(:METASPEC
 (:VERSION "1.0.1" :ORIGIN "https://codeberg.org/dlowe/metaspectre" :BUILT
  "2026-06-14T12:27:16Z")
 (:CHAPTER (:NUM "0" :TITLE ("Credits") :NUMTAG :CHAP-ZERO :NAMETAG :CREDITS)
  :PAR
  (:TABLE (:PLAIN T :NAME NIL)
   (:ROW NIL (:CELL NIL " Principal Technical Editors:"))
   (:ROW (:GAP 8) (:CELL NIL (:B NIL "Kent M. Pitman"))
    (:CELL NIL " Harlequin, Inc. " (:BR NIL) " Symbolics, Inc. ")
    (:CELL NIL " 1993-present " (:BR NIL) " 1990-1992 "))
   (:ROW NIL (:CELL NIL (:B NIL "Kathy Chapman"))
    (:CELL NIL " Digital Equipment Corporation ") (:CELL NIL " 1987-1989 "))
   (:ROW (:GAP 8) (:CELL NIL " Occasional Guest Editors:"))
   (:ROW (:GAP 8) (:CELL NIL (:B NIL "Richard P. Gabriel"))
    (:CELL NIL " Lucid, Inc."))
   (:ROW NIL (:CELL NIL (:B NIL "Sandra Loosemore")) (:CELL NIL " self")))
  " " :PAR " " :PAR
  (:TABLE (:PLAIN T :NAME NIL)
   (:ROW NIL (:CELL NIL " Financial Contributors to the Editing Process:"))
   (:ROW (:GAP 8) (:CELL NIL (:B NIL "Digital Equipment Corporation")))
   (:ROW NIL
    (:CELL NIL (:B NIL "Harlequin, Ltd.") " and " (:B NIL "Harlequin, Inc.")))
   (:ROW NIL (:CELL NIL (:B NIL "Symbolics, Inc.")))
   (:ROW NIL (:CELL NIL (:B NIL "Apple, Inc.")))
   (:ROW NIL (:CELL NIL (:B NIL "Franz, Inc.")))
   (:ROW NIL (:CELL NIL (:B NIL "Lucid, Inc."))))
  " " :PAR " " :PAR
  "Special thanks to Guy L. Steele Jr. and Digital Press for producing "
  (:BIB
   (:URL "https://www.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html" :ISBN
    "1-55558-041-6")
   "Common Lisp: The Language")
  ", and for relaxing copyright restrictions enough to make it possible for that document's text to provide an early basis of this work. "
  :PAR " " :PAR
  (:TABLE (:PLAIN T :NAME NIL)
   (:ROW NIL (:CELL (:SPAN 3) " Edit and Review History:"))
   (:ROW (:GAP 8) (:CELL NIL " 01-Jan-89 ") (:CELL NIL " Chapman ")
    (:CELL NIL " Draft of Chapters 1.1 (scope)."))
   (:ROW NIL (:CELL NIL " 01-Jan-89 ") (:CELL NIL " Pitman ")
    (:CELL NIL " Draft of Chapters 5.1 (conditions)."))
   (:ROW NIL (:CELL NIL " 01-May-89 ") (:CELL NIL " Chapman ")
    (:CELL NIL " Draft of 1.2–1.6. "))
   (:ROW NIL (:CELL NIL " 01-May-89 ") (:CELL NIL " Gabriel ")
    (:CELL NIL " Rewrite of Chapters 1.1 and 5.1."))
   (:ROW NIL (:CELL NIL " 01-Jun-89 ") (:CELL NIL " Loosemore ")
    (:CELL NIL " Review of Chapter 4.2. "))
   (:ROW NIL (:CELL NIL " 01-Jun-89 ") (:CELL NIL " Pitman ")
    (:CELL NIL " Review of Glossary "))
   (:ROW NIL (:CELL NIL " 15-Jun-89 ") (:CELL NIL " Gabriel ")
    (:CELL NIL " Rewrite of Glossary "))
   (:ROW NIL (:CELL NIL " 16-Jun-89 ") (:CELL NIL " Margolin ")
    (:CELL NIL " Comments on Chapters 2.1–2.4 (types, objects)."))
   (:ROW NIL (:CELL NIL " 23-Jun-89 ") (:CELL NIL " Gabriel ")
    (:CELL NIL " Rewrite of 4.2. "))
   (:ROW NIL (:CELL NIL " 07-Jul-89 ") (:CELL NIL " Moon ")
    (:CELL NIL " Review of Chapters 4.1, 4.3 "))
   (:ROW NIL (:CELL NIL " 12-Jul-89 ") (:CELL NIL " Gabriel ")
    (:CELL NIL " Revision of 4.2. "))
   (:ROW NIL (:CELL NIL " 15-Jul-89 ") (:CELL NIL " Pitman ")
    (:CELL NIL " Review of Glossary "))
   (:ROW NIL (:CELL NIL " 18-Jul-89 ") (:CELL NIL " Gray ")
    (:CELL NIL " Comments on 5.1 "))
   (:ROW NIL (:CELL NIL " 25-Jul-89 ") (:CELL NIL " Gabriel ")
    (:CELL NIL " Revision of Chapters 1.2–1.6, 2.2"))
   (:ROW NIL (:CELL NIL " 26-Jul-89 ") (:CELL NIL " Gabriel ")
    (:CELL NIL " Rewrite of 5.1 "))
   (:ROW NIL (:CELL NIL " 26-Jul-89 ") (:CELL NIL " Gabriel ")
    (:CELL NIL " Rewrite of 4.1. "))
   (:ROW NIL (:CELL NIL " 27-Jul-89 ") (:CELL NIL " Pitman ")
    (:CELL NIL " Revision of 5.1 "))
   (:ROW NIL (:CELL NIL " 27-Jul-89 ") (:CELL NIL " Gabriel ")
    (:CELL NIL " Revision of 5.1 "))
   (:ROW NIL (:CELL NIL " 28-Jul-89 ") (:CELL NIL " Chapman ")
    (:CELL NIL " Draft of 2.2, 3.2, 3.3, 5.4 "))
   (:ROW NIL (:CELL NIL " 28-Jul-89 ") (:CELL NIL " Gabriel ")
    (:CELL NIL " Revision of Glossary."))
   (:ROW NIL (:CELL NIL " 01-Oct-89 ") (:CELL NIL " Margolin ")
    (:CELL NIL " Review of Dictionary from Jun-89 draft."))
   (:ROW NIL (:CELL NIL " 20-Jan-91 ") (:CELL NIL " Pitman ")
    (:CELL NIL " Draft 8.81 (for X3J13 review). Document X3J13/91-101."))
   (:ROW NIL (:CELL NIL " 29-Jan-91 ") (:CELL NIL " Waters ")
    (:CELL NIL " Review of 8.81/Chapter 23 (Printer)."))
   (:ROW NIL (:CELL NIL " 01-Mar-91 ") (:CELL NIL " Moon ")
    (:CELL NIL " Review of 8.81/Chapter 4 (Evaluation and Compilation)."))
   (:ROW NIL (:CELL NIL " 01-Mar-91 ") (:CELL NIL " Barrett ")
    (:CELL NIL " Review of 8.81/Chapter 4 (Evaluation and Compilation)."))
   (:ROW NIL (:CELL NIL " 01-Mar-91 ") (:CELL NIL " Moon ")
    (:CELL NIL " Review of 8.81/Glossary."))
   (:ROW NIL (:CELL NIL " 13-Mar-90 ") (:CELL NIL " Wechsler ")
    (:CELL NIL " Review of 8.81/Glossary."))
   (:ROW NIL (:CELL NIL " 21-Mar-91 ") (:CELL NIL " Kerns ")
    (:CELL NIL " Review of 8.81/Chapter 1."))
   (:ROW NIL (:CELL NIL " 26-Apr-91 ") (:CELL NIL " Margolin ")
    (:CELL NIL " Review of 8.81/Chapters 1–12."))
   (:ROW NIL (:CELL NIL " 15-May-91 ") (:CELL NIL " Barrett ")
    (:CELL NIL " Review of 8.81/Chapters 5 (Misc), 11 (Conditions)."))
   (:ROW NIL (:CELL NIL " 04-Jun-91 ") (:CELL NIL " Laddaga ")
    (:CELL NIL " Review of 9.60/Chapter 20 (Pathnames)."))
   (:ROW NIL (:CELL NIL " 10-Jun-91 ") (:CELL NIL " Pitman ")
    (:CELL NIL " Draft 9.126 (for X3J13 review). Document X3J13/91-102."))
   (:ROW NIL (:CELL NIL " 02-Sep-91 ") (:CELL NIL " Barrett ")
    (:CELL NIL " Review of 9.28/Chapter 4 (Evaluation and Compilation)."))
   (:ROW NIL (:CELL NIL " 02-Sep-91 ") (:CELL NIL " Barrett ")
    (:CELL NIL " Review of 9.52/Chapter 4 (Evaluation and Compilation)."))
   (:ROW NIL (:CELL NIL " 15-Sep-91 ") (:CELL NIL " Barrett ")
    (:CELL NIL " Review of 9.126/Chapter 4 (Evaluation and Compilation)"
     (:BR NIL) "   and Chapter 7 (Evaluation/Compilation)." (:BR NIL)
     "  (some comments not yet merged)"))
   (:ROW NIL (:CELL NIL " 18-Sep-91 ") (:CELL NIL " Wechsler ")
    (:CELL NIL " Review of 9.126."))
   (:ROW NIL (:CELL NIL " 21-Sep-91 ") (:CELL NIL " Barrett ")
    (:CELL NIL " Review of 10.16/Chapter 7 (Evaluation/Compilation)." (:BR NIL)
     "  (some comments not yet merged)"))
   (:ROW NIL (:CELL NIL " 28-Sep-91 ") (:CELL NIL " Barrett ")
    (:CELL NIL " Review of 10.95/Chapter 25 (Printer)." (:BR NIL)
     "  (some comments not yet merged)"))
   (:ROW NIL (:CELL NIL " 13-Oct-91 ") (:CELL NIL " Barrett ")
    (:CELL NIL " Review (and help editing) of 10.104/Chapter 4" (:BR NIL)
     "  (Evaluation and Compilation)"))
   (:ROW NIL (:CELL NIL " 15-Oct-91 ") (:CELL NIL " Waters ")
    (:CELL NIL " Review of 10.95/Chapter 25 (Printer)."))
   (:ROW NIL (:CELL NIL " 24-Oct-91 ") (:CELL NIL " Pitman ")
    (:CELL NIL " Draft 10.156 (for X3J13 review). Document X3J13/91-103."))
   (:ROW NIL (:CELL NIL " 04-Nov-91 ") (:CELL NIL " Moon ")
    (:CELL NIL " Review of 10.156/Chapter 5 (Data and Control Flow)" (:BR NIL)
     "   and Chapter 26 (Glossary)."))
   (:ROW NIL (:CELL NIL " 11-Nov-91 ") (:CELL NIL " Loosemore ")
    (:CELL NIL " Review of 10.156/Chapter 2 (Syntax)," (:BR NIL)
     "   Chapter 3 (Evaluation and Compilation)," (:BR NIL)
     "   Chapter 5 (Data and Control Flow), and Chapter 8 (Structures)."))
   (:ROW NIL (:CELL NIL " 02-Dec-91 ") (:CELL NIL " Barrett ")
    (:CELL NIL " Review of 10.156/Chapter 4 (Types and Classes)," (:BR NIL)
     "   and Chapter 10 (Symbols)."))
   (:ROW NIL (:CELL NIL " 02-Dec-91 ") (:CELL NIL " Barrett ")
    (:CELL NIL " Review of 10.156/Chapter 3 (Evaluation and Compilation),"
     (:BR NIL) "   Chapter 6 (Iteration), Chapter 9 (Conditions)," (:BR NIL)
     "   and Chapter 14 (Conses)." (:BR NIL)
     "  (some comments not yet merged)"))
   (:ROW NIL (:CELL NIL " 09-Dec-91 ") (:CELL NIL " Gabriel ")
    (:CELL NIL " Review of 10.156/Chapter 1 (Introduction)," (:BR NIL)
     "   Chapter 2 (Syntax), and Chapter 3 (Evaluation and Compilation)."))
   (:ROW NIL (:CELL NIL " 09-Dec-91 ") (:CELL NIL " Ida ")
    (:CELL NIL " Light review of 10.156/Chapters 1-5."))
   (:ROW NIL (:CELL NIL " 09-Dec-91 ") (:CELL NIL " Moon ")
    (:CELL NIL " Review of 10.156/Chapter 3 (Evaluation and Compilation)."
     (:BR NIL) "  (some comments not yet merged)"))
   (:ROW NIL (:CELL NIL " 10-Dec-91 ") (:CELL NIL " Loosemore ")
    (:CELL NIL " Review of 10.156/Chapter 10 (Symbols)," (:BR NIL)
     "   Chapter 20 (Files), and Chapter 13 (Characters)."))
   (:ROW NIL (:CELL NIL " 10-Dec-91 ") (:CELL NIL " Loosemore ")
    (:CELL NIL " Review of 10.156/Chapter 14 (Conses)." (:BR NIL)
     "  (some comments not yet merged)"))
   (:ROW NIL (:CELL NIL " 10-Dec-91 ") (:CELL NIL " Laubsch ")
    (:CELL NIL " Review of 10.156/Chapters 1 (Introduction)," (:BR NIL)
     "   Chapter 2 (Syntax), Chapter 3 (Evaluation and Compilation)," (:BR NIL)
     "   Chapter 4 (Types and Classes), Chapter 5 (Data and Control Flow), "
     (:BR NIL) "   Chapter 7 (Objects), Chapter 11 (Packages)," (:BR NIL)
     "   Chapter 19 (Filenames), and Chapter 21 (Streams)."))
   (:ROW NIL (:CELL NIL " 18-Dec-91 ") (:CELL NIL " Margolin ")
    (:CELL NIL " Review of 10.156/Chapter 18 (Hash Tables)."))
   (:ROW NIL (:CELL NIL " 04-Jan-92 ") (:CELL NIL " White ")
    (:CELL NIL " Review of 10.156/Chapter 6 (Iteration)," (:BR NIL)
     "   Chapter 11 (Packages), Chapter 18 (Hash Tables)," (:BR NIL)
     "   and Chapter 23 (Reader)."))
   (:ROW NIL (:CELL NIL " 04-Jan-92 ") (:CELL NIL " White ")
    (:CELL NIL " Review of 10.156/Chapter 26 (Glossary)." (:BR NIL)
     "  (some comments not yet merged)"))
   (:ROW NIL (:CELL NIL " 04-Jan-92 ") (:CELL NIL " Barrett ")
    (:CELL NIL
     " Review of 10.156/Chapter 18 (Hash Tables) and Chapter 16 (Strings)."))
   (:ROW NIL (:CELL NIL " 04-Jan-92 ") (:CELL NIL " Barrett ")
    (:CELL NIL
     " Review of 10.156/Chapter 15 (Arrays) and Chapter 21 (Streams)."
     (:BR NIL) "  (some comments not yet merged)"))
   (:ROW NIL (:CELL NIL " 06-Jan-92 ") (:CELL NIL " Loosemore ")
    (:CELL NIL " Review of 10.156/Chapter 16 (Strings)," (:BR NIL)
     "   Chapter 17 (Sequences), and Chapter 25 (Environment)."))
   (:ROW NIL (:CELL NIL " 06-Jan-92 ") (:CELL NIL " Loosemore ")
    (:CELL NIL
     " Review of 10.156/Chapter 21 (Streams) and Chapter 23 (Reader)."
     (:BR NIL) "  (some comments not yet merged)"))
   (:ROW NIL (:CELL NIL " 06-Jan-92 ") (:CELL NIL " Margolin ")
    (:CELL NIL " Review of 10.156/Chapter 2 (Syntax)."))
   (:ROW NIL (:CELL NIL " 07-Jan-92 ") (:CELL NIL " Margolin ")
    (:CELL NIL " Review of 10.156/Chapter 4 (Types and Classes)."))
   (:ROW NIL (:CELL NIL " 03-Feb-92 ") (:CELL NIL " Aspinall ")
    (:CELL NIL " Review of 10.156/Chapter 12 (Numbers)."))
   (:ROW NIL (:CELL NIL " 16-Feb-92 ") (:CELL NIL " Pitman ")
    (:CELL NIL
     " Draft 11.82 (for X3J13 letter ballot). Document X3J13/92-101."))
   (:ROW NIL (:CELL NIL " 16-Mar-92 ") (:CELL NIL " Loosemore ")
    (:CELL NIL " Review of 11.82/Chapter 1, 3, 4, 5, 7, 8, 9, 10," (:BR NIL)
     "   11, 12, 18, 22, 23, 24, 25, and 26."))
   (:ROW NIL (:CELL NIL " 16-Feb-92 ") (:CELL NIL " Pitman ")
    (:CELL NIL " Draft 12.24 (for X3 consideration). Document X3J13/92-102."))
   (:ROW NIL (:CELL NIL " 09-Sep-92 ") (:CELL NIL " Samson ")
    (:CELL NIL
     " Public Review Comments (#1). Documents X3J13/92-1001 to 92-1003."))
   (:ROW NIL (:CELL NIL " 22-Oct-92 ") (:CELL NIL " Rose, Yen ")
    (:CELL NIL
     " Public Review Comments (#2). Documents X3J13/92-1101 to 92-1103."))
   (:ROW NIL (:CELL NIL " 23-Oct-92 ") (:CELL NIL " Staley ")
    (:CELL NIL
     " Public Review Comments (#3). Documents X3J13/92-1201 to 92-1204."))
   (:ROW NIL (:CELL NIL " 09-Nov-92 ") (:CELL NIL " Barrett ")
    (:CELL NIL
     " Public Review Comments (#4). Documents X3J13/92-3101 to 92-3110."))
   (:ROW NIL (:CELL NIL " 11-Nov-92 ") (:CELL NIL " Moon ")
    (:CELL NIL
     " Public Review Comments (#5). Documents X3J13/92-3201 to 92-3248."))
   (:ROW NIL (:CELL NIL " 17-Nov-92 ") (:CELL NIL " Loosemore ")
    (:CELL NIL
     " Public Review Comments (#6). Documents X3J13/92-1301 to 92-1335."))
   (:ROW NIL (:CELL NIL " 23-Nov-92 ") (:CELL NIL " Margolin ")
    (:CELL NIL
     " Public Review Comments (#7). Documents X3J13/92-1401 to 92-1419."))
   (:ROW NIL (:CELL NIL " 23-Nov-92 ") (:CELL NIL " Withington ")
    (:CELL NIL
     " Public Review Comments (#8a). Documents X3J13/92-1501 to 92-1512."))
   (:ROW NIL (:CELL NIL " 23-Nov-92 ") (:CELL NIL " Feinberg ")
    (:CELL NIL
     " Public Review Comments (#8b). Documents X3J13/92-1601 to 92-1603."))
   (:ROW NIL (:CELL NIL " 23-Nov-92 ") (:CELL NIL " Wechsler ")
    (:CELL NIL
     " Public Review Comments (#8c). Documents X3J13/92-1701 to 92-1703."))
   (:ROW NIL (:CELL NIL " 23-Nov-92 ") (:CELL NIL " Moore ")
    (:CELL NIL
     " Public Review Comments (#9). Documents X3J13/92-1801 to 92-1802."))
   (:ROW NIL (:CELL NIL " 23-Nov-92 ") (:CELL NIL " Flanagan ")
    (:CELL NIL
     " Public Review Comments (#10). Documents X3J13/92-1901 to 92-1910."))
   (:ROW NIL (:CELL NIL " 23-Nov-92 ") (:CELL NIL " Dalton ")
    (:CELL NIL
     " Public Review Comments (#11). Documents X3J13/92-2001 to 92-2012."))
   (:ROW NIL (:CELL NIL " 23-Nov-92 ") (:CELL NIL " Gallagher ")
    (:CELL NIL
     " Public Review Comments (#12). Documents X3J13/92-2101 to 92-2103."))
   (:ROW NIL (:CELL NIL " 23-Nov-92 ") (:CELL NIL " Norvig ")
    (:CELL NIL
     " Public Review Comments (#13). Documents X3J13/92-2201 to 92-2208."))
   (:ROW NIL (:CELL NIL " 24-Nov-92 ") (:CELL NIL " Robertson ")
    (:CELL NIL " Public Review Comments (#14). Document X3J13/92-2301."))
   (:ROW NIL (:CELL NIL " 23-Nov-92 ") (:CELL NIL " Kawabe ")
    (:CELL NIL
     " Public Review Comments (#15). Documents X3J13/92-2401 to 92-2403."))
   (:ROW NIL (:CELL NIL " 23-Nov-92 ") (:CELL NIL " Barrett ")
    (:CELL NIL
     " Public Review Comments (#16). Documents X3J13/92-2511 to X3J13/92-2531."))
   (:ROW NIL (:CELL NIL " 23-Nov-92 ") (:CELL NIL " Wertheimer ")
    (:CELL NIL " Public Review Comments (#17). Document X3J13/92-2601."))
   (:ROW NIL (:CELL NIL " 24-Nov-92 ") (:CELL NIL " Pitman ")
    (:CELL NIL
     " Public Review Comments (#18). Documents X3J13/92-2701 to 92-2742."))
   (:ROW NIL (:CELL NIL " 24-Nov-92 ") (:CELL NIL " Mato Mira ")
    (:CELL NIL
     " Public Review Comments (#19). Documents X3J13/92-2801 to 92-2805."))
   (:ROW NIL (:CELL NIL " 24-Nov-92 ") (:CELL NIL " Philpot ")
    (:CELL NIL " Public Review Comments (#20). Document X3J13/92-2901."))
   (:ROW NIL (:CELL NIL " 23-Nov-92 ") (:CELL NIL " Cerys ")
    (:CELL NIL " Public Review Comments (#21). Document X3J13/92-3001."))
   (:ROW NIL (:CELL NIL " 30-Aug-93 ") (:CELL NIL " Pitman ")
    (:CELL NIL
     " Draft 13.65 (for X3J13 consideration). Document X3J13/93-101."))
   (:ROW NIL (:CELL NIL " 04-Oct-93 ") (:CELL NIL " X3J13 ")
    (:CELL NIL " Minor fixes to Draft 13.65 before sending to X3."))
   (:ROW NIL (:CELL NIL " 05-Oct-93 ") (:CELL NIL " Pitman ")
    (:CELL NIL " Draft 14.10 (for X3 consideration). Document X3J13/93-102."))
   (:ROW NIL (:CELL NIL " 08-Nov-93 ") (:CELL NIL " Dalton ")
    (:CELL NIL " “reply to reply to pr comments”. Document X3J13/94-311."))
   (:ROW NIL (:CELL NIL " 04-Apr-94 ")
    (:CELL NIL " Boyer, " (:BR NIL) " Kaufmann, " (:BR NIL) " Moore ")
    (:CELL NIL " Public Review Comments (#1). Document X3J13/94-305."))
   (:ROW NIL (:CELL NIL " 05-Apr-94 ") (:CELL NIL " Pitman ")
    (:CELL NIL " Public Review Comments (#2). Document X3J13/94-306."))
   (:ROW NIL (:CELL NIL " 14-Mar-94 ") (:CELL NIL " Schulenburg ")
    (:CELL NIL " Public Review Comments (#3). Document X3J13/94-307."))
   (:ROW NIL (:CELL NIL " 04-Apr-94 ") (:CELL NIL " Shepard ")
    (:CELL NIL " Late commentary. Document X3J13/94-309."))
   (:ROW NIL (:CELL NIL " 05-May-94 ") (:CELL NIL " X3J13 ")
    (:CELL NIL
     " Editorial-only changes to Draft 14.10 in response to comments."))
   (:ROW NIL (:CELL NIL " 10-May-94 ") (:CELL NIL " Pitman ")
    (:CELL NIL " Draft 15.17 (for X3 consideration). Document X3J13/94-101.")))
  " " :PAR " " :PAR " " :PAR
  "The following lists of information are almost certainly incomplete, but it was felt that it was better to risk publishing incomplete information than to fail to acknowledge important contributions by the many people and organizations who have contributed to this effort. "
  :PAR
  "Mention here of any individual or organization does not imply endorsement of this document by that individual or organization. "
  :PAR
  (:TABLE (:PLAIN T :NAME NIL)
   (:ROW NIL
    (:CELL NIL (:COMMENT NIL "Committee Chairs:&\\cr") "Ad Hoc Group Chairs:")
    (:CELL NIL))
   (:ROW (:GAP 8) (:CELL NIL " Characters ") (:CELL NIL " Linden, Thom "))
   (:ROW NIL (:CELL NIL " Charter ") (:CELL NIL " Ennis, Susan P. "))
   (:ROW NIL (:CELL NIL " Cleanup ")
    (:CELL NIL " Masinter, Larry " (:BR NIL) " Fahlman, Scott "))
   (:ROW NIL (:CELL NIL " Compiler ")
    (:CELL NIL " Haflich, Steve " (:BR NIL) " Loosemore, Sandra "))
   (:ROW NIL (:CELL NIL " Conditions ") (:CELL NIL " Pitman, Kent M. "))
   (:ROW NIL
    (:CELL NIL
     (:COMMENT NIL
      "% Removed per X3J13 at May 4-5, 1994 meeting. -kmp 9-May-94"
      "                           & Daniels, Andy       \\cr")
     "Editorial ")
    (:CELL NIL " Chapman, Kathy "))
   (:ROW NIL
    (:CELL NIL
     (:COMMENT NIL "% Added per X3J13 at May 4-5, 1994 meeting. -kmp 9-May-94")
     "Graphics & Windows ")
    (:CELL NIL " Douglas Rand "))
   (:ROW NIL (:CELL NIL " Iteration ") (:CELL NIL " White, JonL "))
   (:ROW NIL
    (:CELL NIL
     (:COMMENT NIL
      "% Removed per X3J13 at May 4-5, 1994 meeting. -kmp 9-May-94"
      "                           & Waters, Richard C.  \\cr"
      "                           & Perdue, Crispin     \\cr")
     "Lisp" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MN NIL "1"))) "/Lisp"
     (:MATH NIL (:MSUB NIL (:MROW NIL) (:MN NIL "2"))))
    (:CELL NIL " Gabriel, Richard P. "))
   (:ROW NIL
    (:CELL NIL
     (:COMMENT NIL
      "% Removed per X3J13 at May 4-5, 1994 meeting. -kmp 9-May-94"
      "                           & Pitman, Kent M.     \\cr")
     "Macros ")
    (:CELL NIL " Haflich, Steve " (:BR NIL) " Pitman, Kent M. "))
   (:ROW NIL (:CELL NIL " Objects ") (:CELL NIL " Bobrow, Daniel G. "))
   (:ROW NIL (:CELL NIL " Presentation of Standard ")
    (:CELL NIL " Brown, Gary "))
   (:ROW NIL (:CELL NIL " Pretty Printer ") (:CELL NIL " Waters, Richard C. "))
   (:ROW NIL (:CELL NIL " Public Review ") (:CELL NIL " Ida, Masayuki "))
   (:ROW NIL (:CELL NIL " Types & Declarations ")
    (:CELL NIL " Scherlis, William "))
   (:ROW NIL (:CELL NIL " Validation ")
    (:CELL NIL " Berman, Richard " (:BR NIL) " Balzer, Bob ")))
  " " :PAR " " :PAR
  (:TABLE (:PLAIN T :NAME NIL)
   (:ROW NIL (:CELL NIL " Major Administrative Contributions:"))
   (:ROW (:GAP 8)
    (:CELL NIL
     (:COMMENT NIL
      "% Added \"Loeffler\" and \"Tyson\" per Pitman #3 (by X3J13 vote at May 4-5, 1994 meeting)"
      "% -kmp 9-May-94")
     "Mathis, Robert"
     (:CELLNOTE NIL " Convenor; Chairman; Interfacing to X3, etc."))
    (:CELL NIL "Brown, Gary"
     (:CELLNOTE NIL
      " Secretary, Funding administration for DEC's editorship")))
   (:ROW NIL
    (:CELL NIL "Steele, Guy L., Jr."
     (:CELLNOTE NIL
      " Interfacing to X3, etc.; Vice-Chairman; Roberts Rules expert "))
    (:CELL NIL "Eiron, Hanoch"
     (:CELLNOTE NIL
      " Funding administration for Franz, Help finding other funding")))
   (:ROW NIL
    (:CELL NIL "Zubkoff, Jan L."
     (:CELLNOTE NIL
      " Meeting organization, Secretary, Funding administration for Lucid"))
    (:CELL NIL "Haflich, Steve"
     (:CELLNOTE NIL " Establishment of second-generation CL Editorship")))
   (:ROW NIL
    (:CELL NIL "Gabriel, Richard P."
     (:CELLNOTE NIL " Interfacing to ISO, etc."))
    (:CELL NIL "Ida, Masayuki"
     (:CELLNOTE NIL " International Liaison to Japan")))
   (:ROW NIL
    (:CELL NIL "Masinter, Larry"
     (:CELLNOTE NIL " Administration of Cleanup, agenda setting"))
    (:CELL NIL "Loeffler, David D." (:CELLNOTE NIL " Mailing lists at MCC")))
   (:ROW NIL
    (:CELL NIL "Loosemore, Sandra"
     (:CELLNOTE NIL " Administration of Cleanup & Compiler, agenda setting"))
    (:CELL NIL "Tyson, Mabry" (:CELLNOTE NIL " Mailing lists at SRI")))
   (:ROW NIL
    (:CELL NIL "Pitman, Kent M."
     (:CELLNOTE NIL " Administration of Cleanup, agenda setting"))
    (:CELL NIL "Whittemore, Susan"
     (:CELLNOTE NIL " Funding administration for Apple")))
   (:ROW NIL
    (:CELL NIL "Barrett, Kim" (:CELLNOTE NIL " Administration of Cleanup"))
    (:CELL NIL "Woodyatt, Anne"
     (:CELLNOTE NIL " Funding administration for Harlequin")))
   (:ROW NIL (:CELL NIL)))
  " " :PAR " " :PAR
  (:TABLE (:PLAIN T :NAME NIL)
   (:ROW NIL (:CELL NIL " Major Technical Contributions:"))
   (:ROW (:GAP 8)
    (:CELL NIL " Barrett, Kim A. " (:CELLNOTE NIL " Review, Cleanups"))
    (:CELL NIL "Loosemore, Sandra " (:CELLNOTE NIL " Review, Compiler")))
   (:ROW NIL (:CELL NIL "Bobrow, Daniel G. " (:CELLNOTE NIL " CLOS"))
    (:CELL NIL "Margolin, Barry " (:CELLNOTE NIL " Review")))
   (:ROW NIL (:CELL NIL "Daniels, Andy " (:CELLNOTE NIL " Conditions"))
    (:CELL NIL "Moon, David A. " (:CELLNOTE NIL " Review, CLOS, Conditions")))
   (:ROW NIL (:CELL NIL "DeMichiel, Linda G. " (:CELLNOTE NIL " CLOS"))
    (:CELL NIL "Pitman, Kent M. "
     (:CELLNOTE NIL " Review, Conditions, Cleanup, Editor, Lisp1/Lisp2")))
   (:ROW NIL (:CELL NIL "Dussud, Patrick H. " (:CELLNOTE NIL " CLOS"))
    (:CELL NIL "Perdue, Crispin " (:CELLNOTE NIL " Iteration")))
   (:ROW NIL
    (:CELL NIL "Gabriel, Richard P. " (:CELLNOTE NIL " Review, Editing, CLOS"))
    (:CELL NIL "Steele, Guy L., Jr. " (:CELLNOTE NIL " Review, CLtL")))
   (:ROW NIL
    (:CELL NIL "Ida, Masayuki "
     (:CELLNOTE NIL " Administration of Public Review work"))
    (:CELL NIL "Waters, Richard C. "
     (:CELLNOTE NIL " Pretty Printer, Iteration")))
   (:ROW NIL (:CELL NIL "Kiczales, Gregor " (:CELLNOTE NIL " CLOS"))
    (:CELL NIL "White, JonL " (:CELLNOTE NIL " Review, LOOP")))
   (:ROW NIL (:CELL NIL)))
  " " :PAR
  (:TABLE (:PLAIN T :NAME NIL)
   (:ROW NIL (:CELL NIL " Organizational Participants:"))
   (:ROW (:GAP 8) (:CELL NIL " The Aerospace Corporation") (:CELL NIL " LMI"))
   (:ROW NIL (:CELL NIL " AI Architects") (:CELL NIL " Loosemore, Sandra"))
   (:ROW NIL (:CELL NIL " Amoco Production Co.") (:CELL NIL " Lucid, Inc."))
   (:ROW NIL (:CELL NIL " Aoyama Gakuin University") (:CELL NIL " MCC"))
   (:ROW NIL (:CELL NIL " Apple Computer") (:CELL NIL " MIT"))
   (:ROW NIL (:CELL NIL " Barrett, Kim") (:CELL NIL " MITRE Corporation"))
   (:ROW NIL (:CELL NIL " Boeing Advanced Technology Center")
    (:CELL NIL " MSC"))
   (:ROW NIL (:CELL NIL " Carnegie-Mellon University")
    (:CELL NIL " NASA Ames Research Center"))
   (:ROW NIL (:CELL NIL " Chestnut Software") (:CELL NIL " Nihon Symbolics"))
   (:ROW NIL (:CELL NIL " Computer Sciences")
    (:CELL NIL " National Bureau of Standards"))
   (:ROW NIL (:CELL NIL " CONTEL") (:CELL NIL " Prime Computer"))
   (:ROW NIL (:CELL NIL " Digital Equipment Corporation")
    (:CELL NIL " Siemens"))
   (:ROW NIL (:CELL NIL " Evans & Sutherland")
    (:CELL NIL " Southern Illinois University"))
   (:ROW NIL (:CELL NIL " Encore") (:CELL NIL " Sperry"))
   (:ROW NIL (:CELL NIL " Franz, Inc.") (:CELL NIL " SRI"))
   (:ROW NIL (:CELL NIL " Gigamos") (:CELL NIL " Sun Microsystems"))
   (:ROW NIL (:CELL NIL " GMD") (:CELL NIL " Symbolics"))
   (:ROW NIL (:CELL NIL " Gold Hill") (:CELL NIL " Tektronix"))
   (:ROW NIL (:CELL NIL " Greenblatt, Richard")
    (:CELL NIL " Texas Instruments"))
   (:ROW NIL (:CELL NIL " Grumman Data Systems Corporation")
    (:CELL NIL " Thinking Machines Corporation"))
   (:ROW NIL (:CELL NIL " Harlequin, Ltd.") (:CELL NIL " Unisys"))
   (:ROW NIL (:CELL NIL " Hewlett-Packard") (:CELL NIL " University of Bath"))
   (:ROW NIL (:CELL NIL " Honeywell") (:CELL NIL " University of Edinburgh"))
   (:ROW NIL (:CELL NIL " IBM") (:CELL NIL " University of Utah"))
   (:ROW NIL (:CELL NIL " Integrated Inference Machines")
    (:CELL NIL " US Army"))
   (:ROW NIL (:CELL NIL " International LISP Associates")
    (:CELL NIL " USC/ISI"))
   (:ROW NIL (:CELL NIL " Johnson Controls") (:CELL NIL " Xerox"))
   (:ROW NIL (:CELL NIL " Kerns, Robert W.")))
  " " :PAR " " :PAR
  (:TABLE (:PLAIN T :NAME NIL)
   (:ROW NIL (:CELL NIL " Individual Participants:"))
   (:ROW (:GAP 8)
    (:CELL NIL
     (:COMMENT NIL
      " These are attendees from minutes back through 3/88.  Others to be added"
      " per earlier minutes if they can be found.")
     "Antonisse, Jim")
    (:CELL NIL "Hewitt, Carl") (:CELL NIL "Perdue, Crispin"))
   (:ROW NIL (:CELL NIL " Arbaugh, Bill") (:CELL NIL "Hornig, Charles")
    (:CELL NIL "Philipp, Christopher"))
   (:ROW NIL (:CELL NIL " Balzer, Bob") (:CELL NIL "Ida, Masayuki")
    (:CELL NIL "Pierson, Dan"))
   (:ROW NIL (:CELL NIL " Barrett, Kim") (:CELL NIL "Keene, Sonya")
    (:CELL NIL "Pitman, Kent M."))
   (:ROW NIL (:CELL NIL " Bartley, David") (:CELL NIL "Keller, Shaun")
    (:CELL NIL "Raghavan, B."))
   (:ROW NIL (:CELL NIL " Beckerle, Mike") (:CELL NIL "Kempf, James")
    (:CELL NIL "Rand, Douglas"))
   (:ROW NIL (:CELL NIL " Beiser, Paul") (:CELL NIL "Kerns, Robert W.")
    (:CELL NIL "Rininger, Jeff"))
   (:ROW NIL (:CELL NIL " Benson, Eric") (:CELL NIL "Kiczales, Gregor")
    (:CELL NIL "Rosenking, Jeff"))
   (:ROW NIL (:CELL NIL " Berman, Richard") (:CELL NIL "Kolb, Dieter")
    (:CELL NIL "Scherlis, William"))
   (:ROW NIL (:CELL NIL " Bobrow, Daniel G.") (:CELL NIL "Koschmann, Timothy")
    (:CELL NIL "Shiota, Eiji"))
   (:ROW NIL (:CELL NIL " Boelk, Mary") (:CELL NIL "Kosinski, Paul")
    (:CELL NIL "Sizer, Andy"))
   (:ROW NIL (:CELL NIL " Brittain, Skona") (:CELL NIL "Larson, Aaron")
    (:CELL NIL "Slater, David"))
   (:ROW NIL (:CELL NIL " Brown, Gary") (:CELL NIL "Latto, Andy")
    (:CELL NIL "Sodan, Angela"))
   (:ROW NIL (:CELL NIL " Chailloux, Jerome") (:CELL NIL "Laubsch, Joachim")
    (:CELL NIL "Soley, Richard"))
   (:ROW NIL (:CELL NIL " Chapman, Kathy") (:CELL NIL "Layer, Kevin")
    (:CELL NIL "St. Clair, Bill"))
   (:ROW NIL (:CELL NIL " Clinger, Will") (:CELL NIL "Linden, Thom")
    (:CELL NIL "Stanhope, Philip"))
   (:ROW NIL (:CELL NIL " Coffee, Peter C.") (:CELL NIL "Loeffler, David D.")
    (:CELL NIL "Steele, Guy L., Jr."))
   (:ROW NIL (:CELL NIL " Cugini, John") (:CELL NIL "Loosemore, Sandra")
    (:CELL NIL "Tucker, Paul"))
   (:ROW NIL (:CELL NIL " Curtis, Pavel") (:CELL NIL "Magataca, Mituhiro")
    (:CELL NIL "Turba, Thomas"))
   (:ROW NIL (:CELL NIL " Dabrowski, Christopher")
    (:CELL NIL "Margolin, Barry") (:CELL NIL "Unietis, Dave"))
   (:ROW NIL (:CELL NIL " Daessler, Klaus") (:CELL NIL "Masinter, Larry")
    (:CELL NIL "van Roggen, Walter"))
   (:ROW NIL (:CELL NIL " Dalton, Jeff") (:CELL NIL "Mathis, Robert")
    (:CELL NIL "van Roggen, Walter"))
   (:ROW NIL (:CELL NIL " Daniels, Andy") (:CELL NIL "Matthews, Dave")
    (:CELL NIL "Waldrum, Ellen"))
   (:ROW NIL (:CELL NIL " DeMichiel, Linda G.") (:CELL NIL "McCarthy, John")
    (:CELL NIL "Waters, Richard C."))
   (:ROW NIL (:CELL NIL " Duggan, Jerry") (:CELL NIL "Mikelsons, Martin")
    (:CELL NIL "Wechsler, Allan"))
   (:ROW NIL (:CELL NIL " Dussud, Patrick H.") (:CELL NIL "Moon, David A.")
    (:CELL NIL "Wegman, Mark"))
   (:ROW NIL (:CELL NIL " Ennis, Susan P.") (:CELL NIL "Moore, Timothy")
    (:CELL NIL "Weinreb, Daniel"))
   (:ROW NIL (:CELL NIL " Fahlman, Scott") (:CELL NIL "Nicoud, Stephen")
    (:CELL NIL "White, JonL"))
   (:ROW NIL (:CELL NIL " Gabriel, Richard P.") (:CELL NIL "Nilsson, Jarl")
    (:CELL NIL "Wieland, Alexis"))
   (:ROW NIL (:CELL NIL " Giansiracusa, Bob") (:CELL NIL "O'Dell, Jim")
    (:CELL NIL "Withington, P. Tucker"))
   (:ROW NIL (:CELL NIL " Gray, David") (:CELL NIL "Ohlander, Ron")
    (:CELL NIL "Wright, Whitman"))
   (:ROW NIL (:CELL NIL " Greenblatt, Richard") (:CELL NIL "Padget, Julian")
    (:CELL NIL "York, Bill"))
   (:ROW NIL (:CELL NIL " Hadden, George D.") (:CELL NIL "Palter, Gary")
    (:CELL NIL "Zacharias, Gail"))
   (:ROW NIL (:CELL NIL " Haflich, Steve") (:CELL NIL "Peck, Jeff")
    (:CELL NIL "Zubkoff, Jan L."))
   (:ROW NIL (:CELL NIL " Harris, Richard M.") (:CELL NIL "Pellegrino, Bob")
    (:CELL NIL)))
  " " :PAR)
 (:CHAPTER
  (:NUM "1" :TITLE ("Introduction") :NUMTAG :CHAP-ONE :NAMETAG :INTRODUCTION)
  (:SECTION (:TITLE ("Scope, Purpose, and History"))
   (:COMMENT NIL "%Scope, Purpose, and History")
   (:SUBSECTION (:TITLE ("Scope and Purpose"))
    " The specification set forth in this document is designed to promote the portability of "
    (:RM NIL " Common Lisp")
    " programs among a variety of data processing systems. It is a language specification aimed at an audience of implementors and knowledgeable programmers. It is neither a tutorial nor an implementation guide. ")
   :PAR
   (:SUBSECTION (:TITLE ("History"))
    "Lisp is a family of languages with a long history. Early key ideas in Lisp were developed by John McCarthy during the 1956 Dartmouth Summer Research Project on Artificial Intelligence. McCarthy's motivation was to develop an algebraic list processing language for artificial intelligence work. Implementation efforts for early dialects of Lisp were undertaken on the IBM 704, the IBM 7090, the Digital Equipment Corporation (DEC) PDP-1, the DEC PDP-6, and the PDP-10. The primary dialect of Lisp between 1960 and 1965 was Lisp 1.5. By the early 1970's there were two predominant dialects of Lisp, both arising from these early efforts: MacLisp and Interlisp. For further information about very early Lisp dialects, see "
    (:BIB (:URL "https://archive.org/details/anatomyoflisp0000alle")
     "The Anatomy of Lisp")
    " or "
    (:BIB
     (:URL
      "https://softwarepreservation.computerhistory.org/LISP/book/LISP%201.5%20Programmers%20Manual.pdf"
      :ISBN "0-262-13011-4")
     "Lisp 1.5 Programmer's Manual")
    ". " :PAR
    "MacLisp improved on the Lisp 1.5 notion of special variables and error handling. MacLisp also introduced the concept of functions that could take a variable number of arguments, macros, arrays, non-local dynamic exits, fast arithmetic, the first good Lisp compiler, and an emphasis on execution speed. "
    (:COMMENT NIL
     " This next sentence transplanted from a later paragraph about PSL."
     " JonL says: My recollection was that it was closer to 100 than to 50."
     "            More likely, it had been received by about 100 sites, "
     "            and was actually in continued usage by 50 at the end of the decade."
     " KMP: Changed \"was available\" to \"was in use\" to compensate. (6-Dec-91)")
    "By the end of the 1970's, MacLisp was in use at over 50 sites. "
    (:COMMENT NIL
     "From about 1969 onward Jonl White was the dominant force behind Maclisp.")
    "For further information about Maclisp, see "
    (:BIB
     (:URL
      "https://softwarepreservation.computerhistory.org/LISP/MIT/Moon-MACLISP_Reference_Manual-Apr_08_1974.pdf")
     "Maclisp Reference Manual, Revision 0")
    " or "
    (:BIB (:URL "https://www.maclisp.info/pitmanual/")
     "The Revised Maclisp Manual")
    ". " :PAR
    "Interlisp introduced many ideas into Lisp programming environments and methodology. One of the Interlisp ideas that influenced "
    (:RM NIL " Common Lisp")
    " was an iteration construct implemented by Warren Teitelman that inspired the "
    (:MACREF NIL "loop")
    " macro used both on the Lisp Machines and in MacLisp, and now in "
    (:RM NIL " Common Lisp") ". For further information about Interlisp, see "
    (:BIB
     (:URL
      "https://bitsavers.org/pdf/xerox/interlisp/Interlisp_Reference_Manual_Oct_1974.pdf")
     "Interlisp Reference Manual")
    ". " :PAR
    "Although the first implementations of Lisp were on the IBM 704 and the IBM 7090, later work focussed on the DEC PDP-6 and, later, PDP-10 computers, the latter being the mainstay of Lisp and artificial intelligence work at such places as Massachusetts Institute of Technology (MIT), Stanford University, and Carnegie Mellon University (CMU) from the mid-1960's through much of the 1970's. The PDP-10 computer and its predecessor the PDP-6 computer were, by design, especially well-suited to Lisp because they had 36-bit words and 18-bit addresses. This architecture allowed a "
    (:TERM NIL "cons")
    " cell to be stored in one word; single instructions could extract the "
    (:TERM NIL "car") " and " (:TERM NIL "cdr")
    " parts. The PDP-6 and PDP-10 had fast, powerful stack instructions that enabled fast function calling. But the limitations of the PDP-10 were evident by 1973: it supported a small number of researchers using Lisp, and the small, 18-bit address space ("
    (:MATH NIL (:MSUP NIL (:MN NIL "2") (:MN NIL "18"))) " "
    (:MATH NIL (:MO NIL "="))
    " 262,144 words) limited the size of a single program. One response to the address space problem was the Lisp Machine, a special-purpose computer designed to run Lisp programs. The other response was to use general-purpose computers with address spaces larger than 18 bits, such as the DEC VAX and the S-1 Mark IIA. For further information about S-1 Common Lisp, see “"
    (:BIB (:DOI "10.1145/800068.802141") "S-1 Common Lisp Implementation")
    ".” " :PAR
    "The Lisp machine concept was developed in the late 1960's. In the early 1970's, Peter Deutsch, working with Daniel Bobrow, implemented a Lisp on the Alto, a single-user minicomputer, using microcode to interpret a byte-code implementation language. Shortly thereafter, Richard Greenblatt began work on a different hardware and instruction set design at MIT. Although the Alto was not a total success as a Lisp machine, a dialect of Interlisp known as Interlisp-D became available on the D-series machines manufactured by Xerox—the Dorado, Dandelion, Dandetiger, and Dove (or Daybreak). An upward-compatible extension of MacLisp called Lisp Machine Lisp became available on the early MIT Lisp Machines. Commercial Lisp machines from Xerox, Lisp Machines (LMI), and Symbolics were on the market by 1981. For further information about Lisp Machine Lisp, see "
    (:BIB
     (:URL
      "https://archive.org/details/bitsavers_mitcadrWeiManualJan1979_21093856")
     "Lisp Machine Manual")
    ". " :PAR
    "During the late 1970's, Lisp Machine Lisp began to expand towards a much fuller language. Sophisticated lambda lists, "
    (:TT NIL "setf") ", multiple values, and structures like those in "
    (:RM NIL " Common Lisp")
    " are the results of early experimentation with programming styles by the Lisp Machine group. Jonl White and others migrated these features to MacLisp. Around 1980, Scott Fahlman and others at CMU began work on a Lisp to run on the Scientific Personal Integrated Computing Environment (SPICE) workstation. One of the goals of the project was to design a simpler dialect than Lisp Machine Lisp. "
    :PAR
    "The Macsyma group at MIT began a project during the late 1970's called the New Implementation of Lisp (NIL) for the VAX, which was headed by White. One of the stated goals of the NIL project was to fix many of the historic, but annoying, problems with Lisp while retaining significant compatibility with MacLisp. At about the same time, a research group at Stanford University and Lawrence Livermore National Laboratory headed by Richard P. Gabriel began the design of a Lisp to run on the S-1 Mark IIA supercomputer. S-1 Lisp, never completely functional, was the test bed for adapting advanced compiler techniques to Lisp implementation. Eventually the S-1 and NIL groups collaborated. For further information about the NIL project, see “"
    (:BIB
     (:URL
      "https://softwarepreservation.computerhistory.org/LISP/MIT/White-NIL_A_Perspective-1979.pdf")
     "NIL—A Perspective")
    ".” " :PAR
    (:COMMENT NIL
     " The first efforts towards Lisp standardization were Standard Lisp and"
     " Portable Standard Lisp (PSL).  In 1969, Anthony Hearn and Martin Griss"
     " defined Standard Lisp---a subset of Lisp~1.5 and other dialects---to"
     " transport REDUCE, a symbolic algebra system. "
     " PSL was designed to provide more control over the environment and"
     " the compiler."
     " At the end of the 1970's, PSL ran on about a dozen different"
     " computers.  PSL and Franz Lisp---a MacLisp-like dialect for Unix"
     " machines---were the first examples of widely available Lisp dialects"
     " on multiple hardware platforms. MacLisp was available at over 50"
     " sites." " For further information about Standard Lisp, "
     " see ``{\\StandardLispReport}.''"
     "% Sandra:  This paragraph contains inaccuracies and is not well-organized."
     "%          Suggested rewrite [taken -kmp] below.")
    :PAR
    "The first effort towards Lisp standardization was made in 1969, when Anthony Hearn and Martin Griss at the University of Utah defined Standard Lisp—a subset of Lisp 1.5 and other dialects—to transport REDUCE, a symbolic algebra system. During the 1970's, the Utah group implemented first a retargetable optimizing compiler for Standard Lisp, and then an extended implementation known as Portable Standard Lisp (PSL). By the mid 1980's, PSL ran on about a dozen kinds of computers. For further information about Standard Lisp, see “"
    (:BIB
     (:URL "http://www.reduce-algebra.com/reduce38-docs/sl.pdf" :DOI
      "10.1145/953997.953999")
     "Standard LISP Report")
    ".” " :PAR
    "PSL and Franz Lisp—a MacLisp-like dialect for Unix machines—were the first examples of widely available Lisp dialects on multiple hardware platforms. "
    :PAR
    "One of the most important developments in Lisp occurred during the second half of the 1970's: Scheme. Scheme, designed by Gerald J. Sussman and Guy L. Steele Jr., is a simple dialect of Lisp whose design brought to Lisp some of the ideas from programming language semantics developed in the 1960's. Sussman was one of the prime innovators behind many other advances in Lisp technology from the late 1960's through the 1970's. The major contributions of Scheme were lexical scoping, lexical closures, first-class continuations, and simplified syntax (no separation of value cells and function cells). Some of these contributions made a large impact on the design of "
    (:RM NIL " Common Lisp") ". For further information about Scheme, see "
    (:BIB (:DOI "10.1109/IEEESTD.1991.101032" :ISBN "1-55937-125-0")
     "IEEE Standard for the Scheme Programming Language")
    " or “"
    (:BIB (:DOI "10.1145/15042.15043")
     "Revised³ Report on the Algorithmic Language Scheme")
    ".” " :PAR
    "In the late 1970's object-oriented programming concepts started to make a strong impact on Lisp. At MIT, certain ideas from Smalltalk made their way into several widely used programming systems. Flavors, an object-oriented programming system with multiple inheritance, was developed at MIT for the Lisp machine community by Howard Cannon and others. At Xerox, the experience with Smalltalk and Knowledge Representation Language (KRL) led to the development of Lisp Object Oriented Programming System (LOOPS) and later Common LOOPS. For further information on Smalltalk, see "
    (:BIB
     (:URL "https://archive.org/details/smalltalk80langu00gold" :ISBN
      "0201113716")
     "Smalltalk-80: The Language and its Implementation")
    ". For further information on Flavors, see "
    (:BIB
     (:URL
      "https://softwarepreservation.computerhistory.org/LISP/MIT/nnnfla1-20040122.pdf")
     "Flavors: A Non-Hierarchical Approach to Object-Oriented Programming")
    ". " :PAR
    "These systems influenced the design of the Common Lisp Object System (CLOS). CLOS was developed specifically for this standardization effort, and was separately written up in “"
    (:BIB (:DOI "10.1145/885631.885632")
     "Common Lisp Object System Specification")
    ".” However, minor details of its design have changed slightly since that publication, and that paper should not be taken as an authoritative reference to the semantics of the object system as described in this document. "
    :PAR
    "In 1980 Symbolics and LMI were developing Lisp Machine Lisp; stock-hardware implementation groups were developing NIL, Franz Lisp, and PSL; Xerox was developing Interlisp; and the SPICE project at CMU was developing a MacLisp-like dialect of Lisp called SpiceLisp. "
    :PAR
    "In April 1981, after a DARPA-sponsored meeting concerning the splintered Lisp community, Symbolics, the SPICE project, the NIL project, and the S-1 Lisp project joined together to define "
    (:RM NIL " Common Lisp")
    ". Initially spearheaded by White and Gabriel, the driving force behind this grassroots effort was provided by Fahlman, Daniel Weinreb, David Moon, Steele, and Gabriel. "
    (:RM NIL " Common Lisp")
    " was designed as a description of a family of languages. The primary influences on "
    (:RM NIL " Common Lisp")
    " were Lisp Machine Lisp, MacLisp, NIL, S-1 Lisp, Spice Lisp, and Scheme. "
    (:BIB
     (:URL "https://www.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html" :ISBN
      "1-55558-041-6")
     "Common Lisp: The Language")
    " is a description of that design. Its semantics were intentionally underspecified in places where it was felt that a tight specification would overly constrain "
    (:RM NIL " Common Lisp") " research and use. "
    (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"
     "Between 1984 and 1989, \\clisp\\ became a de facto standard. ")
    :PAR
    "In 1986 X3J13 was formed as a technical working group to produce a draft for an ANSI "
    (:RM NIL " Common Lisp") " standard. Because of the acceptance of "
    (:RM NIL " Common Lisp")
    ", the goals of this group differed from those of the original designers. These new goals included stricter standardization for portability, an object-oriented programming system, a condition system, iteration facilities, and a way to handle large character sets. To accommodate those goals, a new language specification, this document, was developed. "
    :PAR)
   :PAR)
  :PAR
  (:SECTION (:TITLE ("Organization of the Document"))
   (:COMMENT NIL "%%Organization of the Document") :PAR
   "This is a reference document, not a tutorial document. Where possible and convenient, the order of presentation has been chosen so that the more primitive topics precede those that build upon them; however, linear readability has not been a priority. "
   :PAR
   "This document is divided into chapters by topic. Any given chapter might contain conceptual material, dictionary entries, or both. "
   :PAR (:TERM NIL "Defined names")
   " within the dictionary portion of a chapter are grouped in a way that brings related topics into physical proximity. Many such groupings were possible, and no deep significance should be inferred from the particular grouping that was chosen. To see "
   (:TERM NIL "defined names")
   " grouped alphabetically, consult the index. For a complete list of "
   (:TERM NIL "defined names") ", see " (:SECREF NIL :CL-SYMBOLS) ". " :PAR
   "In order to compensate for the sometimes-unordered portions of this document, a glossary has been provided; see "
   (:CHAPREF NIL :GLOSSARY)
   ". The glossary provides connectivity by providing easy access to definitions of terms, and in some cases by providing examples or cross references to additional conceptual material. "
   :PAR
   "For information about notational conventions used in this document, see "
   (:SECREF NIL :DEFINITIONS) ". " :PAR
   "For information about conformance, see " (:SECREF NIL :CONFORMANCE) ". "
   :PAR "For information about extensions and subsets, see "
   (:SECREF NIL :LANGUAGE-EXTENSIONS) " and " (:SECREF NIL :LANGUAGE-SUBSETS)
   ". " :PAR "For information about how " (:TERM NIL "programs")
   " in the language are parsed by the " (:TERM NIL "Lisp reader") ", see "
   (:CHAPREF NIL :SYNTAX) ". " :PAR "For information about how "
   (:TERM NIL "programs") " in the language are " (:TERM NIL "compiled")
   " and " (:TERM NIL "executed") ", see "
   (:CHAPREF NIL :EVALUATION-AND-COMPILATION) ". " :PAR
   "For information about data types, see " (:CHAPREF NIL :TYPES-AND-CLASSES)
   ". Not all " (:TERM NIL "types") " and " (:TERM NIL "classes")
   " are defined in this chapter; many are defined in chapter corresponding to their topic–for example, the numeric types are defined in "
   (:CHAPREF NIL :NUMBERS) ". For a complete list of "
   (:TERM NIL "standardized") " " (:TERM NIL "types") ", see "
   (:FIGREF NIL :STANDARDIZED-ATOMIC-TYPE-SPECS) ". " :PAR
   "For information about general purpose control and data flow, see "
   (:CHAPREF NIL :DATA-AND-CONTROL-FLOW) " or " (:CHAPREF NIL :ITERATION) ". "
   :PAR)
  :PAR
  (:SECTION (:TITLE ("Referenced Publications"))
   (:COMMENT NIL "%Referenced Publications") :PAR
   (:LIST NIL
    (:ITEM NIL " "
     (:BIB (:URL "https://archive.org/details/anatomyoflisp0000alle")
      "The Anatomy of Lisp")
     ", John Allen, McGraw-Hill, Inc., 1978. " :PAR
     (:COMMENT NIL
      " JonL wanted this added.  See entry for HASH-TABLE. -kmp 5-Feb-92"))
    (:ITEM NIL " "
     (:BIB (:ISBN "9780201038033") "The Art of Computer Programming, Volume 3")
     ", Donald E. Knuth, Addison-Wesley Company (Reading, MA), 1973. " :PAR)
    (:ITEM NIL " "
     (:BIB
      (:URL "https://archive.org/details/artofmetaobjectp0000kicz" :DOI
       "10.7551/mitpress/1405.001.0001" :ISBN "0262610744")
      "The Art of the Metaobject Protocol")
     ", Kiczales et al., MIT Press (Cambridge, MA), 1991. " :PAR)
    (:ITEM NIL " “"
     (:BIB (:DOI "10.1145/885631.885632")
      "Common Lisp Object System Specification")
     ",” D. Bobrow, L. DiMichiel, R.P. Gabriel, S. Keene, G. Kiczales, D. Moon, "
     (:I NIL "SIGPLAN Notices") " V23, September, 1988. " :PAR)
    (:ITEM NIL " "
     (:BIB
      (:URL "https://www.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html" :ISBN
       "1-55558-041-6")
      "Common Lisp: The Language")
     ", Guy L. Steele Jr., Digital Press (Burlington, MA), 1984. " :PAR)
    (:ITEM NIL " "
     (:BIB
      (:URL "https://www.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html" :ISBN
       "1-55558-041-6")
      "Common Lisp: The Language, Second Edition")
     ", Guy L. Steele Jr., Digital Press (Bedford, MA), 1990. " :PAR)
    (:ITEM NIL " "
     (:BIB
      (:URL
       "https://www.nhplace.com/kent/Papers/Exceptional-Situations-1990.html")
      "Exceptional Situations in Lisp")
     ", Kent M. Pitman, "
     (:I NIL
      " Proceedings of the First European Conference on the Practical Application of LISP")
     " (EUROPAL '90), Churchill College, Cambridge, England, March 27-29, 1990. "
     :PAR)
    (:ITEM NIL " "
     (:BIB
      (:URL
       "https://softwarepreservation.computerhistory.org/LISP/MIT/nnnfla1-20040122.pdf")
      "Flavors: A Non-Hierarchical Approach to Object-Oriented Programming")
     ", Howard I. Cannon, 1982. " :PAR)
    (:ITEM NIL " "
     (:BIB (:DOI "10.1109/IEEESTD.1985.82928" :ISBN "0-7381-1165-1")
      "IEEE Standard for Binary Floating-Point Arithmetic")
     ", ANSI/IEEE Std 754-1985, Institute of Electrical and Electronics Engineers, Inc. (New York), 1985. "
     :PAR)
    (:ITEM NIL " "
     (:BIB (:DOI "10.1109/IEEESTD.1991.101032" :ISBN "1-55937-125-0")
      "IEEE Standard for the Scheme Programming Language")
     ", IEEE Std 1178-1990, Institute of Electrical and Electronic Engineers, Inc. (New York), 1991. "
     :PAR)
    (:ITEM NIL " "
     (:BIB
      (:URL
       "https://bitsavers.org/pdf/xerox/interlisp/Interlisp_Reference_Manual_Oct_1974.pdf")
      "Interlisp Reference Manual")
     ", Third Revision, Teitelman, Warren, et al, Xerox Palo Alto Research Center (Palo Alto, CA), 1978. "
     :PAR)
    (:ITEM NIL " "
     (:BIB (:URL "https://www.iso.org/standard/13467.html") "ISO 6937/2") ", "
     (:I NIL
      "Information processing—Coded character sets for text communication—Part 2: Latin alphabetic and non-alphabetic graphic characters")
     ", ISO, 1983. " :PAR)
    (:ITEM NIL " "
     (:BIB
      (:URL
       "https://softwarepreservation.computerhistory.org/LISP/book/LISP%201.5%20Programmers%20Manual.pdf"
       :ISBN "0-262-13011-4")
      "Lisp 1.5 Programmer's Manual")
     ", John McCarthy, MIT Press (Cambridge, MA), August, 1962. " :PAR)
    (:ITEM NIL " "
     (:BIB
      (:URL
       "https://archive.org/details/bitsavers_mitcadrWeiManualJan1979_21093856")
      "Lisp Machine Manual")
     ", D.L. Weinreb and D.A. Moon, Artificial Intelligence Laboratory, MIT (Cambridge, MA), July, 1981. "
     :PAR)
    (:ITEM NIL " "
     (:BIB
      (:URL
       "https://softwarepreservation.computerhistory.org/LISP/MIT/Moon-MACLISP_Reference_Manual-Apr_08_1974.pdf")
      "Maclisp Reference Manual, Revision 0")
     ", David A. Moon, Project MAC (Laboratory for Computer Science), MIT (Cambridge, MA), March, 1974. "
     :PAR)
    (:ITEM NIL " “"
     (:BIB
      (:URL
       "https://softwarepreservation.computerhistory.org/LISP/MIT/White-NIL_A_Perspective-1979.pdf")
      "NIL—A Perspective")
     ",” JonL White, " (:I NIL "Macsyma User's Conference") ", 1979. " :PAR)
    (:ITEM NIL " "
     (:BIB
      (:URL "https://archive.org/details/performanceevalu0000gabr" :DOI
       "10.7551/mitpress/5298.001.0001" :ISBN "9780262070935")
      "Performance and Evaluation of Lisp Programs")
     ", Richard P. Gabriel, MIT Press (Cambridge, MA), 1985. " :PAR)
    (:ITEM NIL " “"
     (:BIB (:DOI "10.1145/800142.805368")
      "Principal Values and Branch Cuts in Complex APL")
     ",” Paul Penfield Jr., " (:I NIL "APL 81 Conference Proceedings")
     ", ACM SIGAPL (San Francisco, September 1981), 248-256. Proceedings published as "
     (:I NIL "APL Quote Quad 12") ", 1 (September 1981). " :PAR)
    (:ITEM NIL " "
     (:BIB (:URL "https://www.maclisp.info/pitmanual/")
      "The Revised Maclisp Manual")
     ", Kent M. Pitman, Technical Report 295, Laboratory for Computer Science, MIT (Cambridge, MA), May 1983. "
     :PAR)
    (:ITEM NIL " “"
     (:BIB (:DOI "10.1145/15042.15043")
      "Revised³ Report on the Algorithmic Language Scheme")
     ",” Jonathan Rees and William Clinger (editors), "
     (:I NIL "SIGPLAN Notices") " V21, #12, December, 1986. " :PAR)
    (:ITEM NIL " “"
     (:BIB (:DOI "10.1145/800068.802141") "S-1 Common Lisp Implementation")
     ",” R.A. Brooks, R.P. Gabriel, and G.L. Steele, "
     (:I NIL
      "Conference Record of the 1982 ACM Symposium on Lisp and Functional Programming")
     ", 108-113, 1982. " :PAR)
    (:ITEM NIL " "
     (:BIB
      (:URL "https://archive.org/details/smalltalk80langu00gold" :ISBN
       "0201113716")
      "Smalltalk-80: The Language and its Implementation")
     ", A. Goldberg and D. Robson, Addison-Wesley, 1983. " :PAR)
    (:ITEM NIL " “"
     (:BIB
      (:URL "http://www.reduce-algebra.com/reduce38-docs/sl.pdf" :DOI
       "10.1145/953997.953999")
      "Standard LISP Report")
     ",” J.B. Marti, A.C. Hearn, M.L. Griss, and C. Griss, "
     (:I NIL "SIGPLAN Notices") " V14, #10, October, 1979. " :PAR)
    (:ITEM NIL " "
     (:BIB
      (:URL "https://archive.org/details/webstersthirdne001gove" :ISBN
       "9780877792017")
      "Webster's Third New International Dictionary of the English Language, Unabridged")
     ", Merriam Webster (Springfield, MA), 1986. " :PAR)
    (:ITEM NIL " "
     (:BIB
      (:URL "https://dspace.mit.edu/handle/1721.1/6504" :HANDLE "1721.1/6504")
      "XP: A Common Lisp Pretty Printing System")
     ", R.C. Waters, Memo 1102a, Artificial Intelligence Laboratory, MIT (Cambridge, MA), September 1989. "
     :PAR))
   " ")
  :PAR
  (:SECTION (:TITLE ("Definitions") :TAGS (:DEFINITIONS)) " " :PAR
   (:COMMENT NIL "%Definitions")
   "This section contains notational conventions and definitions of terms used in this manual. "
   :PAR
   (:SUBSECTION (:TITLE ("Notational Conventions")) (:IDXTEXT NIL "notation")
    " " :PAR
    "The following notational conventions are used throughout this document. "
    :PAR (:COMMENT NIL "========================================")
    (:SUBSUBSECTION (:TITLE ("Font Key")) (:IDXTEXT NIL "font key") " " :PAR
     "Fonts are used in this document to convey information. " :PAR
     (:LIST NIL
      (:ITEM NIL (:TERM NIL "name") " " :PAR
       "Denotes a formal term whose meaning is defined in the Glossary. When this font is used, the Glossary definition takes precedence over normal English usage. "
       :PAR "Sometimes a glossary term appears subscripted, as in “"
       (:TERM NIL "whitespace") (:SUB NIL "2")
       ".” Such a notation selects one particular Glossary definition out of several, in this case the second. The subscript notation for Glossary terms is generally used where the context might be insufficient to disambiguate among the available definitions. "
       :PAR)
      (:ITEM NIL (:NEWTERM NIL "name") " " :PAR
       "Denotes the introduction of a formal term locally to the current text. There is still a corresponding glossary entry, and is formally equivalent to a use of “"
       (:TERM NIL "name")
       ",” but the hope is that making such uses conspicuous will save the reader a trip to the glossary in some cases. "
       :PAR)
      (:ITEM NIL (:MISC NIL "name") " " :PAR "Denotes a symbol in the "
       (:PACKREF NIL "common-lisp") " " (:TERM NIL "package")
       ". For information about " (:TERM NIL "case") " conventions, see "
       (:SECREF NIL :CASE-IN-SYMBOLS) ". " :PAR)
      (:ITEM NIL (:TT NIL "name") " " :PAR "Denotes a sample "
       (:TERM NIL "name") " or piece of " (:TERM NIL "code")
       " that a programmer might write in " (:RM NIL " Common Lisp") ". " :PAR
       "This font is also used for certain " (:TERM NIL "standardized")
       " names that are not names of " (:TERM NIL "external symbols")
       " of the " (:PACKREF NIL "common-lisp") " " (:TERM NIL "package")
       ", such as " (:TERM NIL "keywords") (:SUB NIL "1") ", "
       (:TERM NIL "package") " " (:TERM NIL "names") ", and "
       (:TERM NIL "loop keywords") ". " :PAR)
      (:ITEM NIL (:PARAM NIL "name") " " :PAR "Denotes the name of a "
       (:TERM NIL "parameter") " or " (:TERM NIL "value") ". " :PAR
       "In some situations the notation “" (:METAVAR NIL "name") "” ("
       (:I NIL "i.e.")
       ",  the same font, but with surrounding “angle brackets”) is used instead in order to provide better visual separation from surrounding characters. These “angle brackets” are metasyntactic, and never actually appear in program input or output. "
       :PAR))
     " " :PAR)
    (:COMMENT NIL "========================================")
    (:SUBSUBSECTION (:TITLE ("Modified BNF Syntax") :TAGS (:MODIFIED-BNF))
     (:IDXTEXT NIL "bnf key") "  " :PAR
     "This specification uses an extended Backus Normal Form (BNF) to describe the syntax of "
     (:RM NIL " Common Lisp") " " (:TERM NIL "macro forms") " and "
     (:TERM NIL "special forms")
     ". This section discusses the syntax of BNF expressions. " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Splicing in Modified BNF Syntax"))
      "The primary extension used is the following: " :PAR
      (:DISPLAYMATH NIL (:MROW NIL (:MO NIL "⟦") (:MI NIL "O") (:MO NIL "⟧")))
      " " :PAR
      "An expression of this form appears whenever a list of elements is to be spliced into a larger structure and the elements can appear in any order. The symbol "
      (:MATH NIL (:MI NIL "O"))
      " represents a description of the syntax of some number of syntactic elements to be spliced; that description must be of the form "
      :PAR
      (:DISPLAYMATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1")) (:MO NIL "|")
       (:MO NIL "…") (:MO NIL "|") (:MSUB NIL (:MI NIL "O") (:MI NIL "l")))
      " " :PAR (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") "  where each "
      (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MI NIL "i")))
      " can be of the form " (:MATH NIL (:MI NIL "S")) " or of the form "
      (:STAR NIL (:MATH NIL (:MI NIL "S"))) " or of the form "
      (:ONE NIL (:MATH NIL (:MI NIL "S"))) ". "
      (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " The expression "
      (:INTERLEAVE NIL (:MATH NIL (:MI NIL "O")))
      " means that a list of the form " :PAR
      (:DISPLAYMATH NIL (:MO NIL "(")
       (:MSUB NIL (:MI NIL "O") (:MSUB NIL (:MI NIL "i") (:MN NIL "1")))
       (:MO NIL "…")
       (:MSUB NIL (:MI NIL "O") (:MSUB NIL (:MI NIL "i") (:MI NIL "j")))
       (:MO NIL ")") (:MN NIL "1") (:MO NIL "≤") (:MI NIL "j"))
      " " :PAR " is spliced into the enclosing expression, such that if "
      (:MATH NIL (:MI NIL "n") (:MO NIL "≠") (:MI NIL "m")) " and "
      (:MATH NIL (:MN NIL "1") (:MO NIL "≤") (:MI NIL "n") (:MO NIL ",")
       (:MI NIL "m") (:MO NIL "≤") (:MI NIL "j"))
      ", then either "
      (:MATH NIL
       (:MSUB NIL (:MI NIL "O") (:MSUB NIL (:MI NIL "i") (:MI NIL "n")))
       (:MO NIL "≠")
       (:MSUB NIL (:MI NIL "O") (:MSUB NIL (:MI NIL "i") (:MI NIL "m"))))
      " or "
      (:MATH NIL
       (:MSUB NIL (:MI NIL "O") (:MSUB NIL (:MI NIL "i") (:MI NIL "n")))
       (:MO NIL "=")
       (:MSUB NIL (:MI NIL "O") (:MSUB NIL (:MI NIL "i") (:MI NIL "m")))
       (:MO NIL "=") (:MSUB NIL (:MI NIL "Q") (:MI NIL "k")))
      ", where for some "
      (:MATH NIL (:MN NIL "1") (:MO NIL "≤") (:MI NIL "k") (:MO NIL "≤")
       (:MI NIL "n"))
      ", " (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MI NIL "k")))
      " is of the form "
      (:STAR NIL (:MATH NIL (:MSUB NIL (:MI NIL "Q") (:MI NIL "k")))) ". "
      (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " "
      (:COMMENT NIL "Added to accomodate new LOOP BNF. -kmp 1-May-93")
      "Furthermore, for each "
      (:MATH NIL
       (:MSUB NIL (:MI NIL "O") (:MSUB NIL (:MI NIL "i") (:MI NIL "n"))))
      " that is of the form "
      (:ONE NIL (:MATH NIL (:MSUB NIL (:MI NIL "Q") (:MI NIL "k"))))
      ", that element is required to appear somewhere in the list to be spliced. "
      (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " " :PAR
      "For example, the expression " :PAR
      (:TT NIL "(x " (:INTERLEAVE NIL "A | " (:STAR NIL "B") " | C") " y)") " "
      :PAR " means that at most one " (:TT NIL " A") ", any number of "
      (:TT NIL " B") "'s, and at most one " (:TT NIL " C")
      " can occur in any order. It is a description of any of these: " :PAR
      (:CODE NIL " (x y)
 (x B A C y)
 (x A B B B B B C y)
 (x C B A B B B y)
")
      " " :PAR " but not any of these: " :PAR
      (:CODE NIL " (x B B A A C C y)
 (x C B C y)
")
      " " :PAR " In the first case, both " (:TT NIL " A") " and "
      (:TT NIL " C") " appear too often, and in the second case "
      (:TT NIL " C") " appears too often. " :PAR
      (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " "
      (:COMMENT NIL
       " I added this notation to make the LOOP bvl easier to specify. -kmp 29-Apr-93")
      :PAR "The notation "
      (:PLUS NIL
       (:INTERLEAVE NIL (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1")))
        " | " (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "2"))) " | "
        (:MATH NIL (:MO NIL "…"))))
      " adds the additional restriction that at least one item from among the possible choices must be used. For example: "
      :PAR
      (:TT NIL "(x "
       (:PLUS NIL (:INTERLEAVE NIL "A | " (:STAR NIL "B") " | C")) " y)")
      " " :PAR " means that at most one " (:TT NIL " A") ", any number of "
      (:TT NIL " B") "'s, and at most one " (:TT NIL " C")
      " can occur in any order, but that in any case at least one of these options must be selected. It is a description of any of these: "
      :PAR
      (:CODE NIL " (x B y)
 (x B A C y)
 (x A B B B B B C y)
 (x C B A B B B y)
")
      " " :PAR " but not any of these: " :PAR
      (:CODE NIL " (x y)
 (x B B A A C C y)
 (x C B C y)
")
      " " :PAR
      " In the first case, no item was used; in the second case, both "
      (:TT NIL " A") " and " (:TT NIL " C")
      " appear too often; and in the third case " (:TT NIL " C")
      " appears too often. " :PAR "Also, the expression: " :PAR
      (:TT NIL "(x "
       (:INTERLEAVE NIL (:ONE NIL "A") " | " (:ONE NIL "B") " | C") " y)")
      " " :PAR " can generate exactly these and no others: " :PAR
      (:CODE NIL " (x A B C y)
 (x A C B y)
 (x A B y)
 (x B A C y)
 (x B C A y)
 (x B A y)
 (x C A B y)
 (x C B A y)
")
      " " :PAR (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Indirection in Modified BNF Syntax"))
      "An indirection extension is introduced in order to make this new syntax more readable: "
      :PAR (:DISPLAYMATH NIL (:MROW NIL (:MO NIL "↓") (:MI NIL "O"))) " " :PAR
      " If " (:PARAM NIL "O")
      " is a non-terminal symbol, the right-hand side of its definition is substituted for the entire expression "
      (:DOWN NIL "O")
      ". For example, the following BNF is equivalent to the BNF in the previous example: "
      :PAR (:TT NIL "(x " (:INTERLEAVE NIL (:DOWN NIL "O")) " y)") " " :PAR " "
      (:BNF (:NAME "O") (:TT NIL "A") " | " (:STAR NIL (:TT NIL "B")) " | "
       (:TT NIL "C"))
      " " :PAR " " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE
       ("Additional Uses for Indirect Definitions in Modified BNF Syntax"))
      "In some cases, an auxiliary definition in the BNF might appear to be unused within the BNF, but might still be useful elsewhere. For example, consider the following definitions: "
      :PAR
      (:DEF (:KIND "macro") (:NAMES NIL "case")
       (:ARGLIST NIL "keyform "
        (:STAR NIL (:CURLY NIL (:DOWN NIL "normal-clause"))) " "
        (:BRAC NIL (:DOWN NIL "otherwise-clause")))
       (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
      " "
      (:DEF (:KIND "macro") (:NAMES NIL "ccase")
       (:ARGLIST NIL "keyplace "
        (:STAR NIL (:CURLY NIL (:DOWN NIL "normal-clause"))))
       (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
      " "
      (:DEF (:KIND "macro") (:NAMES NIL "ecase")
       (:ARGLIST NIL "keyform "
        (:STAR NIL (:CURLY NIL (:DOWN NIL "normal-clause"))))
       (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
      " " :PAR
      (:BNF (:NAME "normal-clause")
       (:PAREN NIL "keys " (:STAR NIL (:CURLY NIL (:PARAM NIL "form")))))
      " "
      (:BNF (:NAME "otherwise-clause")
       (:PAREN NIL (:CURLY NIL "otherwise | t") " "
        (:STAR NIL (:CURLY NIL (:PARAM NIL "form")))))
      " " (:BNF (:NAME "clause") "normal-clause | otherwise-clause") " " :PAR
      " " :PAR "Here the term “" (:PARAM NIL "clause")
      "” might appear to be “dead” in that it is not used in the BNF. However, the purpose of the BNF is not just to guide parsing, but also to define useful terms for reference in the descriptive text which follows. As such, the term “"
      (:PARAM NIL "clause")
      "” might appear in text that follows, as shorthand for “"
      (:PARAM NIL "normal-clause") " or " (:PARAM NIL "otherwise-clause") ".” "
      :PAR)
     :PAR)
    (:COMMENT NIL "========================================")
    (:SUBSUBSECTION (:TITLE ("Special Symbols"))
     "The special symbols described here are used as a notational convenience within this document, and are part of neither the "
     (:RM NIL " Common Lisp") " language nor its environment. " :PAR
     (:LIST NIL
      (:ITEM NIL "→ " :PAR "This indicates evaluation. For example: " :PAR
       (:CODE NIL " (+ 4 5) → 9 
")
       " This means that the result of evaluating the " (:TERM NIL "form") " "
       (:TT NIL "(+ 4 5)") " is " (:TT NIL "9") ". " :PAR
       (:COMMENT NIL
        "!!! Are the first two of these notations still used?  Maybe remove...")
       "If a " (:TERM NIL "form") " returns " (:TERM NIL "multiple values")
       ", those values might be shown separated by spaces, line breaks, or commas. For example: "
       :PAR
       (:CODE NIL " (truncate 7 5)
→ 1 2
 (truncate 7 5) 
→ 1
   2
 (truncate 7 5)
→ 1, 2
")
       " " :PAR
       "Each of the above three examples is equivalent, and specifies that "
       (:TT NIL "(truncate 7 5)") " returns two values, which are "
       (:TT NIL "1") " and " (:TT NIL "2") ". " :PAR "Some "
       (:TERM NIL "conforming implementations")
       " actually type an arrow (or some other indicator) before showing return values, while others do not. "
       :PAR)
      (:ITEM NIL "OR→ " :PAR
       "The notation “OR→” is used to denote one of several possible alternate results. The example "
       :PAR
       (:CODE NIL " (char-name #\\a)
→ NIL
OR→ \"LOWERCASE-a\"
OR→ \"Small-A\"
OR→ \"LA01\"
")
       " " :PAR "indicates that " (:MISC NIL "nil") ", "
       (:TT NIL "\"LOWERCASE-a\"") ", " (:TT NIL "\"Small-A\"") ", "
       (:TT NIL "\"LA01\"") " are among the possible results of "
       (:TT NIL "(char-name #\\a)")
       "—each with equal preference. Unless explicitly specified otherwise, it should not be assumed that the set of possible results shown is exhaustive. Formally, the above example is equivalent to "
       :PAR
       (:CODE NIL " (char-name #\\a) → " (:TERM NIL "implementation-dependent")
        "
")
       " " :PAR
       "but it is intended to provide additional information to illustrate some of the ways in which it is permitted for implementations to diverge. "
       :PAR)
      (:ITEM NIL "NOT→ " :PAR
       "The notation “NOT→” is used to denote a result which is not possible. This might be used, for example, in order to emphasize a situation where some anticipated misconception might lead the reader to falsely believe that the result might be possible. For example, "
       :PAR
       (:CODE NIL " (function-lambda-expression 
    (funcall #'(lambda (x) #'(lambda () x)) nil))
→ NIL, "
        (:TERM NIL "true") ", NIL
OR→ (LAMBDA () X), "
        (:TERM NIL "true") ", NIL
NOT→ NIL, "
        (:TERM NIL "false") ", NIL
NOT→ (LAMBDA () X), "
        (:TERM NIL "false") ", NIL
")
       " " :PAR (:COMMENT NIL "% 1.2.3 3"))
      (:ITEM NIL "≡ " :PAR "This indicates code equivalence. For example: "
       :PAR
       (:CODE NIL " (gcd x (gcd y z)) ≡ (gcd (gcd x y) z)
")
       " This means that the results and observable side-effects of evaluating the "
       (:TERM NIL "form") " " (:TT NIL "(gcd x (gcd y z))")
       "  are always the same as the results and observable side-effects of "
       (:TT NIL "(gcd (gcd x y) z)") "  for any " (:TT NIL "x") ", "
       (:TT NIL "y") ", and " (:TT NIL "z") ". " :PAR
       (:COMMENT NIL
        "!!! Need to expand on the definition of observable side-effects.")
       :PAR)
      (:ITEM NIL "⊳ " :PAR (:RM NIL " Common Lisp")
       " specifies input and output with respect to a non-interactive stream model. The specific details of how interactive input and output are mapped onto that non-interactive model are "
       (:TERM NIL "implementation-defined") ". " :PAR "For example, "
       (:TERM NIL "conforming implementations")
       " are permitted to differ in issues of how interactive input is terminated. For example, the "
       (:TERM NIL "function") " " (:FUNREF NIL "read")
       " terminates when the final delimiter is typed on a non-interactive stream. In some "
       (:TERM NIL "implementations") ", an interactive call to "
       (:FUNREF NIL "read")
       " returns as soon as the final delimiter is typed, even if that delimiter is not a "
       (:TERM NIL "newline") ". In other " (:TERM NIL "implementations")
       ", a final " (:TERM NIL "newline")
       " is always required. In still other " (:TERM NIL "implementations")
       ", there might be a command which “activates” a buffer full of input without the command itself being visible on the program's input stream. "
       :PAR
       "In the examples in this document, the notation “⊳” precedes lines where interactive input and output occurs. Within such a scenario, “"
       (:IN NIL "this notation") "” notates user input. " :PAR
       "For example, the notation " :PAR
       (:CODE NIL " (+ 1 (print (+ (sqrt (read)) (sqrt (read)))))
⊳ "
        (:IN NIL "9 16 ") "
⊳ 7
→ 8
")
       " " :PAR "shows an interaction in which “"
       (:TT NIL "(+ 1 (print (+ (sqrt (read)) (sqrt (read)))))") "” is a "
       (:TERM NIL "form") " to be " (:TERM NIL "evaluated") ", “"
       (:TT NIL "9 16 ") "” is interactive input, “" (:TT NIL "7")
       "” is interactive output, and “" (:TT NIL "8") "” is the "
       (:TERM NIL "value") " " (:TERM NIL "yielded") " from the "
       (:TERM NIL "evaluation") ". " :PAR
       "The use of this notation is intended to disguise small differences in interactive input and output behavior between "
       (:TERM NIL "implementations") ". " :PAR
       "Sometimes, the non-interactive stream model calls for a "
       (:TERM NIL "newline") ". How that " (:TERM NIL "newline")
       " character is interactively entered is an "
       (:TERM NIL "implementation-defined")
       " detail of the user interface, but in that case, either the notation “"
       (:ANG NIL "Newline") "” or “↩” might be used. " :PAR
       (:CODE NIL " (progn (format t \"~&Who? \") (read-line))
⊳ Who? "
        (:IN NIL "Fred, Mary, and Sally↩") "
→ \"Fred, Mary, and Sally\", "
        (:TERM NIL "false") "
")
       " " :PAR))
     " " :PAR)
    (:COMMENT NIL "========================================")
    (:SUBSUBSECTION (:TITLE ("Objects with Multiple Notations")) "Some "
     (:TERM NIL "objects") " in " (:RM NIL " Common Lisp")
     " can be notated in more than one way. In such situations, the choice of which notation to use is technically arbitrary, but conventions may exist which convey a “point of view” or “sense of intent.” "
     :PAR (:COMMENT NIL "----------------------------------------")
     (:SUBSUBSUBSECTION (:TITLE ("Case in Symbols") :TAGS (:CASE-IN-SYMBOLS))
      (:IDXTEXT NIL "case in symbol names") "  " :PAR "While "
      (:TERM NIL "case") " is significant in the process of "
      (:TERM NIL "interning") " a " (:TERM NIL "symbol") ", the "
      (:TERM NIL "Lisp reader")
      ", by default, attempts to canonicalize the case of a "
      (:TERM NIL "symbol") " prior to interning; see "
      (:SECREF NIL :READTABLE-CASE-READ-EFFECT) ". As such, case in "
      (:TERM NIL "symbols")
      " is not, by default, significant. Throughout this document, except as explicitly noted otherwise, the case in which a "
      (:TERM NIL "symbol") " appears is not significant; that is, "
      (:TT NIL "HELLO") ", " (:TT NIL "Hello") ", " (:TT NIL "hElLo") ", and "
      (:TT NIL "hello")
      " are all equivalent ways to denote a symbol whose name is "
      (:TT NIL "\"HELLO\"") ". " :PAR "The characters " (:TERM NIL "backslash")
      " and " (:TERM NIL "vertical-bar") " are used to explicitly quote the "
      (:TERM NIL "case") " and other parsing-related "
      (:COMMENT NIL
       "was \"attributes\" but now that attributes has formaly meaning, "
       "not sure if it's too limiting here, so use a general term. -kmp 26-Jan-92")
      "aspects of characters. As such, the notations " (:TT NIL "|hello|")
      " and " (:TT NIL "\\h\\e\\l\\l\\o")
      " are equivalent ways to refer to a symbol whose name is "
      (:TT NIL "\"hello\"") ", and which is " (:TERM NIL "distinct")
      " from any symbol whose name is " (:TT NIL "\"HELLO\"") ". " :PAR "The "
      (:TERM NIL "symbols") " that correspond to " (:RM NIL " Common Lisp") " "
      (:TERM NIL "defined names") " have " (:TERM NIL "uppercase")
      " names even though their names generally appear in "
      (:TERM NIL "lowercase") " in this document. " :PAR)
     (:COMMENT NIL "----------------------------------------")
     (:SUBSUBSUBSECTION (:TITLE ("Numbers")) "Although "
      (:RM NIL " Common Lisp")
      " provides a variety of ways for programs to manipulate the input and output radix for rational numbers, all numbers in this document are in decimal notation unless explicitly noted otherwise. "
      :PAR)
     (:COMMENT NIL "----------------------------------------")
     (:SUBSUBSUBSECTION (:TITLE ("Use of the Dot Character"))
      "The dot appearing by itself in an " (:TERM NIL "expression") " such as "
      :PAR
      (:TT NIL "(" (:PARAM NIL "item1") " " (:PARAM NIL "item2") " . "
       (:PARAM NIL "tail") ")")
      " " :PAR "means that " (:PARAM NIL "tail") " represents a "
      (:TERM NIL "list") " of " (:TERM NIL "objects")
      " at the end of a list. For example, " :PAR (:TT NIL "(A B C . (D E F))")
      " " :PAR "is notationally equivalent to: " :PAR (:TT NIL "(A B C D E F)")
      " " :PAR "Although " (:TERM NIL "dot")
      " is a valid constituent character in a symbol, no "
      (:TERM NIL "standardized") " " (:TERM NIL "symbols")
      " contain the character " (:TERM NIL "dot")
      ", so a period that follows a reference to a " (:TERM NIL "symbol")
      " at the end of a sentence in this document should always be interpreted as a period and never as part of the "
      (:TERM NIL "symbol") "'s " (:TERM NIL "name")
      ". For example, within this document, a sentence such as “This sample sentence refers to the symbol "
      (:FUNREF NIL "car") ".” "
      (:COMMENT NIL
       " confusion about fonts below made more consistent w/previous section"
       " on symbol names  --sjl 13 Mar 1992"
       "refers to a function named ``\\funref{car}'' with three letters in its name,"
       "and never to a four-letter symbol ``\\funref{car.}''")
      "refers to a symbol whose name is " (:TT NIL "\"CAR\"")
      " (with three letters), and never to a four-letter symbol "
      (:TT NIL "\"CAR.\"") " " :PAR)
     (:COMMENT NIL "----------------------------------------")
     (:SUBSUBSUBSECTION (:TITLE ("NIL")) (:IDXTERM NIL "nil")
      (:IDXTERM NIL "()") (:IDXREF NIL "nil") " " :PAR (:MISC NIL "nil")
      " has a variety of meanings. It is a " (:TERM NIL "symbol") " in the "
      (:PACKREF NIL "common-lisp") " " (:TERM NIL "package") " with the "
      (:TERM NIL "name") " " (:TT NIL "\"NIL\"") ", it is "
      (:TERM NIL "boolean") " (and " (:TERM NIL "generalized boolean") ") "
      (:TERM NIL "false") ", it is the " (:TERM NIL "empty list")
      ", and it is the " (:TERM NIL "name") " of the " (:TERM NIL "empty type")
      " (a " (:TERM NIL "subtype") " of all " (:TERM NIL "types") "). " :PAR
      "Within " (:RM NIL " Common Lisp") ", " (:MISC NIL "nil")
      " can be notated interchangeably as either " (:TT NIL "NIL") " or "
      (:TT NIL "()")
      ". By convention, the choice of notation offers a hint as to which of its many roles it is playing. "
      :PAR
      (:TABLE (:NAME ("Notations for NIL"))
       (:ROW NIL (:CELL NIL (:B NIL "For Evaluation?"))
        (:CELL NIL (:B NIL "Notation"))
        (:CELL NIL (:B NIL "Typically Implied Role")))
       (:ROW (:RULE T :GAP 4) (:CELL NIL " Yes") (:CELL NIL (:TT NIL "nil"))
        (:CELL NIL "use as a " (:TERM NIL "boolean") "."))
       (:ROW NIL (:CELL NIL " Yes") (:CELL NIL (:TT NIL "'nil"))
        (:CELL NIL "use as a " (:TERM NIL "symbol") "."))
       (:ROW NIL (:CELL NIL " Yes") (:CELL NIL (:TT NIL "'()"))
        (:CELL NIL "use as an " (:TERM NIL "empty list")))
       (:ROW NIL (:CELL NIL " No") (:CELL NIL (:TT NIL "nil"))
        (:CELL NIL "use as a " (:TERM NIL "symbol") " or "
         (:TERM NIL "boolean") "."))
       (:ROW NIL (:CELL NIL " No") (:CELL NIL (:TT NIL "()"))
        (:CELL NIL "use as an " (:TERM NIL "empty list") ".")))
      " " :PAR "Within this document only, " (:MISC NIL "nil")
      " is also sometimes notated as " (:TERM NIL "false")
      " to emphasize its role as a " (:TERM NIL "boolean") ". " :PAR
      "For example: " :PAR
      (:CODE NIL " (print ())                          ;avoided
 (defun three nil 3)                 ;avoided 
 '(nil nil)                          ;list of two symbols
 '(() ())                            ;list of empty lists
 (defun three () 3)                  ;Emphasize empty parameter list.
 (append '() '()) → ()              ;Emphasize use of empty lists
 (not nil) → "
       (:TERM NIL "true") "                   ;Emphasize use as Boolean false
 (get 'nil 'color)                   ;Emphasize use as a symbol
")
      " " :PAR "A " (:TERM NIL "function") " is sometimes said to “be "
      (:TERM NIL "false") "” or “be " (:TERM NIL "true")
      "” in some circumstance. Since no " (:TERM NIL "function")
      " object can be the same as " (:MISC NIL "nil") " and all "
      (:TERM NIL "function") " " (:TERM NIL "objects") " represent "
      (:TERM NIL "true") " when viewed as " (:TERM NIL "booleans")
      ", it would be meaningless to say that the " (:TERM NIL "function")
      " was literally " (:TERM NIL "false")
      " and uninteresting to say that it was literally " (:TERM NIL "true")
      ". Instead, these phrases are just traditional alternative ways of saying that the "
      (:TERM NIL "function") " “returns " (:TERM NIL "false") "” or “returns "
      (:TERM NIL "true") ",” respectively. " :PAR)
     :PAR)
    :PAR (:COMMENT NIL "========================================")
    (:SUBSUBSECTION (:TITLE ("Designators") :TAGS (:DESIGNATORS)) " " :PAR "A "
     (:NEWTERM NIL "designator") " is an " (:TERM NIL "object")
     " that denotes another " (:TERM NIL "object") ". " :PAR
     (:COMMENT NIL "!!! RPG: Not clear.  Rewrite.") "Where a "
     (:TERM NIL "parameter") " of an " (:TERM NIL "operator")
     " is described as a " (:TERM NIL "designator") ", the description of the "
     (:TERM NIL "operator")
     " is written in a way that assumes that the value of the "
     (:TERM NIL "parameter") " is the denoted " (:TERM NIL "object")
     "; that is, that the " (:TERM NIL "parameter")
     " is already of the denoted " (:TERM NIL "type")
     ". (The specific nature of the " (:TERM NIL "object") " denoted by a “"
     (:METAVAR NIL "type") " " (:TERM NIL "designator") "” or a “"
     (:TERM NIL "designator") " for a " (:METAVAR NIL "type")
     "” can be found in the Glossary entry for “" (:METAVAR NIL "type") " "
     (:TERM NIL "designator") ".”) " :PAR "For example, “" (:MISC NIL "nil")
     "” and “the " (:TERM NIL "value") " of " (:VARREF NIL "*standard-output*")
     "” are operationally indistinguishable as "
     (:TERM NIL "stream designators") ". Similarly, the " (:TERM NIL "symbol")
     " " (:TT NIL "foo") " and the " (:TERM NIL "string") " "
     (:TT NIL "\"FOO\"") " are operationally indistinguishable as "
     (:TERM NIL "string designators") ". " :PAR
     "Except as otherwise noted, in a situation where the denoted "
     (:TERM NIL "object") " might be used multiple times, it is "
     (:TERM NIL "implementation-dependent") " whether the "
     (:TERM NIL "object")
     " is coerced only once or whether the coercion occurs each time the "
     (:TERM NIL "object") " must be used. " :PAR "For example, "
     (:FUNREF NIL "mapcar") " receives a " (:TERM NIL "function designator")
     " as an argument, and its description is written as if this were simply a function. In fact, it is "
     (:TERM NIL "implementation-dependent") " whether the "
     (:TERM NIL "function designator")
     " is coerced right away or whether it is carried around internally in the form that it was given as an "
     (:TERM NIL "argument")
     " and re-coerced each time it is needed. In most cases, "
     (:TERM NIL "conforming programs")
     " cannot detect the distinction, but there are some pathological situations (particularly those involving self-redefining or mutually-redefining functions) which do conform and which can detect this difference. The following program is a "
     (:TERM NIL "conforming program")
     ", but might or might not have portably correct results, depending on whether its correctness depends on one or the other of the results: "
     :PAR
     (:CODE NIL " (defun add-some (x) 
   (defun add-some (x) (+ x 2))
   (+ x 1)) → ADD-SOME
 (mapcar 'add-some '(1 2 3 4))
→ (2 3 4 5)
OR→ (2 4 5 6)
")
     " " :PAR
     "In a few rare situations, there may be a need in a dictionary entry to refer to the "
     (:TERM NIL "object") " that was the original " (:TERM NIL "designator")
     " for a " (:TERM NIL "parameter") ". Since naming the "
     (:TERM NIL "parameter") " would refer to the denoted "
     (:TERM NIL "object") ", the phrase “the " (:METAVAR NIL "parameter-name")
     " " (:TERM NIL "designator") "” can be used to refer to the "
     (:TERM NIL "designator") " which was the " (:TERM NIL "argument")
     " from which the " (:TERM NIL "value") " of "
     (:METAVAR NIL "parameter-name") " was computed. " :PAR)
    (:COMMENT NIL "========================================")
    (:SUBSUBSECTION (:TITLE ("Nonsense Words")) (:IDXCODE NIL "foo")
     (:IDXCODE NIL "bar") (:IDXCODE NIL "baz") (:IDXCODE NIL "quux") " " :PAR
     "When a word having no pre-attached semantics is required ("
     (:I NIL "e.g.")
     ",  in an example), it is common in the Lisp community to use one of the words “foo,” “bar,” “baz,” and “quux.” For example, in "
     :PAR
     (:CODE NIL " (defun foo (x) (+ x 1))
")
     " the use of the name " (:TT NIL "foo")
     " is just a shorthand way of saying “please substitute your favorite name here.” "
     :PAR
     "These nonsense words have gained such prevalance of usage, that it is commonplace for newcomers to the community to begin to wonder if there is an attached semantics which they are overlooking—there is not. "
     :PAR)
    :PAR)
   :PAR
   (:COMMENT NIL "!!! Barmar thinks \\secref\\InterpretingDictionaryEntries"
    "    should move to someplace around here.")
   :PAR
   (:SUBSECTION (:TITLE ("Error Terminology") :TAGS (:ERROR-TERMS))
    (:IDXTEXT NIL "error terminology") "  " :PAR
    "Situations in which errors might, should, or must be signaled are described in the standard. The wording used to describe such situations is intended to have precise meaning. The following list is a glossary of those meanings. "
    :PAR
    (:LIST NIL
     (:ITEM NIL (:B NIL "Safe code") (:IDXTERM NIL "safe") " " :PAR "This is "
      (:TERM NIL "code") " processed with the " (:DECLREF NIL "safety")
      " optimization at its highest setting (" (:TT NIL "3") "). "
      (:DECLREF NIL "safety")
      " is a lexical property of code. The phrase “the function " (:TT NIL "F")
      " should signal an error” means that if " (:TT NIL "F")
      " is invoked from code processed with the highest "
      (:DECLREF NIL "safety") " optimization, an error is signaled. It is "
      (:TERM NIL "implementation-dependent") " whether " (:TT NIL "F")
      " or the calling code signals the error. " :PAR)
     (:ITEM NIL (:B NIL "Unsafe code") (:IDXTERM NIL "unsafe") " " :PAR
      "This is code processed with lower safety levels. " :PAR
      "Unsafe code might do error checking. Implementations are permitted to treat all code as safe code all the time. "
      :PAR (:COMMENT NIL "% 1.2.4 6" "% 1.2.4 9" "% 1.2.4 10"))
     (:ITEM NIL (:B NIL "An error is signaled") (:IDXTERM NIL "signal")
      (:IDXTEXT NIL "is signaled") (:IDXTEXT NIL "must signal") " " :PAR
      "This means that an error is signaled in both safe and unsafe code. "
      (:TERM NIL "Conforming code")
      " may rely on the fact that the error is signaled in both safe and unsafe code. Every implementation is required to detect the error in both safe and unsafe code. For example, “an error is signaled if "
      (:FUNREF NIL "unexport") " is given a " (:TERM NIL "symbol") " not "
      (:TERM NIL "accessible") " in the " (:TERM NIL "current package") ".” "
      :PAR "If an explicit error type is not specified, the default is "
      (:TYPEREF NIL "error") ". " :PAR)
     (:ITEM NIL (:B NIL "An error should be signaled") (:IDXTERM NIL "signal")
      (:IDXTEXT NIL "should signal") " " :PAR
      "This means that an error is signaled in safe code, and an error might be signaled in unsafe code. "
      (:TERM NIL "Conforming code")
      " may rely on the fact that the error is signaled in safe code. Every implementation is required to detect the error at least in safe code. When the error is not signaled, the “consequences are undefined” (see below). For example, “"
      (:FUNREF NIL "+") " should signal an error of " (:TERM NIL "type") " "
      (:TYPEREF NIL "type-error") " if any argument is not of "
      (:TERM NIL "type") " " (:TYPEREF NIL "number") ".” " :PAR)
     (:ITEM NIL (:B NIL "Should be prepared to signal an error")
      (:IDXTERM NIL "signal") (:IDXTEXT NIL "prepared to signal") " " :PAR
      "This is similar to “should be signaled” except that it does not imply that `extra effort' has to be taken on the part of an "
      (:TERM NIL "operator")
      " to discover an erroneous situation if the normal action of that "
      (:TERM NIL "operator")
      " can be performed successfully with only `lazy' checking. An "
      (:TERM NIL "implementation")
      " is always permitted to signal an error, but even in "
      (:TERM NIL "safe") " " (:TERM NIL "code")
      ", it is only required to signal the error when failing to signal it might lead to incorrect results. In "
      (:TERM NIL "unsafe") " " (:TERM NIL "code")
      ", the consequences are undefined. " :PAR "For example, defining that “"
      (:FUNREF NIL "find") " should be prepared to signal an error of "
      (:TERM NIL "type") " " (:TYPEREF NIL "type-error") " if its second "
      (:TERM NIL "argument") " is not a " (:TERM NIL "proper list")
      "” does not imply that an error is always signaled. The "
      (:TERM NIL "form") " " :PAR
      (:CODE NIL " (find 'a '(a b . c))
")
      " " :PAR "must either signal an error of " (:TERM NIL "type") " "
      (:TYPEREF NIL "type-error") " in " (:TERM NIL "safe") " "
      (:TERM NIL "code") ", else return " (:TT NIL "A") ". In "
      (:TERM NIL "unsafe") " " (:TERM NIL "code")
      ", the consequences are undefined. By contrast, " :PAR
      (:CODE NIL " (find 'd '(a b . c))
")
      " " :PAR "must signal an error of " (:TERM NIL "type") " "
      (:TYPEREF NIL "type-error") " in " (:TERM NIL "safe") " "
      (:TERM NIL "code") ". In " (:TERM NIL "unsafe") " " (:TERM NIL "code")
      ", the consequences are undefined. Also, " :PAR
      (:CODE NIL " (find 'd '#1=(a b . #1#))
")
      " " :PAR "in " (:TERM NIL "safe code") " might return " (:MISC NIL "nil")
      " (as an " (:TERM NIL "implementation-defined")
      " extension), might never return, or might signal an error of "
      (:TERM NIL "type") " " (:TYPEREF NIL "type-error") ". In "
      (:TERM NIL "unsafe") " " (:TERM NIL "code")
      ", the consequences are undefined. " :PAR
      "Typically, the “should be prepared to signal” terminology is used in type checking situations where there are efficiency considerations that make it impractical to detect errors that are not relevant to the correct operation of the "
      (:TERM NIL "operator") ". " :PAR)
     (:ITEM NIL (:B NIL "The consequences are unspecified")
      (:IDXTEXT NIL "consequences") (:IDXTEXT NIL "unspecified consequences")
      " " :PAR
      "This means that the consequences are unpredictable but harmless. Implementations are permitted to specify the consequences of this situation. No "
      (:TERM NIL "conforming code")
      " may depend on the results or effects of this situation, and all "
      (:TERM NIL "conforming code")
      " is required to treat the results and effects of this situation as unpredictable but harmless. For example, “if the second argument to "
      (:FUNREF NIL "shared-initialize")
      " specifies a name that does not correspond to any " (:TERM NIL "slots")
      " " (:TERM NIL "accessible") " in the " (:TERM NIL "object")
      ", the results are unspecified.” " :PAR (:COMMENT NIL "% 1.2.4 4"))
     (:ITEM NIL (:B NIL "The consequences are undefined")
      (:IDXTEXT NIL "consequences") (:IDXTEXT NIL "undefined consequences") " "
      :PAR
      "This means that the consequences are unpredictable. The consequences may range from harmless to fatal. No "
      (:TERM NIL "conforming code") " may depend on the results or effects. "
      (:TERM NIL "Conforming code")
      " must treat the consequences as unpredictable. In places where the words “must,” “must not,” or “may not” are used, then “the consequences are undefined” if the stated requirement is not met and no specific consequence is explicitly stated. An implementation is permitted to signal an error in this case. "
      :PAR "For example: “Once a name has been declared by "
      (:MACREF NIL "defconstant")
      " to be constant, any further assignment or binding of that variable has undefined consequences.” "
      :PAR)
     (:ITEM NIL (:B NIL "An error might be signaled") (:IDXTERM NIL "signal")
      (:IDXTEXT NIL "might signal") " " :PAR
      "This means that the situation has undefined consequences; however, if an error is signaled, it is of the specified "
      (:TERM NIL "type") ". For example, “" (:FUNREF NIL "open")
      " might signal an error of " (:TERM NIL "type") " "
      (:TYPEREF NIL "file-error") ".” " :PAR)
     (:ITEM NIL (:B NIL "The return values are unspecified")
      (:IDXTEXT NIL "unspecified values") " " :PAR
      "This means that only the number and nature of the return values of a "
      (:TERM NIL "form")
      " are not specified. However, the issue of whether or not any side-effects or transfer of control occurs is still well-specified. "
      :PAR
      "A program can be well-specified even if it uses a function whose returns values are unspecified. For example, even if the return values of some function "
      (:TT NIL "F") " are unspecified, an expression such as "
      (:TT NIL "(length (list (F)))")
      " is still well-specified because it does not rely on any particular aspect of the value or values returned by "
      (:TT NIL "F") ". " :PAR)
     (:ITEM NIL
      (:B NIL "Implementations may be extended to cover this situation")
      (:IDXTEXT NIL "extensions") " " :PAR "This means that the "
      (:TERM NIL "situation") " has undefined consequences; however, a "
      (:TERM NIL "conforming implementation")
      " is free to treat the situation in a more specific way. For example, an "
      (:TERM NIL "implementation")
      " might define that an error is signaled, or that an error should be signaled, or even that a certain well-defined non-error behavior occurs. "
      :PAR (:COMMENT NIL "% 1.2.4 5") "No " (:TERM NIL "conforming code")
      " may depend on the consequences of such a " (:TERM NIL "situation")
      "; all " (:TERM NIL "conforming code")
      " must treat the consequences of the situation as undefined. "
      (:TERM NIL "Implementations")
      " are required to document how the situation is treated. " :PAR
      "For example, “implementations may be extended to define other type specifiers to have a corresponding "
      (:TERM NIL "class") ".” " :PAR)
     (:ITEM NIL (:B NIL "Implementations are free to extend the syntax")
      (:IDXTEXT NIL "extensions") " " :PAR
      "This means that in this situation implementations are permitted to define unambiguous extensions to the syntax of the "
      (:TERM NIL "form") " being described. No " (:TERM NIL "conforming code")
      " may depend on this extension. Implementations are required to document each such extension. All "
      (:TERM NIL "conforming code")
      " is required to treat the syntax as meaningless. The standard might disallow certain extensions while allowing others. For example, “no implementation is free to extend the syntax of "
      (:MACREF NIL "defclass") ".” " :PAR
      (:ISSUE NIL "ERROR-TERMINOLOGY-WARNING:MIGHT") " ")
     (:ITEM NIL (:B NIL "A warning might be issued") (:IDXTEXT NIL "warning")
      " " :PAR "This means that " (:TERM NIL "implementations")
      " are encouraged to issue a warning if the context is appropriate ("
      (:I NIL "e.g.") ",  when compiling). However, a "
      (:TERM NIL "conforming implementation")
      " is not required to issue a warning. "
      (:ENDISSUE NIL "ERROR-TERMINOLOGY-WARNING:MIGHT") " " :PAR
      (:COMMENT NIL
       " This means that a warning might be issued, as described in \\funref{warn},"
       " in both safe and unsafe code when the situation is detected."
       " \\term{Conforming code} can rely on the fact that a warning will be issued in"
       " both safe and unsafe code when the situation is detected.  Every"
       " implementation is required to detect this situation in both safe and"
       " unsafe code when the situation is detected. The presence of a warning"
       " will in no way alter the value returned by the \\term{form} that"
       " caused the situation to occur. For example, ``a warning is issued if a"
       " declaration specifier is not one of those defined in the description"
       " of \\misc{declare} and has not been declared in a \\declref{declaration}"
       " declaration.''" "                        "
       " \\itemitem{\\b{A warning should be issued}}" " "
       " This means that a warning might be issued. \\term{Conforming code} must not"
       " rely on the fact that a warning will be issued. If the situation is"
       " detected, a warning might be issued.  The presence of a warning will"
       " in no way alter the value returned by the \\term{form} that caused the"
       " situation to occur. For example, ``a warning should be issued if a"
       " variable declared \\declref{ignore} is ever referenced or is also declared"
       " \\declref{special}, or if a variable is lexical, never referenced, and not"
       " declared \\declref{ignore}.''")
      :PAR))
    " " :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Sections Not Formally Part Of This Standard") :TAGS
     (:REMOVABLE-TEXT))
    " " :PAR
    (:COMMENT NIL
     "% A lot of this seems to be just rationale.  Does it really need to"
     "% be included here?  --sjl 13 Mar 92")
    :PAR
    "Front matter and back matter, such as the “Table of Contents,” “Index,” “Figures,” “Credits,” and “Appendix” are not considered formally part of this standard, so that we retain the flexibility needed to update these sections even at the last minute without fear of needing a formal vote to change those parts of the document. These items are quite short and very useful, however, and it is not recommended that they be removed even in an abridged version of this document. "
    :PAR
    "Within the concept sections, subsections whose names begin with the words “Note” or “Notes” or “Example” or “Examples” are provided for illustration purposes only, and are not considered part of the standard. "
    :PAR
    "An attempt has been made to place these sections last in their parent section, so that they could be removed without disturbing the contiguous numbering of the surrounding sections in order to produce a document of smaller size. "
    :PAR
    "Likewise, the “Examples” and “Notes” sections in a dictionary entry are not considered part of the standard and could be removed if necessary. "
    :PAR
    "Nevertheless, the examples provide important clarifications and consistency checks for the rest of the material, and such abridging is not recommended unless absolutely unavoidable. "
    :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Interpreting Dictionary Entries") :TAGS
     (:INTERPRETING-DICTIONARY-ENTRIES))
    " " :PAR "The dictionary entry for each " (:TERM NIL "defined name")
    " is partitioned into sections. Except as explicitly indicated otherwise below, each section is introduced by a label identifying that section. The omission of a section implies that the section is either not applicable, or would provide no interesting information. "
    :PAR
    "This section defines the significance of each potential section in a dictionary entry. "
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("The “Affected By” Section of a Dictionary Entry")) "For an "
     (:TERM NIL "operator")
     ", anything that can affect the side effects of or " (:TERM NIL "values")
     " returned by the " (:TERM NIL "operator") ". " :PAR "For a "
     (:TERM NIL "variable") ", anything that can affect the "
     (:TERM NIL "value") " of the " (:TERM NIL "variable") " including "
     (:TERM NIL "functions") " that bind or assign it. " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("The “Arguments” Section of a Dictionary Entry"))
     "This information describes the syntax information of entries such as those for "
     (:TERM NIL "declarations") " and special " (:TERM NIL "expressions")
     " which are never " (:TERM NIL "evaluated") " as " (:TERM NIL "forms")
     ", and so do not return " (:TERM NIL "values") ". " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("The “Arguments and Values” Section of a Dictionary Entry"))
     "An English language description of what " (:TERM NIL "arguments") " the "
     (:TERM NIL "operator") " accepts and what " (:TERM NIL "values")
     " it returns, including information about defaults for "
     (:TERM NIL "parameters") " corresponding to omittable "
     (:TERM NIL "arguments") " (such as " (:TERM NIL "optional parameters")
     " and " (:TERM NIL "keyword parameters") "). For "
     (:TERM NIL "special operators") " and " (:TERM NIL "macros") ", their "
     (:TERM NIL "arguments") " are not " (:TERM NIL "evaluated")
     " unless it is explicitly stated in their descriptions that they are "
     (:TERM NIL "evaluated") ". " :PAR
     (:COMMENT NIL
      "% I added the first part of this sentence as editorial discretion "
      "% since I believe we strongly feel that this is not specified otherwise,"
      "% but we want to avoid an unexpected conflict in case it is. -kmp 9-May-94")
     "Except as explicitly specified otherwise, "
     (:COMMENT NIL
      "% Added per X3J13 at May 4-5, 1994 meeting.  -kmp 9-May-94")
     "the consequences are undefined if these type restrictions are violated. "
     :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("The “Binding Types Affected” Section of a Dictionary Entry"))
     "This information alerts the reader to the kinds of "
     (:TERM NIL "bindings")
     " that might potentially be affected by a declaration. Whether in fact any particular such "
     (:TERM NIL "binding")
     " is actually affected is dependent on additional factors as well. See the “Description” section of the declaration in question for details. "
     :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("The “Class Precedence List” Section of a Dictionary Entry"))
     "This appears in the dictionary entry for a " (:TERM NIL "class")
     ", and contains an ordered list of the " (:TERM NIL "classes")
     " defined by " (:RM NIL " Common Lisp") " that must be in the "
     (:TERM NIL "class precedence list") " of this " (:TERM NIL "class") ". "
     :PAR "It is permissible for other (" (:TERM NIL "implementation-defined")
     ") " (:TERM NIL "classes") " to appear in the "
     (:TERM NIL "implementation") "'s " (:TERM NIL "class precedence list")
     " for the " (:TERM NIL "class") ". " :PAR "It is permissible for either "
     (:TYPEREF NIL "standard-object") " or " (:TYPEREF NIL "structure-object")
     " to appear in the " (:TERM NIL "implementation") "'s "
     (:TERM NIL "class precedence list") "; for details, see "
     (:SECREF NIL :TYPE-RELATIONSHIPS) ". " :PAR
     "Except as explicitly indicated otherwise somewhere in this specification, no additional "
     (:TERM NIL "standardized") " " (:TERM NIL "classes") " may appear in the "
     (:TERM NIL "implementation") "'s " (:TERM NIL "class precedence list")
     ". " :PAR "By definition of the relationship between "
     (:TERM NIL "classes") " and " (:TERM NIL "types") ", the "
     (:TERM NIL "classes") " listed in this section are also "
     (:TERM NIL "supertypes") " of the " (:TERM NIL "type") " denoted by the "
     (:TERM NIL "class") ". " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Dictionary Entries for Type Specifiers") :TAGS
      (:TYPE-SPEC-ENTRIES))
     " " :PAR "The " (:TERM NIL "atomic type specifiers") " are those "
     (:TERM NIL "defined names") " listed in "
     (:FIGREF NIL :STANDARDIZED-ATOMIC-TYPE-SPECS)
     ". Such dictionary entries are of kind “Class,” “Condition Type,” “System Class,” or “Type.” A description of how to interpret a "
     (:TERM NIL "symbol") " naming one of these " (:TERM NIL "types") " or "
     (:TERM NIL "classes") " as an " (:TERM NIL "atomic type specifier")
     " is found in the “Description” section of such dictionary entries. " :PAR
     "The " (:TERM NIL "compound type specifiers") " are those "
     (:TERM NIL "defined names") " listed in "
     (:FIGREF NIL :STANDARDIZED-COMPOUND-TYPE-SPEC-NAMES)
     ". Such dictionary entries are of kind “Class,” “System Class,” “Type,” or “Type Specifier.” A description of how to interpret as a "
     (:TERM NIL "compound type specifier") " a " (:TERM NIL "list") " whose "
     (:TERM NIL "car") " is such a " (:TERM NIL "symbol")
     " is found in the “Compound Type Specifier Kind,” “Compound Type Specifier Syntax,” “Compound Type Specifier Arguments,” and “Compound Type Specifier Description” sections of such dictionary entries. "
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE
       ("The “Compound Type Specifier Kind” Section of a Dictionary Entry"))
      "An “abbreviating” " (:TERM NIL "type specifier")
      " is one that describes a " (:TERM NIL "subtype")
      " for which it is in principle possible to enumerate the "
      (:TERM NIL "elements")
      ", but for which in practice it is impractical to do so. " :PAR
      "A “specializing” " (:TERM NIL "type specifier")
      " is one that describes a " (:TERM NIL "subtype") " by restricting the "
      (:TERM NIL "type") " of one or more components of the "
      (:TERM NIL "type") ", such as " (:TERM NIL "element type") " or "
      (:TERM NIL "complex part type") ". " :PAR "A “predicating” "
      (:TERM NIL "type specifier") " is one that describes a "
      (:TERM NIL "subtype") " containing only those " (:TERM NIL "objects")
      " that satisfy a given " (:TERM NIL "predicate") ". " :PAR
      "A “combining” " (:TERM NIL "type specifier") " is one that describes a "
      (:TERM NIL "subtype")
      " in a compositional way, using combining operations (such as “and,” “or,” and “not”) on other "
      (:TERM NIL "types") ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE
       ("The “Compound Type Specifier Syntax” Section of a Dictionary Entry"))
      "This information about a " (:TERM NIL "type")
      " describes the syntax of a " (:TERM NIL "compound type specifier")
      " for that " (:TERM NIL "type") ". " :PAR "Whether or not the "
      (:TERM NIL "type") " is acceptable as an "
      (:TERM NIL "atomic type specifier") " is not represented here; see "
      (:SECREF NIL :TYPE-SPEC-ENTRIES) ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE
       ("The “Compound Type Specifier Arguments” Section of a Dictionary Entry"))
      "This information describes " (:TERM NIL "type")
      " information for the structures defined in the “Compound Type Specifier Syntax” section. "
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE
       ("The “Compound Type Specifier Description” Section of a Dictionary Entry"))
      "This information describes the meaning of the structures defined in the “Compound Type Specifier Syntax” section. "
      :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("The “Constant Value” Section of a Dictionary Entry"))
     "This information describes the unchanging " (:TERM NIL "type") " and "
     (:TERM NIL "value") " of a " (:TERM NIL "constant variable") ". " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("The “Description” Section of a Dictionary Entry"))
     "A summary of the " (:TERM NIL "operator")
     " and all intended aspects of the " (:TERM NIL "operator")
     ", but does not necessarily include all the fields referenced below it (“Side Effects,” “Exceptional Situations,” "
     (:I NIL "etc.") ".) " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("The “Examples” Section of a Dictionary Entry"))
     "Examples of use of the " (:TERM NIL "operator")
     ". These examples are not considered part of the standard; see "
     (:SECREF NIL :REMOVABLE-TEXT) ". " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("The “Exceptional Situations” Section of a Dictionary Entry"))
     "Three kinds of information may appear here: "
     (:LIST NIL
      (:ITEM NIL " Situations that are detected by the " (:TERM NIL "function")
       " and formally signaled. ")
      (:ITEM NIL " Situations that are handled by the " (:TERM NIL "function")
       ". ")
      (:ITEM NIL " Situations that may be detected by the "
       (:TERM NIL "function") ". "))
     " This field does not include conditions that could be signaled by "
     (:TERM NIL "functions") " passed to and called by this "
     (:TERM NIL "operator")
     " as arguments or through dynamic variables, nor by executing subforms of this operator if it is a "
     (:TERM NIL "macro") " or " (:TERM NIL "special operator") ". " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("The “Initial Value” Section of a Dictionary Entry"))
     "This information describes the initial " (:TERM NIL "value") " of a "
     (:TERM NIL "dynamic variable") ". Since this variable might change, see "
     (:TERM NIL "type") " restrictions in the “Value Type” section. " :PAR)
    :PAR (:ISSUE NIL "DOCUMENTATION-FUNCTION-TANGLED:REQUIRE-ARGUMENT") " "
    (:SUBSUBSECTION
     (:TITLE ("The “Argument Precedence Order” Section of a Dictionary Entry"))
     "This information describes the " (:TERM NIL "argument precedence order")
     ". If it is omitted, the " (:TERM NIL "argument precedence order")
     " is the default (left to right). " :PAR)
    (:ENDISSUE NIL "DOCUMENTATION-FUNCTION-TANGLED:REQUIRE-ARGUMENT") " " :PAR
    (:SUBSUBSECTION
     (:TITLE ("The “Method Signature” Section of a Dictionary Entry"))
     "The description of a " (:TERM NIL "generic function")
     " includes descriptions of the " (:TERM NIL "methods")
     " that are defined on that " (:TERM NIL "generic function")
     " by the standard. A method signature is used to describe the "
     (:TERM NIL "parameters") " and " (:TERM NIL "parameter specializers")
     " for each " (:TERM NIL "method") ". " (:TERM NIL "Methods")
     " defined for the " (:TERM NIL "generic function")
     " must be of the form described by the " (:TERM NIL "method") " "
     (:TERM NIL "signature") ". " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "F")
      (:ARGLIST NIL (:PAREN NIL (:PARAM NIL "x") " " (:PARAM NIL "class")) " "
       (:PAREN NIL (:PARAM NIL "y") " t") " " (:KEYWORD NIL " &optional") " "
       (:PARAM NIL "z") " " (:KEYWORD NIL " &key") " " (:PARAM NIL "k")))
     " " :PAR " This " (:TERM NIL "signature")
     " indicates that this method on the " (:TERM NIL "generic function") " "
     (:B NIL "F") " has two " (:TERM NIL "required parameters") ": "
     (:PARAM NIL "x") ", which must be a " (:TERM NIL "generalized instance")
     " of the " (:TERM NIL "class") " " (:PARAM NIL "class") "; and "
     (:PARAM NIL "y") ", which can be any " (:TERM NIL "object") " ("
     (:I NIL "i.e.") ",  a " (:TERM NIL "generalized instance") " of the "
     (:TERM NIL "class") " " (:TYPEREF NIL "t") "). In addition, there is an "
     (:TERM NIL "optional parameter") " " (:PARAM NIL "z") " and a "
     (:TERM NIL "keyword parameter") " " (:PARAM NIL "k") ". This "
     (:TERM NIL "signature") " also indicates that this method on "
     (:TT NIL "F") " is a " (:TERM NIL "primary method") " and has no "
     (:TERM NIL "qualifiers") ". " :PAR "For each " (:TERM NIL "parameter")
     ", the " (:TERM NIL "argument")
     " supplied must be in the intersection of the " (:TERM NIL "type")
     " specified in the description of the corresponding "
     (:TERM NIL "generic function") " and the " (:TERM NIL "type")
     " given in the " (:TERM NIL "signature") " of some " (:TERM NIL "method")
     " (including not only those " (:TERM NIL "methods")
     " defined in this specification, but also "
     (:TERM NIL "implementation-defined") " or user-defined "
     (:TERM NIL "methods") " in situations where the definition of such "
     (:TERM NIL "methods") " is permitted). " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("The “Name” Section of a Dictionary Entry"))
     "This section introduces the dictionary entry. It is not explicitly labeled. It appears preceded and followed by a horizontal bar. "
     :PAR "In large print at left, the " (:TERM NIL "defined name")
     " appears; if more than one " (:TERM NIL "defined name")
     " is to be described by the entry, all such " (:TERM NIL "names")
     " are shown separated by commas. " :PAR
     "In somewhat smaller italic print at right is an indication of what kind of dictionary entry this is. Possible values are: "
     :PAR (:COMMENT NIL " This list believed correct as of 23-Oct-91 -kmp")
     (:LIST NIL
      (:ITEM NIL (:I NIL "Accessor") " " :PAR "This is an "
       (:TERM NIL "accessor") " " (:TERM NIL "function") ". " :PAR)
      (:ITEM NIL (:I NIL "Class") " " :PAR "This is a " (:TERM NIL "class")
       ". " :PAR)
      (:ITEM NIL (:I NIL "Condition Type") " " :PAR "This is a "
       (:TERM NIL "subtype") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "condition") ". "
       (:COMMENT NIL
        " We don't need to constrain how implementations define condition types."
        " --sjl 13 Mar 92" "\\term{Condition types} are defined with"
        "\\macref{define-condition}, not \\macref{defclass}.")
       :PAR)
      (:ITEM NIL (:I NIL "Constant Variable") " " :PAR "This is a "
       (:TERM NIL "constant variable") ". " :PAR)
      (:ITEM NIL (:I NIL "Declaration") " " :PAR "This is a "
       (:TERM NIL "declaration identifier") ". " :PAR)
      (:ITEM NIL (:I NIL "Function") " " :PAR "This is a "
       (:TERM NIL "function") ". " :PAR)
      (:ITEM NIL (:I NIL "Local Function") " " :PAR "This is a "
       (:TERM NIL "function")
       " that is defined only lexically within the scope of some other "
       (:TERM NIL "macro form") ". " :PAR)
      (:ITEM NIL (:I NIL "Local Macro") " " :PAR "This is a "
       (:TERM NIL "macro")
       " that is defined only lexically within the scope of some other "
       (:TERM NIL "macro form") ". " :PAR)
      (:ITEM NIL (:I NIL "Macro") " " :PAR "This is a " (:TERM NIL "macro")
       ". " :PAR)
      (:ITEM NIL (:I NIL "Restart") " " :PAR "This is a " (:TERM NIL "restart")
       ". " :PAR)
      (:ITEM NIL (:I NIL "Special Operator") " " :PAR "This is a "
       (:TERM NIL "special operator") ". " :PAR)
      (:ITEM NIL (:I NIL "Standard Generic Function") " " :PAR "This is a "
       (:TERM NIL "standard generic function") ". " :PAR)
      (:ITEM NIL (:I NIL "Symbol") " " :PAR "This is a " (:TERM NIL "symbol")
       " that is specially recognized in some particular situation, such as the syntax of a "
       (:TERM NIL "macro") ". " :PAR)
      (:ITEM NIL (:I NIL "System Class") " " :PAR "This is like "
       (:TERM NIL "class") ", but it identifies a " (:TERM NIL "class")
       " that is potentially a " (:TERM NIL "built-in class") ". (No "
       (:TERM NIL "class") " is actually required to be a "
       (:TERM NIL "built-in class") ".) " :PAR)
      (:ITEM NIL (:I NIL "Type") " " :PAR "This is an "
       (:TERM NIL "atomic type specifier")
       ", and depending on information for each particular entry, may subject to form other "
       (:TERM NIL "type specifiers") ". " :PAR)
      (:ITEM NIL (:I NIL "Type Specifier") " " :PAR "This is a "
       (:TERM NIL "defined name") " that is not an "
       (:TERM NIL "atomic type specifier")
       ", but that can be used in constructing valid "
       (:TERM NIL "type specifiers") ". " :PAR)
      (:ITEM NIL (:I NIL "Variable") " " :PAR "This is a "
       (:TERM NIL "dynamic variable") ". " :PAR))
     " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("The “Notes” Section of a Dictionary Entry"))
     "Information not found elsewhere in this description which pertains to this "
     (:TERM NIL "operator")
     ". Among other things, this might include cross reference information, code equivalences, stylistic hints, implementation hints, typical uses. This information is not considered part of the standard; any "
     (:TERM NIL "conforming implementation") " or "
     (:TERM NIL "conforming program")
     " is permitted to ignore the presence of this information. " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("The “Pronunciation” Section of a Dictionary Entry"))
     "This offers a suggested pronunciation for " (:TERM NIL "defined names")
     " so that people not in verbal communication with the original designers can figure out how to pronounce words that are not in normal English usage. This information is advisory only, and is not considered part of the standard. "
     (:COMMENT NIL
      " Added for Ida, who wondered why these didn't occur for every entry.")
     "For brevity, it is only provided for entries with names that are specific to "
     (:RM NIL " Common Lisp") " and would not be found in "
     (:BIB
      (:URL "https://archive.org/details/webstersthirdne001gove" :ISBN
       "9780877792017")
      "Webster's Third New International Dictionary of the English Language, Unabridged")
     ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("The “See Also” Section of a Dictionary Entry"))
     "List of references to other parts of this standard that offer information relevant to this "
     (:TERM NIL "operator") ". This list is not part of the standard. " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("The “Side Effects” Section of a Dictionary Entry"))
     "Anything that is changed as a result of the evaluation of the "
     (:TERM NIL "form") " containing this " (:TERM NIL "operator") ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("The “Supertypes” Section of a Dictionary Entry"))
     "This appears in the dictionary entry for a " (:TERM NIL "type")
     ", and contains a list of the " (:TERM NIL "standardized") " "
     (:TERM NIL "types") " that must be " (:TERM NIL "supertypes") " of this "
     (:TERM NIL "type") ". " :PAR
     (:COMMENT NIL
      "!!! Is this needed? Mail sent to `barmar' and `barrett' with subject \"supertypes\""
      "    asking for opinions. -kmp 10-Feb-92")
     "In " (:TERM NIL "implementations") " where there is a corresponding "
     (:TERM NIL "class") ", the order of the " (:TERM NIL "classes") " in the "
     (:TERM NIL "class precedence list")
     " is consistent with the order presented in this section. " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("The “Syntax” Section of a Dictionary Entry"))
     "This section describes how to use the " (:TERM NIL "defined name")
     " in code. The “Syntax” description for a " (:TERM NIL "generic function")
     " describes the " (:TERM NIL "lambda list") " of the "
     (:TERM NIL "generic function")
     " itself, while the “Method Signatures” describe the "
     (:TERM NIL "lambda lists") " of the defined " (:TERM NIL "methods")
     ". The “Syntax” description for an " (:TERM NIL "ordinary function")
     ", a " (:TERM NIL "macro") ", or a " (:TERM NIL "special operator")
     " describes its " (:TERM NIL "parameters") ". " :PAR "For example, an "
     (:TERM NIL "operator") " description might say: " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "F")
      (:ARGLIST NIL "x y " (:KEYWORD NIL " &optional") " z "
       (:KEYWORD NIL " &key") " k"))
     " " :PAR " This description indicates that the function " (:B NIL "F")
     " has two required parameters, " (:PARAM NIL "x") " and " (:PARAM NIL "y")
     ". In addition, there is an optional parameter " (:PARAM NIL "z")
     " and a keyword parameter " (:PARAM NIL "k") ". " :PAR "For "
     (:TERM NIL "macros") " and " (:TERM NIL "special operators")
     ", syntax is given in modified BNF notation; see "
     (:SECREF NIL :MODIFIED-BNF) ". For " (:TERM NIL "functions") " a "
     (:TERM NIL "lambda list") " is given. " (:COMMENT NIL "Added per Barmar:")
     "In both cases, however, the outermost parentheses are omitted, and default value information is omitted. "
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Special “Syntax” Notations for Overloaded Operators"))
      "If two descriptions exist for the same operation but with different numbers of arguments, then the extra arguments are to be treated as optional. For example, this pair of lines: "
      :PAR
      (:DEF (:KIND "function") (:NAMES NIL "file-position")
       (:ARGLIST NIL "stream") (:VALUES NIL "position"))
      " "
      (:DEF (:KIND "function") (:NAMES NIL "file-position")
       (:ARGLIST NIL "stream position-spec") (:VALUES NIL "success-p"))
      " " :PAR " is operationally equivalent to this line: " :PAR
      (:DEF (:KIND "function") (:NAMES NIL "file-position")
       (:ARGLIST NIL "stream " (:KEYWORD NIL " &optional") " position-spec")
       (:VALUES NIL "result"))
      " " :PAR
      " and differs only in that it provides on opportunity to introduce different names for "
      (:TERM NIL "parameter") " and " (:TERM NIL "values")
      " for each case. The separated (multi-line) notation is used when an "
      (:TERM NIL "operator") " is overloaded in such a way that the "
      (:TERM NIL "parameters")
      " are used in different ways depending on how many "
      (:TERM NIL "arguments") " are supplied (" (:I NIL "e.g.") ",  for the "
      (:TERM NIL "function") " " (:FUNREF NIL "/")
      ") or the return values are different in the two cases (" (:I NIL "e.g.")
      ",  for the " (:TERM NIL "function") " " (:FUNREF NIL "file-position")
      "). " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Naming Conventions for Rest Parameters"))
      "Within this specification, if the name of a "
      (:TERM NIL "rest parameter")
      " is chosen to be a plural noun, use of that name in "
      (:PARAM NIL "parameter") " font refers to the " (:TERM NIL "list")
      " to which the " (:TERM NIL "rest parameter")
      " is bound. Use of the singular form of that name in "
      (:PARAM NIL "parameter") " font refers to an " (:TERM NIL "element")
      " of that " (:TERM NIL "list") ". " :PAR
      "For example, given a syntax description such as: " :PAR
      (:DEF (:KIND "function") (:NAMES NIL "F")
       (:ARGLIST NIL (:KEYWORD NIL " &rest") " " (:PARAM NIL "arguments")))
      " " :PAR " it is appropriate to refer either to the "
      (:TERM NIL "rest parameter") " named " (:PARAM NIL "arguments")
      " by name, or to one of its elements by speaking of “an "
      (:PARAM NIL "argument") ",” “some " (:PARAM NIL "argument") ",” “each "
      (:PARAM NIL "argument") "” " (:I NIL "etc.") ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Requiring Non-Null Rest Parameters in the “Syntax” Section"))
      "In some cases it is useful to refer to all arguments equally as a single aggregation using a "
      (:TERM NIL "rest parameter")
      " while at the same time requiring at least one argument. A variety of imperative and declarative means are available in "
      (:TERM NIL "code")
      " for expressing such a restriction, however they generally do not manifest themselves in a "
      (:TERM NIL "lambda list")
      ". For descriptive purposes within this specification, " :PAR
      (:DEF (:KIND "function") (:NAMES NIL "F")
       (:ARGLIST NIL (:KEYWORD NIL " &rest") " " (:PLUS NIL "arguments")))
      " " :PAR " means the same as " :PAR
      (:DEF (:KIND "function") (:NAMES NIL "F")
       (:ARGLIST NIL (:KEYWORD NIL " &rest") " arguments"))
      " " :PAR
      " but introduces the additional requirement that there be at least one "
      (:PARAM NIL "argument") ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Return values in the “Syntax” Section"))
      "An evaluation arrow “→” precedes a list of " (:TERM NIL "values")
      " to be returned. For example: " :PAR
      (:DEF (:KIND "function") (:NAMES NIL "F") (:ARGLIST NIL "a b c")
       (:VALUES NIL "x"))
      " " :PAR " indicates that " (:TT NIL "F")
      " is an operator that has three " (:TERM NIL "required parameters") " ("
      (:I NIL "i.e.") ",  " (:PARAM NIL "a") ", " (:PARAM NIL "b") ", and "
      (:PARAM NIL "c") ") and that returns one " (:TERM NIL "value") " ("
      (:I NIL "i.e.") ",  " (:PARAM NIL "x") "). If more than one "
      (:TERM NIL "value") " is returned by an operator, the "
      (:TERM NIL "names") " of the " (:TERM NIL "values")
      " are separated by commas, as in: " :PAR
      (:DEF (:KIND "function") (:NAMES NIL "F") (:ARGLIST NIL "a b c")
       (:VALUES NIL "x, y, z"))
      " " :PAR
      (:SUBSUBSUBSUBSECTION
       (:TITLE ("No Arguments or Values in the “Syntax” Section")) "If no "
       (:TERM NIL "arguments") " are permitted, or no " (:TERM NIL "values")
       " are returned, a special notation is used to make this more visually apparent. For example, "
       :PAR
       (:DEF (:KIND "function") (:NAMES NIL "F")
        (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments")))
        (:VALUES NIL (:ANG NIL "no " (:TERM NIL "values"))))
       " " :PAR "indicates that " (:TT NIL "F")
       " is an operator that accepts no " (:TERM NIL "arguments")
       " and returns no " (:TERM NIL "values") ". " :PAR)
      :PAR
      (:SUBSUBSUBSUBSECTION
       (:TITLE ("Unconditional Transfer of Control in the “Syntax” Section"))
       "Some " (:TERM NIL "operators")
       " perform an unconditional transfer of control, and so never have any return values. Such "
       (:TERM NIL "operators")
       " are notated using a notation such as the following: " :PAR
       (:DEF (:KIND "function" :NO-RETURN T) (:NAMES NIL "F")
        (:ARGLIST NIL "a b c"))
       " " :PAR)
      :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("The “Valid Context” Section of a Dictionary Entry"))
     "This information is used by dictionary entries such as “Declarations” in order to restrict the context in which the declaration may appear. "
     :PAR "A given “Declaration” might appear in a " (:TERM NIL "declaration")
     " (" (:I NIL "i.e.") ",  a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "), a " (:TERM NIL "proclamation") " ("
     (:I NIL "i.e.") ",  a " (:MACREF NIL "declaim") " or "
     (:FUNREF NIL "proclaim") " " (:TERM NIL "form") "), or both. " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("The “Value Type” Section of a Dictionary Entry"))
     "This information describes any " (:TERM NIL "type") " restrictions on a "
     (:TERM NIL "dynamic variable") ". " :PAR
     (:COMMENT NIL
      "% I added the first part of this sentence as editorial discretion "
      "% since I believe we strongly feel that this is not specified otherwise,"
      "% but we want to avoid an unexpected conflict in case it is. -kmp 9-May-94")
     "Except as explicitly specified otherwise, "
     (:COMMENT NIL
      "% Added per X3J13 at May 4-5, 1994 meeting.  -kmp 9-May-94")
     "the consequences are undefined if this type restriction is violated. "
     :PAR)
    :PAR))
  :PAR
  (:SECTION (:TITLE ("Conformance") :TAGS (:CONFORMANCE)) " " :PAR
   (:COMMENT NIL "%Compliance")
   "This standard presents the syntax and semantics to be implemented by a "
   (:TERM NIL "conforming implementation")
   " (and its accompanying documentation). In addition, it imposes requirements on "
   (:TERM NIL "conforming programs") ". " :PAR
   (:SUBSECTION (:TITLE ("Conforming Implementations")) "A "
    (:NEWTERM NIL "conforming implementation")
    " shall adhere to the requirements outlined in this section. " :PAR
    (:SUBSUBSECTION
     (:TITLE ("Required Language Features") :TAGS (:REQ-LANG-FEATURES)) " "
     :PAR "A " (:TERM NIL "conforming implementation")
     " shall accept all features (including deprecated features) of the language specified in this standard, with the meanings defined in this standard. "
     :PAR "A " (:TERM NIL "conforming implementation")
     " shall not require the inclusion of substitute or additional language elements in code in order to accomplish a feature of the language that is specified in this standard. "
     :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Documentation of Implementation-Dependent Features")) "A "
     (:TERM NIL "conforming implementation")
     " shall be accompanied by a document that provides a definition of all "
     (:TERM NIL "implementation-defined")
     " aspects of the language defined by this specification. " :PAR
     "In addition, a " (:TERM NIL "conforming implementation")
     " is encouraged (but not required) to document items in this standard that are identified as "
     (:TERM NIL "implementation-dependent")
     ", although in some cases such documentation might simply identify the item as “undefined.” "
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Documentation of Extensions")) "A "
     (:TERM NIL "conforming implementation")
     " shall be accompanied by a document that separately describes any features accepted by the "
     (:TERM NIL "implementation")
     " that are not specified in this standard, but that do not cause any ambiguity or contradiction when added to the language standard. Such extensions shall be described as being “extensions to "
     (:RM NIL " Common Lisp") " as specified by ANSI "
     (:METAVAR NIL "standard number") ".” " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Treatment of Exceptional Situations")) "A "
     (:TERM NIL "conforming implementation")
     " shall treat exceptional situations in a manner consistent with this specification. "
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Resolution of Apparent Conflicts in Exceptional Situations"))
      "If more than one passage in this specification appears to apply to the same situation but in conflicting ways, the passage that appears to describe the situation in the most specific way (not necessarily the passage that provides the most constrained kind of error detection) takes precedence. "
      :PAR
      (:SUBSUBSUBSUBSECTION
       (:TITLE
        ("Examples of Resolution of Apparent Conflicts in Exceptional Situations"))
       "Suppose that function " (:TT NIL "foo") " is a member of a set "
       (:MATH NIL (:MI NIL "S")) " of " (:TERM NIL "functions")
       " that operate on numbers. Suppose that one passage states that an error must be signaled if any "
       (:TERM NIL "function") " in " (:MATH NIL (:MI NIL "S"))
       " is ever given an argument of " (:TT NIL "17")
       ". Suppose that an apparently conflicting passage states that the consequences are undefined if "
       (:TT NIL "foo") " receives an argument of " (:TT NIL "17")
       ". Then the second passage (the one specifically about " (:TT NIL "foo")
       ") would dominate because the description of the situational context is the most specific, and it would not be required that "
       (:TT NIL "foo") " signal an error on an argument of " (:TT NIL "17")
       " even though other functions in the set " (:MATH NIL (:MI NIL "S"))
       " would be required to do so. " :PAR)
      (:COMMENT NIL "			 in Exceptional Situations}") :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Conformance Statement")) "A "
     (:TERM NIL "conforming implementation")
     " shall produce a conformance statement as a consequence of using the implementation, or that statement shall be included in the accompanying documentation. If the implementation conforms in all respects with this standard, the conformance statement shall be "
     :PAR
     (:LIST NIL
      (:ITEM NIL " “" (:METAVAR NIL "Implementation")
       " conforms with the requirements of ANSI "
       (:METAVAR NIL "standard number") "” "))
     " " :PAR "If the " (:TERM NIL "implementation")
     " conforms with some but not all of the requirements of this standard, then the conformance statement shall be "
     :PAR
     (:LIST NIL
      (:ITEM NIL " “" (:METAVAR NIL "Implementation")
       " conforms with the requirements of ANSI "
       (:METAVAR NIL "standard number") " with the following exceptions: "
       (:METAVAR NIL
        "reference to or complete list of the requirements of the standard with which the implementation does not conform")
       ".” "))
     " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Conforming Programs"))
    (:IDXTERM NIL "conforming program") (:IDXTERM NIL "conforming code") " "
    :PAR
    "Code conforming with the requirements of this standard shall adhere to the following: "
    :PAR
    (:LIST NIL
     (:ITEM NIL "1. " (:TERM NIL "Conforming code")
      " shall use only those features of the language syntax and semantics that are either specified in this standard or defined using the extension mechanisms specified in the standard. "
      (:COMMENT NIL
       "% This biz about syntactic extension seems overly specific for this context. -kmp 23-Oct-91"
       " 		      (\\eg \\term{symbol macros}, " " 			   \\term{macros}, "
       " %%Compiler macros do not extend syntax.  "
       " %%They only provide an alternate implementation of existing syntax. -kmp 11-Mar-91"
       " %\\term{compiler macros}," " 		       and \\term{reader macros}).")
      :PAR
      (:COMMENT NIL
       "% Rewritten per X3J13 and Boyer/Kaufmann/Moore #2 (second public review)."
       "% -kmp 9-May-94"
       " \\itemitem{2.} \\term{Conforming code} shall not rely on any particular"
       "               interpretation of \\term{implementation-dependent} features."))
     (:ITEM NIL "2. " (:TERM NIL "Conforming code") " may use "
      (:TERM NIL "implementation-dependent")
      " features and values, but shall not rely upon any particular interpretation of these features and values other than those that are discovered by the execution of "
      (:TERM NIL "code") ". " :PAR)
     (:ITEM NIL "3. " (:TERM NIL "Conforming code")
      " shall not depend on the consequences of undefined or unspecified situations. "
      :PAR)
     (:ITEM NIL "4. " (:TERM NIL "Conforming code")
      " does not use any constructions that are prohibited by the standard. "
      :PAR)
     (:ITEM NIL "5. " (:TERM NIL "Conforming code")
      " does not depend on extensions included in an implementation. "))
    " " :PAR
    (:COMMENT NIL
     " This material is all covered in more detail in chapter 3 (in the section"
     " on constraints on externalizable objects).  There is no need to repeat"
     " the material here.  --sjl 13 Mar 92"
     "\\beginsubsubsection{Conforming Programs in Files}"
     "A \\term{conforming program} whose source text is in a \\term{compilation unit}"
     "must satisfy the following constraints:" "\\beginlist" "\\item{\\bull} "
     "  Any \\term{top level form} in a \\term{file} that alters "
     "  \\thevalueof{*package*} at compile time must also alter it at load time"
     "  to a \\term{similar} \\term{package}." "\\item{\\bull}"
     "  If the first \\term{non-atomic} \\term{top level form} in the \\term{file}"
     "  is not a call to \\macref{in-package}, then the \\term{current package}"
     "  at load time must be a \\term{similar} \\term{package} to the one in effect at "
     "  compile time." "\\item{\\bull}"
     "  Any \\term{symbol} in the source text \\term{accessible} in the"
     "  \\term{current package} at compile time and whose \\term{home package} "
     "  is the package $P$ must be \\term{accessible} in the \\term{current package} "
     "  at load time and must also be \\term{accessible} in a package \\term{similar} to $P$."
     "  " "\\item{\\bull} "
     "  Any \\term{symbol} in the source text that is an \\term{external symbol} "
     "  of the package $P$ at compile time must be an \\term{external symbol} "
     "  of package \\term{similar} to $P$ at load time." "\\endlist"
     "In \\term{situations} in which any of these conditions does not hold,"
     "an \\term{implementation} might signal an error "
     "or might extend \\clisp\\ to handle the situation."
     "\\endsubsubsection%{Conforming Programs in Files}")
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Use of Implementation-Defined Language Features")) "Note that "
     (:TERM NIL "conforming code") " may rely on particular "
     (:TERM NIL "implementation-defined")
     " values or features. Also note that the requirements for "
     (:TERM NIL "conforming code") " and "
     (:TERM NIL "conforming implementations")
     " do not require that the results produced by conforming code always be the same when processed by a "
     (:TERM NIL "conforming implementation")
     ". The results may be the same, or they may differ. " :PAR
     (:COMMENT NIL
      "% Moved to its own section (see below) per Dalton #1 (1st Public Review) "
      "% by X3J13 vote May 4-5, 1994 (after 2nd public review)."
      "% -kmp 9-May-94"
      " %!!! Barmar wonders if this is really the right place for the next sentence."
      " \\term{Portable code} is written using only \\term{standard characters}.")
     :PAR
     (:COMMENT NIL
      "Informally, the basic rules for conformance are as follows:"
      "1. Conforming code is defined in terms of its structure,"
      "and not in terms of its results and side effects."
      "2. Conforming code is written using only the syntax specified in the standard,"
      "or syntax defined using the syntax extension mechanisms (macros and reader"
      "macros) specified in the standard."
      "3. Conforming code is written in only the sequence specified in the standard."
      "4. Conforming code is written using only the functions, macros,"
      "special forms, variables, and constants specified in the standard."
      "5. Conforming implementations provide the functionality and behavior "
      "specified in the standard."
      "The definitions of all names and syntax that aren't specified in the "
      "standard and aren't provided by the implementation must accompany the code. "
      "6. Conformance is not machine-checkable.")
     :PAR
     "Conforming code may run in all conforming implementations, but might have allowable "
     (:TERM NIL "implementation-defined")
     " behavior that makes it non-portable code. "
     (:COMMENT NIL
      "Insofar as we allow options in the standard this will be true.")
     "For example, the following are examples of " (:TERM NIL "forms")
     " that are conforming, but that might return different "
     (:TERM NIL "values") " in different implementations: " :PAR
     (:CODE NIL " (evenp most-positive-fixnum) → "
      (:TERM NIL "implementation-dependent") "
 (random) → "
      (:TERM NIL "implementation-dependent") "
 (> lambda-parameters-limit 93) → "
      (:TERM NIL "implementation-dependent") "
 (char-name #\\A) → "
      (:TERM NIL "implementation-dependent") "
")
     " " :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Use of Read-Time Conditionals") :TAGS
       (:READ-TIME-CONDITIONALS))
      " " :PAR
      (:COMMENT NIL "The following is added to clarify a question from RWK."
       "Mail sent to him and Quinquevirate noting that this interpretation was made."
       " -kmp 10-Apr-91")
      :PAR "Use of " (:TT NIL "#+") " and " (:TT NIL "#-")
      " does not automatically disqualify a program from being conforming. A program which uses "
      (:TT NIL "#+") " and " (:TT NIL "#-")
      " is considered conforming if there is no set of " (:TERM NIL "features")
      " in which the program would not be conforming. Of course, "
      (:TERM NIL "conforming programs")
      " are not necessarily working programs. The following program is conforming: "
      :PAR
      (:CODE NIL "(defun foo ()
  #+ACME (acme:initialize-something)
  (print 'hello-there))
")
      " " :PAR
      "However, this program might or might not work, depending on whether the presence of the feature "
      (:TT NIL "ACME") " really implies that a function named "
      (:TT NIL "acme:initialize-something")
      " is present in the environment. In effect, using " (:TT NIL "#+") " or "
      (:TT NIL "#-") " in a " (:TERM NIL "conforming program")
      " means that the variable " (:VARREF NIL "*features*")
      (:IDXREF NIL "*features*")
      " becomes just one more piece of input data to that program. Like any other data coming into a program, the programmer is responsible for assuring that the program does not make unwarranted assumptions on the basis of input data. "
      :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Character Set for Portable Code"))
     (:TERM NIL "Portable code") " is written using only "
     (:TERM NIL "standard characters") ". " :PAR)
    :PAR))
  :PAR
  (:SECTION (:TITLE ("Language Extensions") :TAGS (:LANGUAGE-EXTENSIONS)) " "
   (:COMMENT NIL "%Language Extensions") :PAR
   (:ISSUE NIL "EXTENSIONS-POSITION:DOCUMENTATION") " " :PAR
   "A language extension is any documented "
   (:TERM NIL "implementation-defined") " behavior of a "
   (:TERM NIL "defined name")
   " in this standard that varies from the behavior described in this standard, or a documented consequence of a situation that the standard specifies as undefined, unspecified, or extendable by the implementation. For example, if this standard says that “the results are unspecified,” an extension would be to specify the results. "
   :PAR
   (:REVIEWER NIL
    "Barmar: This contradicts previous definitions of conforming code.")
   " If the correct behavior of a program depends on the results provided by an extension, only implementations with the same extension will execute the program correctly. Note that such a program might be non-conforming. Also, if this standard says that “an implementation may be extended,” a conforming, but possibly non-portable, program can be written using an extension. "
   :PAR
   "An implementation can have extensions, provided they do not alter the behavior of conforming code and provided they are not explicitly prohibited by this standard. "
   :PAR (:ENDISSUE NIL "EXTENSIONS-POSITION:DOCUMENTATION") " " :PAR
   "The term “extension” refers only to extensions available upon startup. An implementation is free to allow or prohibit redefinition of an extension. "
   :PAR
   "The following list contains specific guidance to implementations concerning certain types of extensions. "
   (:LIST NIL
    (:ITEM NIL (:B NIL "Extra return values") " " :PAR
     (:ISSUE NIL "EXTRA-RETURN-VALUES:NO")
     " An implementation must return exactly the number of return values specified by this standard unless the standard specifically indicates otherwise. "
     (:ENDISSUE NIL "EXTRA-RETURN-VALUES:NO") " " :PAR
     (:COMMENT NIL
      "\\itemitem{\\b{Function behavior on non-standard data types}}"
      "An implementation does not define the behavior of \\term{functions}"
      "on \\term{types} not explicitly permitted by this standard. ")
     :PAR)
    (:ITEM NIL (:B NIL "Unsolicited messages") " " :PAR
     (:ISSUE NIL "UNSOLICITED-MESSAGES:NOT-TO-SYSTEM-USER-STREAMS") " " :PAR
     "No output can be produced by a function other than that specified in the standard or due to the signaling of "
     (:TERM NIL "conditions") " detected by the function. " :PAR
     "Unsolicited output, such as garbage collection notifications and autoload heralds, should not go directly to the "
     (:TERM NIL "stream") " that is the value of a " (:TERM NIL "stream")
     " variable defined in this standard, but can go indirectly to "
     (:TERM NIL "terminal I/O") " by using a " (:TERM NIL "synonym stream")
     " to " (:VARREF NIL "*terminal-io*") ". " :PAR
     "Progress reports from such functions as " (:FUNREF NIL "load") " and "
     (:FUNREF NIL "compile")
     " are considered solicited, and are not covered by this prohibition. "
     :PAR (:ENDISSUE NIL "UNSOLICITED-MESSAGES:NOT-TO-SYSTEM-USER-STREAMS") " "
     :PAR)
    (:ITEM NIL (:B NIL "Implementation of macros and special forms") " " :PAR
     (:COMMENT NIL "Operators that are defined as \\term{macros} or"
      "\\term{special forms} may be defined as \\term{functions}"
      "instead if the semantics can be preserved. " "or as follows:"
      "Alternate Proposal: MACRO-AS-FUNCTION:STATUS-QUO"
      "The standard will remain silent on the issue of whether or not is"
      "is valid for an implementation to implementation \"macros\" and "
      "\"special forms\" as functions.")
     (:ISSUE NIL "MACRO-AS-FUNCTION:DISALLOW") " " :PAR (:TERM NIL "Macros")
     " and " (:TERM NIL "special operators")
     " defined in this standard must not be " (:TERM NIL "functions") ". "
     (:ENDISSUE NIL "MACRO-AS-FUNCTION:DISALLOW") " " :PAR))
   " ")
  :PAR
  (:SECTION (:TITLE ("Language Subsets") :TAGS (:LANGUAGE-SUBSETS)) " "
   (:COMMENT NIL "%Language Subsets") :PAR
   (:ISSUE NIL "SUBSETTING-POSITION:NONE")
   " The language described in this standard contains no subsets, though subsets are not forbidden. "
   (:ENDISSUE NIL "SUBSETTING-POSITION:NONE") " " :PAR
   "For a language to be considered a subset, it must have the property that any valid "
   (:TERM NIL "program")
   " in that language has equivalent semantics and will run directly (with no extralingual pre-processing, and no special compatibility packages) in any "
   (:TERM NIL "conforming implementation") " of the full language. " :PAR
   "A language that conforms to this requirement shall be described as being a “subset of "
   (:RM NIL " Common Lisp") " as specified by ANSI "
   (:METAVAR NIL "standard number") ".” ")
  :PAR
  (:COMMENT NIL
   "Per X3J13. Fixed typo: \"beginsubsection\" => \"beginsection\".")
  (:SECTION
   (:TITLE ("Deprecated Language Features") :TAGS (:DEPRECATED-FEATURES)) " "
   :PAR "Deprecated language features are not expected to appear in future "
   (:RM NIL " Common Lisp")
   " standards, but are required to be implemented for conformance with this standard; see "
   (:SECREF NIL :REQ-LANG-FEATURES) ". " :PAR (:TERM NIL "Conforming programs")
   " can use deprecated features; however, it is considered good programming style to avoid them. It is permissible for the compiler to produce "
   (:TERM NIL "style warnings")
   " about the use of such features at compile time, but there should be no such warnings at program execution time. "
   :PAR
   (:SUBSECTION (:TITLE ("Deprecated Functions"))
    (:ISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-AGAIN:X3J13-DEC-91") " "
    (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " "
    (:ISSUE NIL "GENTEMP-BAD-IDEA:DEPRECATE") " The " (:TERM NIL "functions")
    " in " (:NEXTFIGURE NIL) " are deprecated. "
    (:TABLE (:NAME ("Deprecated Functions"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " assoc-if-not"))
      (:CELL NIL (:FUNREF NIL "nsubst-if-not"))
      (:CELL NIL (:FUNREF NIL "require")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " count-if-not"))
      (:CELL NIL (:FUNREF NIL "nsubstitute-if-not"))
      (:CELL NIL (:FUNREF NIL "set")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " delete-if-not"))
      (:CELL NIL (:FUNREF NIL "position-if-not"))
      (:CELL NIL (:FUNREF NIL "subst-if-not")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " find-if-not"))
      (:CELL NIL (:FUNREF NIL "provide"))
      (:CELL NIL (:FUNREF NIL "substitute-if-not")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " gentemp"))
      (:CELL NIL (:FUNREF NIL "rassoc-if-not")) (:CELL NIL))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " member-if-not"))
      (:CELL NIL (:FUNREF NIL "remove-if-not")) (:CELL NIL)))
    " "
    (:COMMENT NIL "Restored PROVIDE,REQUIRE -kmp 7-Feb-92"
     "Added GENTEMP -kmp 18-Aug-93")
    (:ENDISSUE NIL "GENTEMP-BAD-IDEA:DEPRECATE") " "
    (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " "
    (:ENDISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-AGAIN:X3J13-DEC-91") " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Deprecated Argument Conventions"))
    (:ISSUE NIL "GENSYM-NAME-STICKINESS:LIKE-TEFLON")
    " The ability to pass a numeric " (:TERM NIL "argument") " to "
    (:FUNREF NIL "gensym") " has been deprecated. "
    (:ENDISSUE NIL "GENSYM-NAME-STICKINESS:LIKE-TEFLON") " " :PAR
    (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " The " (:KWD NIL "test-not") " "
    (:TERM NIL "argument") " to the " (:TERM NIL "functions") " in "
    (:NEXTFIGURE NIL) " are deprecated. " :PAR
    (:TABLE (:NAME ("Functions with Deprecated :TEST-NOT Arguments"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " adjoin"))
      (:CELL NIL (:FUNREF NIL "nset-difference"))
      (:CELL NIL (:FUNREF NIL "search")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " assoc"))
      (:CELL NIL (:FUNREF NIL "nset-exclusive-or"))
      (:CELL NIL (:FUNREF NIL "set-difference")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " count"))
      (:CELL NIL (:FUNREF NIL "nsublis"))
      (:CELL NIL (:FUNREF NIL "set-exclusive-or")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " delete"))
      (:CELL NIL (:FUNREF NIL "nsubst")) (:CELL NIL (:FUNREF NIL "sublis")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " delete-duplicates"))
      (:CELL NIL (:FUNREF NIL "nsubstitute"))
      (:CELL NIL (:FUNREF NIL "subsetp")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " find"))
      (:CELL NIL (:FUNREF NIL "nunion")) (:CELL NIL (:FUNREF NIL "subst")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " intersection"))
      (:CELL NIL (:FUNREF NIL "position"))
      (:CELL NIL (:FUNREF NIL "substitute")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " member"))
      (:CELL NIL (:FUNREF NIL "rassoc"))
      (:CELL NIL (:FUNREF NIL "tree-equal")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " mismatch"))
      (:CELL NIL (:FUNREF NIL "remove")) (:CELL NIL (:FUNREF NIL "union")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " nintersection"))
      (:CELL NIL (:FUNREF NIL "remove-duplicates")) (:CELL NIL)))
    " " (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
    (:ISSUE NIL "EVAL-WHEN-NON-TOP-LEVEL:GENERALIZE-EVAL-NEW-KEYWORDS") " "
    (:ISSUE NIL "EVAL-WHEN-OBSOLETE-KEYWORDS:X3J13-MAR-1993")
    " The use of the situation names " (:MISC NIL "compile") ", "
    (:MISC NIL "load") ", and " (:MISC NIL "eval") " in "
    (:SPECREF NIL "eval-when") " is deprecated. "
    (:ENDISSUE NIL "EVAL-WHEN-OBSOLETE-KEYWORDS:X3J13-MAR-1993") " "
    (:ENDISSUE NIL "EVAL-WHEN-NON-TOP-LEVEL:GENERALIZE-EVAL-NEW-KEYWORDS") " "
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Deprecated Variables"))
    (:ISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-AGAIN:X3J13-DEC-91") " The "
    (:TERM NIL "variable") " " (:VARREF NIL "*modules*") " is deprecated. "
    (:ENDISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-AGAIN:X3J13-DEC-91") " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Deprecated Reader Syntax"))
    (:ISSUE NIL "STRUCTURE-READ-PRINT-SYNTAX:KEYWORDS") " The " (:TT NIL "#S")
    " " (:TERM NIL "reader macro") " forces keyword names into the "
    (:PACKREF NIL "keyword") " " (:TERM NIL "package") "; see "
    (:SECREF NIL :SHARPSIGN-S)
    ". This feature is deprecated; in the future, keyword names will be taken in the package they are read in, so "
    (:TERM NIL "symbols") " that are actually in the " (:PACKREF NIL "keyword")
    " " (:TERM NIL "package") " should be used if that is what is desired. "
    (:ENDISSUE NIL "STRUCTURE-READ-PRINT-SYNTAX:KEYWORDS") " " :PAR)
   :PAR)
  :PAR
  (:SECTION (:TITLE ("Symbols in the COMMON-LISP Package") :TAGS (:CL-SYMBOLS))
   " "
   (:COMMENT NIL " 978 symbols in ANSI package COMMON-LISP,"
    " generated by kmp@SONATA.Harlequin.COM on machine BALBOA"
    " running Genera 8.3, System 446.21 on 8/29/93 21:30:44,"
    " including these symbols added manually:"
    "  (BOOLEAN ENSURE-DIRECTORIES-EXIST READ-SEQUENCE WRITE-SEQUENCE DEFINE-SYMBOL-MACRO)."
    " *** THIS FILE IS AUTOMATICALLY GENERATED."
    " *** DO NOT MANUALLY EDIT, OR YOUR CHANGES MAY BE LOST!"
    " *** SEE \"B:>ansi-cl>spec>tools>show-cl-symbols\" FOR MORE INFO."
    " ***   --kmp")
   :PAR
   "The figures on the next twelve pages contain a complete enumeration of the 978 "
   (:TERM NIL "external") " " (:TERM NIL "symbols") " in the "
   (:PACKREF NIL "common-lisp") " " (:TERM NIL "package") "."
   (:IDXPACKREF NIL "common-lisp") " " :PAR
   (:TABLE (:NAME ("Symbols in the COMMON-LISP package (part one of twelve)."))
    (:ROW NIL (:CELL NIL (:MISC NIL " &allow-other-keys"))
     (:CELL NIL (:MISC NIL "*print-miser-width*")))
    (:ROW NIL (:CELL NIL (:MISC NIL " &aux"))
     (:CELL NIL (:MISC NIL "*print-pprint-dispatch*")))
    (:ROW NIL (:CELL NIL (:MISC NIL " &body"))
     (:CELL NIL (:MISC NIL "*print-pretty*")))
    (:ROW NIL (:CELL NIL (:MISC NIL " &environment"))
     (:CELL NIL (:MISC NIL "*print-radix*")))
    (:ROW NIL (:CELL NIL (:MISC NIL " &key"))
     (:CELL NIL (:MISC NIL "*print-readably*")))
    (:ROW NIL (:CELL NIL (:MISC NIL " &optional"))
     (:CELL NIL (:MISC NIL "*print-right-margin*")))
    (:ROW NIL (:CELL NIL (:MISC NIL " &rest"))
     (:CELL NIL (:MISC NIL "*query-io*")))
    (:ROW NIL (:CELL NIL (:MISC NIL " &whole"))
     (:CELL NIL (:MISC NIL "*random-state*")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *"))
     (:CELL NIL (:MISC NIL "*read-base*")))
    (:ROW NIL (:CELL NIL (:MISC NIL " **"))
     (:CELL NIL (:MISC NIL "*read-default-float-format*")))
    (:ROW NIL (:CELL NIL (:MISC NIL " ***"))
     (:CELL NIL (:MISC NIL "*read-eval*")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *break-on-signals*"))
     (:CELL NIL (:MISC NIL "*read-suppress*")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *compile-file-pathname*"))
     (:CELL NIL (:MISC NIL "*readtable*")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *compile-file-truename*"))
     (:CELL NIL (:MISC NIL "*standard-input*")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *compile-print*"))
     (:CELL NIL (:MISC NIL "*standard-output*")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *compile-verbose*"))
     (:CELL NIL (:MISC NIL "*terminal-io*")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *debug-io*"))
     (:CELL NIL (:MISC NIL "*trace-output*")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *debugger-hook*"))
     (:CELL NIL (:MISC NIL "+")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *default-pathname-defaults*"))
     (:CELL NIL (:MISC NIL "++")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *error-output*"))
     (:CELL NIL (:MISC NIL "+++")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *features*"))
     (:CELL NIL (:MISC NIL "-")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *gensym-counter*"))
     (:CELL NIL (:MISC NIL "/")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *load-pathname*"))
     (:CELL NIL (:MISC NIL "//")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *load-print*"))
     (:CELL NIL (:MISC NIL "///")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *load-truename*"))
     (:CELL NIL (:MISC NIL "/=")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *load-verbose*"))
     (:CELL NIL (:MISC NIL "1+")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *macroexpand-hook*"))
     (:CELL NIL (:MISC NIL "1-")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *modules*")) (:CELL NIL (:MISC NIL "<")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *package*"))
     (:CELL NIL (:MISC NIL "<=")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *print-array*"))
     (:CELL NIL (:MISC NIL "=")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *print-base*"))
     (:CELL NIL (:MISC NIL ">")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *print-case*"))
     (:CELL NIL (:MISC NIL ">=")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *print-circle*"))
     (:CELL NIL (:MISC NIL "abort")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *print-escape*"))
     (:CELL NIL (:MISC NIL "abs")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *print-gensym*"))
     (:CELL NIL (:MISC NIL "acons")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *print-length*"))
     (:CELL NIL (:MISC NIL "acos")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *print-level*"))
     (:CELL NIL (:MISC NIL "acosh")))
    (:ROW NIL (:CELL NIL (:MISC NIL " *print-lines*"))
     (:CELL NIL (:MISC NIL "add-method"))))
   " " :PAR " " :PAR
   (:TABLE (:NAME ("Symbols in the COMMON-LISP package (part two of twelve)."))
    (:ROW NIL (:CELL NIL (:MISC NIL " adjoin")) (:CELL NIL (:MISC NIL "atom"))
     (:CELL NIL (:MISC NIL "boundp")))
    (:ROW NIL (:CELL NIL (:MISC NIL " adjust-array"))
     (:CELL NIL (:MISC NIL "base-char")) (:CELL NIL (:MISC NIL "break")))
    (:ROW NIL (:CELL NIL (:MISC NIL " adjustable-array-p"))
     (:CELL NIL (:MISC NIL "base-string"))
     (:CELL NIL (:MISC NIL "broadcast-stream")))
    (:ROW NIL (:CELL NIL (:MISC NIL " allocate-instance"))
     (:CELL NIL (:MISC NIL "bignum"))
     (:CELL NIL (:MISC NIL "broadcast-stream-streams")))
    (:ROW NIL (:CELL NIL (:MISC NIL " alpha-char-p"))
     (:CELL NIL (:MISC NIL "bit")) (:CELL NIL (:MISC NIL "built-in-class")))
    (:ROW NIL (:CELL NIL (:MISC NIL " alphanumericp"))
     (:CELL NIL (:MISC NIL "bit-and")) (:CELL NIL (:MISC NIL "butlast")))
    (:ROW NIL (:CELL NIL (:MISC NIL " and"))
     (:CELL NIL (:MISC NIL "bit-andc1")) (:CELL NIL (:MISC NIL "byte")))
    (:ROW NIL (:CELL NIL (:MISC NIL " append"))
     (:CELL NIL (:MISC NIL "bit-andc2"))
     (:CELL NIL (:MISC NIL "byte-position")))
    (:ROW NIL (:CELL NIL (:MISC NIL " apply"))
     (:CELL NIL (:MISC NIL "bit-eqv")) (:CELL NIL (:MISC NIL "byte-size")))
    (:ROW NIL (:CELL NIL (:MISC NIL " apropos"))
     (:CELL NIL (:MISC NIL "bit-ior")) (:CELL NIL (:MISC NIL "caaaar")))
    (:ROW NIL (:CELL NIL (:MISC NIL " apropos-list"))
     (:CELL NIL (:MISC NIL "bit-nand")) (:CELL NIL (:MISC NIL "caaadr")))
    (:ROW NIL (:CELL NIL (:MISC NIL " aref")) (:CELL NIL (:MISC NIL "bit-nor"))
     (:CELL NIL (:MISC NIL "caaar")))
    (:ROW NIL (:CELL NIL (:MISC NIL " arithmetic-error"))
     (:CELL NIL (:MISC NIL "bit-not")) (:CELL NIL (:MISC NIL "caadar")))
    (:ROW NIL (:CELL NIL (:MISC NIL " arithmetic-error-operands"))
     (:CELL NIL (:MISC NIL "bit-orc1")) (:CELL NIL (:MISC NIL "caaddr")))
    (:ROW NIL (:CELL NIL (:MISC NIL " arithmetic-error-operation"))
     (:CELL NIL (:MISC NIL "bit-orc2")) (:CELL NIL (:MISC NIL "caadr")))
    (:ROW NIL (:CELL NIL (:MISC NIL " array"))
     (:CELL NIL (:MISC NIL "bit-vector")) (:CELL NIL (:MISC NIL "caar")))
    (:ROW NIL (:CELL NIL (:MISC NIL " array-dimension"))
     (:CELL NIL (:MISC NIL "bit-vector-p")) (:CELL NIL (:MISC NIL "cadaar")))
    (:ROW NIL (:CELL NIL (:MISC NIL " array-dimension-limit"))
     (:CELL NIL (:MISC NIL "bit-xor")) (:CELL NIL (:MISC NIL "cadadr")))
    (:ROW NIL (:CELL NIL (:MISC NIL " array-dimensions"))
     (:CELL NIL (:MISC NIL "block")) (:CELL NIL (:MISC NIL "cadar")))
    (:ROW NIL (:CELL NIL (:MISC NIL " array-displacement"))
     (:CELL NIL (:MISC NIL "boole")) (:CELL NIL (:MISC NIL "caddar")))
    (:ROW NIL (:CELL NIL (:MISC NIL " array-element-type"))
     (:CELL NIL (:MISC NIL "boole-1")) (:CELL NIL (:MISC NIL "cadddr")))
    (:ROW NIL (:CELL NIL (:MISC NIL " array-has-fill-pointer-p"))
     (:CELL NIL (:MISC NIL "boole-2")) (:CELL NIL (:MISC NIL "caddr")))
    (:ROW NIL (:CELL NIL (:MISC NIL " array-in-bounds-p"))
     (:CELL NIL (:MISC NIL "boole-and")) (:CELL NIL (:MISC NIL "cadr")))
    (:ROW NIL (:CELL NIL (:MISC NIL " array-rank"))
     (:CELL NIL (:MISC NIL "boole-andc1"))
     (:CELL NIL (:MISC NIL "call-arguments-limit")))
    (:ROW NIL (:CELL NIL (:MISC NIL " array-rank-limit"))
     (:CELL NIL (:MISC NIL "boole-andc2"))
     (:CELL NIL (:MISC NIL "call-method")))
    (:ROW NIL (:CELL NIL (:MISC NIL " array-row-major-index"))
     (:CELL NIL (:MISC NIL "boole-c1"))
     (:CELL NIL (:MISC NIL "call-next-method")))
    (:ROW NIL (:CELL NIL (:MISC NIL " array-total-size"))
     (:CELL NIL (:MISC NIL "boole-c2")) (:CELL NIL (:MISC NIL "car")))
    (:ROW NIL (:CELL NIL (:MISC NIL " array-total-size-limit"))
     (:CELL NIL (:MISC NIL "boole-clr")) (:CELL NIL (:MISC NIL "case")))
    (:ROW NIL (:CELL NIL (:MISC NIL " arrayp"))
     (:CELL NIL (:MISC NIL "boole-eqv")) (:CELL NIL (:MISC NIL "catch")))
    (:ROW NIL (:CELL NIL (:MISC NIL " ash"))
     (:CELL NIL (:MISC NIL "boole-ior")) (:CELL NIL (:MISC NIL "ccase")))
    (:ROW NIL (:CELL NIL (:MISC NIL " asin"))
     (:CELL NIL (:MISC NIL "boole-nand")) (:CELL NIL (:MISC NIL "cdaaar")))
    (:ROW NIL (:CELL NIL (:MISC NIL " asinh"))
     (:CELL NIL (:MISC NIL "boole-nor")) (:CELL NIL (:MISC NIL "cdaadr")))
    (:ROW NIL (:CELL NIL (:MISC NIL " assert"))
     (:CELL NIL (:MISC NIL "boole-orc1")) (:CELL NIL (:MISC NIL "cdaar")))
    (:ROW NIL (:CELL NIL (:MISC NIL " assoc"))
     (:CELL NIL (:MISC NIL "boole-orc2")) (:CELL NIL (:MISC NIL "cdadar")))
    (:ROW NIL (:CELL NIL (:MISC NIL " assoc-if"))
     (:CELL NIL (:MISC NIL "boole-set")) (:CELL NIL (:MISC NIL "cdaddr")))
    (:ROW NIL (:CELL NIL (:MISC NIL " assoc-if-not"))
     (:CELL NIL (:MISC NIL "boole-xor")) (:CELL NIL (:MISC NIL "cdadr")))
    (:ROW NIL (:CELL NIL (:MISC NIL " atan")) (:CELL NIL (:MISC NIL "boolean"))
     (:CELL NIL (:MISC NIL "cdar")))
    (:ROW NIL (:CELL NIL (:MISC NIL " atanh"))
     (:CELL NIL (:MISC NIL "both-case-p")) (:CELL NIL (:MISC NIL "cddaar"))))
   " " :PAR " " :PAR
   (:TABLE
    (:NAME ("Symbols in the COMMON-LISP package (part three of twelve)."))
    (:ROW NIL (:CELL NIL (:MISC NIL " cddadr"))
     (:CELL NIL (:MISC NIL "clear-input")) (:CELL NIL (:MISC NIL "copy-tree")))
    (:ROW NIL (:CELL NIL (:MISC NIL " cddar"))
     (:CELL NIL (:MISC NIL "clear-output")) (:CELL NIL (:MISC NIL "cos")))
    (:ROW NIL (:CELL NIL (:MISC NIL " cdddar")) (:CELL NIL (:MISC NIL "close"))
     (:CELL NIL (:MISC NIL "cosh")))
    (:ROW NIL (:CELL NIL (:MISC NIL " cddddr"))
     (:CELL NIL (:MISC NIL "clrhash")) (:CELL NIL (:MISC NIL "count")))
    (:ROW NIL (:CELL NIL (:MISC NIL " cdddr"))
     (:CELL NIL (:MISC NIL "code-char")) (:CELL NIL (:MISC NIL "count-if")))
    (:ROW NIL (:CELL NIL (:MISC NIL " cddr")) (:CELL NIL (:MISC NIL "coerce"))
     (:CELL NIL (:MISC NIL "count-if-not")))
    (:ROW NIL (:CELL NIL (:MISC NIL " cdr"))
     (:CELL NIL (:MISC NIL "compilation-speed"))
     (:CELL NIL (:MISC NIL "ctypecase")))
    (:ROW NIL (:CELL NIL (:MISC NIL " ceiling"))
     (:CELL NIL (:MISC NIL "compile")) (:CELL NIL (:MISC NIL "debug")))
    (:ROW NIL (:CELL NIL (:MISC NIL " cell-error"))
     (:CELL NIL (:MISC NIL "compile-file")) (:CELL NIL (:MISC NIL "decf")))
    (:ROW NIL (:CELL NIL (:MISC NIL " cell-error-name"))
     (:CELL NIL (:MISC NIL "compile-file-pathname"))
     (:CELL NIL (:MISC NIL "declaim")))
    (:ROW NIL (:CELL NIL (:MISC NIL " cerror"))
     (:CELL NIL (:MISC NIL "compiled-function"))
     (:CELL NIL (:MISC NIL "declaration")))
    (:ROW NIL (:CELL NIL (:MISC NIL " change-class"))
     (:CELL NIL (:MISC NIL "compiled-function-p"))
     (:CELL NIL (:MISC NIL "declare")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char"))
     (:CELL NIL (:MISC NIL "compiler-macro"))
     (:CELL NIL (:MISC NIL "decode-float")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char-code"))
     (:CELL NIL (:MISC NIL "compiler-macro-function"))
     (:CELL NIL (:MISC NIL "decode-universal-time")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char-code-limit"))
     (:CELL NIL (:MISC NIL "complement")) (:CELL NIL (:MISC NIL "defclass")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char-downcase"))
     (:CELL NIL (:MISC NIL "complex")) (:CELL NIL (:MISC NIL "defconstant")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char-equal"))
     (:CELL NIL (:MISC NIL "complexp")) (:CELL NIL (:MISC NIL "defgeneric")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char-greaterp"))
     (:CELL NIL (:MISC NIL "compute-applicable-methods"))
     (:CELL NIL (:MISC NIL "define-compiler-macro")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char-int"))
     (:CELL NIL (:MISC NIL "compute-restarts"))
     (:CELL NIL (:MISC NIL "define-condition")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char-lessp"))
     (:CELL NIL (:MISC NIL "concatenate"))
     (:CELL NIL (:MISC NIL "define-method-combination")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char-name"))
     (:CELL NIL (:MISC NIL "concatenated-stream"))
     (:CELL NIL (:MISC NIL "define-modify-macro")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char-not-equal"))
     (:CELL NIL (:MISC NIL "concatenated-stream-streams"))
     (:CELL NIL (:MISC NIL "define-setf-expander")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char-not-greaterp"))
     (:CELL NIL (:MISC NIL "cond"))
     (:CELL NIL (:MISC NIL "define-symbol-macro")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char-not-lessp"))
     (:CELL NIL (:MISC NIL "condition")) (:CELL NIL (:MISC NIL "defmacro")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char-upcase"))
     (:CELL NIL (:MISC NIL "conjugate")) (:CELL NIL (:MISC NIL "defmethod")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char/=")) (:CELL NIL (:MISC NIL "cons"))
     (:CELL NIL (:MISC NIL "defpackage")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char<")) (:CELL NIL (:MISC NIL "consp"))
     (:CELL NIL (:MISC NIL "defparameter")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char<="))
     (:CELL NIL (:MISC NIL "constantly")) (:CELL NIL (:MISC NIL "defsetf")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char="))
     (:CELL NIL (:MISC NIL "constantp")) (:CELL NIL (:MISC NIL "defstruct")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char>"))
     (:CELL NIL (:MISC NIL "continue")) (:CELL NIL (:MISC NIL "deftype")))
    (:ROW NIL (:CELL NIL (:MISC NIL " char>="))
     (:CELL NIL (:MISC NIL "control-error")) (:CELL NIL (:MISC NIL "defun")))
    (:ROW NIL (:CELL NIL (:MISC NIL " character"))
     (:CELL NIL (:MISC NIL "copy-alist")) (:CELL NIL (:MISC NIL "defvar")))
    (:ROW NIL (:CELL NIL (:MISC NIL " characterp"))
     (:CELL NIL (:MISC NIL "copy-list")) (:CELL NIL (:MISC NIL "delete")))
    (:ROW NIL (:CELL NIL (:MISC NIL " check-type"))
     (:CELL NIL (:MISC NIL "copy-pprint-dispatch"))
     (:CELL NIL (:MISC NIL "delete-duplicates")))
    (:ROW NIL (:CELL NIL (:MISC NIL " cis"))
     (:CELL NIL (:MISC NIL "copy-readtable"))
     (:CELL NIL (:MISC NIL "delete-file")))
    (:ROW NIL (:CELL NIL (:MISC NIL " class"))
     (:CELL NIL (:MISC NIL "copy-seq")) (:CELL NIL (:MISC NIL "delete-if")))
    (:ROW NIL (:CELL NIL (:MISC NIL " class-name"))
     (:CELL NIL (:MISC NIL "copy-structure"))
     (:CELL NIL (:MISC NIL "delete-if-not")))
    (:ROW NIL (:CELL NIL (:MISC NIL " class-of"))
     (:CELL NIL (:MISC NIL "copy-symbol"))
     (:CELL NIL (:MISC NIL "delete-package"))))
   " " :PAR " " :PAR
   (:TABLE
    (:NAME ("Symbols in the COMMON-LISP package (part four of twelve)."))
    (:ROW NIL (:CELL NIL (:MISC NIL " denominator"))
     (:CELL NIL (:MISC NIL "eq")))
    (:ROW NIL (:CELL NIL (:MISC NIL " deposit-field"))
     (:CELL NIL (:MISC NIL "eql")))
    (:ROW NIL (:CELL NIL (:MISC NIL " describe"))
     (:CELL NIL (:MISC NIL "equal")))
    (:ROW NIL (:CELL NIL (:MISC NIL " describe-object"))
     (:CELL NIL (:MISC NIL "equalp")))
    (:ROW NIL (:CELL NIL (:MISC NIL " destructuring-bind"))
     (:CELL NIL (:MISC NIL "error")))
    (:ROW NIL (:CELL NIL (:MISC NIL " digit-char"))
     (:CELL NIL (:MISC NIL "etypecase")))
    (:ROW NIL (:CELL NIL (:MISC NIL " digit-char-p"))
     (:CELL NIL (:MISC NIL "eval")))
    (:ROW NIL (:CELL NIL (:MISC NIL " directory"))
     (:CELL NIL (:MISC NIL "eval-when")))
    (:ROW NIL (:CELL NIL (:MISC NIL " directory-namestring"))
     (:CELL NIL (:MISC NIL "evenp")))
    (:ROW NIL (:CELL NIL (:MISC NIL " disassemble"))
     (:CELL NIL (:MISC NIL "every")))
    (:ROW NIL (:CELL NIL (:MISC NIL " division-by-zero"))
     (:CELL NIL (:MISC NIL "exp")))
    (:ROW NIL (:CELL NIL (:MISC NIL " do")) (:CELL NIL (:MISC NIL "export")))
    (:ROW NIL (:CELL NIL (:MISC NIL " do*")) (:CELL NIL (:MISC NIL "expt")))
    (:ROW NIL (:CELL NIL (:MISC NIL " do-all-symbols"))
     (:CELL NIL (:MISC NIL "extended-char")))
    (:ROW NIL (:CELL NIL (:MISC NIL " do-external-symbols"))
     (:CELL NIL (:MISC NIL "fboundp")))
    (:ROW NIL (:CELL NIL (:MISC NIL " do-symbols"))
     (:CELL NIL (:MISC NIL "fceiling")))
    (:ROW NIL (:CELL NIL (:MISC NIL " documentation"))
     (:CELL NIL (:MISC NIL "fdefinition")))
    (:ROW NIL (:CELL NIL (:MISC NIL " dolist"))
     (:CELL NIL (:MISC NIL "ffloor")))
    (:ROW NIL (:CELL NIL (:MISC NIL " dotimes"))
     (:CELL NIL (:MISC NIL "fifth")))
    (:ROW NIL (:CELL NIL (:MISC NIL " double-float"))
     (:CELL NIL (:MISC NIL "file-author")))
    (:ROW NIL (:CELL NIL (:MISC NIL " double-float-epsilon"))
     (:CELL NIL (:MISC NIL "file-error")))
    (:ROW NIL (:CELL NIL (:MISC NIL " double-float-negative-epsilon"))
     (:CELL NIL (:MISC NIL "file-error-pathname")))
    (:ROW NIL (:CELL NIL (:MISC NIL " dpb"))
     (:CELL NIL (:MISC NIL "file-length")))
    (:ROW NIL (:CELL NIL (:MISC NIL " dribble"))
     (:CELL NIL (:MISC NIL "file-namestring")))
    (:ROW NIL (:CELL NIL (:MISC NIL " dynamic-extent"))
     (:CELL NIL (:MISC NIL "file-position")))
    (:ROW NIL (:CELL NIL (:MISC NIL " ecase"))
     (:CELL NIL (:MISC NIL "file-stream")))
    (:ROW NIL (:CELL NIL (:MISC NIL " echo-stream"))
     (:CELL NIL (:MISC NIL "file-string-length")))
    (:ROW NIL (:CELL NIL (:MISC NIL " echo-stream-input-stream"))
     (:CELL NIL (:MISC NIL "file-write-date")))
    (:ROW NIL (:CELL NIL (:MISC NIL " echo-stream-output-stream"))
     (:CELL NIL (:MISC NIL "fill")))
    (:ROW NIL (:CELL NIL (:MISC NIL " ed"))
     (:CELL NIL (:MISC NIL "fill-pointer")))
    (:ROW NIL (:CELL NIL (:MISC NIL " eighth")) (:CELL NIL (:MISC NIL "find")))
    (:ROW NIL (:CELL NIL (:MISC NIL " elt"))
     (:CELL NIL (:MISC NIL "find-all-symbols")))
    (:ROW NIL (:CELL NIL (:MISC NIL " encode-universal-time"))
     (:CELL NIL (:MISC NIL "find-class")))
    (:ROW NIL (:CELL NIL (:MISC NIL " end-of-file"))
     (:CELL NIL (:MISC NIL "find-if")))
    (:ROW NIL (:CELL NIL (:MISC NIL " endp"))
     (:CELL NIL (:MISC NIL "find-if-not")))
    (:ROW NIL (:CELL NIL (:MISC NIL " enough-namestring"))
     (:CELL NIL (:MISC NIL "find-method")))
    (:ROW NIL (:CELL NIL (:MISC NIL " ensure-directories-exist"))
     (:CELL NIL (:MISC NIL "find-package")))
    (:ROW NIL (:CELL NIL (:MISC NIL " ensure-generic-function"))
     (:CELL NIL (:MISC NIL "find-restart"))))
   " " :PAR " " :PAR
   (:TABLE
    (:NAME ("Symbols in the COMMON-LISP package (part five of twelve)."))
    (:ROW NIL (:CELL NIL (:MISC NIL " find-symbol"))
     (:CELL NIL (:MISC NIL "get-internal-run-time")))
    (:ROW NIL (:CELL NIL (:MISC NIL " finish-output"))
     (:CELL NIL (:MISC NIL "get-macro-character")))
    (:ROW NIL (:CELL NIL (:MISC NIL " first"))
     (:CELL NIL (:MISC NIL "get-output-stream-string")))
    (:ROW NIL (:CELL NIL (:MISC NIL " fixnum"))
     (:CELL NIL (:MISC NIL "get-properties")))
    (:ROW NIL (:CELL NIL (:MISC NIL " flet"))
     (:CELL NIL (:MISC NIL "get-setf-expansion")))
    (:ROW NIL (:CELL NIL (:MISC NIL " float"))
     (:CELL NIL (:MISC NIL "get-universal-time")))
    (:ROW NIL (:CELL NIL (:MISC NIL " float-digits"))
     (:CELL NIL (:MISC NIL "getf")))
    (:ROW NIL (:CELL NIL (:MISC NIL " float-precision"))
     (:CELL NIL (:MISC NIL "gethash")))
    (:ROW NIL (:CELL NIL (:MISC NIL " float-radix"))
     (:CELL NIL (:MISC NIL "go")))
    (:ROW NIL (:CELL NIL (:MISC NIL " float-sign"))
     (:CELL NIL (:MISC NIL "graphic-char-p")))
    (:ROW NIL (:CELL NIL (:MISC NIL " floating-point-inexact"))
     (:CELL NIL (:MISC NIL "handler-bind")))
    (:ROW NIL (:CELL NIL (:MISC NIL " floating-point-invalid-operation"))
     (:CELL NIL (:MISC NIL "handler-case")))
    (:ROW NIL (:CELL NIL (:MISC NIL " floating-point-overflow"))
     (:CELL NIL (:MISC NIL "hash-table")))
    (:ROW NIL (:CELL NIL (:MISC NIL " floating-point-underflow"))
     (:CELL NIL (:MISC NIL "hash-table-count")))
    (:ROW NIL (:CELL NIL (:MISC NIL " floatp"))
     (:CELL NIL (:MISC NIL "hash-table-p")))
    (:ROW NIL (:CELL NIL (:MISC NIL " floor"))
     (:CELL NIL (:MISC NIL "hash-table-rehash-size")))
    (:ROW NIL (:CELL NIL (:MISC NIL " fmakunbound"))
     (:CELL NIL (:MISC NIL "hash-table-rehash-threshold")))
    (:ROW NIL (:CELL NIL (:MISC NIL " force-output"))
     (:CELL NIL (:MISC NIL "hash-table-size")))
    (:ROW NIL (:CELL NIL (:MISC NIL " format"))
     (:CELL NIL (:MISC NIL "hash-table-test")))
    (:ROW NIL (:CELL NIL (:MISC NIL " formatter"))
     (:CELL NIL (:MISC NIL "host-namestring")))
    (:ROW NIL (:CELL NIL (:MISC NIL " fourth"))
     (:CELL NIL (:MISC NIL "identity")))
    (:ROW NIL (:CELL NIL (:MISC NIL " fresh-line"))
     (:CELL NIL (:MISC NIL "if")))
    (:ROW NIL (:CELL NIL (:MISC NIL " fround"))
     (:CELL NIL (:MISC NIL "ignorable")))
    (:ROW NIL (:CELL NIL (:MISC NIL " ftruncate"))
     (:CELL NIL (:MISC NIL "ignore")))
    (:ROW NIL (:CELL NIL (:MISC NIL " ftype"))
     (:CELL NIL (:MISC NIL "ignore-errors")))
    (:ROW NIL (:CELL NIL (:MISC NIL " funcall"))
     (:CELL NIL (:MISC NIL "imagpart")))
    (:ROW NIL (:CELL NIL (:MISC NIL " function"))
     (:CELL NIL (:MISC NIL "import")))
    (:ROW NIL (:CELL NIL (:MISC NIL " function-keywords"))
     (:CELL NIL (:MISC NIL "in-package")))
    (:ROW NIL (:CELL NIL (:MISC NIL " function-lambda-expression"))
     (:CELL NIL (:MISC NIL "incf")))
    (:ROW NIL (:CELL NIL (:MISC NIL " functionp"))
     (:CELL NIL (:MISC NIL "initialize-instance")))
    (:ROW NIL (:CELL NIL (:MISC NIL " gcd")) (:CELL NIL (:MISC NIL "inline")))
    (:ROW NIL (:CELL NIL (:MISC NIL " generic-function"))
     (:CELL NIL (:MISC NIL "input-stream-p")))
    (:ROW NIL (:CELL NIL (:MISC NIL " gensym"))
     (:CELL NIL (:MISC NIL "inspect")))
    (:ROW NIL (:CELL NIL (:MISC NIL " gentemp"))
     (:CELL NIL (:MISC NIL "integer")))
    (:ROW NIL (:CELL NIL (:MISC NIL " get"))
     (:CELL NIL (:MISC NIL "integer-decode-float")))
    (:ROW NIL (:CELL NIL (:MISC NIL " get-decoded-time"))
     (:CELL NIL (:MISC NIL "integer-length")))
    (:ROW NIL (:CELL NIL (:MISC NIL " get-dispatch-macro-character"))
     (:CELL NIL (:MISC NIL "integerp")))
    (:ROW NIL (:CELL NIL (:MISC NIL " get-internal-real-time"))
     (:CELL NIL (:MISC NIL "interactive-stream-p"))))
   " " :PAR " " :PAR
   (:TABLE (:NAME ("Symbols in the COMMON-LISP package (part six of twelve)."))
    (:ROW NIL (:CELL NIL (:MISC NIL " intern"))
     (:CELL NIL (:MISC NIL "lisp-implementation-type")))
    (:ROW NIL (:CELL NIL (:MISC NIL " internal-time-units-per-second"))
     (:CELL NIL (:MISC NIL "lisp-implementation-version")))
    (:ROW NIL (:CELL NIL (:MISC NIL " intersection"))
     (:CELL NIL (:MISC NIL "list")))
    (:ROW NIL (:CELL NIL (:MISC NIL " invalid-method-error"))
     (:CELL NIL (:MISC NIL "list*")))
    (:ROW NIL (:CELL NIL (:MISC NIL " invoke-debugger"))
     (:CELL NIL (:MISC NIL "list-all-packages")))
    (:ROW NIL (:CELL NIL (:MISC NIL " invoke-restart"))
     (:CELL NIL (:MISC NIL "list-length")))
    (:ROW NIL (:CELL NIL (:MISC NIL " invoke-restart-interactively"))
     (:CELL NIL (:MISC NIL "listen")))
    (:ROW NIL (:CELL NIL (:MISC NIL " isqrt")) (:CELL NIL (:MISC NIL "listp")))
    (:ROW NIL (:CELL NIL (:MISC NIL " keyword"))
     (:CELL NIL (:MISC NIL "load")))
    (:ROW NIL (:CELL NIL (:MISC NIL " keywordp"))
     (:CELL NIL (:MISC NIL "load-logical-pathname-translations")))
    (:ROW NIL (:CELL NIL (:MISC NIL " labels"))
     (:CELL NIL (:MISC NIL "load-time-value")))
    (:ROW NIL (:CELL NIL (:MISC NIL " lambda"))
     (:CELL NIL (:MISC NIL "locally")))
    (:ROW NIL (:CELL NIL (:MISC NIL " lambda-list-keywords"))
     (:CELL NIL (:MISC NIL "log")))
    (:ROW NIL (:CELL NIL (:MISC NIL " lambda-parameters-limit"))
     (:CELL NIL (:MISC NIL "logand")))
    (:ROW NIL (:CELL NIL (:MISC NIL " last"))
     (:CELL NIL (:MISC NIL "logandc1")))
    (:ROW NIL (:CELL NIL (:MISC NIL " lcm"))
     (:CELL NIL (:MISC NIL "logandc2")))
    (:ROW NIL (:CELL NIL (:MISC NIL " ldb")) (:CELL NIL (:MISC NIL "logbitp")))
    (:ROW NIL (:CELL NIL (:MISC NIL " ldb-test"))
     (:CELL NIL (:MISC NIL "logcount")))
    (:ROW NIL (:CELL NIL (:MISC NIL " ldiff"))
     (:CELL NIL (:MISC NIL "logeqv")))
    (:ROW NIL (:CELL NIL (:MISC NIL " least-negative-double-float"))
     (:CELL NIL (:MISC NIL "logical-pathname")))
    (:ROW NIL (:CELL NIL (:MISC NIL " least-negative-long-float"))
     (:CELL NIL (:MISC NIL "logical-pathname-translations")))
    (:ROW NIL (:CELL NIL (:MISC NIL " least-negative-normalized-double-float"))
     (:CELL NIL (:MISC NIL "logior")))
    (:ROW NIL (:CELL NIL (:MISC NIL " least-negative-normalized-long-float"))
     (:CELL NIL (:MISC NIL "lognand")))
    (:ROW NIL (:CELL NIL (:MISC NIL " least-negative-normalized-short-float"))
     (:CELL NIL (:MISC NIL "lognor")))
    (:ROW NIL (:CELL NIL (:MISC NIL " least-negative-normalized-single-float"))
     (:CELL NIL (:MISC NIL "lognot")))
    (:ROW NIL (:CELL NIL (:MISC NIL " least-negative-short-float"))
     (:CELL NIL (:MISC NIL "logorc1")))
    (:ROW NIL (:CELL NIL (:MISC NIL " least-negative-single-float"))
     (:CELL NIL (:MISC NIL "logorc2")))
    (:ROW NIL (:CELL NIL (:MISC NIL " least-positive-double-float"))
     (:CELL NIL (:MISC NIL "logtest")))
    (:ROW NIL (:CELL NIL (:MISC NIL " least-positive-long-float"))
     (:CELL NIL (:MISC NIL "logxor")))
    (:ROW NIL (:CELL NIL (:MISC NIL " least-positive-normalized-double-float"))
     (:CELL NIL (:MISC NIL "long-float")))
    (:ROW NIL (:CELL NIL (:MISC NIL " least-positive-normalized-long-float"))
     (:CELL NIL (:MISC NIL "long-float-epsilon")))
    (:ROW NIL (:CELL NIL (:MISC NIL " least-positive-normalized-short-float"))
     (:CELL NIL (:MISC NIL "long-float-negative-epsilon")))
    (:ROW NIL (:CELL NIL (:MISC NIL " least-positive-normalized-single-float"))
     (:CELL NIL (:MISC NIL "long-site-name")))
    (:ROW NIL (:CELL NIL (:MISC NIL " least-positive-short-float"))
     (:CELL NIL (:MISC NIL "loop")))
    (:ROW NIL (:CELL NIL (:MISC NIL " least-positive-single-float"))
     (:CELL NIL (:MISC NIL "loop-finish")))
    (:ROW NIL (:CELL NIL (:MISC NIL " length"))
     (:CELL NIL (:MISC NIL "lower-case-p")))
    (:ROW NIL (:CELL NIL (:MISC NIL " let"))
     (:CELL NIL (:MISC NIL "machine-instance")))
    (:ROW NIL (:CELL NIL (:MISC NIL " let*"))
     (:CELL NIL (:MISC NIL "machine-type"))))
   " " :PAR " " :PAR
   (:TABLE
    (:NAME ("Symbols in the COMMON-LISP package (part seven of twelve)."))
    (:ROW NIL (:CELL NIL (:MISC NIL " machine-version"))
     (:CELL NIL (:MISC NIL "mask-field")))
    (:ROW NIL (:CELL NIL (:MISC NIL " macro-function"))
     (:CELL NIL (:MISC NIL "max")))
    (:ROW NIL (:CELL NIL (:MISC NIL " macroexpand"))
     (:CELL NIL (:MISC NIL "member")))
    (:ROW NIL (:CELL NIL (:MISC NIL " macroexpand-1"))
     (:CELL NIL (:MISC NIL "member-if")))
    (:ROW NIL (:CELL NIL (:MISC NIL " macrolet"))
     (:CELL NIL (:MISC NIL "member-if-not")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-array"))
     (:CELL NIL (:MISC NIL "merge")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-broadcast-stream"))
     (:CELL NIL (:MISC NIL "merge-pathnames")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-concatenated-stream"))
     (:CELL NIL (:MISC NIL "method")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-condition"))
     (:CELL NIL (:MISC NIL "method-combination")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-dispatch-macro-character"))
     (:CELL NIL (:MISC NIL "method-combination-error")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-echo-stream"))
     (:CELL NIL (:MISC NIL "method-qualifiers")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-hash-table"))
     (:CELL NIL (:MISC NIL "min")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-instance"))
     (:CELL NIL (:MISC NIL "minusp")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-instances-obsolete"))
     (:CELL NIL (:MISC NIL "mismatch")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-list"))
     (:CELL NIL (:MISC NIL "mod")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-load-form"))
     (:CELL NIL (:MISC NIL "most-negative-double-float")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-load-form-saving-slots"))
     (:CELL NIL (:MISC NIL "most-negative-fixnum")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-method"))
     (:CELL NIL (:MISC NIL "most-negative-long-float")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-package"))
     (:CELL NIL (:MISC NIL "most-negative-short-float")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-pathname"))
     (:CELL NIL (:MISC NIL "most-negative-single-float")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-random-state"))
     (:CELL NIL (:MISC NIL "most-positive-double-float")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-sequence"))
     (:CELL NIL (:MISC NIL "most-positive-fixnum")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-string"))
     (:CELL NIL (:MISC NIL "most-positive-long-float")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-string-input-stream"))
     (:CELL NIL (:MISC NIL "most-positive-short-float")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-string-output-stream"))
     (:CELL NIL (:MISC NIL "most-positive-single-float")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-symbol"))
     (:CELL NIL (:MISC NIL "muffle-warning")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-synonym-stream"))
     (:CELL NIL (:MISC NIL "multiple-value-bind")))
    (:ROW NIL (:CELL NIL (:MISC NIL " make-two-way-stream"))
     (:CELL NIL (:MISC NIL "multiple-value-call")))
    (:ROW NIL (:CELL NIL (:MISC NIL " makunbound"))
     (:CELL NIL (:MISC NIL "multiple-value-list")))
    (:ROW NIL (:CELL NIL (:MISC NIL " map"))
     (:CELL NIL (:MISC NIL "multiple-value-prog1")))
    (:ROW NIL (:CELL NIL (:MISC NIL " map-into"))
     (:CELL NIL (:MISC NIL "multiple-value-setq")))
    (:ROW NIL (:CELL NIL (:MISC NIL " mapc"))
     (:CELL NIL (:MISC NIL "multiple-values-limit")))
    (:ROW NIL (:CELL NIL (:MISC NIL " mapcan"))
     (:CELL NIL (:MISC NIL "name-char")))
    (:ROW NIL (:CELL NIL (:MISC NIL " mapcar"))
     (:CELL NIL (:MISC NIL "namestring")))
    (:ROW NIL (:CELL NIL (:MISC NIL " mapcon"))
     (:CELL NIL (:MISC NIL "nbutlast")))
    (:ROW NIL (:CELL NIL (:MISC NIL " maphash"))
     (:CELL NIL (:MISC NIL "nconc")))
    (:ROW NIL (:CELL NIL (:MISC NIL " mapl"))
     (:CELL NIL (:MISC NIL "next-method-p")))
    (:ROW NIL (:CELL NIL (:MISC NIL " maplist"))
     (:CELL NIL (:MISC NIL "nil"))))
   " " :PAR " " :PAR
   (:TABLE
    (:NAME ("Symbols in the COMMON-LISP package (part eight of twelve)."))
    (:ROW NIL (:CELL NIL (:MISC NIL " nintersection"))
     (:CELL NIL (:MISC NIL "package-error")))
    (:ROW NIL (:CELL NIL (:MISC NIL " ninth"))
     (:CELL NIL (:MISC NIL "package-error-package")))
    (:ROW NIL (:CELL NIL (:MISC NIL " no-applicable-method"))
     (:CELL NIL (:MISC NIL "package-name")))
    (:ROW NIL (:CELL NIL (:MISC NIL " no-next-method"))
     (:CELL NIL (:MISC NIL "package-nicknames")))
    (:ROW NIL (:CELL NIL (:MISC NIL " not"))
     (:CELL NIL (:MISC NIL "package-shadowing-symbols")))
    (:ROW NIL (:CELL NIL (:MISC NIL " notany"))
     (:CELL NIL (:MISC NIL "package-use-list")))
    (:ROW NIL (:CELL NIL (:MISC NIL " notevery"))
     (:CELL NIL (:MISC NIL "package-used-by-list")))
    (:ROW NIL (:CELL NIL (:MISC NIL " notinline"))
     (:CELL NIL (:MISC NIL "packagep")))
    (:ROW NIL (:CELL NIL (:MISC NIL " nreconc"))
     (:CELL NIL (:MISC NIL "pairlis")))
    (:ROW NIL (:CELL NIL (:MISC NIL " nreverse"))
     (:CELL NIL (:MISC NIL "parse-error")))
    (:ROW NIL (:CELL NIL (:MISC NIL " nset-difference"))
     (:CELL NIL (:MISC NIL "parse-integer")))
    (:ROW NIL (:CELL NIL (:MISC NIL " nset-exclusive-or"))
     (:CELL NIL (:MISC NIL "parse-namestring")))
    (:ROW NIL (:CELL NIL (:MISC NIL " nstring-capitalize"))
     (:CELL NIL (:MISC NIL "pathname")))
    (:ROW NIL (:CELL NIL (:MISC NIL " nstring-downcase"))
     (:CELL NIL (:MISC NIL "pathname-device")))
    (:ROW NIL (:CELL NIL (:MISC NIL " nstring-upcase"))
     (:CELL NIL (:MISC NIL "pathname-directory")))
    (:ROW NIL (:CELL NIL (:MISC NIL " nsublis"))
     (:CELL NIL (:MISC NIL "pathname-host")))
    (:ROW NIL (:CELL NIL (:MISC NIL " nsubst"))
     (:CELL NIL (:MISC NIL "pathname-match-p")))
    (:ROW NIL (:CELL NIL (:MISC NIL " nsubst-if"))
     (:CELL NIL (:MISC NIL "pathname-name")))
    (:ROW NIL (:CELL NIL (:MISC NIL " nsubst-if-not"))
     (:CELL NIL (:MISC NIL "pathname-type")))
    (:ROW NIL (:CELL NIL (:MISC NIL " nsubstitute"))
     (:CELL NIL (:MISC NIL "pathname-version")))
    (:ROW NIL (:CELL NIL (:MISC NIL " nsubstitute-if"))
     (:CELL NIL (:MISC NIL "pathnamep")))
    (:ROW NIL (:CELL NIL (:MISC NIL " nsubstitute-if-not"))
     (:CELL NIL (:MISC NIL "peek-char")))
    (:ROW NIL (:CELL NIL (:MISC NIL " nth")) (:CELL NIL (:MISC NIL "phase")))
    (:ROW NIL (:CELL NIL (:MISC NIL " nth-value"))
     (:CELL NIL (:MISC NIL "pi")))
    (:ROW NIL (:CELL NIL (:MISC NIL " nthcdr"))
     (:CELL NIL (:MISC NIL "plusp")))
    (:ROW NIL (:CELL NIL (:MISC NIL " null")) (:CELL NIL (:MISC NIL "pop")))
    (:ROW NIL (:CELL NIL (:MISC NIL " number"))
     (:CELL NIL (:MISC NIL "position")))
    (:ROW NIL (:CELL NIL (:MISC NIL " numberp"))
     (:CELL NIL (:MISC NIL "position-if")))
    (:ROW NIL (:CELL NIL (:MISC NIL " numerator"))
     (:CELL NIL (:MISC NIL "position-if-not")))
    (:ROW NIL (:CELL NIL (:MISC NIL " nunion"))
     (:CELL NIL (:MISC NIL "pprint")))
    (:ROW NIL (:CELL NIL (:MISC NIL " oddp"))
     (:CELL NIL (:MISC NIL "pprint-dispatch")))
    (:ROW NIL (:CELL NIL (:MISC NIL " open"))
     (:CELL NIL (:MISC NIL "pprint-exit-if-list-exhausted")))
    (:ROW NIL (:CELL NIL (:MISC NIL " open-stream-p"))
     (:CELL NIL (:MISC NIL "pprint-fill")))
    (:ROW NIL (:CELL NIL (:MISC NIL " optimize"))
     (:CELL NIL (:MISC NIL "pprint-indent")))
    (:ROW NIL (:CELL NIL (:MISC NIL " or"))
     (:CELL NIL (:MISC NIL "pprint-linear")))
    (:ROW NIL (:CELL NIL (:MISC NIL " otherwise"))
     (:CELL NIL (:MISC NIL "pprint-logical-block")))
    (:ROW NIL (:CELL NIL (:MISC NIL " output-stream-p"))
     (:CELL NIL (:MISC NIL "pprint-newline")))
    (:ROW NIL (:CELL NIL (:MISC NIL " package"))
     (:CELL NIL (:MISC NIL "pprint-pop"))))
   " " :PAR " " :PAR
   (:TABLE
    (:NAME ("Symbols in the COMMON-LISP package (part nine of twelve)."))
    (:ROW NIL (:CELL NIL (:MISC NIL " pprint-tab"))
     (:CELL NIL (:MISC NIL "read-char")))
    (:ROW NIL (:CELL NIL (:MISC NIL " pprint-tabular"))
     (:CELL NIL (:MISC NIL "read-char-no-hang")))
    (:ROW NIL (:CELL NIL (:MISC NIL " prin1"))
     (:CELL NIL (:MISC NIL "read-delimited-list")))
    (:ROW NIL (:CELL NIL (:MISC NIL " prin1-to-string"))
     (:CELL NIL (:MISC NIL "read-from-string")))
    (:ROW NIL (:CELL NIL (:MISC NIL " princ"))
     (:CELL NIL (:MISC NIL "read-line")))
    (:ROW NIL (:CELL NIL (:MISC NIL " princ-to-string"))
     (:CELL NIL (:MISC NIL "read-preserving-whitespace")))
    (:ROW NIL (:CELL NIL (:MISC NIL " print"))
     (:CELL NIL (:MISC NIL "read-sequence")))
    (:ROW NIL (:CELL NIL (:MISC NIL " print-not-readable"))
     (:CELL NIL (:MISC NIL "reader-error")))
    (:ROW NIL (:CELL NIL (:MISC NIL " print-not-readable-object"))
     (:CELL NIL (:MISC NIL "readtable")))
    (:ROW NIL (:CELL NIL (:MISC NIL " print-object"))
     (:CELL NIL (:MISC NIL "readtable-case")))
    (:ROW NIL (:CELL NIL (:MISC NIL " print-unreadable-object"))
     (:CELL NIL (:MISC NIL "readtablep")))
    (:ROW NIL (:CELL NIL (:MISC NIL " probe-file"))
     (:CELL NIL (:MISC NIL "real")))
    (:ROW NIL (:CELL NIL (:MISC NIL " proclaim"))
     (:CELL NIL (:MISC NIL "realp")))
    (:ROW NIL (:CELL NIL (:MISC NIL " prog"))
     (:CELL NIL (:MISC NIL "realpart")))
    (:ROW NIL (:CELL NIL (:MISC NIL " prog*"))
     (:CELL NIL (:MISC NIL "reduce")))
    (:ROW NIL (:CELL NIL (:MISC NIL " prog1"))
     (:CELL NIL (:MISC NIL "reinitialize-instance")))
    (:ROW NIL (:CELL NIL (:MISC NIL " prog2")) (:CELL NIL (:MISC NIL "rem")))
    (:ROW NIL (:CELL NIL (:MISC NIL " progn")) (:CELL NIL (:MISC NIL "remf")))
    (:ROW NIL (:CELL NIL (:MISC NIL " program-error"))
     (:CELL NIL (:MISC NIL "remhash")))
    (:ROW NIL (:CELL NIL (:MISC NIL " progv"))
     (:CELL NIL (:MISC NIL "remove")))
    (:ROW NIL (:CELL NIL (:MISC NIL " provide"))
     (:CELL NIL (:MISC NIL "remove-duplicates")))
    (:ROW NIL (:CELL NIL (:MISC NIL " psetf"))
     (:CELL NIL (:MISC NIL "remove-if")))
    (:ROW NIL (:CELL NIL (:MISC NIL " psetq"))
     (:CELL NIL (:MISC NIL "remove-if-not")))
    (:ROW NIL (:CELL NIL (:MISC NIL " push"))
     (:CELL NIL (:MISC NIL "remove-method")))
    (:ROW NIL (:CELL NIL (:MISC NIL " pushnew"))
     (:CELL NIL (:MISC NIL "remprop")))
    (:ROW NIL (:CELL NIL (:MISC NIL " quote"))
     (:CELL NIL (:MISC NIL "rename-file")))
    (:ROW NIL (:CELL NIL (:MISC NIL " random"))
     (:CELL NIL (:MISC NIL "rename-package")))
    (:ROW NIL (:CELL NIL (:MISC NIL " random-state"))
     (:CELL NIL (:MISC NIL "replace")))
    (:ROW NIL (:CELL NIL (:MISC NIL " random-state-p"))
     (:CELL NIL (:MISC NIL "require")))
    (:ROW NIL (:CELL NIL (:MISC NIL " rassoc")) (:CELL NIL (:MISC NIL "rest")))
    (:ROW NIL (:CELL NIL (:MISC NIL " rassoc-if"))
     (:CELL NIL (:MISC NIL "restart")))
    (:ROW NIL (:CELL NIL (:MISC NIL " rassoc-if-not"))
     (:CELL NIL (:MISC NIL "restart-bind")))
    (:ROW NIL (:CELL NIL (:MISC NIL " ratio"))
     (:CELL NIL (:MISC NIL "restart-case")))
    (:ROW NIL (:CELL NIL (:MISC NIL " rational"))
     (:CELL NIL (:MISC NIL "restart-name")))
    (:ROW NIL (:CELL NIL (:MISC NIL " rationalize"))
     (:CELL NIL (:MISC NIL "return")))
    (:ROW NIL (:CELL NIL (:MISC NIL " rationalp"))
     (:CELL NIL (:MISC NIL "return-from")))
    (:ROW NIL (:CELL NIL (:MISC NIL " read"))
     (:CELL NIL (:MISC NIL "revappend")))
    (:ROW NIL (:CELL NIL (:MISC NIL " read-byte"))
     (:CELL NIL (:MISC NIL "reverse"))))
   " " :PAR " " :PAR
   (:TABLE (:NAME ("Symbols in the COMMON-LISP package (part ten of twelve)."))
    (:ROW NIL (:CELL NIL (:MISC NIL " room"))
     (:CELL NIL (:MISC NIL "simple-bit-vector")))
    (:ROW NIL (:CELL NIL (:MISC NIL " rotatef"))
     (:CELL NIL (:MISC NIL "simple-bit-vector-p")))
    (:ROW NIL (:CELL NIL (:MISC NIL " round"))
     (:CELL NIL (:MISC NIL "simple-condition")))
    (:ROW NIL (:CELL NIL (:MISC NIL " row-major-aref"))
     (:CELL NIL (:MISC NIL "simple-condition-format-arguments")))
    (:ROW NIL (:CELL NIL (:MISC NIL " rplaca"))
     (:CELL NIL (:MISC NIL "simple-condition-format-control")))
    (:ROW NIL (:CELL NIL (:MISC NIL " rplacd"))
     (:CELL NIL (:MISC NIL "simple-error")))
    (:ROW NIL (:CELL NIL (:MISC NIL " safety"))
     (:CELL NIL (:MISC NIL "simple-string")))
    (:ROW NIL (:CELL NIL (:MISC NIL " satisfies"))
     (:CELL NIL (:MISC NIL "simple-string-p")))
    (:ROW NIL (:CELL NIL (:MISC NIL " sbit"))
     (:CELL NIL (:MISC NIL "simple-type-error")))
    (:ROW NIL (:CELL NIL (:MISC NIL " scale-float"))
     (:CELL NIL (:MISC NIL "simple-vector")))
    (:ROW NIL (:CELL NIL (:MISC NIL " schar"))
     (:CELL NIL (:MISC NIL "simple-vector-p")))
    (:ROW NIL (:CELL NIL (:MISC NIL " search"))
     (:CELL NIL (:MISC NIL "simple-warning")))
    (:ROW NIL (:CELL NIL (:MISC NIL " second")) (:CELL NIL (:MISC NIL "sin")))
    (:ROW NIL (:CELL NIL (:MISC NIL " sequence"))
     (:CELL NIL (:MISC NIL "single-float")))
    (:ROW NIL (:CELL NIL (:MISC NIL " serious-condition"))
     (:CELL NIL (:MISC NIL "single-float-epsilon")))
    (:ROW NIL (:CELL NIL (:MISC NIL " set"))
     (:CELL NIL (:MISC NIL "single-float-negative-epsilon")))
    (:ROW NIL (:CELL NIL (:MISC NIL " set-difference"))
     (:CELL NIL (:MISC NIL "sinh")))
    (:ROW NIL (:CELL NIL (:MISC NIL " set-dispatch-macro-character"))
     (:CELL NIL (:MISC NIL "sixth")))
    (:ROW NIL (:CELL NIL (:MISC NIL " set-exclusive-or"))
     (:CELL NIL (:MISC NIL "sleep")))
    (:ROW NIL (:CELL NIL (:MISC NIL " set-macro-character"))
     (:CELL NIL (:MISC NIL "slot-boundp")))
    (:ROW NIL (:CELL NIL (:MISC NIL " set-pprint-dispatch"))
     (:CELL NIL (:MISC NIL "slot-exists-p")))
    (:ROW NIL (:CELL NIL (:MISC NIL " set-syntax-from-char"))
     (:CELL NIL (:MISC NIL "slot-makunbound")))
    (:ROW NIL (:CELL NIL (:MISC NIL " setf"))
     (:CELL NIL (:MISC NIL "slot-missing")))
    (:ROW NIL (:CELL NIL (:MISC NIL " setq"))
     (:CELL NIL (:MISC NIL "slot-unbound")))
    (:ROW NIL (:CELL NIL (:MISC NIL " seventh"))
     (:CELL NIL (:MISC NIL "slot-value")))
    (:ROW NIL (:CELL NIL (:MISC NIL " shadow"))
     (:CELL NIL (:MISC NIL "software-type")))
    (:ROW NIL (:CELL NIL (:MISC NIL " shadowing-import"))
     (:CELL NIL (:MISC NIL "software-version")))
    (:ROW NIL (:CELL NIL (:MISC NIL " shared-initialize"))
     (:CELL NIL (:MISC NIL "some")))
    (:ROW NIL (:CELL NIL (:MISC NIL " shiftf")) (:CELL NIL (:MISC NIL "sort")))
    (:ROW NIL (:CELL NIL (:MISC NIL " short-float"))
     (:CELL NIL (:MISC NIL "space")))
    (:ROW NIL (:CELL NIL (:MISC NIL " short-float-epsilon"))
     (:CELL NIL (:MISC NIL "special")))
    (:ROW NIL (:CELL NIL (:MISC NIL " short-float-negative-epsilon"))
     (:CELL NIL (:MISC NIL "special-operator-p")))
    (:ROW NIL (:CELL NIL (:MISC NIL " short-site-name"))
     (:CELL NIL (:MISC NIL "speed")))
    (:ROW NIL (:CELL NIL (:MISC NIL " signal")) (:CELL NIL (:MISC NIL "sqrt")))
    (:ROW NIL (:CELL NIL (:MISC NIL " signed-byte"))
     (:CELL NIL (:MISC NIL "stable-sort")))
    (:ROW NIL (:CELL NIL (:MISC NIL " signum"))
     (:CELL NIL (:MISC NIL "standard")))
    (:ROW NIL (:CELL NIL (:MISC NIL " simple-array"))
     (:CELL NIL (:MISC NIL "standard-char")))
    (:ROW NIL (:CELL NIL (:MISC NIL " simple-base-string"))
     (:CELL NIL (:MISC NIL "standard-char-p"))))
   " " :PAR " " :PAR
   (:TABLE
    (:NAME ("Symbols in the COMMON-LISP package (part eleven of twelve)."))
    (:ROW NIL (:CELL NIL (:MISC NIL " standard-class"))
     (:CELL NIL (:MISC NIL "sublis")))
    (:ROW NIL (:CELL NIL (:MISC NIL " standard-generic-function"))
     (:CELL NIL (:MISC NIL "subseq")))
    (:ROW NIL (:CELL NIL (:MISC NIL " standard-method"))
     (:CELL NIL (:MISC NIL "subsetp")))
    (:ROW NIL (:CELL NIL (:MISC NIL " standard-object"))
     (:CELL NIL (:MISC NIL "subst")))
    (:ROW NIL (:CELL NIL (:MISC NIL " step"))
     (:CELL NIL (:MISC NIL "subst-if")))
    (:ROW NIL (:CELL NIL (:MISC NIL " storage-condition"))
     (:CELL NIL (:MISC NIL "subst-if-not")))
    (:ROW NIL (:CELL NIL (:MISC NIL " store-value"))
     (:CELL NIL (:MISC NIL "substitute")))
    (:ROW NIL (:CELL NIL (:MISC NIL " stream"))
     (:CELL NIL (:MISC NIL "substitute-if")))
    (:ROW NIL (:CELL NIL (:MISC NIL " stream-element-type"))
     (:CELL NIL (:MISC NIL "substitute-if-not")))
    (:ROW NIL (:CELL NIL (:MISC NIL " stream-error"))
     (:CELL NIL (:MISC NIL "subtypep")))
    (:ROW NIL (:CELL NIL (:MISC NIL " stream-error-stream"))
     (:CELL NIL (:MISC NIL "svref")))
    (:ROW NIL (:CELL NIL (:MISC NIL " stream-external-format"))
     (:CELL NIL (:MISC NIL "sxhash")))
    (:ROW NIL (:CELL NIL (:MISC NIL " streamp"))
     (:CELL NIL (:MISC NIL "symbol")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string"))
     (:CELL NIL (:MISC NIL "symbol-function")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string-capitalize"))
     (:CELL NIL (:MISC NIL "symbol-macrolet")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string-downcase"))
     (:CELL NIL (:MISC NIL "symbol-name")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string-equal"))
     (:CELL NIL (:MISC NIL "symbol-package")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string-greaterp"))
     (:CELL NIL (:MISC NIL "symbol-plist")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string-left-trim"))
     (:CELL NIL (:MISC NIL "symbol-value")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string-lessp"))
     (:CELL NIL (:MISC NIL "symbolp")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string-not-equal"))
     (:CELL NIL (:MISC NIL "synonym-stream")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string-not-greaterp"))
     (:CELL NIL (:MISC NIL "synonym-stream-symbol")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string-not-lessp"))
     (:CELL NIL (:MISC NIL "t")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string-right-trim"))
     (:CELL NIL (:MISC NIL "tagbody")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string-stream"))
     (:CELL NIL (:MISC NIL "tailp")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string-trim"))
     (:CELL NIL (:MISC NIL "tan")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string-upcase"))
     (:CELL NIL (:MISC NIL "tanh")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string/="))
     (:CELL NIL (:MISC NIL "tenth")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string<"))
     (:CELL NIL (:MISC NIL "terpri")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string<="))
     (:CELL NIL (:MISC NIL "the")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string="))
     (:CELL NIL (:MISC NIL "third")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string>"))
     (:CELL NIL (:MISC NIL "throw")))
    (:ROW NIL (:CELL NIL (:MISC NIL " string>="))
     (:CELL NIL (:MISC NIL "time")))
    (:ROW NIL (:CELL NIL (:MISC NIL " stringp"))
     (:CELL NIL (:MISC NIL "trace")))
    (:ROW NIL (:CELL NIL (:MISC NIL " structure"))
     (:CELL NIL (:MISC NIL "translate-logical-pathname")))
    (:ROW NIL (:CELL NIL (:MISC NIL " structure-class"))
     (:CELL NIL (:MISC NIL "translate-pathname")))
    (:ROW NIL (:CELL NIL (:MISC NIL " structure-object"))
     (:CELL NIL (:MISC NIL "tree-equal")))
    (:ROW NIL (:CELL NIL (:MISC NIL " style-warning"))
     (:CELL NIL (:MISC NIL "truename"))))
   " " :PAR " " :PAR
   (:TABLE
    (:NAME ("Symbols in the COMMON-LISP package (part twelve of twelve)."))
    (:ROW NIL (:CELL NIL (:MISC NIL " truncate"))
     (:CELL NIL (:MISC NIL "values-list")))
    (:ROW NIL (:CELL NIL (:MISC NIL " two-way-stream"))
     (:CELL NIL (:MISC NIL "variable")))
    (:ROW NIL (:CELL NIL (:MISC NIL " two-way-stream-input-stream"))
     (:CELL NIL (:MISC NIL "vector")))
    (:ROW NIL (:CELL NIL (:MISC NIL " two-way-stream-output-stream"))
     (:CELL NIL (:MISC NIL "vector-pop")))
    (:ROW NIL (:CELL NIL (:MISC NIL " type"))
     (:CELL NIL (:MISC NIL "vector-push")))
    (:ROW NIL (:CELL NIL (:MISC NIL " type-error"))
     (:CELL NIL (:MISC NIL "vector-push-extend")))
    (:ROW NIL (:CELL NIL (:MISC NIL " type-error-datum"))
     (:CELL NIL (:MISC NIL "vectorp")))
    (:ROW NIL (:CELL NIL (:MISC NIL " type-error-expected-type"))
     (:CELL NIL (:MISC NIL "warn")))
    (:ROW NIL (:CELL NIL (:MISC NIL " type-of"))
     (:CELL NIL (:MISC NIL "warning")))
    (:ROW NIL (:CELL NIL (:MISC NIL " typecase"))
     (:CELL NIL (:MISC NIL "when")))
    (:ROW NIL (:CELL NIL (:MISC NIL " typep"))
     (:CELL NIL (:MISC NIL "wild-pathname-p")))
    (:ROW NIL (:CELL NIL (:MISC NIL " unbound-slot"))
     (:CELL NIL (:MISC NIL "with-accessors")))
    (:ROW NIL (:CELL NIL (:MISC NIL " unbound-slot-instance"))
     (:CELL NIL (:MISC NIL "with-compilation-unit")))
    (:ROW NIL (:CELL NIL (:MISC NIL " unbound-variable"))
     (:CELL NIL (:MISC NIL "with-condition-restarts")))
    (:ROW NIL (:CELL NIL (:MISC NIL " undefined-function"))
     (:CELL NIL (:MISC NIL "with-hash-table-iterator")))
    (:ROW NIL (:CELL NIL (:MISC NIL " unexport"))
     (:CELL NIL (:MISC NIL "with-input-from-string")))
    (:ROW NIL (:CELL NIL (:MISC NIL " unintern"))
     (:CELL NIL (:MISC NIL "with-open-file")))
    (:ROW NIL (:CELL NIL (:MISC NIL " union"))
     (:CELL NIL (:MISC NIL "with-open-stream")))
    (:ROW NIL (:CELL NIL (:MISC NIL " unless"))
     (:CELL NIL (:MISC NIL "with-output-to-string")))
    (:ROW NIL (:CELL NIL (:MISC NIL " unread-char"))
     (:CELL NIL (:MISC NIL "with-package-iterator")))
    (:ROW NIL (:CELL NIL (:MISC NIL " unsigned-byte"))
     (:CELL NIL (:MISC NIL "with-simple-restart")))
    (:ROW NIL (:CELL NIL (:MISC NIL " untrace"))
     (:CELL NIL (:MISC NIL "with-slots")))
    (:ROW NIL (:CELL NIL (:MISC NIL " unuse-package"))
     (:CELL NIL (:MISC NIL "with-standard-io-syntax")))
    (:ROW NIL (:CELL NIL (:MISC NIL " unwind-protect"))
     (:CELL NIL (:MISC NIL "write")))
    (:ROW NIL (:CELL NIL (:MISC NIL " update-instance-for-different-class"))
     (:CELL NIL (:MISC NIL "write-byte")))
    (:ROW NIL (:CELL NIL (:MISC NIL " update-instance-for-redefined-class"))
     (:CELL NIL (:MISC NIL "write-char")))
    (:ROW NIL (:CELL NIL (:MISC NIL " upgraded-array-element-type"))
     (:CELL NIL (:MISC NIL "write-line")))
    (:ROW NIL (:CELL NIL (:MISC NIL " upgraded-complex-part-type"))
     (:CELL NIL (:MISC NIL "write-sequence")))
    (:ROW NIL (:CELL NIL (:MISC NIL " upper-case-p"))
     (:CELL NIL (:MISC NIL "write-string")))
    (:ROW NIL (:CELL NIL (:MISC NIL " use-package"))
     (:CELL NIL (:MISC NIL "write-to-string")))
    (:ROW NIL (:CELL NIL (:MISC NIL " use-value"))
     (:CELL NIL (:MISC NIL "y-or-n-p")))
    (:ROW NIL (:CELL NIL (:MISC NIL " user-homedir-pathname"))
     (:CELL NIL (:MISC NIL "yes-or-no-p")))
    (:ROW NIL (:CELL NIL (:MISC NIL " values"))
     (:CELL NIL (:MISC NIL "zerop"))))
   " ")
  :PAR)
 (:CHAPTER (:NUM "2" :TITLE ("Syntax") :NUMTAG :CHAP-TWO :NAMETAG :SYNTAX)
  (:SECTION
   (:TITLE ("Character Syntax") :TAGS (:CHARACTER-SYNTAX :THE-STANDARD-SYNTAX))
   " " (:COMMENT NIL "% Character Syntax") :PAR
   (:COMMENT NIL "% 2.2.1 1" "% 2.2.1 2" "% 22.1.5 1") :PAR "The "
   (:TERM NIL "Lisp reader") " takes " (:TERM NIL "characters") " from a "
   (:TERM NIL "stream") ", interprets them as a printed representation of an "
   (:TERM NIL "object") ", constructs that " (:TERM NIL "object")
   ", and returns it. " :PAR
   " The syntax described by this chapter is called the "
   (:NEWTERM NIL "standard syntax") ". Operations are provided by "
   (:RM NIL " Common Lisp")
   " so that various aspects of the syntax information represented by a "
   (:TERM NIL "readtable") " can be modified under program control; see "
   (:CHAPREF NIL :READER)
   ". Except as explicitly stated otherwise, the syntax used throughout this document is "
   (:TERM NIL "standard syntax") ". " :PAR
   (:SUBSECTION (:TITLE ("Readtables") :TAGS (:READTABLES)) " " :PAR
    "Syntax information for use by the " (:TERM NIL "Lisp reader")
    " is embodied in an " (:TERM NIL "object") " called a "
    (:NEWTERM NIL "readtable") ". Among other things, the "
    (:TERM NIL "readtable") " contains the association between "
    (:TERM NIL "characters") " and " (:TERM NIL "syntax types") ". " :PAR
    (:NEXTFIGURE (:CAPS T)) " lists some " (:TERM NIL "defined names")
    " that are applicable to " (:TERM NIL "readtables") ". " :PAR
    (:TABLE (:NAME ("Readtable defined names"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " *readtable*"))
      (:CELL NIL (:FUNREF NIL "readtable-case")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " copy-readtable"))
      (:CELL NIL (:FUNREF NIL "readtablep")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " get-dispatch-macro-character"))
      (:CELL NIL (:FUNREF NIL "set-dispatch-macro-character")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " get-macro-character"))
      (:CELL NIL (:FUNREF NIL "set-macro-character")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " make-dispatch-macro-character"))
      (:CELL NIL (:FUNREF NIL "set-syntax-from-char"))))
    " " :PAR
    (:SUBSUBSECTION
     (:TITLE ("The Current Readtable") :TAGS (:CURRENT-READTABLE)) " " :PAR
     "Several " (:TERM NIL "readtables")
     " describing different syntaxes can exist, but at any given time only one, called the "
     (:NEWTERM NIL "current readtable") ", affects the way in which "
     (:TERM NIL "expressions") (:SUB NIL "2") " are parsed into "
     (:TERM NIL "objects") " by the " (:TERM NIL "Lisp reader") ". The "
     (:TERM NIL "current readtable") " in a given "
     (:TERM NIL "dynamic environment") " is the " (:TERM NIL "value") " of "
     (:VARREF NIL "*readtable*") " in that " (:TERM NIL "environment")
     ". To make a different " (:TERM NIL "readtable") " become the "
     (:TERM NIL "current readtable") ", " (:VARREF NIL "*readtable*")
     " can be " (:TERM NIL "assigned") " or " (:TERM NIL "bound") ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("The Standard Readtable")) "The "
     (:NEWTERM NIL "standard readtable") " conforms to "
     (:TERM NIL "standard syntax")
     ". The consequences are undefined if an attempt is made to modify the "
     (:TERM NIL "standard readtable") ". " (:COMMENT NIL "% 22.1.5 3")
     "To achieve the effect of altering or extending "
     (:TERM NIL "standard syntax") ", a copy of the "
     (:TERM NIL "standard readtable") " can be created; see the "
     (:TERM NIL "function") " " (:FUNREF NIL "copy-readtable") ". " :PAR "The "
     (:TERM NIL "readtable case") " of the " (:TERM NIL "standard readtable")
     " is " (:KWD NIL "upcase") ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("The Initial Readtable")) "The "
     (:NEWTERM NIL "initial readtable") " is the " (:TERM NIL "readtable")
     " that is the " (:TERM NIL "current readtable") " at the time when the "
     (:TERM NIL "Lisp image") " starts. At that time, it conforms to "
     (:TERM NIL "standard syntax") ". The " (:TERM NIL "initial readtable")
     " is " (:TERM NIL "distinct") " from the "
     (:TERM NIL "standard readtable") ". It is permissible for a "
     (:TERM NIL "conforming program") " to modify the "
     (:TERM NIL "initial readtable") ". " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Variables that affect the Lisp Reader") :TAGS (:READER-VARS)) " "
    :PAR "The " (:TERM NIL "Lisp reader") " is influenced not only by the "
    (:TERM NIL "current readtable") ", but also by various "
    (:TERM NIL "dynamic variables") ". " (:NEXTFIGURE (:CAPS T)) " lists the "
    (:TERM NIL "variables") " that influence the behavior of the "
    (:TERM NIL "Lisp reader") ". " :PAR
    (:TABLE (:NAME ("Variables that influence the Lisp reader."))
     (:ROW NIL (:CELL NIL (:VARREF NIL " *package*"))
      (:CELL NIL (:VARREF NIL "*read-default-float-format*"))
      (:CELL NIL (:VARREF NIL "*readtable*")))
     (:ROW NIL (:CELL NIL (:VARREF NIL " *read-base*"))
      (:CELL NIL (:VARREF NIL "*read-suppress*")) (:CELL NIL)))
    " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Standard Characters") :TAGS (:STANDARD-CHARS)) " "
    :PAR
    (:COMMENT NIL "% Redundant."
     " \\clisp\\ \\term{characters} are used for writing programs "
     " that can be read by a \\clisp\\ implementation, and for data.")
    (:ISSUE NIL "CHARACTER-PROPOSAL:2-2-1") " All "
    (:TERM NIL "implementations") " must support a " (:TERM NIL "character")
    " " (:TERM NIL "repertoire") " called " (:TYPEREF NIL "standard-char") "; "
    (:TERM NIL "characters") " that are members of that "
    (:TERM NIL "repertoire") " are called "
    (:NEWTERM (:IDX "standard character") "standard characters") ". " :PAR
    "The " (:TYPEREF NIL "standard-char") " " (:TERM NIL "repertoire")
    " consists of the " (:TERM NIL "non-graphic") " " (:TERM NIL "character")
    " " (:TERM NIL "newline") ", the " (:TERM NIL "graphic") " "
    (:TERM NIL "character") " " (:TERM NIL "space")
    ", and the following additional ninety-four " (:TERM NIL "graphic") " "
    (:TERM NIL "characters") " or their equivalents: " :PAR
    (:TABLE
     (:NAME
      ("Standard Character Subrepertoire (Part 1 of 3: Latin Characters)"))
     (:ROW NIL (:CELL NIL "Graphic ID") (:CELL NIL "Glyph")
      (:CELL NIL "Description") (:CELL NIL "Graphic ID") (:CELL NIL "Glyph")
      (:CELL NIL "Description"))
     (:ROW NIL (:CELL NIL " LA01 ") (:CELL NIL (:TT NIL "a"))
      (:CELL NIL " small a ") (:CELL NIL " LN01 ") (:CELL NIL (:TT NIL "n"))
      (:CELL NIL " small n "))
     (:ROW NIL (:CELL NIL " LA02 ") (:CELL NIL (:TT NIL "A"))
      (:CELL NIL " capital A ") (:CELL NIL " LN02 ") (:CELL NIL (:TT NIL "N"))
      (:CELL NIL " capital N "))
     (:ROW NIL (:CELL NIL " LB01 ") (:CELL NIL (:TT NIL "b"))
      (:CELL NIL " small b ") (:CELL NIL " LO01 ") (:CELL NIL (:TT NIL "o"))
      (:CELL NIL " small o "))
     (:ROW NIL (:CELL NIL " LB02 ") (:CELL NIL (:TT NIL "B"))
      (:CELL NIL " capital B ") (:CELL NIL " LO02 ") (:CELL NIL (:TT NIL "O"))
      (:CELL NIL " capital O "))
     (:ROW NIL (:CELL NIL " LC01 ") (:CELL NIL (:TT NIL "c"))
      (:CELL NIL " small c ") (:CELL NIL " LP01 ") (:CELL NIL (:TT NIL "p"))
      (:CELL NIL " small p "))
     (:ROW NIL (:CELL NIL " LC02 ") (:CELL NIL (:TT NIL "C"))
      (:CELL NIL " capital C ") (:CELL NIL " LP02 ") (:CELL NIL (:TT NIL "P"))
      (:CELL NIL " capital P "))
     (:ROW NIL (:CELL NIL " LD01 ") (:CELL NIL (:TT NIL "d"))
      (:CELL NIL " small d ") (:CELL NIL " LQ01 ") (:CELL NIL (:TT NIL "q"))
      (:CELL NIL " small q "))
     (:ROW NIL (:CELL NIL " LD02 ") (:CELL NIL (:TT NIL "D"))
      (:CELL NIL " capital D ") (:CELL NIL " LQ02 ") (:CELL NIL (:TT NIL "Q"))
      (:CELL NIL " capital Q "))
     (:ROW NIL (:CELL NIL " LE01 ") (:CELL NIL (:TT NIL "e"))
      (:CELL NIL " small e ") (:CELL NIL " LR01 ") (:CELL NIL (:TT NIL "r"))
      (:CELL NIL " small r "))
     (:ROW NIL (:CELL NIL " LE02 ") (:CELL NIL (:TT NIL "E"))
      (:CELL NIL " capital E ") (:CELL NIL " LR02 ") (:CELL NIL (:TT NIL "R"))
      (:CELL NIL " capital R "))
     (:ROW NIL (:CELL NIL " LF01 ") (:CELL NIL (:TT NIL "f"))
      (:CELL NIL " small f ") (:CELL NIL " LS01 ") (:CELL NIL (:TT NIL "s"))
      (:CELL NIL " small s "))
     (:ROW NIL (:CELL NIL " LF02 ") (:CELL NIL (:TT NIL "F"))
      (:CELL NIL " capital F ") (:CELL NIL " LS02 ") (:CELL NIL (:TT NIL "S"))
      (:CELL NIL " capital S "))
     (:ROW NIL (:CELL NIL " LG01 ") (:CELL NIL (:TT NIL "g"))
      (:CELL NIL " small g ") (:CELL NIL " LT01 ") (:CELL NIL (:TT NIL "t"))
      (:CELL NIL " small t "))
     (:ROW NIL (:CELL NIL " LG02 ") (:CELL NIL (:TT NIL "G"))
      (:CELL NIL " capital G ") (:CELL NIL " LT02 ") (:CELL NIL (:TT NIL "T"))
      (:CELL NIL " capital T "))
     (:ROW NIL (:CELL NIL " LH01 ") (:CELL NIL (:TT NIL "h"))
      (:CELL NIL " small h ") (:CELL NIL " LU01 ") (:CELL NIL (:TT NIL "u"))
      (:CELL NIL " small u "))
     (:ROW NIL (:CELL NIL " LH02 ") (:CELL NIL (:TT NIL "H"))
      (:CELL NIL " capital H ") (:CELL NIL " LU02 ") (:CELL NIL (:TT NIL "U"))
      (:CELL NIL " capital U "))
     (:ROW NIL (:CELL NIL " LI01 ") (:CELL NIL (:TT NIL "i"))
      (:CELL NIL " small i ") (:CELL NIL " LV01 ") (:CELL NIL (:TT NIL "v"))
      (:CELL NIL " small v "))
     (:ROW NIL (:CELL NIL " LI02 ") (:CELL NIL (:TT NIL "I"))
      (:CELL NIL " capital I ") (:CELL NIL " LV02 ") (:CELL NIL (:TT NIL "V"))
      (:CELL NIL " capital V "))
     (:ROW NIL (:CELL NIL " LJ01 ") (:CELL NIL (:TT NIL "j"))
      (:CELL NIL " small j ") (:CELL NIL " LW01 ") (:CELL NIL (:TT NIL "w"))
      (:CELL NIL " small w "))
     (:ROW NIL (:CELL NIL " LJ02 ") (:CELL NIL (:TT NIL "J"))
      (:CELL NIL " capital J ") (:CELL NIL " LW02 ") (:CELL NIL (:TT NIL "W"))
      (:CELL NIL " capital W "))
     (:ROW NIL (:CELL NIL " LK01 ") (:CELL NIL (:TT NIL "k"))
      (:CELL NIL " small k ") (:CELL NIL " LX01 ") (:CELL NIL (:TT NIL "x"))
      (:CELL NIL " small x "))
     (:ROW NIL (:CELL NIL " LK02 ") (:CELL NIL (:TT NIL "K"))
      (:CELL NIL " capital K ") (:CELL NIL " LX02 ") (:CELL NIL (:TT NIL "X"))
      (:CELL NIL " capital X "))
     (:ROW NIL (:CELL NIL " LL01 ") (:CELL NIL (:TT NIL "l"))
      (:CELL NIL " small l ") (:CELL NIL " LY01 ") (:CELL NIL (:TT NIL "y"))
      (:CELL NIL " small y "))
     (:ROW NIL (:CELL NIL " LL02 ") (:CELL NIL (:TT NIL "L"))
      (:CELL NIL " capital L ") (:CELL NIL " LY02 ") (:CELL NIL (:TT NIL "Y"))
      (:CELL NIL " capital Y "))
     (:ROW NIL (:CELL NIL " LM01 ") (:CELL NIL (:TT NIL "m"))
      (:CELL NIL " small m ") (:CELL NIL " LZ01 ") (:CELL NIL (:TT NIL "z"))
      (:CELL NIL " small z "))
     (:ROW NIL (:CELL NIL " LM02 ") (:CELL NIL (:TT NIL "M"))
      (:CELL NIL " capital M ") (:CELL NIL " LZ02 ") (:CELL NIL (:TT NIL "Z"))
      (:CELL NIL " capital Z ")))
    " " :PAR
    (:TABLE
     (:NAME
      ("Standard Character Subrepertoire (Part 2 of 3: Numeric Characters)"))
     (:ROW NIL (:CELL NIL "Graphic ID") (:CELL NIL "Glyph")
      (:CELL NIL "Description") (:CELL NIL "Graphic ID") (:CELL NIL "Glyph")
      (:CELL NIL "Description"))
     (:ROW NIL (:CELL NIL " ND01 ") (:CELL NIL (:TT NIL "1"))
      (:CELL NIL " digit 1 ") (:CELL NIL " ND06 ") (:CELL NIL (:TT NIL "6"))
      (:CELL NIL " digit 6 "))
     (:ROW NIL (:CELL NIL " ND02 ") (:CELL NIL (:TT NIL "2"))
      (:CELL NIL " digit 2 ") (:CELL NIL " ND07 ") (:CELL NIL (:TT NIL "7"))
      (:CELL NIL " digit 7 "))
     (:ROW NIL (:CELL NIL " ND03 ") (:CELL NIL (:TT NIL "3"))
      (:CELL NIL " digit 3 ") (:CELL NIL " ND08 ") (:CELL NIL (:TT NIL "8"))
      (:CELL NIL " digit 8 "))
     (:ROW NIL (:CELL NIL " ND04 ") (:CELL NIL (:TT NIL "4"))
      (:CELL NIL " digit 4 ") (:CELL NIL " ND09 ") (:CELL NIL (:TT NIL "9"))
      (:CELL NIL " digit 9 "))
     (:ROW NIL (:CELL NIL " ND05 ") (:CELL NIL (:TT NIL "5"))
      (:CELL NIL " digit 5 ") (:CELL NIL " ND10 ") (:CELL NIL (:TT NIL "0"))
      (:CELL NIL " digit 0 ")))
    " " :PAR " "
    (:TABLE
     (:NAME
      ("Standard Character Subrepertoire (Part 3 of 3: Special Characters)")
      :TAGS (:STD-CHARS-THREE))
     (:ROW NIL (:CELL NIL "Graphic ID") (:CELL NIL "Glyph")
      (:CELL NIL "Description"))
     (:ROW NIL (:CELL NIL " SP02 ") (:CELL NIL (:TT NIL "!"))
      (:CELL NIL " exclamation mark "))
     (:ROW NIL (:CELL NIL " SC03 ") (:CELL NIL (:TT NIL "$"))
      (:CELL NIL " dollar sign "))
     (:ROW NIL (:CELL NIL " SP04 ") (:CELL NIL (:TT NIL "\""))
      (:CELL NIL " quotation mark, or double quote "))
     (:ROW NIL (:CELL NIL " SP05 ") (:CELL NIL (:TT NIL "'"))
      (:CELL NIL " apostrophe, or " (:BRAC NIL "single") " quote "))
     (:ROW NIL (:CELL NIL " SP06 ") (:CELL NIL (:TT NIL "("))
      (:CELL NIL " left parenthesis, or open parenthesis "))
     (:ROW NIL (:CELL NIL " SP07 ") (:CELL NIL (:TT NIL ")"))
      (:CELL NIL " right parenthesis, or close parenthesis "))
     (:ROW NIL (:CELL NIL " SP08 ") (:CELL NIL (:TT NIL ","))
      (:CELL NIL " comma "))
     (:ROW NIL (:CELL NIL " SP09 ") (:CELL NIL (:TT NIL "_"))
      (:CELL NIL " low line, or underscore "))
     (:ROW NIL (:CELL NIL " SP10 ") (:CELL NIL (:TT NIL "-"))
      (:CELL NIL " hyphen, or minus " (:BRAC NIL "sign")))
     (:ROW NIL (:CELL NIL " SP11 ") (:CELL NIL (:TT NIL "."))
      (:CELL NIL " full stop, period, or dot "))
     (:ROW NIL (:CELL NIL " SP12 ") (:CELL NIL (:TT NIL "/"))
      (:CELL NIL " solidus, or slash "))
     (:ROW NIL (:CELL NIL " SP13 ") (:CELL NIL (:TT NIL ":"))
      (:CELL NIL " colon "))
     (:ROW NIL (:CELL NIL " SP14 ") (:CELL NIL (:TT NIL ";"))
      (:CELL NIL " semicolon "))
     (:ROW NIL (:CELL NIL " SP15 ") (:CELL NIL (:TT NIL "?"))
      (:CELL NIL " question mark "))
     (:ROW NIL (:CELL NIL " SA01 ") (:CELL NIL (:TT NIL "+"))
      (:CELL NIL " plus " (:BRAC NIL "sign")))
     (:ROW NIL (:CELL NIL " SA03 ") (:CELL NIL (:TT NIL "<"))
      (:CELL NIL " less-than " (:BRAC NIL "sign")))
     (:ROW NIL (:CELL NIL " SA04 ") (:CELL NIL (:TT NIL "="))
      (:CELL NIL " equals " (:BRAC NIL "sign")))
     (:ROW NIL (:CELL NIL " SA05 ") (:CELL NIL (:TT NIL ">"))
      (:CELL NIL " greater-than " (:BRAC NIL "sign")))
     (:ROW NIL (:CELL NIL " SM01 ") (:CELL NIL (:TT NIL "#"))
      (:CELL NIL " number sign, or sharp" (:BRAC NIL "sign")))
     (:ROW NIL (:CELL NIL " SM02 ") (:CELL NIL (:TT NIL "%"))
      (:CELL NIL " percent " (:BRAC NIL "sign")))
     (:ROW NIL (:CELL NIL " SM03 ") (:CELL NIL (:TT NIL "&"))
      (:CELL NIL " ampersand "))
     (:ROW NIL (:CELL NIL " SM04 ") (:CELL NIL (:TT NIL "*"))
      (:CELL NIL " asterisk, or star "))
     (:ROW NIL (:CELL NIL " SM05 ") (:CELL NIL (:TT NIL "@"))
      (:CELL NIL " commercial at, or at-sign "))
     (:ROW NIL (:CELL NIL " SM06 ") (:CELL NIL (:TT NIL "["))
      (:CELL NIL " left " (:BRAC NIL "square") " bracket "))
     (:ROW NIL (:CELL NIL " SM07 ") (:CELL NIL (:TT NIL "\\"))
      (:CELL NIL " reverse solidus, or backslash "))
     (:ROW NIL (:CELL NIL " SM08 ") (:CELL NIL (:TT NIL "]"))
      (:CELL NIL " right " (:BRAC NIL "square") " bracket "))
     (:ROW NIL (:CELL NIL " SM11 ") (:CELL NIL (:TT NIL "{"))
      (:CELL NIL " left curly bracket, or left brace "))
     (:ROW NIL (:CELL NIL " SM13 ") (:CELL NIL (:TT NIL "|"))
      (:CELL NIL " vertical bar "))
     (:ROW NIL (:CELL NIL " SM14 ") (:CELL NIL (:TT NIL "}"))
      (:CELL NIL " right curly bracket, or right brace "))
     (:ROW NIL (:CELL NIL " SD13 ") (:CELL NIL (:TT NIL "`"))
      (:CELL NIL " grave accent, or backquote "))
     (:ROW NIL (:CELL NIL " SD15 ") (:CELL NIL (:TT NIL "^"))
      (:CELL NIL " circumflex accent "))
     (:ROW NIL (:CELL NIL " SD19 ") (:CELL NIL (:TT NIL " "))
      (:CELL NIL " tilde ")))
    " " :PAR "The graphic IDs are not used within " (:RM NIL " Common Lisp")
    ", but are provided for cross reference purposes with "
    (:BIB (:URL "https://www.iso.org/standard/13467.html") "ISO 6937/2")
    ". Note that the first letter of the graphic ID categorizes the character as follows: L—Latin, N—Numeric, S—Special. "
    :PAR)
   :PAR (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-2-1") " " :PAR
   (:SUBSECTION
    (:TITLE ("Character Syntax Types") :TAGS (:CHARACTER-SYNTAX-TYPES)) " "
    :PAR (:COMMENT NIL "% 22.1.1 1") :PAR "The " (:TERM NIL "Lisp reader")
    " constructs an " (:TERM NIL "object")
    " from the input text by interpreting each " (:TERM NIL "character")
    " according to its " (:TERM NIL "syntax type") ". The "
    (:TERM NIL "Lisp reader") " cannot accept as input everything that the "
    (:TERM NIL "Lisp printer") " produces, and the " (:TERM NIL "Lisp reader")
    " has features that are not used by the " (:TERM NIL "Lisp printer")
    ". The " (:TERM NIL "Lisp reader")
    " can be used as a lexical analyzer for a more general user-written parser. "
    :PAR (:COMMENT NIL "% 22.1.1 2" "% 22.1.1 3") "When the "
    (:TERM NIL "Lisp reader")
    " is invoked, it reads a single character from the " (:TERM NIL "input")
    " " (:TERM NIL "stream") " and dispatches according to the "
    (:NEWTERM NIL "syntax type") " of that " (:TERM NIL "character") ". Every "
    (:TERM NIL "character") " that can appear in the " (:TERM NIL "input") " "
    (:TERM NIL "stream") " is of one of the " (:TERM NIL "syntax types")
    " shown in " (:FIGREF NIL :POSSIBLE-SYNTAX-TYPES) ". " :PAR " "
    (:TABLE
     (:NAME ("Possible Character Syntax Types") :TAGS (:POSSIBLE-SYNTAX-TYPES))
     (:ROW NIL (:CELL NIL (:TERM NIL "constituent"))
      (:CELL NIL (:TERM NIL "macro character"))
      (:CELL NIL (:TERM NIL "single escape")))
     (:ROW NIL (:CELL NIL (:TERM NIL "invalid"))
      (:CELL NIL (:TERM NIL "multiple escape"))
      (:CELL NIL (:TERM NIL "whitespace") (:SUB NIL "2"))))
    " " :PAR "The " (:TERM NIL "syntax type") " of a " (:TERM NIL "character")
    " in a " (:TERM NIL "readtable")
    " determines how that character is interpreted by the "
    (:TERM NIL "Lisp reader") " while that " (:TERM NIL "readtable") " is the "
    (:TERM NIL "current readtable")
    ". At any given time, every character has exactly one "
    (:TERM NIL "syntax type") ". " :PAR (:COMMENT NIL "% 22.1.1 4" "% 2.3.0 5")
    (:FIGREF NIL :CHAR-SYNTAX-TYPES-IN-STD-SYNTAX) " lists the "
    (:TERM NIL "syntax type") " of each " (:TERM NIL "character") " in "
    (:TERM NIL "standard syntax") ". " :PAR " " (:COMMENT NIL "% 22.1.1 36")
    "  " (:COMMENT NIL "cheat on \"char\" => \"character\" to make fit") " "
    (:COMMENT NIL "ditto") "    "
    (:TABLE
     (:NAME ("Character Syntax Types in Standard Syntax") :TAGS
      (:CHAR-SYNTAX-TYPES-IN-STD-SYNTAX))
     (:ROW NIL (:CELL NIL "character") (:CELL NIL "syntax type")
      (:CELL NIL "character") (:CELL NIL "syntax type"))
     (:ROW NIL (:CELL NIL " Backspace") (:CELL NIL (:TERM NIL "constituent"))
      (:CELL NIL "0–9") (:CELL NIL (:TERM NIL "constituent")))
     (:ROW NIL (:CELL NIL " Tab")
      (:CELL NIL (:TERM NIL "whitespace") (:SUB NIL "2")) (:CELL NIL ":")
      (:CELL NIL (:TERM NIL "constituent")))
     (:ROW NIL (:CELL NIL " Newline")
      (:CELL NIL (:TERM NIL "whitespace") (:SUB NIL "2")) (:CELL NIL ";")
      (:CELL NIL (:TERM NIL "terminating") (:TERM NIL "macro char")))
     (:ROW NIL (:CELL NIL " Linefeed")
      (:CELL NIL (:TERM NIL "whitespace") (:SUB NIL "2"))
      (:CELL NIL (:TT NIL "<")) (:CELL NIL (:TERM NIL "constituent")))
     (:ROW NIL (:CELL NIL " Page")
      (:CELL NIL (:TERM NIL "whitespace") (:SUB NIL "2")) (:CELL NIL "=")
      (:CELL NIL (:TERM NIL "constituent")))
     (:ROW NIL (:CELL NIL " Return")
      (:CELL NIL (:TERM NIL "whitespace") (:SUB NIL "2"))
      (:CELL NIL (:TT NIL ">")) (:CELL NIL (:TERM NIL "constituent")))
     (:ROW NIL (:CELL NIL " Space")
      (:CELL NIL (:TERM NIL "whitespace") (:SUB NIL "2")) (:CELL NIL "?")
      (:CELL NIL (:TERM NIL "constituent") "*"))
     (:ROW NIL (:CELL NIL " !") (:CELL NIL (:TERM NIL "constituent") "*")
      (:CELL NIL (:TT NIL " @")) (:CELL NIL (:TERM NIL "constituent")))
     (:ROW NIL (:CELL NIL (:TT NIL "\""))
      (:CELL NIL (:TERM NIL "terminating") (:TERM NIL "macro char"))
      (:CELL NIL "A–Z") (:CELL NIL (:TERM NIL "constituent")))
     (:ROW NIL (:CELL NIL " #")
      (:CELL NIL (:TERM NIL "non-terminating") (:TERM NIL "macro char"))
      (:CELL NIL (:TT NIL "[")) (:CELL NIL (:TERM NIL "constituent") "*"))
     (:ROW NIL (:CELL NIL " $") (:CELL NIL (:TERM NIL "constituent"))
      (:CELL NIL (:TT NIL "\\")) (:CELL NIL (:TERM NIL "single escape")))
     (:ROW NIL (:CELL NIL " %") (:CELL NIL (:TERM NIL "constituent"))
      (:CELL NIL (:TT NIL "]")) (:CELL NIL (:TERM NIL "constituent") "*"))
     (:ROW NIL (:CELL NIL " &") (:CELL NIL (:TERM NIL "constituent"))
      (:CELL NIL "^") (:CELL NIL (:TERM NIL "constituent")))
     (:ROW NIL (:CELL NIL " '")
      (:CELL NIL (:TERM NIL "terminating") (:TERM NIL "macro char"))
      (:CELL NIL (:TT NIL "_")) (:CELL NIL (:TERM NIL "constituent")))
     (:ROW NIL (:CELL NIL " (")
      (:CELL NIL (:TERM NIL "terminating") (:TERM NIL "macro char"))
      (:CELL NIL "`")
      (:CELL NIL (:TERM NIL "terminating") (:TERM NIL "macro char")))
     (:ROW NIL (:CELL NIL " )")
      (:CELL NIL (:TERM NIL "terminating") (:TERM NIL "macro char"))
      (:CELL NIL "a–z") (:CELL NIL (:TERM NIL "constituent")))
     (:ROW NIL (:CELL NIL (:TT NIL "*")) (:CELL NIL (:TERM NIL "constituent"))
      (:CELL NIL (:TT NIL "{")) (:CELL NIL (:TERM NIL "constituent") "*"))
     (:ROW NIL (:CELL NIL " +") (:CELL NIL (:TERM NIL "constituent"))
      (:CELL NIL (:TT NIL "|")) (:CELL NIL (:TERM NIL "multiple escape")))
     (:ROW NIL (:CELL NIL " ,")
      (:CELL NIL (:TERM NIL "terminating") (:TERM NIL "macro char"))
      (:CELL NIL (:TT NIL "}")) (:CELL NIL (:TERM NIL "constituent") "*"))
     (:ROW NIL (:CELL NIL " -") (:CELL NIL (:TERM NIL "constituent"))
      (:CELL NIL (:TT NIL " ")) (:CELL NIL (:TERM NIL "constituent")))
     (:ROW NIL (:CELL NIL " .") (:CELL NIL (:TERM NIL "constituent"))
      (:CELL NIL "Rubout") (:CELL NIL (:TERM NIL "constituent")))
     (:ROW NIL (:CELL NIL " /") (:CELL NIL (:TERM NIL "constituent"))))
    " " :PAR
    (:COMMENT NIL
     "% The next two paragraphs were mutually redundant, so I collapsed them into one. -kmp 17-Jan-92")
    "The characters marked with an asterisk (*) are initially "
    (:TERM NIL "constituents") ", "
    (:COMMENT NIL
     " but are reserved to the user for use as \\term{macro characters} or for any other"
     " desired purpose." "                     "
     " Brackets (\\f{[} and \\f{]})," " braces   (\\f{\\{}, \\f{\\}}),"
     " question mark (\\f{?})," " and exclamation point (\\f{!})"
     " are defined to be constituents, ")
    "but they are not used in any standard " (:RM NIL " Common Lisp")
    " notations. "
    (:COMMENT NIL
     "!!! Maybe make a glossary term out of \"reserved to the programmer\""
     "    and discuss the issue of who the \"programmer\" is in the face of"
     "    cascaded/layered/embedded implementations, some of which are conforming"
     "    and some of which are not.")
    "These characters are explicitly reserved to the " (:TERM NIL "programmer")
    ". " (:TT NIL " ") " is not used in " (:RM NIL " Common Lisp")
    ", and reserved to implementors. " (:TT NIL "$") " and " (:TT NIL "%")
    " are " (:TERM NIL "alphabetic") (:SUB NIL "2") " "
    (:TERM NIL "characters") ", but are not used in the names of any standard "
    (:RM NIL " Common Lisp") " " (:TERM NIL "defined names") ". " :PAR
    (:TERM NIL "Whitespace") (:SUB NIL "2")
    " characters serve as separators but are otherwise ignored. "
    (:TERM NIL "Constituent") " and " (:TERM NIL "escape") " "
    (:TERM NIL "characters") " are accumulated to make a " (:TERM NIL "token")
    ", which is then interpreted as a " (:TERM NIL "number") " or "
    (:TERM NIL "symbol") ". " (:TERM NIL "Macro characters")
    " trigger the invocation of " (:TERM NIL "functions")
    " (possibly user-supplied) that can perform arbitrary parsing actions. "
    (:TERM NIL "Macro characters") " are divided into two kinds, "
    (:TERM NIL "terminating") " and " (:TERM NIL "non-terminating")
    ", depending on whether or not they terminate a " (:TERM NIL "token")
    ". The following are descriptions of each kind of "
    (:TERM NIL "syntax type") ". " :PAR
    (:SUBSUBSECTION
     (:TITLE ("Constituent Characters") :TAGS (:CONSTITUENT-CHARS)) " " :PAR
     (:TERM NIL "Constituent") " " (:TERM NIL "characters") " are used in "
     (:TERM NIL "tokens") ". "
     (:COMMENT NIL
      "% Sandra didn't like this wording, and wanted \"representation of\" added. -kmp 19-Nov-91"
      "A \\term{token} is a \\term{number} or a \\term{symbol} name.")
     "A " (:NEWTERM NIL "token") " is a representation of a "
     (:TERM NIL "number") " or a " (:TERM NIL "symbol") ". Examples of "
     (:TERM NIL "constituent") " " (:TERM NIL "characters")
     " are letters and digits. " :PAR (:COMMENT NIL "% 2.3.0 6")
     "Letters in symbol names are sometimes converted to letters in the opposite "
     (:TERM NIL "case") " when the name is read; see "
     (:SECREF NIL :READTABLE-CASE-READ-EFFECT) ". " (:TERM NIL "Case")
     " conversion can be suppressed by the use of " (:TERM NIL "single escape")
     " or " (:TERM NIL "multiple escape") " characters. "
     (:COMMENT NIL "% Moved to the section \"Case in Symbols\" -kmp 25-Jan-92"
      " The \\term{symbols} that correspond to \\clisp\\ \\term{defined names}"
      " have uppercase names even though their names generally appear"
      " in lowercase in this document.")
     :PAR)
    (:SUBSUBSECTION (:TITLE ("Constituent Traits") :TAGS (:CONSTITUENT-TRAITS))
     " " :PAR "Every " (:TERM NIL "character") " has one or more "
     (:TERM NIL "constituent traits") " that define how the "
     (:TERM NIL "character") " is to be interpreted by the "
     (:TERM NIL "Lisp reader") " when the " (:TERM NIL "character") " is a "
     (:TERM NIL "constituent") " " (:TERM NIL "character") ". These "
     (:TERM NIL "constituent traits") " are " (:TERM NIL "alphabetic")
     (:SUB NIL "2") ", digit, " (:TERM NIL "package marker")
     ", plus sign, minus sign, dot, decimal point, " (:TERM NIL "ratio marker")
     ", " (:TERM NIL "exponent marker") ", and " (:TERM NIL "invalid") ". "
     (:FIGREF NIL :CONSTITUENT-TRAITS-OF-STD-CHARS) " shows the "
     (:TERM NIL "constituent traits") " of the "
     (:TERM NIL "standard characters") " and of certain "
     (:TERM NIL "semi-standard") " " (:TERM NIL "characters") "; "
     (:COMMENT NIL
      " I added this next to clarify.  It effectively says the same thing in SET-SYNTAX-FROM-CHAR."
      " -kmp 28-Jan-92")
     "no mechanism is provided for changing the "
     (:TERM NIL "constituent trait") " of a " (:TERM NIL "character") ". Any "
     (:TERM NIL "character") " with the alphadigit "
     (:TERM NIL "constituent trait") " in that figure is a digit if the "
     (:TERM NIL "current input base")
     " is greater than that character's digit value, otherwise the "
     (:TERM NIL "character") " is " (:TERM NIL "alphabetic") (:SUB NIL "2")
     ". "
     (:COMMENT NIL
      "\\term{Alphabetic}\\meaning{2} \\term{constituents} are valid"
      "\\term{characters} for \\term{symbol} \\term{names}.  ")
     "Any " (:TERM NIL "character") " quoted by a " (:TERM NIL "single escape")
     " is treated as an " (:TERM NIL "alphabetic") (:SUB NIL "2")
     " constituent, regardless of its normal syntax. " :PAR " "
     (:FIGURE (:TAGS (:CONSTITUENT-TRAITS-OF-STD-CHARS)) "     "
      (:TABLE (:NAME NIL)
       (:ROW NIL (:CELL NIL (:B NIL " constituent"))
        (:CELL NIL (:B NIL " traits")) (:CELL NIL (:B NIL " constituent"))
        (:CELL NIL (:B NIL " traits")))
       (:ROW NIL (:CELL NIL (:B NIL " character")) (:CELL NIL)
        (:CELL NIL (:B NIL " character")))
       (:ROW (:RULE T :GAP 4) (:CELL NIL " Backspace")
        (:CELL NIL (:TERM NIL "invalid")) (:CELL NIL (:TT NIL "{"))
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2")))
       (:ROW NIL (:CELL NIL " Tab") (:CELL NIL (:TERM NIL "invalid") "*")
        (:CELL NIL (:TT NIL "}"))
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2")))
       (:ROW NIL (:CELL NIL " Newline") (:CELL NIL (:TERM NIL "invalid") "*")
        (:CELL NIL "+")
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2") ", plus sign"))
       (:ROW NIL (:CELL NIL " Linefeed") (:CELL NIL (:TERM NIL "invalid") "*")
        (:CELL NIL "-")
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2") ", minus sign"))
       (:ROW NIL (:CELL NIL " Page") (:CELL NIL (:TERM NIL "invalid") "*")
        (:CELL NIL ".")
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2")
         ", dot, decimal point"))
       (:ROW NIL (:CELL NIL " Return") (:CELL NIL (:TERM NIL "invalid") "*")
        (:CELL NIL "/")
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2") ", "
         (:TERM NIL "ratio marker")))
       (:ROW NIL (:CELL NIL " Space") (:CELL NIL (:TERM NIL "invalid") "*")
        (:CELL NIL "A, a") (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL " ! ")
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2")) (:CELL NIL "B, b")
        (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL (:TT NIL " \""))
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2") "*")
        (:CELL NIL "C, c") (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL " #")
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2") "*")
        (:CELL NIL "D, d")
        (:CELL NIL "alphadigit, double-float " (:TERM NIL "exponent marker")))
       (:ROW NIL (:CELL NIL " $")
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2")) (:CELL NIL "E, e")
        (:CELL NIL "alphadigit, float " (:TERM NIL "exponent marker")))
       (:ROW NIL (:CELL NIL " %")
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2")) (:CELL NIL "F, f")
        (:CELL NIL "alphadigit, single-float " (:TERM NIL "exponent marker")))
       (:ROW NIL (:CELL NIL " &")
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2")) (:CELL NIL "G, g")
        (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL " '")
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2") "*")
        (:CELL NIL "H, h") (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL " (")
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2") "*")
        (:CELL NIL "I, i") (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL " )")
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2") "*")
        (:CELL NIL "J, j") (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL (:TT NIL " *"))
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2")) (:CELL NIL "K, k")
        (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL " ,")
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2") "*")
        (:CELL NIL "L, l")
        (:CELL NIL "alphadigit, long-float " (:TERM NIL "exponent marker")))
       (:ROW NIL (:CELL NIL " 0-9") (:CELL NIL "alphadigit") (:CELL NIL "M, m")
        (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL " :") (:CELL NIL (:TERM NIL "package marker"))
        (:CELL NIL "N, n") (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL " ;")
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2") "*")
        (:CELL NIL "O, o") (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL (:TT NIL "<"))
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2")) (:CELL NIL "P, p")
        (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL " =")
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2")) (:CELL NIL "Q, q")
        (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL (:TT NIL ">"))
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2")) (:CELL NIL "R, r")
        (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL " ?")
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2")) (:CELL NIL "S, s")
        (:CELL NIL "alphadigit, short-float " (:TERM NIL "exponent marker")))
       (:ROW NIL (:CELL NIL (:TT NIL "@"))
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2")) (:CELL NIL "T, t")
        (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL (:TT NIL "["))
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2")) (:CELL NIL "U, u")
        (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL (:TT NIL "\\"))
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2") "*")
        (:CELL NIL "V, v") (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL (:TT NIL "]"))
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2")) (:CELL NIL "W, w")
        (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL " ^")
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2")) (:CELL NIL "X, x")
        (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL (:TT NIL "_"))
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2")) (:CELL NIL "Y, y")
        (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL " `")
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2") "*")
        (:CELL NIL "Z, z") (:CELL NIL "alphadigit"))
       (:ROW NIL (:CELL NIL (:TT NIL "|"))
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2") "*")
        (:CELL NIL "Rubout") (:CELL NIL (:TERM NIL "invalid")))
       (:ROW NIL (:CELL NIL (:TT NIL " "))
        (:CELL NIL (:TERM NIL "alphabetic") (:SUB NIL "2"))))
      " "
      (:CAPTION NIL
       "Constituent Traits of Standard Characters and Semi-Standard Characters")
      " ")
     " " :PAR "The interpretations in this table apply only to "
     (:TERM NIL "characters") " whose " (:TERM NIL "syntax type") " is "
     (:TERM NIL "constituent")
     ". Entries marked with an asterisk (*) are normally "
     (:TERM NIL "shadowed") (:SUB NIL "2") " because the indicated "
     (:TERM NIL "characters") " are of " (:TERM NIL "syntax type") " "
     (:TERM NIL "whitespace") (:SUB NIL "2") ", " (:TERM NIL "macro character")
     ", " (:TERM NIL "single escape") ", or " (:TERM NIL "multiple escape")
     "; these " (:TERM NIL "constituent traits")
     " apply to them only if their " (:TERM NIL "syntax types")
     " are changed to " (:TERM NIL "constituent") ". " :PAR)
    :PAR :PAR
    (:SUBSUBSECTION (:TITLE ("Invalid Characters") :TAGS (:INVALID-CHARS)) " "
     :PAR (:TERM NIL "Characters") " with the " (:TERM NIL "constituent trait")
     " " (:TERM NIL "invalid") " cannot ever appear in a " (:TERM NIL "token")
     " except under the control of a " (:TERM NIL "single escape") " "
     (:TERM NIL "character") ". If an " (:TERM NIL "invalid") " "
     (:TERM NIL "character") " is encountered while an " (:TERM NIL "object")
     " is being read, an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "reader-error") " is signaled. If an " (:TERM NIL "invalid")
     " " (:TERM NIL "character") " is preceded by a "
     (:TERM NIL "single escape") " " (:TERM NIL "character")
     ", it is treated as an " (:TERM NIL "alphabetic") (:SUB NIL "2") " "
     (:TERM NIL "constituent") " instead. " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Macro Characters") :TAGS (:MACRO-CHARS)) " " :PAR
     "When the " (:TERM NIL "Lisp reader") " encounters a "
     (:TERM NIL "macro character") " on an " (:TERM NIL "input") " "
     (:TERM NIL "stream") ", special parsing of subsequent "
     (:TERM NIL "characters") " on the " (:TERM NIL "input") " "
     (:TERM NIL "stream") " is performed. " :PAR "A "
     (:TERM NIL "macro character") " has an associated " (:TERM NIL "function")
     " called a " (:NEWTERM NIL "reader macro function")
     " that implements its specialized parsing behavior. An association of this kind can be established or modified under control of a "
     (:TERM NIL "conforming program") " by using the " (:TERM NIL "functions")
     " " (:FUNREF NIL "set-macro-character") " and "
     (:FUNREF NIL "set-dispatch-macro-character") ". " :PAR
     "Upon encountering a " (:TERM NIL "macro character") ", the "
     (:TERM NIL "Lisp reader") " calls its "
     (:TERM NIL "reader macro function")
     ", which parses one specially formatted object from the "
     (:TERM NIL "input") " " (:TERM NIL "stream") ". The "
     (:TERM NIL "function") " either returns the parsed " (:TERM NIL "object")
     ", or else it returns no " (:TERM NIL "values")
     " to indicate that the characters scanned by the " (:TERM NIL "function")
     " are being ignored (" (:I NIL "e.g.")
     ",  in the case of a comment). Examples of "
     (:TERM NIL "macro characters") " are " (:TERM NIL "backquote") ", "
     (:TERM NIL "single-quote") ", " (:TERM NIL "left-parenthesis") ", and "
     (:TERM NIL "right-parenthesis") ". " :PAR "A "
     (:TERM NIL "macro character") " is either " (:TERM NIL "terminating")
     " or " (:TERM NIL "non-terminating") ". The difference between "
     (:TERM NIL "terminating") " and " (:TERM NIL "non-terminating") " "
     (:TERM NIL "macro characters")
     " lies in what happens when such characters occur in the middle of a "
     (:TERM NIL "token") ". If a " (:NEWTERM NIL "non-terminating") " "
     (:TERM NIL "macro character") " occurs in the middle of a "
     (:TERM NIL "token") ", the " (:TERM NIL "function")
     " associated with the " (:TERM NIL "non-terminating") " "
     (:TERM NIL "macro character") " is not called, and the "
     (:TERM NIL "non-terminating") " " (:TERM NIL "macro character")
     " does not terminate the " (:TERM NIL "token")
     "'s name; it becomes part of the name as if the "
     (:TERM NIL "macro character") " were really a constituent character. A "
     (:NEWTERM NIL "terminating") " " (:TERM NIL "macro character")
     " terminates any " (:TERM NIL "token") ", and its associated "
     (:TERM NIL "reader macro function") " is called no matter where the "
     (:TERM NIL "character") " appears. The only "
     (:TERM NIL "non-terminating") " " (:TERM NIL "macro character") " in "
     (:TERM NIL "standard syntax") " is " (:TERM NIL "sharpsign") ". " :PAR
     "If a " (:TERM NIL "character") " is a "
     (:TERM NIL "dispatching macro character") " "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) ", its "
     (:TERM NIL "reader macro function") " is a " (:TERM NIL "function")
     " supplied by the " (:TERM NIL "implementation") ". This "
     (:TERM NIL "function") " reads decimal " (:TERM NIL "digit") " "
     (:TERM NIL "characters") " until a non-" (:TERM NIL "digit") " "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) " is read. If any "
     (:TERM NIL "digits")
     " were read, they are converted into a corresponding "
     (:TERM NIL "integer") " infix parameter " (:MATH NIL (:MI NIL "P"))
     "; otherwise, the infix parameter " (:MATH NIL (:MI NIL "P")) " is "
     (:MISC NIL "nil") ". The terminating non-" (:TERM NIL "digit") " "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) " is a "
     (:TERM NIL "character")
     " (sometimes called a “sub-character” to emphasize its subordinate role in the dispatching) that is looked up in the dispatch table associated with the "
     (:TERM NIL "dispatching macro character") " "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) ". The "
     (:TERM NIL "reader macro function") " associated with the sub-character "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2")))
     " is invoked with three arguments: the " (:TERM NIL "stream")
     ", the sub-character " (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2")))
     ", and the infix parameter " (:MATH NIL (:MI NIL "P"))
     ". For more information about dispatch characters, see the "
     (:TERM NIL "function") " " (:FUNREF NIL "set-dispatch-macro-character")
     ". " :PAR "For information about the " (:TERM NIL "macro characters")
     " that are available in " (:TERM NIL "standard syntax") ", see "
     (:SECREF NIL :STANDARD-MACRO-CHARS) ". " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Multiple Escape Characters") :TAGS (:MULTIPLE-ESCAPE-CHAR)) " "
     :PAR "A pair of " (:NEWTERM NIL "multiple escape") " "
     (:TERM NIL "characters")
     " is used to indicate that an enclosed sequence of characters, including possible "
     (:TERM NIL "macro characters") " and " (:TERM NIL "whitespace")
     (:SUB NIL "2") " " (:TERM NIL "characters") ", are to be treated as "
     (:TERM NIL "alphabetic") (:SUB NIL "2") " " (:TERM NIL "characters")
     " with " (:TERM NIL "case") " preserved. Any " (:TERM NIL "single escape")
     " and " (:TERM NIL "multiple escape") " " (:TERM NIL "characters")
     " that are to appear in the sequence must be preceded by a "
     (:TERM NIL "single escape") " " (:TERM NIL "character") ". " :PAR
     (:TERM NIL "Vertical-bar") " is a " (:TERM NIL "multiple escape") " "
     (:TERM NIL "character") " in " (:TERM NIL "standard syntax") ". " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Examples of Multiple Escape Characters"))
      (:CODE NIL
       " ;; The following examples assume the readtable case of *readtable* 
 ;; and *print-case* are both :upcase.
 (eq 'abc 'ABC) → "
       (:TERM NIL "true") "
 (eq 'abc '|ABC|) → "
       (:TERM NIL "true") "
 (eq 'abc 'a|B|c) → "
       (:TERM NIL "true") "
 (eq 'abc '|abc|) → "
       (:TERM NIL "false") "
")
      " " :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Single Escape Character") :TAGS (:SINGLE-ESCAPE-CHAR)) " " :PAR
     "A " (:NEWTERM NIL "single escape") " is used to indicate that the next "
     (:TERM NIL "character") " is to be treated as an "
     (:TERM NIL "alphabetic") (:SUB NIL "2") " " (:TERM NIL "character")
     " with its " (:TERM NIL "case") " preserved, no matter what the "
     (:TERM NIL "character") " is or which " (:TERM NIL "constituent traits")
     " it has. " :PAR
     (:COMMENT NIL
      "% \"slash\" => \"backslash\" as an editorial change per Boyer/Kaufmann/Moore #4."
      "% This was right everywhere else in the manual--shame for it to be wrong here."
      "% -kmp 9-May-94")
     (:TERM NIL "Backslash") " is a " (:TERM NIL "single escape") " "
     (:TERM NIL "character") " in " (:TERM NIL "standard syntax") ". " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Examples of Single Escape Characters"))
      (:CODE NIL
       " ;; The following examples assume the readtable case of *readtable* 
 ;; and *print-case* are both :upcase.
 (eq 'abc '\\A\\B\\C) → "
       (:TERM NIL "true") "
 (eq 'abc 'a\\Bc) → "
       (:TERM NIL "true") "
 (eq 'abc '\\ABC) → "
       (:TERM NIL "true") "
 (eq 'abc '\\abc) → "
       (:TERM NIL "false") "
")
      " " :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Whitespace Characters") :TAGS (:WHITESPACE-CHARS)) " " :PAR
     (:TERM NIL "Whitespace") (:SUB NIL "2") " " (:TERM NIL "characters")
     " are used to separate " (:TERM NIL "tokens") ". " :PAR
     (:TERM NIL "Space") " and " (:TERM NIL "newline") " are "
     (:TERM NIL "whitespace") (:SUB NIL "2") " " (:TERM NIL "characters")
     " in " (:TERM NIL "standard syntax") ". " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Examples of Whitespace Characters"))
      (:CODE NIL " (length '(this-that)) → 1
 (length '(this - that)) → 3
 (length '(a
           b)) → 2
 (+ 34) → 34
 (+ 3 4) → 7
")
      " " :PAR)
     :PAR)
    :PAR))
  :PAR
  (:SECTION (:TITLE ("Reader Algorithm") :TAGS (:READER-ALGORITHM)) " "
   (:COMMENT NIL "% Reader Algorithm") :PAR (:COMMENT NIL "% 22.1.1 5")
   "This section describes the algorithm used by the "
   (:TERM NIL "Lisp reader") " to parse " (:TERM NIL "objects") " from an "
   (:TERM NIL "input") " " (:TERM NIL "character") " " (:TERM NIL "stream")
   ", including how the " (:TERM NIL "Lisp reader") " processes "
   (:TERM NIL "macro characters") ". " :PAR "When dealing with "
   (:TERM NIL "tokens")
   ", the reader's basic function is to distinguish representations of "
   (:TERM NIL "symbols") " from those of " (:TERM NIL "numbers") ". "
   (:COMMENT NIL "%Barmar didn't like the double negatives:"
    " When a \\term{token} is"
    " accumulated, it is assumed to be a \\term{number} unless it does"
    " not satisfy the Syntax for Numbers listed in \\figref\\SyntaxForNumericTokens.")
   "When a " (:TERM NIL "token")
   " is accumulated, it is assumed to represent a " (:TERM NIL "number")
   " if it satisfies the syntax for numbers listed in "
   (:FIGREF NIL :SYNTAX-FOR-NUMERIC-TOKENS) ". "
   (:COMMENT NIL "%Ditto:"
    " If it is not a \\term{number}, it is then assumed to be a potential"
    " number unless it does not satisfy the rules governing the syntax for a"
    " \\term{potential number}.")
   "If it does not represent a " (:TERM NIL "number")
   ", it is then assumed to be a " (:TERM NIL "potential number")
   " if it satisfies the rules governing the syntax for a "
   (:TERM NIL "potential number") ". If a valid " (:TERM NIL "token")
   " is neither a representation of a " (:TERM NIL "number") " nor a "
   (:TERM NIL "potential number") ", it represents a " (:TERM NIL "symbol")
   ". " :PAR "The algorithm performed by the " (:TERM NIL "Lisp reader")
   " is as follows: " :PAR (:COMMENT NIL "% 22.1.1 6")
   (:LIST NIL
    (:ITEM NIL
     "1. If at end of file, end-of-file processing is performed as specified in "
     (:FUNREF NIL "read") ". Otherwise, one " (:TERM NIL "character") ", "
     (:PARAM NIL "x") ", is read from the " (:TERM NIL "input") " "
     (:TERM NIL "stream") ", and dispatched according to the "
     (:TERM NIL "syntax type") " of " (:PARAM NIL "x")
     " to one of steps 2 to 7. " :PAR (:COMMENT NIL "% 22.1.1 7"))
    (:ITEM NIL "2. If " (:PARAM NIL "x") " is an " (:TERM NIL "invalid") " "
     (:TERM NIL "character") ", an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "reader-error") " is signaled. " :PAR
     (:COMMENT NIL "% 22.1.1 8"))
    (:ITEM NIL "3. If " (:PARAM NIL "x") " is a " (:TERM NIL "whitespace")
     (:SUB NIL "2") " " (:TERM NIL "character")
     ", then it is discarded and step 1 is re-entered. " :PAR
     (:COMMENT NIL "% 22.1.1 9"))
    (:ITEM NIL "4. If " (:PARAM NIL "x") " is a " (:TERM NIL "terminating")
     " or " (:TERM NIL "non-terminating") " " (:TERM NIL "macro character")
     " then its associated " (:TERM NIL "reader macro function")
     " is called with two " (:TERM NIL "arguments") ", the "
     (:TERM NIL "input") " " (:TERM NIL "stream") " and " (:PARAM NIL "x") ". "
     :PAR (:COMMENT NIL "% 22.1.1 10") "The "
     (:TERM NIL "reader macro function") " may read " (:TERM NIL "characters")
     " from the " (:TERM NIL "input") " " (:TERM NIL "stream")
     "; if it does, it will see those " (:TERM NIL "characters")
     " following the " (:TERM NIL "macro character") ". The "
     (:TERM NIL "Lisp reader") " may be invoked recursively from the "
     (:TERM NIL "reader macro function") ". " :PAR (:COMMENT NIL "% 22.1.5 16")
     "The " (:TERM NIL "reader macro function")
     " must not have any side effects other than on the " (:TERM NIL "input")
     " " (:TERM NIL "stream")
     "; because of backtracking and restarting of the " (:FUNREF NIL "read")
     " operation, front ends to the " (:TERM NIL "Lisp reader") " ("
     (:I NIL "e.g.") ",  “editors” and “rubout handlers”) may cause the "
     (:TERM NIL "reader macro function")
     " to be called repeatedly during the reading of a single "
     (:TERM NIL "expression") " in which " (:PARAM NIL "x")
     " only appears once. " :PAR (:COMMENT NIL "% 22.1.1 11") "The "
     (:TERM NIL "reader macro function")
     " may return zero values or one value. If one value is returned, then that value is returned as the result of the read operation; the algorithm is done. If zero values are returned, then step 1 is re-entered. "
     :PAR (:COMMENT NIL "% 22.1.1 12"))
    (:ITEM NIL "5. If " (:PARAM NIL "x") " is a " (:TERM NIL "single escape")
     " " (:TERM NIL "character") " then the next " (:TERM NIL "character") ", "
     (:PARAM NIL "y") ", is read, or an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "end-of-file") " is signaled if at the end of file. "
     (:PARAM NIL "y") " is treated as if it is a " (:TERM NIL "constituent")
     " whose only " (:TERM NIL "constituent trait") " is "
     (:TERM NIL "alphabetic") (:SUB NIL "2") ". " (:PARAM NIL "y")
     " is used to begin a " (:TERM NIL "token") ", and step 8 is entered. "
     :PAR (:COMMENT NIL "% 22.1.1 13"))
    (:ITEM NIL "6. If " (:PARAM NIL "x") " is a " (:TERM NIL "multiple escape")
     " " (:TERM NIL "character") " then a " (:TERM NIL "token")
     " (initially containing no " (:TERM NIL "characters")
     ") is begun and step 9 is entered. " :PAR (:COMMENT NIL "% 22.1.1 14"))
    (:ITEM NIL "7. If " (:PARAM NIL "x") " is a " (:TERM NIL "constituent") " "
     (:TERM NIL "character") ", then it begins a " (:TERM NIL "token")
     ". After the " (:TERM NIL "token")
     " is read in, it will be interpreted either as a " (:RM NIL " Lisp") " "
     (:TERM NIL "object") " or as being of invalid syntax. If the "
     (:TERM NIL "token") " represents an " (:TERM NIL "object") ", that "
     (:TERM NIL "object")
     " is returned as the result of the read operation. If the "
     (:TERM NIL "token") " is of invalid syntax, an error is signaled. "
     (:COMMENT NIL " If \\param{x} is a \\term{lowercase} \\term{character},"
      " it is replaced with the corresponding \\term{uppercase} \\term{character}."
      "% Tentatively replaced with the following to satisfy Sandra:")
     "If " (:PARAM NIL "x") " is a " (:TERM NIL "character") " with "
     (:TERM NIL "case") ", it might be replaced with the corresponding "
     (:TERM NIL "character") " of the opposite " (:TERM NIL "case")
     ", depending on the " (:TERM NIL "readtable case") " of the "
     (:TERM NIL "current readtable") ", as outlined in "
     (:SECREF NIL :READTABLE-CASE-READ-EFFECT) ". " (:PARAM NIL "X")
     " is used to begin a " (:TERM NIL "token") ", and step 8 is entered. "
     :PAR (:COMMENT NIL "% 22.1.1 15" "% 22.1.1 16" "% 22.1.1 17"))
    (:ITEM NIL "8. At this point a " (:TERM NIL "token")
     " is being accumulated, and an even number of "
     (:TERM NIL "multiple escape") " " (:TERM NIL "characters")
     " have been encountered. If at end of file, step 10 is entered. Otherwise, a "
     (:TERM NIL "character") ", " (:PARAM NIL "y")
     ", is read, and one of the following actions is performed according to its "
     (:TERM NIL "syntax type") ": " :PAR
     (:LIST NIL
      (:ITEM NIL " If " (:PARAM NIL "y") " is a " (:TERM NIL "constituent")
       " or " (:TERM NIL "non-terminating") " " (:TERM NIL "macro character")
       ": "
       (:LIST NIL
        (:ITEM NIL "– "
         (:COMMENT NIL
          " If \\param{y} is a \\term{lowercase} \\term{character}, it is replaced with the"
          " corresponding \\term{uppercase} \\term{character}."
          "% Tentatively replaced with the following to satisfy Sandra:")
         "If " (:PARAM NIL "y") " is a " (:TERM NIL "character") " with "
         (:TERM NIL "case") ", it might be replaced with the corresponding "
         (:TERM NIL "character") " of the opposite " (:TERM NIL "case")
         ", depending on the " (:TERM NIL "readtable case") " of the "
         (:TERM NIL "current readtable") ", as outlined in "
         (:SECREF NIL :READTABLE-CASE-READ-EFFECT) ". ")
        (:ITEM NIL "– " (:PARAM NIL "Y") " is appended to the "
         (:TERM NIL "token") " being built. ")
        (:ITEM NIL "– Step 8 is repeated. "))
       " " :PAR (:COMMENT NIL "% 22.1.1 18"))
      (:ITEM NIL " If " (:PARAM NIL "y") " is a " (:TERM NIL "single escape")
       " " (:TERM NIL "character") ", then the next " (:TERM NIL "character")
       ", " (:PARAM NIL "z") ", is read, or an error of " (:TERM NIL "type")
       " " (:TYPEREF NIL "end-of-file") " is signaled if at end of file. "
       (:PARAM NIL "Z") " is treated as if it is a " (:TERM NIL "constituent")
       " whose only " (:TERM NIL "constituent trait") " is "
       (:TERM NIL "alphabetic") (:SUB NIL "2") ". " (:PARAM NIL "Z")
       " is appended to the " (:TERM NIL "token")
       " being built, and step 8 is repeated. " :PAR
       (:COMMENT NIL "% 22.1.1 19"))
      (:ITEM NIL " If " (:PARAM NIL "y") " is a " (:TERM NIL "multiple escape")
       " " (:TERM NIL "character") ", then step 9 is entered. " :PAR
       (:COMMENT NIL "% 22.1.1 20"))
      (:ITEM NIL " If " (:PARAM NIL "y") " is an " (:TERM NIL "invalid") " "
       (:TERM NIL "character") ", an error of " (:TERM NIL "type") " "
       (:TYPEREF NIL "reader-error") " is signaled. " :PAR
       (:COMMENT NIL "% 22.1.1 21"))
      (:ITEM NIL " If " (:PARAM NIL "y") " is a " (:TERM NIL "terminating") " "
       (:TERM NIL "macro character") ", then it terminates the "
       (:TERM NIL "token") ". First the " (:TERM NIL "character") " "
       (:PARAM NIL "y") " is unread (see " (:FUNREF NIL "unread-char")
       "), and then step 10 is entered. " :PAR (:COMMENT NIL "% 22.1.1 22"))
      (:ITEM NIL " If " (:PARAM NIL "y") " is a " (:TERM NIL "whitespace")
       (:SUB NIL "2") " " (:TERM NIL "character") ", then it terminates the "
       (:TERM NIL "token") ". First the " (:TERM NIL "character") " "
       (:PARAM NIL "y") " is unread if appropriate (see "
       (:FUNREF NIL "read-preserving-whitespace")
       "), and then step 10 is entered. "))
     " " :PAR (:COMMENT NIL "% 22.1.1 23" "% 22.1.1 24"))
    (:ITEM NIL "9. At this point a " (:TERM NIL "token")
     " is being accumulated, and an odd number of "
     (:TERM NIL "multiple escape") " " (:TERM NIL "characters")
     " have been encountered. If at end of file, an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "end-of-file")
     " is signaled. Otherwise, a " (:TERM NIL "character") ", "
     (:PARAM NIL "y")
     ", is read, and one of the following actions is performed according to its "
     (:TERM NIL "syntax type") ": " :PAR (:COMMENT NIL "% 22.1.1 25")
     (:LIST NIL
      (:ITEM NIL " If " (:PARAM NIL "y") " is a " (:TERM NIL "constituent")
       ", macro, or " (:TERM NIL "whitespace") (:SUB NIL "2") " "
       (:TERM NIL "character") ", " (:PARAM NIL "y") " is treated as a "
       (:TERM NIL "constituent") " whose only " (:TERM NIL "constituent trait")
       " is " (:TERM NIL "alphabetic") (:SUB NIL "2") ". " (:PARAM NIL "Y")
       " is appended to the " (:TERM NIL "token")
       " being built, and step 9 is repeated. " :PAR
       (:COMMENT NIL "% 22.1.1 26"))
      (:ITEM NIL " If " (:PARAM NIL "y") " is a " (:TERM NIL "single escape")
       " " (:TERM NIL "character") ", then the next " (:TERM NIL "character")
       ", " (:PARAM NIL "z") ", is read, or an error of " (:TERM NIL "type")
       " " (:TYPEREF NIL "end-of-file") " is signaled if at end of file. "
       (:PARAM NIL "Z") " is treated as a " (:TERM NIL "constituent")
       " whose only " (:TERM NIL "constituent trait") " is "
       (:TERM NIL "alphabetic") (:SUB NIL "2") ". " (:PARAM NIL "Z")
       " is appended to the " (:TERM NIL "token")
       " being built, and step 9 is repeated. " :PAR
       (:COMMENT NIL "% 22.1.1 27"))
      (:ITEM NIL " If " (:PARAM NIL "y") " is a " (:TERM NIL "multiple escape")
       " " (:TERM NIL "character") ", then step 8 is entered. " :PAR
       (:COMMENT NIL "% 22.1.1 28"))
      (:ITEM NIL " If " (:PARAM NIL "y") " is an " (:TERM NIL "invalid") " "
       (:TERM NIL "character") ", an error of " (:TERM NIL "type") " "
       (:TYPEREF NIL "reader-error") " is signaled. "))
     " " :PAR (:COMMENT NIL "% 22.1.1 29"))
    (:ITEM NIL "10. An entire " (:TERM NIL "token")
     " has been accumulated. The " (:TERM NIL "object") " represented by the "
     (:TERM NIL "token")
     " is returned as the result of the read operation, or an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "reader-error")
     " is signaled if the " (:TERM NIL "token") " is not of valid syntax. "))
   " " :PAR
   (:COMMENT NIL "% 22.1.1 30" "% 22.1.1 31"
    "%Barmar observes that this is said elsewhere, and in any case is"
    "%implied by the algorithm above:"
    " \\term{Single escape} and \\term{multiple escape} \\term{characters}"
    " can be included in a \\term{token} when"
    " preceded by another \\term{single escape} \\term{character}.")
   :PAR)
  :PAR
  (:SECTION (:TITLE ("Interpretation of Tokens") :TAGS (:INTERP-OF-TOKENS)) " "
   (:COMMENT NIL "% Interpretation of Tokens") :PAR
   (:SUBSECTION (:TITLE ("Numbers as Tokens")) "When a " (:TERM NIL "token")
    " is read, it is interpreted as a " (:TERM NIL "number") " or "
    (:TERM NIL "symbol") ". The " (:TERM NIL "token") " is interpreted as a "
    (:TERM NIL "number")
    " if it satisfies the syntax for numbers specified in " (:NEXTFIGURE NIL)
    ". "
    (:COMMENT NIL "\\term{Whitespace}\\meaning{2}, macro, and escape"
     "characters are treated as \\term{alphabetic}\\meaning{2} within an extended \\term{token}"
     "unless preceded by an escape character.")
    :PAR " " (:COMMENT NIL "% 2.1.2 3" "% 2.1.2 4" "% 22.1.2 3")
    (:FIGURE (:TAGS (:SYNTAX-FOR-NUMERIC-TOKENS)) " "
     (:TABLE (:NAME NIL)
      (:ROW NIL (:CELL NIL (:PARAM NIL "numeric-token"))
       (:CELL NIL " ::" (:MATH NIL (:MO NIL "=")))
       (:CELL NIL (:DOWN NIL "integer") (:MATH NIL (:MO NIL "|"))
        (:DOWN NIL "ratio") (:MATH NIL (:MO NIL "|")) (:DOWN NIL "float")))
      (:ROW NIL (:CELL NIL (:PARAM NIL "integer"))
       (:CELL NIL " ::" (:MATH NIL (:MO NIL "=")))
       (:CELL NIL (:BRAC NIL (:PARAM NIL "sign"))
        (:PLUS NIL (:CURLY NIL (:PARAM NIL "decimal-digit")))
        (:PARAM NIL "decimal-point") (:MATH NIL (:MO NIL "|"))
        (:BRAC NIL (:PARAM NIL "sign"))
        (:PLUS NIL (:CURLY NIL (:PARAM NIL "digit")))))
      (:ROW NIL
       (:CELL NIL
        (:COMMENT NIL
         "  \\param{integer}         & ::$=$ & \\ttbrac{\\param{sign}} "
         " 				   \\plus{\\curly{\\param{digit}}}"
         " 				   \\ttbrac{\\param{decimal-point}} \\cr")
        (:PARAM NIL "ratio"))
       (:CELL NIL " ::" (:MATH NIL (:MO NIL "=")))
       (:CELL NIL (:BRAC NIL (:PARAM NIL "sign"))
        (:PLUS NIL (:CURLY NIL (:PARAM NIL "digit"))) (:PARAM NIL "slash")
        (:PLUS NIL (:CURLY NIL (:PARAM NIL "digit")))))
      (:ROW NIL (:CELL NIL (:PARAM NIL "float"))
       (:CELL NIL " ::" (:MATH NIL (:MO NIL "=")))
       (:CELL NIL (:BRAC NIL (:PARAM NIL "sign"))
        (:STAR NIL (:CURLY NIL (:PARAM NIL "decimal-digit")))
        (:PARAM NIL "decimal-point")
        (:PLUS NIL (:CURLY NIL (:PARAM NIL "decimal-digit")))
        (:BRAC NIL (:DOWN NIL "exponent")) (:BR NIL)
        (:MATH NIL (:MO NIL "|") (:MO NIL ";")) (:BRAC NIL (:PARAM NIL "sign"))
        (:PLUS NIL (:CURLY NIL (:PARAM NIL "decimal-digit")))
        (:BRAC NIL (:PARAM NIL "decimal-point") " "
         (:STAR NIL (:CURLY NIL (:PARAM NIL "decimal-digit"))))
        (:DOWN NIL "exponent")))
      (:ROW NIL (:CELL NIL (:PARAM NIL "exponent"))
       (:CELL NIL " ::" (:MATH NIL (:MO NIL "=")))
       (:CELL NIL (:PARAM NIL "exponent-marker")
        (:BRAC NIL (:PARAM NIL "sign"))
        (:PLUS NIL (:CURLY NIL (:PARAM NIL "digit")))))
      (:ROW (:GAP 5)
       (:CELL (:SPAN 3) (:PARAM NIL "sign") "—a " (:TERM NIL "sign") "."))
      (:ROW NIL
       (:CELL (:SPAN 3) (:PARAM NIL "slash") "—a " (:TERM NIL "slash")))
      (:ROW NIL
       (:CELL (:SPAN 3) (:PARAM NIL "decimal-point") "—a " (:TERM NIL "dot")
        "."))
      (:ROW NIL
       (:CELL (:SPAN 3) (:PARAM NIL "exponent-marker") "—an "
        (:TERM NIL "exponent marker") "."))
      (:ROW NIL
       (:CELL (:SPAN 3) (:PARAM NIL "decimal-digit") "—a " (:TERM NIL "digit")
        " in " (:TERM NIL "radix") (:TT NIL "10") "."))
      (:ROW NIL
       (:CELL (:SPAN 3) (:PARAM NIL "digit") "—a " (:TERM NIL "digit")
        " in the " (:TERM NIL "current input radix") ".")))
     " " (:CAPTION NIL "Syntax for Numeric Tokens") " ")
    " " :PAR
    (:SUBSUBSECTION
     (:TITLE ("Potential Numbers as Tokens") :TAGS
      (:POTENTIAL-NUMBERS-AS-TOKENS))
     " " :PAR (:COMMENT NIL "% 22.1.2 3" "% 22.1.2 4")
     "To allow implementors and future " (:RM NIL " Common Lisp")
     " standards to extend the syntax of numbers, a syntax for "
     (:TERM NIL "potential numbers")
     " is defined that is more general than the syntax for numbers. A "
     (:TERM NIL "token") " is a " (:TERM NIL "potential number")
     " if it satisfies all of the following requirements: " :PAR
     (:COMMENT NIL "% 22.1.2 5")
     (:LIST NIL
      (:ITEM NIL "1. The " (:TERM NIL "token") " consists entirely of "
       (:TERM NIL "digits") ", " (:TERM NIL "signs") ", "
       (:TERM NIL "ratio markers") ", decimal points (" (:TT NIL ".")
       "), extension characters (^ or " (:TT NIL "_")
       "), and number markers. A number marker is a letter. Whether a letter may be treated as a number marker depends on context, but no letter that is adjacent to another letter may ever be treated as a number marker. "
       (:TERM NIL "Exponent markers") " are number markers. " :PAR
       (:COMMENT NIL "% 22.1.2 6"))
      (:ITEM NIL "2. The " (:TERM NIL "token")
       " contains at least one digit. Letters may be considered to be digits, depending on the "
       (:TERM NIL "current input base") ", but only in " (:TERM NIL "tokens")
       " containing no decimal points. " :PAR (:COMMENT NIL "% 22.1.2 7"))
      (:ITEM NIL "3. The " (:TERM NIL "token") " begins with a "
       (:TERM NIL "digit") ", " (:TERM NIL "sign")
       ", decimal point, or extension character, " (:ISSUE NIL "COLON-NUMBER")
       " "
       (:REVIEWER NIL
        "Barmar: This section is unnecessary because the first bullet already omits discussion of a colon ("
        (:TERM NIL "package marker") ").")
       (:COMMENT NIL "!!!") "but not a " (:COMMENT NIL "colon.")
       (:TERM NIL "package marker") ". The syntax involving a leading "
       (:COMMENT NIL "colon") (:TERM NIL "package marker") " followed by a "
       (:TERM NIL "potential number")
       " is not well-defined. The consequences of the use of notation such as "
       (:TT NIL ":1") ", " (:TT NIL ":1/2") ", and " (:TT NIL ":2^3")
       " in a position where an expression appropriate for "
       (:FUNREF NIL "read") " is expected are unspecified. "
       (:ENDISSUE NIL "COLON-NUMBER") " " :PAR (:COMMENT NIL "% 22.1.2 8"))
      (:ITEM NIL "4. The " (:TERM NIL "token") " does not end with a sign. "))
     " " :PAR (:COMMENT NIL "% 22.1.2 10") "If a "
     (:TERM NIL "potential number") " has number syntax, a "
     (:TERM NIL "number")
     " of the appropriate type is constructed and returned, if the "
     (:TERM NIL "number") " is representable in an implementation. A "
     (:TERM NIL "number")
     " will not be representable in an implementation if it is outside the boundaries set by the "
     (:TERM NIL "implementation-dependent") " constants for "
     (:TERM NIL "numbers")
     ". For example, specifying too large or too small an exponent for a "
     (:TERM NIL "float") " may make the " (:TERM NIL "number")
     " impossible to represent in the implementation. A " (:TERM NIL "ratio")
     " with denominator zero (such as " (:TT NIL "-35/000")
     ") is not represented in any implementation. When a " (:TERM NIL "token")
     " with the syntax of a number cannot be converted to an internal "
     (:TERM NIL "number") ", an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "reader-error")
     " is signaled. An error must not be signaled for specifying too many significant digits for a "
     (:TERM NIL "float") "; a truncated or rounded value should be produced. "
     :PAR (:COMMENT NIL "% 22.1.2 11" "% 22.1.2 12")
     "If there is an ambiguity as to whether a letter should be treated as a digit or as a number marker, the letter is treated as a digit. "
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Escape Characters and Potential Numbers") :TAGS
       (:ESC-CHARS-AND-POTENTIAL-NUMS))
      " "
      (:COMMENT NIL
       "% This section moved from 22.1.2 per Loosemore #11 (first public review). -kmp 10-May-93")
      :PAR (:COMMENT NIL "% 22.1.2 9" "The printed representation for") "A "
      (:TERM NIL "potential number") " cannot contain any "
      (:TERM NIL "escape") " " (:TERM NIL "characters") ". An "
      (:TERM NIL "escape") " " (:TERM NIL "character") " robs the following "
      (:TERM NIL "character")
      " of all syntactic qualities, forcing it to be strictly "
      (:TERM NIL "alphabetic") (:SUB NIL "2")
      " and therefore unsuitable for use in a " (:TERM NIL "potential number")
      ". For example, all of the following representations are interpreted as "
      (:TERM NIL "symbols") ", not " (:TERM NIL "numbers") ": " :PAR
      (:CODE NIL
       " \\256   25\\64   1.0\\E6   |100|   3\\.14159   |3/4|   3\\/4   5||
")
      " " :PAR "In each case, removing the " (:TERM NIL "escape") " "
      (:TERM NIL "character") " (or " (:TERM NIL "characters") ") would "
      (:COMMENT NIL
       "% Kent and Sandra agreed that the following word change was editorial"
       "% and would de-mystify the intent. -kmp 12-May-93"
       "allow the token to be treated as a \\term{number}.")
      "cause the token to be a " (:TERM NIL "potential number") ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Examples of Potential Numbers"))
      "As examples, the " (:TERM NIL "tokens") " in " (:NEXTFIGURE NIL) " are "
      (:TERM NIL "potential numbers")
      ", but they are not actually numbers, and so are reserved "
      (:TERM NIL "tokens") "; a " (:TERM NIL "conforming implementation")
      " is permitted, but not required, to define their meaning. " :PAR
      (:TABLE (:NAME ("Examples of reserved tokens"))
       (:ROW NIL (:CELL NIL (:TT NIL "1b5000")) (:CELL NIL (:TT NIL "777777q"))
        (:CELL NIL (:TT NIL "1.7J")) (:CELL NIL (:TT NIL "-3/4+6.7J"))
        (:CELL NIL (:TT NIL "12/25/83")))
       (:ROW NIL (:CELL NIL (:TT NIL "27^19")) (:CELL NIL (:TT NIL "3^4/5"))
        (:CELL NIL (:TT NIL "6//7")) (:CELL NIL (:TT NIL "3.1.2.6"))
        (:CELL NIL (:TT NIL "^-43^")))
       (:ROW NIL (:CELL NIL (:TT NIL "3.141_592_653_589_793_238_4"))
        (:CELL NIL (:TT NIL "-3.7+2.6i-6.17j+19.6k"))))
      " " :PAR "The " (:TERM NIL "tokens") " in " (:NEXTFIGURE NIL) " are not "
      (:TERM NIL "potential numbers") "; they are always treated as "
      (:TERM NIL "symbols") ": " :PAR
      (:TABLE (:NAME ("Examples of symbols"))
       (:ROW NIL (:CELL NIL (:TT NIL "/")) (:CELL NIL (:TT NIL "/5"))
        (:CELL NIL (:TT NIL "+")) (:CELL NIL (:TT NIL "1+"))
        (:CELL NIL (:TT NIL "1-")))
       (:ROW NIL (:CELL NIL (:TT NIL "foo+")) (:CELL NIL (:TT NIL "ab.cd"))
        (:CELL NIL (:TT NIL "_")) (:CELL NIL (:TT NIL "^"))
        (:CELL NIL (:TT NIL "^/-"))))
      " " :PAR "The " (:TERM NIL "tokens") " in " (:NEXTFIGURE NIL) " are "
      (:TERM NIL "potential numbers") " if the "
      (:TERM NIL "current input base") " is " (:TT NIL "16")
      ", but they are always treated as " (:TERM NIL "symbols") " if the "
      (:TERM NIL "current input base") " is " (:TT NIL "10") ". " :PAR
      (:TABLE (:NAME ("Examples of symbols or potential numbers"))
       (:ROW NIL (:CELL NIL (:TT NIL "bad-face"))
        (:CELL NIL (:TT NIL "25-dec-83")) (:CELL NIL (:TT NIL "a/b"))
        (:CELL NIL (:TT NIL "fad_cafe")) (:CELL NIL (:TT NIL "f^"))))
      " " :PAR)
     :PAR)
    :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Constructing Numbers from Tokens") :TAGS (:NUMS-FROM-TOKENS)) " "
    :PAR "A " (:TERM NIL "real")
    " is constructed directly from a corresponding numeric "
    (:TERM NIL "token") "; see " (:FIGREF NIL :SYNTAX-FOR-NUMERIC-TOKENS) ". "
    :PAR "A " (:TERM NIL "complex") " is notated as a " (:TT NIL "#C") " (or "
    (:TT NIL "#c") ") followed by a " (:TERM NIL "list") " of two "
    (:TERM NIL "reals") "; see " (:SECREF NIL :SHARPSIGN-C) ". " :PAR "The "
    (:TERM NIL "reader macros") " " (:TT NIL "#B") ", " (:TT NIL "#O") ", "
    (:TT NIL "#X") ", and " (:TT NIL "#R")
    " may also be useful in controlling the input " (:TERM NIL "radix")
    " in which " (:TERM NIL "rationals") " are parsed; see "
    (:SECREF NIL :SHARPSIGN-B) ", " (:SECREF NIL :SHARPSIGN-O) ", "
    (:SECREF NIL :SHARPSIGN-X) ", and " (:SECREF NIL :SHARPSIGN-R) ". " :PAR
    "This section summarizes the full syntax for " (:TERM NIL "numbers") ". "
    :PAR
    (:SUBSUBSECTION (:TITLE ("Syntax of a Rational"))
     (:SUBSUBSUBSECTION
      (:TITLE ("Syntax of an Integer") :TAGS (:SYNTAX-OF-INTEGERS)) " " :PAR
      (:COMMENT NIL "% 2.1.2 3") :PAR
      (:COMMENT NIL
       " \\term{Integers} can be written as a sequence of digits, optionally"
       " preceded by a sign and optionally followed by a decimal point;"
       " \\seefigure\\SyntaxForNumericTokens.")
      :PAR (:TERM NIL "Integers") " can be written as a sequence of "
      (:TERM NIL "digits") ", optionally preceded by a " (:TERM NIL "sign")
      " and optionally followed by a decimal point; see "
      (:FIGREF NIL :SYNTAX-FOR-NUMERIC-TOKENS)
      ". When a decimal point is used, the " (:TERM NIL "digits")
      " are taken to be in " (:TERM NIL "radix") " " (:TT NIL "10")
      "; when no decimal point is used, the " (:TERM NIL "digits")
      " are taken to be in radix given by the "
      (:TERM NIL "current input base") ". " :PAR "For information on how "
      (:TERM NIL "integers") " are printed, see "
      (:SECREF NIL :PRINTING-INTEGERS) ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Syntax of a Ratio") :TAGS (:SYNTAX-OF-RATIOS)) " " :PAR
      (:TERM NIL "Ratios") " can be written as an optional " (:TERM NIL "sign")
      " followed by two non-empty sequences of " (:TERM NIL "digits")
      " separated by a " (:TERM NIL "slash") "; see "
      (:FIGREF NIL :SYNTAX-FOR-NUMERIC-TOKENS) ". " (:COMMENT NIL "% 2.1.2 4")
      "The second sequence may not consist entirely of zeros. "
      (:COMMENT NIL "The same radix specifiers"
       "(one of \\f{\\#\\param{nn}R}, \\f{\\#O}, \\f{\\#B}, or \\f{\\#X}) as for "
       "\\term{integers}"
       "are used to notate \\term{ratios} in radices other than ten.")
      "Examples of " (:TERM NIL "ratios") " are in " (:NEXTFIGURE NIL) ". "
      :PAR
      (:TABLE (:NAME ("Examples of Ratios"))
       (:ROW NIL (:CELL NIL (:TT NIL "2/3"))
        (:CELL NIL " ;This is in canonical form "))
       (:ROW NIL (:CELL NIL (:TT NIL "4/6"))
        (:CELL NIL " ;A non-canonical form for 2/3 "))
       (:ROW NIL (:CELL NIL (:TT NIL "-17/23"))
        (:CELL NIL " ;A ratio preceded by a sign "))
       (:ROW NIL (:CELL NIL (:TT NIL "-30517578125/32768"))
        (:CELL NIL " ;This is "
         (:MATH NIL (:MO NIL "(") (:MO NIL "-") (:MN NIL "5") (:MO NIL "/")
          (:MN NIL "2") (:MSUP NIL (:MO NIL ")") (:MN NIL "15")))))
       (:ROW NIL (:CELL NIL (:TT NIL "10/5"))
        (:CELL NIL " ;The canonical form for this is " (:TT NIL "2")))
       (:ROW NIL (:CELL NIL (:TT NIL "#o-101/75"))
        (:CELL NIL " ;Octal notation for "
         (:MATH NIL (:MO NIL "-") (:MN NIL "65") (:MO NIL "/")
          (:MN NIL "61"))))
       (:ROW NIL (:CELL NIL (:TT NIL "#3r120/21"))
        (:CELL NIL " ;Ternary notation for "
         (:MATH NIL (:MN NIL "15") (:MO NIL "/") (:MN NIL "7"))))
       (:ROW NIL (:CELL NIL (:TT NIL "#Xbc/ad"))
        (:CELL NIL " ;Hexadecimal notation for "
         (:MATH NIL (:MN NIL "188") (:MO NIL "/") (:MN NIL "173"))))
       (:ROW NIL (:CELL NIL (:TT NIL "#xFADED/FACADE"))
        (:CELL NIL " ;Hexadecimal notation for "
         (:MATH NIL (:MN NIL "1027565") (:MO NIL "/") (:MN NIL "16435934")))))
      " " :PAR
      (:REVIEWER NIL
       "Barmar: #o, #3r, #X, and #x mentioned above are not in the syntax rules defined just above that.")
      " " (:COMMENT NIL "!!! Maybe they don't belong here? -kmp 17-Oct-90")
      :PAR "For information on how " (:TERM NIL "ratios") " are printed, see "
      (:SECREF NIL :PRINTING-RATIOS) ". " :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Syntax of a Float") :TAGS (:SYNTAX-OF-FLOATS))
     " " :PAR (:COMMENT NIL "% 2.1.3 7                   ")
     (:TERM NIL "Floats")
     " can be written in either decimal fraction or computerized scientific notation: an optional sign, then a non-empty sequence of digits with an embedded decimal point, then an optional decimal exponent specification. If there is no exponent specifier, then the decimal point is required, and there must be digits after it. The exponent specifier consists of an "
     (:TERM NIL "exponent marker")
     ", an optional sign, and a non-empty sequence of digits. If no exponent specifier is present, or if the "
     (:TERM NIL "exponent marker") " " (:TT NIL "e") " (or " (:TT NIL "E")
     ") is used, then "
     (:COMMENT NIL "  the precise format to be used "
      " is not specified.  When such a representation is read and"
      " converted to an internal floating-point data value,")
     "the format specified by " (:VARREF NIL "*read-default-float-format*")
     " is used. See " (:FIGREF NIL :SYNTAX-FOR-NUMERIC-TOKENS) ". " :PAR
     (:COMMENT NIL "% 2.1.3 1")
     "An implementation may provide one or more kinds of " (:TERM NIL "float")
     " that collectively make up the " (:TERM NIL "type") " "
     (:TYPEREF NIL "float") ". " (:COMMENT NIL "% 2.1.3 8") "The letters "
     (:TT NIL "s") ", " (:TT NIL "f") ", " (:TT NIL "d") ", and " (:TT NIL "l")
     " (or their respective uppercase equivalents) explicitly specify the use of the "
     (:TERM NIL "types") " " (:TYPEREF NIL "short-float") ", "
     (:TYPEREF NIL "single-float") ", " (:TYPEREF NIL "double-float") ", and "
     (:TYPEREF NIL "long-float") ", respectively. " :PAR
     (:COMMENT NIL "% 2.1.3 9")
     "The internal format used for an external representation depends only on the "
     (:TERM NIL "exponent marker")
     ", and not on the number of decimal digits in the external representation. "
     :PAR (:NEXTFIGURE (:CAPS T)) " contains examples of notations for "
     (:TERM NIL "floats") ": " :PAR
     (:TABLE (:NAME ("Examples of Floating-point numbers"))
      (:ROW NIL (:CELL NIL (:TT NIL "0.0"))
       (:CELL NIL " ;Floating-point zero in default format "))
      (:ROW NIL (:CELL NIL (:TT NIL "0E0"))
       (:CELL NIL
        " ;As input, this is also floating-point zero in default format. "
        (:BR NIL) " ;As output, this would appear as " (:TT NIL "0.0") ". "))
      (:ROW NIL (:CELL NIL (:TT NIL "0e0"))
       (:CELL NIL
        " ;As input, this is also floating-point zero in default format. "
        (:BR NIL) " ;As output, this would appear as " (:TT NIL "0.0") ". "))
      (:ROW NIL (:CELL NIL (:TT NIL "-.0"))
       (:CELL NIL " ;As input, this might be a zero or a minus zero, "
        (:BR NIL) " ; depending on whether the implementation supports "
        (:BR NIL) " ; a distinct minus zero. " (:BR NIL) " ;As output, "
        (:TT NIL "0.0") " is zero and " (:TT NIL "-0.0") " is minus zero. "))
      (:ROW NIL (:CELL NIL (:TT NIL "0."))
       (:CELL NIL " ;On input, the integer zero—" (:I NIL "not")
        " a floating-point number! " (:BR NIL) " ;Whether this appears as "
        (:TT NIL "0") " or " (:TT NIL "0.") " on output depends " (:BR NIL)
        " ;on the " (:TERM NIL "value") " of " (:VARREF NIL "*print-radix*")
        ". "))
      (:ROW NIL (:CELL NIL (:TT NIL "0.0s0"))
       (:CELL NIL " ;A floating-point zero in short format "))
      (:ROW NIL (:CELL NIL (:TT NIL "0s0"))
       (:CELL NIL " ;As input, this is a floating-point zero in short format. "
        (:BR NIL) " ;As output, such a zero would appear as " (:TT NIL "0.0s0")
        (:BR NIL) " ; (or as " (:TT NIL "0.0") " if " (:MISC NIL "short-float")
        " was the default format). "))
      (:ROW NIL (:CELL NIL (:TT NIL "6.02E+23"))
       (:CELL NIL " ;Avogadro's number, in default format "))
      (:ROW NIL (:CELL NIL (:TT NIL "602E+21"))
       (:CELL NIL " ;Also Avogadro's number, in default format ")))
     " " :PAR "For information on how " (:TERM NIL "floats")
     " are printed, see " (:SECREF NIL :PRINTING-FLOATS) ". " :PAR)
    :PAR
    (:COMMENT NIL
     "!!! Barmar: This next is out of place because it isn't really syntax-related.}"
     "    KMP: Where to move it to? -kmp")
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Syntax of a Complex") :TAGS (:SYNTAX-OF-COMPLEXES)) " " :PAR
     "A " (:TERM NIL "complex")
     " has a Cartesian structure, with a real part and an imaginary part each of which is a "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TERM NIL "real") ". "
     (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " The parts of a "
     (:TERM NIL "complex") " are not necessarily " (:TERM NIL "floats")
     " but both parts must be of the same " (:TERM NIL "type") ": "
     (:EDITORNOTE NIL
      "KMP: This is not the same as saying they must be the same type. Maybe we mean they are of the same `precision' or `format'? GLS had suggestions which are not yet merged.")
     (:COMMENT NIL "!!! 4-Jan-91") "either both are " (:TERM NIL "rationals")
     ", or both are of the same " (:TERM NIL "float") " " (:TERM NIL "subtype")
     ". When constructing a " (:TERM NIL "complex")
     ", if the specified parts are not the same " (:TERM NIL "type")
     ", the parts are converted to be the same " (:TERM NIL "type")
     " internally (" (:I NIL "i.e.") ",  the " (:TERM NIL "rational")
     " part is converted to a " (:TERM NIL "float") "). An "
     (:TERM NIL "object") " of type " (:TT NIL "(complex rational)")
     " is converted internally and represented thereafter as a "
     (:TERM NIL "rational") " if its imaginary part is an "
     (:TERM NIL "integer") " whose value is 0. " :PAR
     "For further information, see " (:SECREF NIL :SHARPSIGN-C) " and "
     (:SECREF NIL :PRINTING-COMPLEXES) ". " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("The Consing Dot")) "If a " (:TERM NIL "token")
    " consists solely of dots (with no escape characters), then an error of "
    (:TERM NIL "type") " " (:TYPEREF NIL "reader-error")
    " is signaled, except in one circumstance: if the " (:TERM NIL "token")
    " is a single " (:TERM NIL "dot") " and appears in a situation where "
    (:TERM NIL "dotted pair") " notation permits a " (:TERM NIL "dot")
    ", then it is accepted as part of such syntax and no error is signaled. See "
    (:SECREF NIL :LEFT-PAREN) ". " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Symbols as Tokens") :TAGS (:SYMBOL-TOKENS)) " " :PAR
    "Any " (:TERM NIL "token") " that is not a " (:TERM NIL "potential number")
    ", " (:COMMENT NIL "next line added per Barmar:") "does not contain a "
    (:TERM NIL "package marker")
    ", and does not consist entirely of dots will always be interpreted as a "
    (:TERM NIL "symbol") ". Any " (:TERM NIL "token") " that is a "
    (:TERM NIL "potential number")
    " but does not fit the number syntax is a reserved " (:TERM NIL "token")
    " and has an " (:TERM NIL "implementation-dependent") " interpretation. "
    (:COMMENT NIL "% 22.1.2 14" "% 11.3.0 7" "% 2.3.0 4")
    "In all other cases, the " (:TERM NIL "token")
    " is construed to be the name of a " (:TERM NIL "symbol") ". " :PAR
    "Examples of the printed representation of " (:TERM NIL "symbols")
    " are in " (:NEXTFIGURE NIL)
    ". For presentational simplicity, these examples assume that the "
    (:TERM NIL "readtable case") " of the " (:TERM NIL "current readtable")
    " is " (:KWD NIL "upcase") ". " :PAR
    (:COMMENT NIL "% 2.3.0 7                                        ")
    (:TABLE
     (:NAME
      ("Examples of the printed representation of symbols (Part 1 of 2)"))
     (:ROW NIL (:CELL NIL (:TT NIL "FROBBOZ"))
      (:CELL NIL " The " (:TERM NIL "symbol") " whose " (:TERM NIL "name")
       " is " (:TT NIL "FROBBOZ") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "frobboz"))
      (:CELL NIL " Another way to notate the same " (:TERM NIL "symbol") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "fRObBoz"))
      (:CELL NIL " Yet another way to notate it. "))
     (:ROW NIL (:CELL NIL (:TT NIL "unwind-protect"))
      (:CELL NIL " A " (:TERM NIL "symbol") " with a hyphen in its "
       (:TERM NIL "name") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "+$"))
      (:CELL NIL " The " (:TERM NIL "symbol") " named " (:TT NIL "+$") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "1+"))
      (:CELL NIL " The " (:TERM NIL "symbol") " named " (:TT NIL "1+") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "+1"))
      (:CELL NIL " This is the " (:TERM NIL "integer") (:TT NIL "1") ", not a "
       (:TERM NIL "symbol") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "pascal_style"))
      (:CELL NIL " This " (:TERM NIL "symbol") " has an underscore in its "
       (:TERM NIL "name") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "file.rel.43"))
      (:CELL NIL " This " (:TERM NIL "symbol") " has periods in its "
       (:TERM NIL "name") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "\\("))
      (:CELL NIL " The " (:TERM NIL "symbol") " whose " (:TERM NIL "name")
       " is " (:TT NIL "(") ". "))
     (:ROW NIL (:CELL NIL (:COMMENT NIL "))") (:TT NIL "\\+1"))
      (:CELL NIL " The " (:TERM NIL "symbol") " whose " (:TERM NIL "name")
       " is " (:TT NIL "+1") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "+\\1"))
      (:CELL NIL " Also the " (:TERM NIL "symbol") " whose " (:TERM NIL "name")
       " is " (:TT NIL "+1") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "\\frobboz"))
      (:CELL NIL " The " (:TERM NIL "symbol") " whose " (:TERM NIL "name")
       " is " (:TT NIL "fROBBOZ") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "3.14159265\\s0"))
      (:CELL NIL " The " (:TERM NIL "symbol") " whose " (:TERM NIL "name")
       " is " (:TT NIL "3.14159265s0") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "3.14159265\\S0"))
      (:CELL NIL " A different " (:TERM NIL "symbol") ", whose "
       (:TERM NIL "name") " is " (:TT NIL "3.14159265S0") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "3.14159265s0"))
      (:CELL NIL " A possible " (:TERM NIL "short float") " approximation to "
       (:MATH NIL (:MI NIL "π")) ". ")))
    " " :PAR
    (:COMMENT NIL
     " This is sort of an artificial division, but addresses the fact that this table is pretty"
     " big and makes for awkward-looking page break if the table is left all one piece."
     " -kmp 31-Jan-92")
    :PAR
    (:TABLE
     (:NAME
      ("Examples of the printed representation of symbols (Part 2 of 2)"))
     (:ROW NIL (:CELL NIL (:TT NIL "APL\\\\360"))
      (:CELL NIL " The " (:TERM NIL "symbol") " whose " (:TERM NIL "name")
       " is " (:TT NIL "APL\\360") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "apl\\\\360"))
      (:CELL NIL " Also the " (:TERM NIL "symbol") " whose " (:TERM NIL "name")
       " is " (:TT NIL "APL\\360") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "\\(b^2\\)\\ -\\ 4*a" (:TT NIL "*c")))
      (:CELL NIL " The " (:TERM NIL "name") " is " (:TT NIL "(B^2) - 4*A*C")
       ". " (:BR NIL) " Parentheses and two spaces in it. "))
     (:ROW NIL (:CELL NIL (:TT NIL "\\(\\b^2\\)\\ -\\4*\\a*\\c"))
      (:CELL NIL " The " (:TERM NIL "name") " is " (:TT NIL "(b^2) - 4*a*c")
       ". " (:BR NIL) " Letters explicitly lowercase. "))
     (:ROW NIL (:CELL NIL (:TT NIL "|\"|"))
      (:CELL NIL " The same as writing " (:TT NIL "\\\"") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "|(b^2) - 4*a*c|"))
      (:CELL NIL " The " (:TERM NIL "name") " is " (:TT NIL "(b^2) - 4*a*c")
       ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "|frobboz|"))
      (:CELL NIL " The " (:TERM NIL "name") " is " (:TT NIL "frobboz") ", not "
       (:TT NIL "FROBBOZ") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "|APL\\360|"))
      (:CELL NIL " The " (:TERM NIL "name") " is " (:TT NIL "APL360") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "|APL\\\\360|"))
      (:CELL NIL " The " (:TERM NIL "name") " is " (:TT NIL "APL\\360") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "|apl\\\\360|"))
      (:CELL NIL " The " (:TERM NIL "name") " is " (:TT NIL "apl\\360") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "|\\|\\||"))
      (:CELL NIL " Same as " (:TT NIL "\\|\\|") " —the " (:TERM NIL "name")
       " is " (:TT NIL "||") ". "))
     (:ROW NIL (:CELL NIL (:TT NIL "|(B^2) - 4*A*C|"))
      (:CELL NIL " The " (:TERM NIL "name") " is " (:TT NIL "(B^2) - 4*A*C")
       ". " (:BR NIL) " Parentheses and two spaces in it. "))
     (:ROW NIL (:CELL NIL (:TT NIL "|(b^2) - 4*a*c|"))
      (:CELL NIL " The " (:TERM NIL "name") " is " (:TT NIL "(b^2) - 4*a*c")
       ". ")))
    " " :PAR
    (:COMMENT NIL
     "!!! Presumably this means \"other than the code attribute.\" sigh... -kmp 25-Jan-92")
    (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " In the process of parsing a "
    (:TERM NIL "symbol") ", it is " (:TERM NIL "implementation-dependent")
    " which "
    (:COMMENT NIL
     "\\term{attributes} are removed from \\term{symbol} \\term{names}."
     "% Sandra didn't like the above wording. She suggested this:")
    (:TERM NIL "implementation-defined") " " (:TERM NIL "attributes")
    " are removed from the " (:TERM NIL "characters") " forming a "
    (:TERM NIL "token") " that represents a " (:TERM NIL "symbol") ". "
    (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR
    (:COMMENT NIL "% 11.3.0 2      "
     " When the \\term{Lisp reader} has, by parsing, obtained a string of characters"
     " %!!! RPG: \"thought\"? oh well." " thought to name a \\term{symbol}, "
     " that name is looked up in the \\term{current package}."
     "% Rewritten for RPG's sake:")
    "When parsing the syntax for a " (:TERM NIL "symbol") ", the "
    (:TERM NIL "Lisp reader") " looks up the " (:TERM NIL "name") " of that "
    (:TERM NIL "symbol") " in the " (:TERM NIL "current package")
    ". This lookup may involve looking in other " (:TERM NIL "packages")
    " whose " (:TERM NIL "external symbols") " are inherited by the "
    (:TERM NIL "current package") ". If the name is found, the corresponding "
    (:TERM NIL "symbol")
    " is returned. If the name is not found (that is, there is no "
    (:TERM NIL "symbol") " of that name " (:TERM NIL "accessible") " in the "
    (:TERM NIL "current package") "), a new " (:TERM NIL "symbol")
    " is created and is placed in the " (:TERM NIL "current package") " as an "
    (:TERM NIL "internal symbol") ". The " (:TERM NIL "current package")
    " becomes the owner (" (:TERM NIL "home package") ") of the "
    (:TERM NIL "symbol") ", and the " (:TERM NIL "symbol")
    " becomes interned in the " (:TERM NIL "current package")
    ". If the name is later read again while this same " (:TERM NIL "package")
    " is current, the same " (:TERM NIL "symbol")
    " will be found and returned. " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Valid Patterns for Tokens"))
    "The valid patterns for " (:TERM NIL "tokens") " are summarized in "
    (:NEXTFIGURE NIL) ". " :PAR
    (:TABLE (:NAME ("Valid patterns for tokens"))
     (:ROW NIL (:CELL NIL (:TT NIL (:I NIL "nnnnn")))
      (:CELL NIL " a " (:TERM NIL "number")))
     (:ROW NIL (:CELL NIL (:TT NIL (:I NIL "xxxxx")))
      (:CELL NIL " a " (:TERM NIL "symbol") " in the "
       (:TERM NIL "current package")))
     (:ROW NIL (:CELL NIL (:TT NIL ":" (:I NIL "xxxxx")))
      (:CELL NIL " a " (:TERM NIL "symbol") " in the " (:PACKREF NIL "keyword")
       (:TERM NIL "package")))
     (:ROW NIL (:CELL NIL (:TT NIL (:I NIL "ppppp") ":" (:I NIL "xxxxx")))
      (:CELL NIL " an " (:TERM NIL "external symbol") " in the "
       (:I NIL "ppppp") (:TERM NIL "package")))
     (:ROW NIL (:CELL NIL (:TT NIL (:I NIL "ppppp") "::" (:I NIL "xxxxx")))
      (:CELL NIL " a (possibly internal) " (:TERM NIL "symbol") " in the "
       (:I NIL "ppppp") (:TERM NIL "package")))
     (:ROW NIL (:CELL NIL (:TT NIL ":" (:I NIL "nnnnn")))
      (:CELL NIL " undefined "))
     (:ROW NIL (:CELL NIL (:TT NIL (:I NIL "ppppp") ":" (:I NIL "nnnnn")))
      (:CELL NIL " undefined "))
     (:ROW NIL (:CELL NIL (:TT NIL (:I NIL "ppppp") "::" (:I NIL "nnnnn")))
      (:CELL NIL " undefined "))
     (:ROW NIL (:CELL NIL (:TT NIL "::" (:I NIL "aaaaa")))
      (:CELL NIL " undefined "))
     (:ROW NIL (:CELL NIL (:TT NIL (:I NIL "aaaaa") ":"))
      (:CELL NIL " undefined "))
     (:ROW NIL
      (:CELL NIL
       (:TT NIL (:I NIL "aaaaa") ":" (:I NIL "aaaaa") ":" (:I NIL "aaaaa")))
      (:CELL NIL " undefined ")))
    " " :PAR "Note that " (:I NIL "nnnnn") " has number syntax, neither "
    (:I NIL "xxxxx") " nor " (:I NIL "ppppp") " has number syntax, and "
    (:I NIL "aaaaa") " has any syntax. " :PAR (:COMMENT NIL "% 11.0.0 30")
    "A summary of rules concerning " (:TERM NIL "package markers")
    " follows. In each case, examples are offered to illustrate the case; for presentational simplicity, the examples assume that the "
    (:TERM NIL "readtable case") " of the " (:TERM NIL "current readtable")
    " is " (:KWD NIL "upcase") ". " :PAR
    (:COMMENT NIL "% 22.1.2 15" "% 11.0.0 33")
    (:LIST NIL
     (:ITEM NIL "1. If there is a single " (:TERM NIL "package marker")
      ", and it occurs at the beginning of the " (:TERM NIL "token")
      ", then the " (:TERM NIL "token") " is interpreted as a "
      (:TERM NIL "symbol") " in the " (:PACKREF NIL "keyword") " "
      (:TERM NIL "package") ". It also sets the " (:FUNREF NIL "symbol-value")
      " of the newly-created " (:TERM NIL "symbol") " to that same "
      (:TERM NIL "symbol") " so that the " (:TERM NIL "symbol")
      " will self-evaluate. " :PAR "For example, " (:TT NIL ":bar")
      ", when read, interns " (:TT NIL "BAR") " as an "
      (:TERM NIL "external symbol") " in the " (:PACKREF NIL "keyword") " "
      (:TERM NIL "package") ". " :PAR
      (:COMMENT NIL "% 22.1.2 16" "% 11.0.0 31" "% 11.0.0 29"))
     (:ITEM NIL "2. If there is a single " (:TERM NIL "package marker")
      " not at the beginning or end of the " (:TERM NIL "token")
      ", then it divides the " (:TERM NIL "token")
      " into two parts. The first part specifies a " (:TERM NIL "package")
      "; the second part is the name of an " (:TERM NIL "external symbol")
      " available in that package. " :PAR "For example, " (:TT NIL "foo:bar")
      ", when read, looks up " (:TT NIL "BAR") " among the "
      (:TERM NIL "external symbols") " of the " (:TERM NIL "package") " named "
      (:TT NIL "FOO") ". "
      (:COMMENT NIL
       "\\f{\\#:bar}, when read, creates a new, \\term{uninterned} \\term{symbol} "
       "named \\f{BAR}."
       "\\funref{import} and \\funref{unintern} can create a \\term{symbol} "
       "that has no" "recorded \\term{home package},"
       "but that in fact is \\term{accessible} in some \\term{package}."
       "The implementation "
       "does not check for this pathological case, and such \\term{symbols}"
       "are printed preceded by \\f{\\#:}.")
      :PAR (:COMMENT NIL "% 22.1.2 17" "% 11.0.0 32" "% 11.0.0 26"))
     (:ITEM NIL "3. If there are two adjacent " (:TERM NIL "package markers")
      " not at the beginning or end of the " (:TERM NIL "token")
      ", then they divide the " (:TERM NIL "token")
      " into two parts. The first part specifies a " (:TERM NIL "package")
      "; the second part is the name of a " (:TERM NIL "symbol")
      " within that " (:TERM NIL "package") " (possibly an "
      (:TERM NIL "internal symbol") "). " :PAR "For example, "
      (:TT NIL "foo::bar") ", when read, interns " (:TT NIL "BAR") " in the "
      (:TERM NIL "package") " named " (:TT NIL "FOO") ". " :PAR
      (:COMMENT NIL "% 22.1.2 18"))
     (:ITEM NIL "4. If the " (:TERM NIL "token") " contains no "
      (:TERM NIL "package markers") ", and does not have "
      (:TERM NIL "potential number") " syntax, then the entire "
      (:TERM NIL "token") " is the name of the " (:TERM NIL "symbol") ". The "
      (:TERM NIL "symbol") " is looked up in the "
      (:TERM NIL "current package") ". " :PAR "For example, " (:TT NIL "bar")
      ", when read, interns " (:TT NIL "BAR") " in the "
      (:TERM NIL "current package") ". " :PAR
      (:COMMENT NIL "% 22.1.2 19" "% 11.0.0 34"))
     (:ITEM NIL "5. The consequences are unspecified if any other pattern of "
      (:TERM NIL "package markers") " in a " (:TERM NIL "token")
      " is used. All other uses of " (:TERM NIL "package markers")
      " within names of " (:TERM NIL "symbols")
      " are not defined by this standard but are reserved for "
      (:TERM NIL "implementation-dependent") " use. "))
    " " :PAR (:COMMENT NIL "% 11.0.0 25") "For example, assuming the "
    (:TERM NIL "readtable case") " of the " (:TERM NIL "current readtable")
    " is " (:KWD NIL "upcase") ", " (:TT NIL "editor:buffer") " refers to the "
    (:TERM NIL "external symbol") " named " (:TT NIL "BUFFER")
    " present in the " (:TERM NIL "package") " named " (:TT NIL "editor")
    ", regardless of whether there is a " (:TERM NIL "symbol") " named "
    (:TT NIL "BUFFER") " in the " (:TERM NIL "current package")
    ". If there is no " (:TERM NIL "package") " named " (:TT NIL "editor")
    ", or if no " (:TERM NIL "symbol") " named " (:TT NIL "BUFFER")
    " is present in " (:TT NIL "editor") ", or if " (:TT NIL "BUFFER")
    " is not exported by " (:TT NIL "editor")
    ", the reader signals a correctable error. "
    (:COMMENT NIL "!!! Error type?") "If " (:TT NIL "editor::buffer")
    " is seen, the effect is exactly the same as reading " (:TT NIL "buffer")
    " with the " (:PACKREF NIL "editor") " " (:TERM NIL "package")
    " being the " (:TERM NIL "current package") ". " :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Package System Consistency Rules") :TAGS
     (:PACKAGE-SYS-CONSISTENCY-RULES))
    " " :PAR (:COMMENT NIL "% 11.0.0 14")
    "The following rules apply to the package system as long as the "
    (:TERM NIL "value") " of " (:VARREF NIL "*package*") " is not changed: "
    :PAR (:COMMENT NIL "% 11.0.0 15")
    (:LIST NIL
     (:ITEM NIL (:B NIL "Read-read consistency") " " :PAR
      (:COMMENT NIL "!!! Is \"same\" meaning \"string=\" here?")
      "Reading the same " (:TERM NIL "symbol") " " (:TERM NIL "name") " "
      (:COMMENT NIL
       " \"same (eq)\" => \"\\term{same}\" for simplicity. -kmp 10-Apr-91")
      "always results in the " (:TERM NIL "same") " " (:TERM NIL "symbol") ". "
      :PAR (:COMMENT NIL "% 11.0.0 16"))
     (:ITEM NIL (:B NIL "Print-read consistency") " " :PAR
      (:COMMENT NIL
       " \"same (eq)\" => \"\\term{same}\" for simplicity. -kmp 10-Apr-91")
      "An " (:TERM NIL "interned symbol")
      " always prints as a sequence of characters that, when read back in, yields the "
      (:TERM NIL "same") " " (:TERM NIL "symbol") ". " :PAR
      "For information about how the " (:TERM NIL "Lisp printer") " treats "
      (:TERM NIL "symbols") ", see " (:SECREF NIL :PRINTING-SYMBOLS) ". " :PAR
      (:COMMENT NIL "% 11.0.0 17"))
     (:ITEM NIL (:B NIL "Print-print consistency") " " :PAR
      (:COMMENT NIL
       " \"same (eq)\" => \"\\term{same}\" for simplicity. -kmp 10-Apr-91")
      "If two interned " (:TERM NIL "symbols") " are not the "
      (:TERM NIL "same")
      ", then their printed representations will be different sequences of characters. "))
    " " :PAR (:COMMENT NIL "% 11.0.0 18")
    "These rules are true regardless of any implicit interning. As long as the "
    (:TERM NIL "current package")
    " is not changed, results are reproducible regardless of the order of "
    (:TERM NIL "loading") " files or the exact history of what "
    (:TERM NIL "symbols") " were typed in when. If the " (:TERM NIL "value")
    " of " (:VARREF NIL "*package*")
    " is changed and then changed back to the previous value, consistency is maintained. The rules can be violated by changing the "
    (:TERM NIL "value") " of " (:VARREF NIL "*package*")
    ", forcing a change to " (:TERM NIL "symbols") " or to "
    (:TERM NIL "packages")
    " or to both by continuing from an error, or calling one of the following "
    (:TERM NIL "functions") ": " (:FUNREF NIL "unintern") ", "
    (:FUNREF NIL "unexport") ", " (:FUNREF NIL "shadow") ", "
    (:FUNREF NIL "shadowing-import") ", or " (:FUNREF NIL "unuse-package") ". "
    :PAR
    "An inconsistency only applies if one of the restrictions is violated between two of the named "
    (:TERM NIL "symbols") ". " (:FUNREF NIL "shadow") ", "
    (:FUNREF NIL "unexport") ", " (:FUNREF NIL "unintern") ", and "
    (:FUNREF NIL "shadowing-import") " can only affect the consistency of "
    (:TERM NIL "symbols") " with the same " (:TERM NIL "names") " (under "
    (:FUNREF NIL "string=") ") as the ones supplied as arguments. " :PAR))
  :PAR
  (:SECTION
   (:TITLE ("Standard Macro Characters") :TAGS (:STANDARD-MACRO-CHARS)) " "
   (:COMMENT NIL "% Standard Macro Characters") :PAR
   (:COMMENT NIL "% 22.1.3 1") "If the reader encounters a "
   (:TERM NIL "macro character") ", then its associated "
   (:TERM NIL "reader macro function") " is invoked and may produce an "
   (:TERM NIL "object") " to be returned. This " (:TERM NIL "function")
   " may read the " (:TERM NIL "characters") " following the "
   (:TERM NIL "macro character") " in the " (:TERM NIL "stream")
   " in any syntax and return the " (:TERM NIL "object")
   " represented by that syntax. " :PAR (:COMMENT NIL "% 22.1.3 2") "Any "
   (:TERM NIL "character") " can be made to be a "
   (:TERM NIL "macro character") ". The " (:TERM NIL "macro characters")
   " defined initially in a " (:TERM NIL "conforming implementation")
   " include the following: " :PAR
   (:SUBSECTION (:TITLE ("Left-Parenthesis") :TAGS (:LEFT-PAREN))
    (:IDXCODE NIL "(") (:IDXTEXT NIL "Left-Parenthesis (reader macro)")
    (:IDXREF NIL "list") " " :PAR
    (:COMMENT NIL "% 22.1.3 3" "% 2.4.0 3                    ") :PAR "The "
    (:TERM NIL "left-parenthesis") " initiates reading of a "
    (:TERM NIL "list") ". " (:FUNREF NIL "read")
    " is called recursively to read successive " (:TERM NIL "objects")
    " until a right parenthesis is found in the input " (:TERM NIL "stream")
    ". A " (:TERM NIL "list") " of the " (:TERM NIL "objects")
    " read is returned. Thus " :PAR
    (:CODE NIL " (a b c)
")
    " is read as a " (:TERM NIL "list") " of three " (:TERM NIL "objects")
    " (the " (:TERM NIL "symbols") " " (:TT NIL "a") ", " (:TT NIL "b")
    ", and " (:TT NIL "c")
    "). The right parenthesis need not immediately follow the printed representation of the last "
    (:TERM NIL "object") "; " (:TERM NIL "whitespace") (:SUB NIL "2")
    " characters and comments may precede it. " :PAR
    (:COMMENT NIL "\\code" " (defun traffic-light (color)" "   (case color"
     "     (green)" "     (red (stop))"
     "     (amber (accelerate))      ;Insert more colors after this line."
     "     ))" "\\endcode")
    :PAR (:COMMENT NIL "% 22.1.3 4") "If no " (:TERM NIL "objects")
    " precede the right parenthesis, it reads as a " (:TERM NIL "list")
    " of zero " (:TERM NIL "objects") " (the " (:TERM NIL "empty list") "). "
    :PAR (:COMMENT NIL "% 22.1.3 5") "If a " (:TERM NIL "token")
    " that is just a dot" (:IDXTERM NIL "dot") (:IDXCODE NIL ".")
    " not immediately preceded by an escape character is read after some "
    (:TERM NIL "object") " then exactly one more " (:TERM NIL "object")
    " must follow the dot, possibly preceded or followed by "
    (:TERM NIL "whitespace") (:SUB NIL "2")
    " or a comment, followed by the right parenthesis: " :PAR
    (:CODE NIL " (a b c . d)
")
    " This means that the " (:TERM NIL "cdr") " of the last "
    (:TERM NIL "cons") " in the " (:TERM NIL "list") " is not "
    (:MISC NIL "nil") ", but rather the " (:TERM NIL "object")
    " whose representation followed the dot. The above example might have been the result of evaluating "
    :PAR
    (:CODE NIL " (cons 'a (cons 'b (cons 'c 'd)))
")
    " Similarly, " :PAR
    (:CODE NIL " (cons 'this-one 'that-one) → (this-one . that-one)
")
    " It is permissible for the " (:TERM NIL "object")
    " following the dot to be a " (:TERM NIL "list") ": " :PAR
    (:CODE NIL " (a b c d . (e f . (g))) ≡ (a b c d e f g)
")
    " " :PAR "For information on how the " (:TERM NIL "Lisp printer")
    " prints " (:TERM NIL "lists") " and " (:TERM NIL "conses") ", see "
    (:SECREF NIL :PRINTING-LISTS-AND-CONSES) ". " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Right-Parenthesis")) (:IDXCODE NIL ")")
    (:IDXTEXT NIL "Right-Parenthesis (reader macro)") " " :PAR
    (:COMMENT NIL "% 22.1.3 6") :PAR "The " (:TERM NIL "right-parenthesis")
    " is invalid except when used in conjunction with the left parenthesis character. For more information, see "
    (:SECREF NIL :READER-ALGORITHM) ". " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Single-Quote") :TAGS (:QUOTE-MACRO)) " "
    (:IDXCODE NIL "'") (:IDXTEXT NIL "Single-Quote (reader macro)")
    (:IDXTEXT NIL "quotation (of forms)") (:IDXREF NIL "quote") " " :PAR
    (:B NIL "Syntax:") " " (:TT NIL "'" (:METAVAR NIL "exp")) " " :PAR
    (:COMMENT NIL "% 22.1.3 7") :PAR "A " (:TERM NIL "single-quote")
    " introduces an " (:TERM NIL "expression") " to be “quoted.” "
    (:TERM NIL "Single-quote") " followed by an " (:TERM NIL "expression") " "
    (:PARAM NIL "exp") " is treated by the " (:TERM NIL "Lisp reader")
    " as an abbreviation for and is parsed identically to the "
    (:TERM NIL "expression") " " (:TT NIL "(quote " (:PARAM NIL "exp") ")")
    ". See the " (:TERM NIL "special operator") " " (:SPECREF NIL "quote") ". "
    :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of Single-Quote"))
     (:CODE NIL " 'foo → FOO
 ''foo → (QUOTE FOO)
 (car ''foo) → QUOTE
")
     " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Semicolon")) (:IDXCODE NIL ";")
    (:IDXTEXT NIL "Semicolon (reader macro)") (:IDXTEXT NIL "comment") " " :PAR
    (:B NIL "Syntax:") " " (:TT NIL ";" (:METAVAR NIL "text")) " " :PAR
    (:COMMENT NIL "% 22.1.3 8   ") :PAR "A " (:TERM NIL "semicolon")
    " introduces " (:TERM NIL "characters")
    " that are to be ignored, such as comments. The " (:TERM NIL "semicolon")
    " and all " (:TERM NIL "characters") " up to and including the next "
    (:TERM NIL "newline") " or end of file are ignored. " :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of Semicolon"))
     (:CODE NIL " (+ 3 ; three
    4)
→ 7    
")
     " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Notes about Style for Semicolon"))
     "Some text editors make assumptions about desired indentation based on the number of "
     (:TERM NIL "semicolons")
     " that begin a comment. The following style conventions are common, although not by any means universal. "
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Use of Single Semicolon"))
      "Comments that begin with a single " (:TERM NIL "semicolon")
      " are all aligned to the same column at the right (sometimes called the “comment column”). The text of such a comment generally applies only to the line on which it appears. Occasionally two or three contain a single sentence together; this is sometimes indicated by indenting all but the first with an additional space (after the "
      (:TERM NIL "semicolon") "). " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Use of Double Semicolon"))
      "Comments that begin with a double " (:TERM NIL "semicolon")
      " are all aligned to the same level of indentation as a "
      (:TERM NIL "form") " would be at that same position in the "
      (:TERM NIL "code") ". "
      (:COMMENT NIL "% I think this is a matter of personal taste,"
       "% independent of the semicolon convention. -kmp 25-Jan-92"
       " A space generally follows the two semicolons.")
      "The text of such a comment usually describes the state of the "
      (:TERM NIL "program") " at the point where the comment occurs, the "
      (:TERM NIL "code") " which follows the comment, or both. " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Use of Triple Semicolon"))
      "Comments that begin with a triple " (:TERM NIL "semicolon")
      " are all aligned to the left margin. Usually they are used prior to a definition or set of definitions, rather than within a definition. "
      :PAR)
     :PAR (:COMMENT NIL "% 22.1.3 12") :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Use of Quadruple Semicolon"))
      "Comments that begin with a quadruple " (:TERM NIL "semicolon")
      " are all aligned to the left margin, and generally contain only a short piece of text that serve as a title for the code which follows, and might be used in the header or footer of a program that prepares code for presentation as a hardcopy document. "
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Examples of Style for Semicolon"))
      (:CODE NIL ";;;; Math Utilities

;;; FIB computes the Fibonacci function in the traditional
;;; recursive way.

(defun fib (n)
  (check-type n integer)
  ;; At this point we're sure we have an integer argument.
  ;; Now we can get down to some serious computation.
  (cond ((< n 0)
         ;; Hey, this is just supposed to be a simple example.
         ;; Did you really expect me to handle the general case?
         (error \"FIB got ~D as an argument.\" n))
        ((< n 2) n)             ;fib[0]=0 and fib[1]=1
        ;; The cheap cases didn't work.
        ;; Nothing more to do but recurse.
        (t (+ (fib (- n 1))     ;The traditional formula
              (fib (- n 2)))))) ; is fib[n-1]+fib[n-2].
")
      " " :PAR)
     :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Double-Quote") :TAGS (:DOUBLEQUOTE)) " "
    (:IDXTEXT NIL "Double-Quote (reader macro)")
    (:IDXTEXT NIL "quotation (of strings)") (:IDXREF NIL "string") " " :PAR
    (:B NIL "Syntax:") " " (:TT NIL "\"" (:METAVAR NIL "text") "\"") " " :PAR
    (:COMMENT NIL "% 22.1.3 14" "% 2.5.2 1") :PAR "The "
    (:TERM NIL "double-quote") " is used to begin and end a "
    (:TERM NIL "string") ". When a " (:TERM NIL "double-quote")
    " is encountered, " (:TERM NIL "characters") " are read from the "
    (:TERM NIL "input") " " (:TERM NIL "stream")
    " and accumulated until another " (:TERM NIL "double-quote")
    " is encountered. If a " (:TERM NIL "single escape") " "
    (:TERM NIL "character") " is seen, the " (:TERM NIL "single escape") " "
    (:TERM NIL "character") " is discarded, the next " (:TERM NIL "character")
    " is accumulated, and accumulation continues. " (:COMMENT NIL "% 2.5.2 3")
    "The accumulated " (:TERM NIL "characters")
    " up to but not including the matching " (:TERM NIL "double-quote")
    " are made into a " (:TERM NIL "simple string") " and returned. "
    (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " It is "
    (:TERM NIL "implementation-dependent") " which " (:TERM NIL "attributes")
    " of the accumulated characters are removed in this process. "
    (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR
    "Examples of the use of the " (:TERM NIL "double-quote")
    " character are in " (:NEXTFIGURE NIL) ". " :PAR
    (:TABLE (:NAME ("Examples of the use of double-quote"))
     (:ROW NIL (:CELL NIL (:TT NIL "\"Foo\""))
      (:CELL NIL " ;A string with three characters in it "))
     (:ROW NIL (:CELL NIL (:TT NIL "\"\"")) (:CELL NIL " ;An empty string "))
     (:ROW NIL (:CELL NIL (:TT NIL "\"\\\"APL\\\\360?\\\" he cried.\""))
      (:CELL NIL " ;A string with twenty characters "))
     (:ROW NIL (:CELL NIL (:TT NIL "\"|x| = |-x|\""))
      (:CELL NIL " ;A ten-character string ")))
    " " :PAR "Note that to place a single escape character or a "
    (:TERM NIL "double-quote")
    " into a string, such a character must be preceded by a single escape character. Note, too, that a multiple escape character need not be quoted by a single escape character within a string. "
    :PAR
    (:COMMENT NIL "% 2.5.2 2"
     "With the exception of unquoted escape characters,"
     "the characters contained by the double-quotes, taken from left to right,"
     "occupy locations within the string with increasing indices."
     "The leftmost character is string element number 0, the next one"
     "is element number 1, and so on.")
    :PAR "For information on how the " (:TERM NIL "Lisp printer") " prints "
    (:TERM NIL "strings") ", see " (:SECREF NIL :PRINTING-STRINGS) ". " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Backquote") :TAGS (:BACKQUOTE)) " "
    (:IDXCODE NIL "`") (:IDXTEXT NIL "Backquote (reader macro)")
    (:IDXTEXT NIL "quotation (of forms)") " " (:IDXREF NIL "quote")
    (:IDXREF NIL "list") (:IDXREF NIL "cons") " " :PAR
    (:COMMENT NIL "% 22.1.3 15") :PAR "The " (:TERM NIL "backquote")
    " introduces a template of a data structure to be built. For example, writing "
    :PAR
    (:CODE NIL " `(cond ((numberp ,x) ,@y) (t (print ,x) ,@y))
")
    " is roughly equivalent to writing " :PAR
    (:CODE NIL " (list 'cond 
       (cons (list 'numberp x) y) 
       (list* 't (list 'print x) y))
")
    " Where a comma occurs in the template, the " (:TERM NIL "expression")
    " following the comma is to be evaluated to produce an "
    (:TERM NIL "object") " to be inserted at that point. Assume " (:TT NIL "b")
    " has the value 3, for example, then evaluating the " (:TERM NIL "form")
    " denoted by " (:TT NIL "`(a b ,b ,(+ b 1) b)") " produces the result "
    (:TT NIL "(a b 3 4 b)") ". " :PAR (:COMMENT NIL "% 22.1.3 16")
    "If a comma is immediately followed by an " (:TERM NIL "at-sign")
    ", then the " (:TERM NIL "form") " following the " (:TERM NIL "at-sign")
    " is evaluated to produce a " (:TERM NIL "list") " of "
    (:TERM NIL "objects") ". These " (:TERM NIL "objects")
    " are then “spliced” into place in the template. For example, if "
    (:TT NIL "x") " has the value " (:TT NIL "(a b c)") ", then " :PAR
    (:CODE NIL " `(x ,x ,@x foo ,(cadr x) bar ,(cdr x) baz ,@(cdr x))
→ (x (a b c) a b c foo b bar (b c) baz b c)
")
    " " (:COMMENT NIL "% 22.1.3 17")
    "The backquote syntax can be summarized formally as follows. " :PAR
    (:LIST NIL
     (:ITEM NIL " " (:TT NIL "`" (:PARAM NIL "basic")) " is the same as "
      (:TT NIL "'" (:PARAM NIL "basic")) ", that is, "
      (:TT NIL "(quote " (:PARAM NIL "basic") ")") ", for any "
      (:TERM NIL "expression") " " (:PARAM NIL "basic") " that is not a "
      (:TERM NIL "list") " or a general " (:TERM NIL "vector") ". " :PAR
      (:COMMENT NIL "% 22.1.3 18"))
     (:ITEM NIL " " (:TT NIL "`," (:PARAM NIL "form")) " is the same as "
      (:PARAM NIL "form") ", for any " (:PARAM NIL "form")
      ", provided that the representation of " (:PARAM NIL "form")
      " does not begin with " (:TERM NIL "at-sign") " or " (:TERM NIL "dot")
      ". (A similar caveat holds for all occurrences of a form after a "
      (:TERM NIL "comma") ".) " :PAR (:COMMENT NIL "% 22.1.3 19"))
     (:ITEM NIL " " (:TT NIL "`,@" (:PARAM NIL "form"))
      " has undefined consequences. " :PAR (:COMMENT NIL "% 22.1.3 20"))
     (:ITEM NIL " " (:TT NIL "`(x1 x2 x3 ... xn . atom)")
      " may be interpreted to mean " :PAR
      (:CODE NIL " (append [ x1] [ x2] [ x3] ... [ xn] (quote atom))
")
      " where the brackets are used to indicate a transformation of an "
      (:PARAM NIL "xj") " as follows: " :PAR (:COMMENT NIL "% 22.1.3 21")
      (:LIST NIL
       (:ITEM NIL "– " (:TT NIL "[" (:PARAM NIL "form") "]")
        " is interpreted as " (:TT NIL "(list `" (:PARAM NIL "form") ")")
        ", which contains a backquoted form that must then be further interpreted. "
        :PAR (:COMMENT NIL "% 22.1.3 22"))
       (:ITEM NIL "– " (:TT NIL "[," (:PARAM NIL "form") "]")
        " is interpreted as " (:TT NIL "(list " (:PARAM NIL "form") ")") ". "
        :PAR (:COMMENT NIL "% 22.1.3 23"))
       (:ITEM NIL "– " (:TT NIL "[,@" (:PARAM NIL "form") "]")
        " is interpreted as " (:PARAM NIL "form") ". "))
      " " :PAR (:COMMENT NIL "% 22.1.3 24"))
     (:ITEM NIL " " (:TT NIL "`(x1 x2 x3 ... xn)")
      " may be interpreted to mean the same as the backquoted form "
      (:TT NIL "`(x1 x2 x3 ... xn . " (:MISC NIL "nil") ")")
      ", thereby reducing it to the previous case. " :PAR
      (:COMMENT NIL "% 22.1.3 25"))
     (:ITEM NIL " " (:TT NIL "`(x1 x2 x3 ... xn . ,form)")
      " may be interpreted to mean " :PAR
      (:CODE NIL " (append [ x1] [ x2] [ x3] ... [ xn] form)
")
      " where the brackets indicate a transformation of an " (:TT NIL " xj")
      " as described above. " :PAR (:COMMENT NIL "% 22.1.3 26"))
     (:ITEM NIL " " (:TT NIL "`(x1 x2 x3 ... xn . ,@form)")
      " has undefined consequences. " :PAR (:COMMENT NIL "% 22.1.3 27"))
     (:ITEM NIL " " (:TT NIL "`#(x1 x2 x3 ... xn)")
      " may be interpreted to mean "
      (:TT NIL "(apply #'vector `(x1 x2 x3 ... xn))") ". "))
    " " :PAR (:COMMENT NIL "% 22.1.3 28") "Anywhere “" (:TT NIL ",@")
    "” may be used, the syntax “" (:TT NIL ",.")
    "” may be used instead to indicate that it is permissible to operate "
    (:TERM NIL "destructively") " on the " (:TERM NIL "list structure")
    " produced by the form following the “" (:TT NIL ",.")
    "” (in effect, to use " (:FUNREF NIL "nconc") " instead of "
    (:FUNREF NIL "append") "). " :PAR (:COMMENT NIL "% 22.1.3 29")
    "If the backquote syntax is nested, the innermost backquoted form should be expanded first. This means that if several commas occur in a row, the leftmost one belongs to the innermost "
    (:TERM NIL "backquote") ". " :PAR (:COMMENT NIL "% 22.1.3 30") :PAR
    (:COMMENT NIL " An implementation is free to interpret"
     " a backquoted form as any form that, when evaluated, will produce a result"
     " that is \\funref{equal} to the result implied by the above definition."
     " % Barmar:" " %  Except for the non-destructive nature of ,@.  "
     " %  It must also cons a new top-level list if comma is used.  e.g.,"
     " %  (defun foo (x) `'(,x))" " %  (eq (foo 1) (foo 2)) => \\term{false}"
     " %  i.e., it can't cache a structure and then replac it each time." " %"
     "% Rewritten for Barmar. -kmp 11-Feb-92")
    "An " (:TERM NIL "implementation") " is free to interpret a backquoted "
    (:TERM NIL "form") " " (:MATH NIL (:MSUB NIL (:MI NIL "F") (:MN NIL "1")))
    " as any " (:TERM NIL "form") " "
    (:MATH NIL (:MSUB NIL (:MI NIL "F") (:MN NIL "2")))
    " that, when evaluated, will produce a result that is the "
    (:TERM NIL "same") " under " (:FUNREF NIL "equal")
    " as the result implied by the above definition, provided that the side-effect behavior of the substitute "
    (:TERM NIL "form") " " (:MATH NIL (:MSUB NIL (:MI NIL "F") (:MN NIL "2")))
    " is also consistent with the description given above. "
    (:COMMENT NIL "End of rewrite.")
    "The constructed copy of the template might or might not share "
    (:TERM NIL "list")
    " structure with the template itself. As an example, the above definition implies that "
    :PAR
    (:CODE NIL " `((,a b) ,c ,@d)
")
    " will be interpreted as if it were " :PAR
    (:CODE NIL " (append (list (append (list a) (list 'b) '" (:MISC NIL "nil")
     ")) (list c) d '" (:MISC NIL "nil") ")
")
    " but it could also be legitimately interpreted to mean any of the following: "
    :PAR
    (:CODE NIL " (append (list (append (list a) (list 'b))) (list c) d)
 (append (list (append (list a) '(b))) (list c) d)
 (list* (cons a '(b)) c d)
 (list* (cons a (list 'b)) c d)
 (append (list (cons a '(b))) (list c) d)
 (list* (cons a '(b)) c (copy-list d))
")
    " " :PAR
    (:SUBSUBSECTION (:TITLE ("Notes about Backquote"))
     "Since the exact manner in which the " (:TERM NIL "Lisp reader")
     " will parse an " (:TERM NIL "expression") " involving the "
     (:TERM NIL "backquote") " " (:TERM NIL "reader macro")
     " is not specified, an " (:TERM NIL "implementation")
     " is free to choose any representation that preserves the semantics described. "
     :PAR "Often an " (:TERM NIL "implementation")
     " will choose a representation that facilitates pretty printing of the expression, so that "
     (:TT NIL "(pprint `(a ,b))") " will display " (:TT NIL "`(a ,b)")
     " and not, for example, " (:TT NIL "(list 'a b)")
     ". However, this is not a requirement. " :PAR
     "Implementors who have no particular reason to make one choice or another might wish to refer to "
     (:BIB (:DOI "10.1109/IEEESTD.1991.101032" :ISBN "1-55937-125-0")
      "IEEE Standard for the Scheme Programming Language")
     ", which identifies a popular choice of representation for such expressions that might provide useful to be useful compatibility for some user communities. There is no requirement, however, that any "
     (:TERM NIL "conforming implementation")
     " use this particular representation. This information is provided merely for cross-reference purposes. "
     :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Comma")) (:IDXCODE NIL ",")
    (:IDXTEXT NIL "Comma (reader macro)") (:IDXTEXT NIL "quotation (of forms)")
    " " (:IDXREF NIL "quote") (:IDXREF NIL "list") (:IDXREF NIL "cons") " "
    :PAR (:COMMENT NIL "% 22.1.3 31                               ") :PAR
    "The " (:TERM NIL "comma") " is part of the backquote syntax; see "
    (:SECREF NIL :BACKQUOTE) ". " (:TERM NIL "Comma")
    " is invalid if used other than inside the body of a backquote "
    (:TERM NIL "expression") " as described above. " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Sharpsign")) (:IDXCODE NIL "#")
    (:IDXTEXT NIL "Sharpsign (reader macro)") " " :PAR
    (:COMMENT NIL "% 22.1.3 32" "% 22.1.3 33") :PAR (:TERM NIL "Sharpsign")
    " is a " (:TERM NIL "non-terminating") " "
    (:TERM NIL "dispatching macro character") ". It reads an optional "
    (:COMMENT NIL "was \"digit \\term{string}\". ugh. -kmp 10-Apr-91")
    "sequence of digits and then one more character, and uses that character to select a "
    (:TERM NIL "function") " to run as a " (:TERM NIL "reader macro function")
    ". " :PAR (:COMMENT NIL "% 22.1.4 1") "The " (:TERM NIL "standard syntax")
    " includes constructs introduced by the " (:TT NIL "#")
    " character. The syntax of these constructs is as follows: a character that identifies the type of construct is followed by arguments in some form. If the character is a letter, its "
    (:TERM NIL "case") " is not important; " (:TT NIL "#O") " and "
    (:TT NIL "#o") " are considered to be equivalent, for example. " :PAR
    (:COMMENT NIL "% 22.1.4 2") "Certain " (:TT NIL "#")
    " constructs allow an unsigned decimal number to appear between the "
    (:TT NIL "#") " and the character. " :PAR (:COMMENT NIL "% 22.1.4 4")
    "The " (:TERM NIL "reader macros") " associated with the "
    (:TERM NIL "dispatching macro character") " " (:TT NIL "#")
    " are described later in this section and summarized in " (:NEXTFIGURE NIL)
    ". " :PAR (:COMMENT NIL "% 22.1.4 3") :PAR
    (:COMMENT NIL " \\boxfig" " {        " " \\def\\u{undefined}"
     " \\def\\s{signals error}" " \\def\\ia{infix argument}" " \\tabskip 1pc"
     " \\halign to \\hsize {#\\hfil\\tabskip 1pc&#\\hfil\\tabskip 0pt plus 1fil"
     " &#\\hfil\\tabskip 1pc&#\\hfil\\cr" " \\noalign{\\vskip -9pt}   "
     " \\omit\\bf character&\\omit\\bf purpose&\\omit\\bf character& \\omit\\bf purpose\\cr"
     " \\omit\\bf combination&\\omit&\\omit\\bf  combination\\cr"
     " \\noalign{\\vskip 2pt\\hrule\\vskip 2pt}"
     " Backspace&\\s&\\f{\\{}&\\u*\\cr" " Tab&\\s&\\f{\\}}&\\u*\\cr"
     " Newline&\\s&+&read-time conditional\\cr"
     " Linefeed&\\s&-&read-time conditional\\cr"
     " Page&\\s&.&read-time evaluation\\cr" " Return&\\s&/&\\u\\cr"
     " Space&\\s&A, a&array\\cr" " !&\\u*&B, b&binary rational\\cr"
     " \\f{\"}&\\u&C, c&complex number\\cr"
     " \\#&reference to = label&D, d&\\u\\cr" " \\$&\\u&E, e&\\u\\cr"
     " \\%&\\u&F, f&\\u\\cr      " " \\&&\\u&G, g&\\u\\cr"
     " '&function abbreviation&H, h&\\u\\cr" " (&simple vector&I, i&\\u\\cr"
     " )&\\s&J, j&\\u\\cr" " {\\tt *}&bit vector&K, k&\\u\\cr"
     " ,&\\u&L, l&\\u\\cr" " :&uninterned symbol&M, m&\\u\\cr"
     " ;&\\u&N, n&\\u\\cr" " \\f{<}&\\s&O, o&octal rational\\cr"
     " \\f{=}&labels following object&P, p&pathname\\cr"
     " \\f{>}&\\u&Q, q&\\u\\cr" " ?&\\u*&R, r&radix-$n$ rational\\cr"
     " @&\\u&S, s&structure\\cr" " [&\\u*&T, t&\\u\\cr"
     " \\f{\\\\}&character object&U, u&\\u\\cr" " ]&\\u*&V, v&\\u\\cr"
     " {\\hat}&\\u&W, w&\\u\\cr" " \\f{\\_}&\\u&X, x&hexadecimal rational\\cr"
     " `&\\u&Y, y&\\u\\cr" " \\f{|}&balanced comment&Z, z&\\u\\cr"
     " \\f{~}&\\u&Rubout&\\u\\cr" " \\noalign{\\vskip -9pt}" " }}            "
     " \\caption{Standard \\# Dispatching Macro Character Syntax}" " \\endfig")
    :PAR "   "
    (:TABLE (:NAME ("Standard # Dispatching Macro Character Syntax"))
     (:ROW NIL (:CELL NIL "dispatch char") (:CELL NIL "purpose")
      (:CELL NIL "dispatch char") (:CELL NIL "purpose"))
     (:ROW NIL (:CELL NIL " Backspace") (:CELL NIL "signals error")
      (:CELL NIL (:TT NIL "{")) (:CELL NIL "undefined*"))
     (:ROW NIL (:CELL NIL " Tab") (:CELL NIL "signals error")
      (:CELL NIL (:TT NIL "}")) (:CELL NIL "undefined*"))
     (:ROW NIL (:CELL NIL " Newline") (:CELL NIL "signals error")
      (:CELL NIL "+") (:CELL NIL "read-time conditional"))
     (:ROW NIL (:CELL NIL " Linefeed") (:CELL NIL "signals error")
      (:CELL NIL "-") (:CELL NIL "read-time conditional"))
     (:ROW NIL (:CELL NIL " Page") (:CELL NIL "signals error") (:CELL NIL ".")
      (:CELL NIL "read-time evaluation"))
     (:ROW NIL (:CELL NIL " Return") (:CELL NIL "signals error")
      (:CELL NIL "/") (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL " Space") (:CELL NIL "signals error")
      (:CELL NIL "A, a") (:CELL NIL "array"))
     (:ROW NIL (:CELL NIL " !") (:CELL NIL "undefined*") (:CELL NIL "B, b")
      (:CELL NIL "binary rational"))
     (:ROW NIL (:CELL NIL (:TT NIL "\"")) (:CELL NIL "undefined")
      (:CELL NIL "C, c") (:CELL NIL "complex number"))
     (:ROW NIL (:CELL NIL " #") (:CELL NIL "reference to = label")
      (:CELL NIL "D, d") (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL " $") (:CELL NIL "undefined") (:CELL NIL "E, e")
      (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL " %") (:CELL NIL "undefined") (:CELL NIL "F, f")
      (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL " &") (:CELL NIL "undefined") (:CELL NIL "G, g")
      (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL " '") (:CELL NIL "function abbreviation")
      (:CELL NIL "H, h") (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL " (") (:CELL NIL "simple vector") (:CELL NIL "I, i")
      (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL " )") (:CELL NIL "signals error") (:CELL NIL "J, j")
      (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL (:TT NIL " *")) (:CELL NIL "bit vector")
      (:CELL NIL "K, k") (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL " ,") (:CELL NIL "undefined") (:CELL NIL "L, l")
      (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL " :") (:CELL NIL "uninterned symbol")
      (:CELL NIL "M, m") (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL " ;") (:CELL NIL "undefined") (:CELL NIL "N, n")
      (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL (:TT NIL "<")) (:CELL NIL "signals error")
      (:CELL NIL "O, o") (:CELL NIL "octal rational"))
     (:ROW NIL (:CELL NIL (:TT NIL "=")) (:CELL NIL "labels following object")
      (:CELL NIL "P, p") (:CELL NIL "pathname"))
     (:ROW NIL (:CELL NIL (:TT NIL ">")) (:CELL NIL "undefined")
      (:CELL NIL "Q, q") (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL " ?") (:CELL NIL "undefined*") (:CELL NIL "R, r")
      (:CELL NIL "radix-" (:MATH NIL (:MI NIL "n")) " rational"))
     (:ROW NIL (:CELL NIL " @") (:CELL NIL "undefined") (:CELL NIL "S, s")
      (:CELL NIL "structure"))
     (:ROW NIL (:CELL NIL " [") (:CELL NIL "undefined*") (:CELL NIL "T, t")
      (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL (:TT NIL "\\")) (:CELL NIL "character object")
      (:CELL NIL "U, u") (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL " ]") (:CELL NIL "undefined*") (:CELL NIL "V, v")
      (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL "^") (:CELL NIL "undefined") (:CELL NIL "W, w")
      (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL (:TT NIL "_")) (:CELL NIL "undefined")
      (:CELL NIL "X, x") (:CELL NIL "hexadecimal rational"))
     (:ROW NIL (:CELL NIL " `") (:CELL NIL "undefined") (:CELL NIL "Y, y")
      (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL (:TT NIL "|")) (:CELL NIL "balanced comment")
      (:CELL NIL "Z, z") (:CELL NIL "undefined"))
     (:ROW NIL (:CELL NIL (:TT NIL " ")) (:CELL NIL "undefined")
      (:CELL NIL "Rubout") (:CELL NIL "undefined")))
    " " :PAR
    (:COMMENT NIL
     "* The combinations marked by an asterisk are explicitly reserved to the"
     " user and will never be defined by the \\clisp\\ standard.")
    "The combinations marked by an asterisk (*) are explicitly reserved to the user. No "
    (:TERM NIL "conforming implementation") " defines them. " :PAR
    "Note also that " (:TERM NIL "digits")
    " do not appear in the preceding table. This is because the notations "
    (:TT NIL " #0") ", " (:TT NIL " #1") ", ..., " (:TT NIL " #9")
    " are reserved for another purpose which occupies the same syntactic space. When a "
    (:TERM NIL "digit") " follows a " (:TERM NIL "sharpsign")
    ", it is not treated as a dispatch character. Instead, an unsigned integer argument is accumulated and passed as an "
    (:TERM NIL "argument") " to the " (:TERM NIL "reader macro") " for the "
    (:TERM NIL "character") " that follows the digits. For example, "
    (:TT NIL "#2A((1 2) (3 4))") " is a use of " (:TT NIL " #A")
    " with an argument of " (:TT NIL "2") ". " :PAR
    (:COMMENT NIL "% 1.2.7 13" "% 22.1.4 5") :PAR
    (:SUBSUBSECTION
     (:TITLE ("Sharpsign Backslash") :TAGS (:SHARPSIGN-BACKSLASH)) " "
     (:IDXTEXT NIL "Sharpsign Backslash (reader macro)")
     (:IDXTEXT NIL "Backslash (sharpsign reader macro)")
     (:IDXREF NIL "character") " " :PAR (:B NIL "Syntax:") " "
     (:TT NIL "#\\" (:METAVAR NIL "x")) " " :PAR (:COMMENT NIL "% 2.2.0 3")
     :PAR "When the " (:TERM NIL "token") " " (:PARAM NIL "x") " is a single "
     (:TERM NIL "character") " long, this parses as the literal "
     (:TERM NIL "character") " " (:PARAM NIL "char") ". "
     (:COMMENT NIL "% 22.1.4 7") (:TERM NIL "Uppercase") " and "
     (:TERM NIL "lowercase") " letters are distinguished after "
     (:TT NIL "#\\") "; " (:TT NIL "#\\A") " and " (:TT NIL "#\\a")
     " denote different " (:TERM NIL "character") " " (:TERM NIL "objects")
     ". Any single " (:TERM NIL "character") " works after " (:TT NIL "#\\")
     ", even those that are normally special to " (:FUNREF NIL "read")
     ", such as " (:TERM NIL "left-parenthesis") " and "
     (:TERM NIL "right-parenthesis") ". " :PAR (:COMMENT NIL "% 22.1.4 6")
     "In the single " (:TERM NIL "character") " case, the " (:PARAM NIL "x")
     " must be followed by a non-constituent " (:TERM NIL "character")
     ". After " (:TT NIL "#\\") " is read, the reader backs up over the "
     (:TERM NIL "slash") " and then reads a " (:TERM NIL "token")
     ", treating the initial " (:TERM NIL "slash") " as a "
     (:TERM NIL "single escape") " " (:TERM NIL "character")
     " (whether it really is or not in the " (:TERM NIL "current readtable")
     "). " :PAR
     (:COMMENT NIL
      " When the \\term{token} \\param{x} is more than one \\term{character} long,"
      " %% 22.1.4 8" " the \\param{x} has the syntax of a \\term{symbol},"
      " and the \\term{sharpsign} \\term{backslash} notation"
      " parses as the \\term{character} whose \\term{name} is \\f{(string-upcase \\param{x})};"
      " \\seesection\\CharacterNames.")
     :PAR "When the " (:TERM NIL "token") " " (:PARAM NIL "x")
     " is more than one " (:TERM NIL "character") " long, "
     (:COMMENT NIL "% 22.1.4 8") "the " (:PARAM NIL "x")
     " must have the syntax of a " (:TERM NIL "symbol") " with no embedded "
     (:TERM NIL "package markers") ". In this case, the "
     (:TERM NIL "sharpsign") " " (:TERM NIL "backslash")
     " notation parses as the " (:TERM NIL "character") " whose "
     (:TERM NIL "name") " is " (:TT NIL "(string-upcase " (:PARAM NIL "x") ")")
     "; see " (:SECREF NIL :CHARACTER-NAMES) ". " :PAR
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " "
     (:ISSUE NIL "CHARACTER-LOOSE-ENDS:FIX") " "
     (:COMMENT NIL "% 22.1.4 18" "% 2.2.4 2"
      " Discussion of #n\\x notation for font n removed." "% 2.2.4 3"
      "%% 22.1.4 17"
      " Discussion of bits \\term{attribute} and stuff like #\\Control-Meta-Return removed.")
     (:ENDISSUE NIL "CHARACTER-LOOSE-ENDS:FIX") " "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR
     "For information about how the " (:TERM NIL "Lisp printer") " prints "
     (:TERM NIL "character") " " (:TERM NIL "objects") ", see "
     (:SECREF NIL :PRINTING-CHARACTERS) ". " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Sharpsign Single-Quote") :TAGS (:SHARPSIGN-QUOTE)) " "
     (:IDXTEXT NIL "Sharpsign Single-Quote (reader macro)")
     (:IDXTEXT NIL "Single-Quote (sharpsign reader macro)")
     (:IDXREF NIL "function") " " :PAR
     (:COMMENT NIL "% 22.1.4 19" "% 7.1.1 10") :PAR
     (:COMMENT NIL
      " %\\f{\\#'\\param{foo}} is an abbreviation for \\f{(function \\param{foo})}."
      " Any form \\param{f} preceded by \\f{\\#'} (\\f{\\#} followed by an apostrophe)"
      " is assumed to have \\f{(function)} wrapped around it to make"
      " {\\tt (function \\param{f})}.  For example,")
     :PAR "Any " (:PARAM NIL "expression") " preceded by " (:TT NIL "#'") " ("
     (:TERM NIL "sharpsign") " followed by " (:TERM NIL "single-quote")
     "), as in " (:TT NIL "#'" (:PARAM NIL "expression"))
     ", is treated by the " (:TERM NIL "Lisp reader")
     " as an abbreviation for and parsed identically to the "
     (:TERM NIL "expression") " "
     (:TT NIL "(function " (:PARAM NIL "expression") ")") ". See "
     (:SPECREF NIL "function") ". For example, " :PAR
     (:CODE NIL "(apply #'+ l) ≡ (apply (function +) l)
")
     " " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Sharpsign Left-Parenthesis") :TAGS (:SHARPSIGN-LEFT-PAREN)) " "
     (:IDXTEXT NIL "Sharpsign Left-Parenthesis (reader macro)")
     (:IDXTEXT NIL "Left-Parenthesis (sharpsign reader macro)")
     (:IDXREF NIL "vector") (:IDXREF NIL "simple-vector") " " :PAR
     (:COMMENT NIL "% 2.5.1 2                                  " "% 22.1.4 20")
     :PAR (:TT NIL "#(") " and " (:TT NIL ")") " are used to notate a "
     (:TERM NIL "simple vector") ". " :PAR (:COMMENT NIL "% 22.1.4 21")
     "If an unsigned decimal integer appears between the " (:TT NIL "#")
     " and " (:TT NIL "(") ", it specifies explicitly the length of the "
     (:TERM NIL "vector") ". The consequences are undefined if the number of "
     (:TERM NIL "objects") " specified before the closing " (:TT NIL ")")
     " exceeds the unsigned decimal integer. If the number of "
     (:TERM NIL "objects") " supplied before the closing " (:TT NIL ")")
     " is less than the unsigned decimal integer but greater than zero, the last "
     (:TERM NIL "object") " is used to fill all remaining elements of the "
     (:TERM NIL "vector") ". "
     (:EDITORNOTE NIL "Barmar: This should say \"signals...\".")
     " The consequences are undefined if the unsigned decimal integer is non-zero and number of "
     (:TERM NIL "objects") " supplied before the closing " (:TT NIL ")")
     " is zero. For example, " :PAR
     (:CODE NIL " #(a b c c c c)
 #6(a b c c c c)
 #6(a b c)
 #6(a b c c)
")
     " " :PAR "all mean the same thing: a " (:TERM NIL "vector") " of length "
     (:TT NIL "6") " with " (:TERM NIL "elements") " " (:TT NIL "a") ", "
     (:TT NIL "b") ", and four occurrences of " (:TT NIL "c")
     ". Other examples follow: " :PAR
     (:CODE NIL " #(a b c)               ;A vector of length 3
 #(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47)
                        ;A vector containing the primes below 50
 #()                    ;An empty vector
")
     " The notation " (:TT NIL "#()") " denotes an empty " (:TERM NIL "vector")
     ", as does " (:TT NIL "#0()") ". " :PAR "For information on how the "
     (:TERM NIL "Lisp printer") " prints " (:TERM NIL "vectors") ", see "
     (:SECREF NIL :PRINTING-STRINGS) ", " (:SECREF NIL :PRINTING-BIT-VECTORS)
     ", or " (:SECREF NIL :PRINTING-OTHER-VECTORS) ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Sharpsign Asterisk") :TAGS (:SHARPSIGN-STAR)) " "
     (:IDXTEXT NIL "Sharpsign Asterisk (reader macro)")
     (:IDXTEXT NIL "Asterisk (sharpsign reader macro)")
     (:IDXREF NIL "bit-vector") (:IDXREF NIL "simple-bit-vector") " " :PAR
     (:COMMENT NIL "% 22.1.4 22" "% 2.5.3 1") (:B NIL "Syntax:") " "
     (:TT NIL "#*" (:METAVAR NIL "bits")) " " :PAR (:COMMENT NIL "% 2.5.3 2")
     "A " (:TERM NIL "simple bit vector")
     " is constructed containing the indicated " (:TERM NIL "bits") " ("
     (:TT NIL "0") "'s and " (:TT NIL "1") "'s), where the leftmost "
     (:PARAM NIL "bit") " has index zero and the subsequent "
     (:PARAM NIL "bits") " have increasing indices. " :PAR (:B NIL "Syntax:")
     " " (:TT NIL "#" (:METAVAR NIL "n") "*" (:METAVAR NIL "bits")) " " :PAR
     (:COMMENT NIL "% 22.1.4 23") "With an argument " (:PARAM NIL "n") ", the "
     (:TERM NIL "vector") " to be created is of " (:TERM NIL "length") " "
     (:PARAM NIL "n") ". If the number of " (:PARAM NIL "bits")
     " is less than " (:PARAM NIL "n")
     " but greater than zero, the last bit is used to fill all remaining bits of the "
     (:TERM NIL "bit vector") ". " :PAR "The notations " (:TT NIL "#*") " and "
     (:TT NIL "#0*") " each denote an empty " (:TERM NIL "bit vector") ". "
     :PAR (:ISSUE NIL "SHARP-STAR-DELIMITER:NORMAL-DELIMITER")
     " Regardless of whether the optional numeric argument " (:PARAM NIL "n")
     " is provided, the " (:TERM NIL "token") " that follows the "
     (:TERM NIL "asterisk") " is delimited by a normal " (:TERM NIL "token")
     " delimiter. However, (unless the " (:TERM NIL "value") " of "
     (:VARREF NIL "*read-suppress*") " is " (:TERM NIL "true") ") an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "reader-error")
     " is signaled if that " (:TERM NIL "token")
     " is not composed entirely of " (:TT NIL "0") "'s and " (:TT NIL "1")
     "'s, or if " (:PARAM NIL "n") " was supplied and the " (:TERM NIL "token")
     " is composed of more than " (:PARAM NIL "n") " " (:PARAM NIL "bits")
     ", or if " (:PARAM NIL "n") " is greater than one, but no "
     (:PARAM NIL "bits") " were specified. Neither a "
     (:TERM NIL "single escape") " nor a " (:TERM NIL "multiple escape")
     " is permitted in this " (:TERM NIL "token") ". "
     (:ENDISSUE NIL "SHARP-STAR-DELIMITER:NORMAL-DELIMITER") " " :PAR
     "For information on how the " (:TERM NIL "Lisp printer") " prints "
     (:TERM NIL "bit vectors") ", see " (:SECREF NIL :PRINTING-BIT-VECTORS)
     ". " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Examples of Sharpsign Asterisk"))
      "For example, "
      (:CODE NIL "  #*101111
 #6*101111
 #6*101
 #6*1011
")
      " all mean the same thing: a " (:TERM NIL "vector") " of length "
      (:TT NIL "6") " with " (:TERM NIL "elements") " " (:TT NIL "1") ", "
      (:TT NIL "0") ", " (:TT NIL "1") ", " (:TT NIL "1") ", " (:TT NIL "1")
      ", and " (:TT NIL "1") ". " :PAR "For example: " :PAR
      (:CODE NIL " #*         ;An empty bit-vector
")
      " " :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Sharpsign Colon") :TAGS (:SHARPSIGN-COLON)) " "
     (:IDXTEXT NIL "Sharpsign Colon (reader macro)")
     (:IDXTEXT NIL "Colon (sharpsign reader macro)") (:IDXREF NIL "symbol") " "
     :PAR (:COMMENT NIL "% 22.1.4 24 ") :PAR
     (:COMMENT NIL
      " \\f{\\#:\\param{foo}} denotes an \\term{uninterned} \\term{symbol} "
      " whose \\term{name} is \\param{foo}."
      " Every time this syntax is encountered,"
      " a \\term{distinct} \\term{uninterned} \\term{symbol} is created."
      " \\f{\\#:} requires \\param{foo} to have the syntax of a "
      " \\term{symbol} name with no embedded \\term{package markers}."
      "% Replaced:")
     :PAR (:B NIL "Syntax:") " " (:TT NIL "#:" (:METAVAR NIL "symbol-name"))
     " " :PAR (:TT NIL "#:") " introduces an " (:TERM NIL "uninterned") " "
     (:TERM NIL "symbol") " whose " (:TERM NIL "name") " is "
     (:PARAM NIL "symbol-name") ". Every time this syntax is encountered, a "
     (:TERM NIL "distinct") " " (:TERM NIL "uninterned") " "
     (:TERM NIL "symbol") " is created. The " (:PARAM NIL "symbol-name")
     " must have the syntax of a " (:TERM NIL "symbol") " with no "
     (:TERM NIL "package prefix") ". " :PAR "For information on how the "
     (:TERM NIL "Lisp reader") " prints " (:TERM NIL "uninterned") " "
     (:TERM NIL "symbols") ", see " (:SECREF NIL :PRINTING-SYMBOLS) ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Sharpsign Dot") :TAGS (:SHARPSIGN-DOT)) " "
     (:IDXTEXT NIL "Sharpsign Dot (reader macro)")
     (:IDXTEXT NIL "Dot (sharpsign reader macro)") (:IDXREF NIL "eval")
     (:IDXREF NIL "*read-eval*") " " :PAR (:COMMENT NIL "% 22.1.4 25") :PAR
     (:TT NIL "#." (:PARAM NIL "foo")) " is read as the " (:TERM NIL "object")
     " resulting from the evaluation of the " (:TERM NIL "object")
     " represented by " (:PARAM NIL "foo")
     ". The evaluation is done during the " (:FUNREF NIL "read")
     " process, when the " (:TT NIL "#.") " notation is encountered. The "
     (:TT NIL "#.") " syntax therefore performs a read-time evaluation of "
     (:PARAM NIL "foo") ". " :PAR "The normal effect of " (:TT NIL " #.")
     " is inhibited when the " (:TERM NIL "value") " of "
     (:VARREF NIL "*read-eval*") " is " (:TERM NIL "false") ". "
     (:COMMENT NIL
      "Barmar asked what error type gets signaled. I made it be PARSE-ERROR. -kmp 17-Oct-90"
      "Oops. READER-ERROR. -kmp 15-Jan-91")
     (:ISSUE NIL "PARSE-ERROR-STREAM:SPLIT-TYPES")
     " In that situation, an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "reader-error") " is signaled. "
     (:ENDISSUE NIL "PARSE-ERROR-STREAM:SPLIT-TYPES") " " :PAR
     (:COMMENT NIL "% 22.1.4 26") "For an " (:TERM NIL "object")
     " that does not have a convenient printed representation, a "
     (:TERM NIL "form") " that computes the " (:TERM NIL "object")
     " can be given using the " (:TT NIL "#.") " notation. "
     (:ISSUE NIL "SHARP-COMMA-CONFUSION:REMOVE") " "
     (:COMMENT NIL "% issue here" "The following will be deleted."
      "or {\\tt \\#,}." "End of deletion.")
     (:ENDISSUE NIL "SHARP-COMMA-CONFUSION:REMOVE") " " :PAR)
    :PAR (:ISSUE NIL "SHARP-COMMA-CONFUSION:REMOVE") " "
    (:COMMENT NIL "% 22.1.4 27" "\\beginsubsubsection{Sharpsign Comma}"
     " Discussion of Sharpsign Comma removed here."
     "\\endsubsubsection%{Sharpsign Comma}")
    (:ENDISSUE NIL "SHARP-COMMA-CONFUSION:REMOVE") " " :PAR
    (:SUBSUBSECTION (:TITLE ("Sharpsign B") :TAGS (:SHARPSIGN-B)) " "
     (:IDXTEXT NIL "Sharpsign B (reader macro)")
     (:IDXTEXT NIL "B (sharpsign reader macro)") (:IDXREF NIL "*read-base*")
     " " :PAR (:COMMENT NIL "% 22.1.4 28") :PAR (:TT NIL "#B")
     (:PARAM NIL "rational") " reads " (:PARAM NIL "rational")
     " in binary (radix 2). For example, " :PAR
     (:CODE NIL " #B1101 ≡ 13 ;1101" (:SUB NIL "2") "
 #b101/11 ≡ 5/3
")
     " " :PAR (:ISSUE NIL "SHARP-O-FOOBAR:CONSEQUENCES-UNDEFINED")
     " The consequences are undefined if the token immediately following the "
     (:TT NIL "#B") " does not have the syntax of a binary (" (:I NIL "i.e.")
     ",  radix 2) " (:TERM NIL "rational") ". "
     (:ENDISSUE NIL "SHARP-O-FOOBAR:CONSEQUENCES-UNDEFINED") " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Sharpsign O") :TAGS (:SHARPSIGN-O)) " "
     (:IDXTEXT NIL "Sharpsign O (reader macro)")
     (:IDXTEXT NIL "O (sharpsign reader macro)") (:IDXREF NIL "*read-base*")
     " " :PAR (:COMMENT NIL "% 22.1.4 29") :PAR (:TT NIL "#O")
     (:PARAM NIL "rational") " reads " (:PARAM NIL "rational")
     " in octal (radix 8). For example, " :PAR
     (:CODE NIL " #o37/15 ≡ 31/13
 #o777 ≡ 511
 #o105 ≡ 69 ;105"
      (:SUB NIL "8") "
")
     " " :PAR (:ISSUE NIL "SHARP-O-FOOBAR:CONSEQUENCES-UNDEFINED")
     " The consequences are undefined if the token immediately following the "
     (:TT NIL "#O") " does not have the syntax of an octal (" (:I NIL "i.e.")
     ",  radix 8) " (:TERM NIL "rational") ". "
     (:ENDISSUE NIL "SHARP-O-FOOBAR:CONSEQUENCES-UNDEFINED") " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Sharpsign X") :TAGS (:SHARPSIGN-X)) " "
     (:IDXTEXT NIL "Sharpsign X (reader macro)")
     (:IDXTEXT NIL "X (sharpsign reader macro)") (:IDXREF NIL "*read-base*")
     " " :PAR (:COMMENT NIL "% 22.1.4 30") :PAR (:TT NIL "#X")
     (:PARAM NIL "rational") " reads " (:PARAM NIL "rational")
     " in hexadecimal (radix 16). The digits above " (:TT NIL "9")
     " are the letters " (:TT NIL "A") " through " (:TT NIL "F")
     " (the lowercase letters " (:TT NIL "a") " through " (:TT NIL "f")
     " are also acceptable). For example, " :PAR
     (:CODE NIL " #xF00 ≡ 3840             
 #x105 ≡ 261 ;105"
      (:SUB NIL "16") "
")
     " " :PAR (:ISSUE NIL "SHARP-O-FOOBAR:CONSEQUENCES-UNDEFINED")
     " The consequences are undefined if the token immediately following the "
     (:TT NIL "#X") " does not have the syntax of a hexadecimal ("
     (:I NIL "i.e.") ",  radix 16) " (:TERM NIL "rational") ". "
     (:ENDISSUE NIL "SHARP-O-FOOBAR:CONSEQUENCES-UNDEFINED") " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Sharpsign R") :TAGS (:SHARPSIGN-R)) " "
     (:IDXTEXT NIL "Sharpsign R (reader macro)")
     (:IDXTEXT NIL "R (sharpsign reader macro)") (:IDXREF NIL "*read-base*")
     " " :PAR (:COMMENT NIL "% 22.1.4 31                 ")
     (:TT NIL "#" (:PARAM NIL "n") "R") " " :PAR
     (:TT NIL "#" (:PARAM NIL "radix") "R" (:PARAM NIL "rational")) " reads "
     (:PARAM NIL "rational") " in radix " (:PARAM NIL "radix") ". "
     (:PARAM NIL "radix")
     " must consist of only digits that are interpreted as an "
     (:TERM NIL "integer")
     " in decimal radix; its value must be between 2 and 36 (inclusive). Only valid digits for the specified radix may be used. "
     :PAR (:COMMENT NIL "% 22.1.4 32") "For example, " (:TT NIL "#3r102")
     " is another way of writing " (:TT NIL "11") " (decimal), and "
     (:TT NIL "#11R32") " is another way of writing " (:TT NIL "35")
     " (decimal). For radices larger than 10, letters of the alphabet are used in order for the digits after "
     (:TT NIL "9") ". No alternate " (:TT NIL "#")
     " notation exists for the decimal radix since a decimal point suffices. "
     :PAR (:NEXTFIGURE (:CAPS T)) " contains examples of the use of "
     (:TT NIL "#B") ", " (:TT NIL " #O") ", " (:TT NIL " #X") ", and "
     (:TT NIL " #R") ". " :PAR
     (:TABLE (:NAME ("Radix Indicator Example"))
      (:ROW NIL (:CELL NIL (:TT NIL "#2r11010101"))
       (:CELL NIL " ;Another way of writing " (:TT NIL "213") " decimal "))
      (:ROW NIL (:CELL NIL (:TT NIL "#b11010101")) (:CELL NIL " ;Ditto "))
      (:ROW NIL (:CELL NIL (:TT NIL "#b+11010101")) (:CELL NIL " ;Ditto "))
      (:ROW NIL (:CELL NIL (:TT NIL "#o325"))
       (:CELL NIL " ;Ditto, in octal radix "))
      (:ROW NIL (:CELL NIL (:TT NIL "#xD5"))
       (:CELL NIL " ;Ditto, in hexadecimal radix "))
      (:ROW NIL (:CELL NIL (:TT NIL "#16r+D5")) (:CELL NIL " ;Ditto "))
      (:ROW NIL (:CELL NIL (:TT NIL "#o-300"))
       (:CELL NIL " ;Decimal " (:TT NIL "-192") ", written in base 8 "))
      (:ROW NIL (:CELL NIL (:TT NIL "#3r-21010"))
       (:CELL NIL " ;Same thing in base 3 "))
      (:ROW NIL (:CELL NIL (:TT NIL "#25R-7H"))
       (:CELL NIL " ;Same thing in base 25 "))
      (:ROW NIL (:CELL NIL (:TT NIL "#xACCEDED"))
       (:CELL NIL " ;" (:TT NIL "181202413") ", in hexadecimal radix ")))
     " " :PAR (:ISSUE NIL "SHARP-O-FOOBAR:CONSEQUENCES-UNDEFINED")
     " The consequences are undefined if the token immediately following the "
     (:TT NIL "#" (:PARAM NIL "n") "R") " does not have the syntax of a "
     (:TERM NIL "rational") " in radix " (:PARAM NIL "n") ". "
     (:ENDISSUE NIL "SHARP-O-FOOBAR:CONSEQUENCES-UNDEFINED") " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Sharpsign C") :TAGS (:SHARPSIGN-C)) " "
     (:IDXTEXT NIL "Sharpsign C (reader macro)")
     (:IDXTEXT NIL "C (sharpsign reader macro)") (:IDXREF NIL "complex") " "
     :PAR (:ISSUE NIL "READ-SUPPRESS-CONFUSING:GENERALIZE") " "
     (:COMMENT NIL
      " \\f{\\#C} followed by a \\term{list} of the real and imaginary parts denotes"
      " a \\term{complex} number.")
     (:TT NIL "#C") " reads a following " (:TERM NIL "object")
     ", which must be a " (:TERM NIL "list") " of length two whose "
     (:TERM NIL "elements") " are both " (:TERM NIL "reals") ". These "
     (:TERM NIL "reals")
     " denote, respectively, the real and imaginary parts of a "
     (:TERM NIL "complex") " number. "
     (:ENDISSUE NIL "READ-SUPPRESS-CONFUSING:GENERALIZE") " "
     (:COMMENT NIL "% 2.1.4 2")
     "If the two parts as notated are not of the same data type, then they are converted according to the rules of floating-point "
     (:TERM NIL "contagion") " described in "
     (:SECREF NIL :NUMERIC-CONTAGION-RULES) ". " :PAR
     (:TT NIL "#C(" (:PARAM NIL "real") " " (:PARAM NIL "imag") ")")
     " is equivalent to "
     (:TT NIL "#.(complex (quote " (:PARAM NIL "real") ") (quote "
      (:PARAM NIL "imag") "))")
     ", "
     (:COMMENT NIL " I added this next phrase for clarity. -kmp 23-Aug-93")
     "except that " (:TT NIL "#C") " is not affected by "
     (:VARREF NIL "*read-eval*") ". See the " (:TERM NIL "function") " "
     (:FUNREF NIL "complex") ". " :PAR (:NEXTFIGURE (:CAPS T))
     " contains examples of the use of " (:TT NIL " #C") ". " :PAR
     (:TABLE (:NAME ("Complex Number Example"))
      (:ROW NIL (:CELL NIL (:TT NIL "#C(3.0s1 2.0s-1)"))
       (:CELL NIL " ;A " (:TERM NIL "complex") " with "
        (:TERM NIL "small float") " parts. "))
      (:ROW NIL (:CELL NIL (:TT NIL "#C(5 -3) "))
       (:CELL NIL " ;A “Gaussian integer” "))
      (:ROW NIL (:CELL NIL (:TT NIL "#C(5/3 7.0) "))
       (:CELL NIL " ;Will be converted internally to "
        (:TT NIL "#C(1.66666 7.0)")))
      (:ROW NIL (:CELL NIL (:TT NIL "#C(0 1)"))
       (:CELL NIL " ;The imaginary unit; that is, i. ")))
     " " :PAR "For further information, see " (:SECREF NIL :PRINTING-COMPLEXES)
     " and " (:SECREF NIL :SYNTAX-OF-COMPLEXES) ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Sharpsign A") :TAGS (:SHARPSIGN-A)) " "
     (:IDXTEXT NIL "Sharpsign A (reader macro)")
     (:IDXTEXT NIL "A (sharpsign reader macro)") (:IDXREF NIL "array") " " :PAR
     (:COMMENT NIL "% 22.1.4 33           ") (:TT NIL "#" (:PARAM NIL "n") "A")
     " " :PAR
     (:TT NIL "#" (:PARAM NIL "n") (:TT NIL "A") (:PARAM NIL "object"))
     " constructs an " (:PARAM NIL "n") "-dimensional " (:TERM NIL "array")
     ", using " (:PARAM NIL "object") " as the value of the "
     (:KWD NIL "initial-contents") " argument to " (:FUNREF NIL "make-array")
     ". " :PAR
     (:COMMENT NIL
      "% 22.1.4 34                                                  ")
     "For example, " (:TT NIL "#2A((0 1 5) (foo 2 (hot dog)))")
     " represents a 2-by-3 matrix: " :PAR
     (:CODE NIL " 0       1       5
 foo     2       (hot dog)
")
     " In contrast, " (:TT NIL "#1A((0 1 5) (foo 2 (hot dog)))")
     " represents a " (:TERM NIL "vector") " of " (:TERM NIL "length") " "
     (:TT NIL "2") " whose " (:TERM NIL "elements") " are " (:TERM NIL "lists")
     ": " :PAR
     (:CODE NIL " (0 1 5) (foo 2 (hot dog))
")
     " " (:TT NIL "#0A((0 1 5) (foo 2 (hot dog)))")
     " represents a zero-dimensional " (:TERM NIL "array")
     " whose sole element is a " (:TERM NIL "list") ": " :PAR
     (:CODE NIL " ((0 1 5) (foo 2 (hot dog)))
")
     " " (:TT NIL "#0A foo") " represents a zero-dimensional "
     (:TERM NIL "array") " whose sole element is the " (:TERM NIL "symbol") " "
     (:TT NIL "foo") ". The notation " (:TT NIL "#1A foo")
     " is not valid because " (:TT NIL "foo") " is not a "
     (:TERM NIL "sequence") ". " :PAR "If some " (:TERM NIL "dimension")
     " of the " (:TERM NIL "array")
     " whose representation is being parsed is found to be " (:TT NIL "0")
     ", all " (:TERM NIL "dimensions") " to the right (" (:I NIL "i.e.")
     ",  the higher numbered " (:TERM NIL "dimensions")
     ") are also considered to be " (:TT NIL "0") ". " :PAR
     "For information on how the " (:TERM NIL "Lisp printer") " prints "
     (:TERM NIL "arrays") ", see " (:SECREF NIL :PRINTING-STRINGS) ", "
     (:SECREF NIL :PRINTING-BIT-VECTORS) ", "
     (:SECREF NIL :PRINTING-OTHER-VECTORS) ", or "
     (:SECREF NIL :PRINTING-OTHER-ARRAYS) ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Sharpsign S") :TAGS (:SHARPSIGN-S)) " "
     (:IDXTEXT NIL "Sharpsign S (reader macro)")
     (:IDXTEXT NIL "S (sharpsign reader macro)") (:IDXREF NIL "structure") " "
     :PAR (:COMMENT NIL "% 22.1.4 35") :PAR
     (:TT NIL "#s(name slot1 value1 slot2 value2 ...)") " denotes a "
     (:TERM NIL "structure") ". This is valid only if " (:PARAM NIL "name")
     " is the name of a " (:TERM NIL "structure") " " (:TERM NIL "type")
     " already defined by " (:MACREF NIL "defstruct") " and if the "
     (:TERM NIL "structure") " " (:TERM NIL "type")
     " has a standard constructor function. Let " (:PARAM NIL "cm")
     " stand for the name of this constructor function; then this syntax is equivalent to "
     :PAR
     (:CODE NIL " #.(cm keyword1 'value1 keyword2 'value2 ...)
")
     " " :PAR "where each " (:PARAM NIL "keywordj")
     " is the result of computing " :PAR
     (:CODE NIL " (intern (string slotj) (find-package 'keyword))
")
     " " :PAR
     "The net effect is that the constructor function is called with the specified slots having the specified values. "
     (:ISSUE NIL "STRUCTURE-READ-PRINT-SYNTAX:KEYWORDS")
     " (This coercion feature is deprecated; in the future, keyword names will be taken in the package they are read in, so "
     (:TERM NIL "symbols") " that are actually in the "
     (:PACKREF NIL "keyword") " " (:TERM NIL "package")
     " should be used if that is what is desired.) "
     (:ENDISSUE NIL "STRUCTURE-READ-PRINT-SYNTAX:KEYWORDS") " " :PAR
     "Whatever " (:TERM NIL "object")
     " the constructor function returns is returned by the " (:TT NIL "#S")
     " syntax. " :PAR "For information on how the " (:TERM NIL "Lisp printer")
     " prints " (:TERM NIL "structures") ", see "
     (:SECREF NIL :PRINTING-STRUCTURES) ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Sharpsign P") :TAGS (:SHARPSIGN-P)) " "
     (:IDXTEXT NIL "Sharpsign P (reader macro)")
     (:IDXTEXT NIL "P (sharpsign reader macro)") (:IDXREF NIL "pathname") " "
     :PAR (:ISSUE NIL "PATHNAME-PRINT-READ:SHARPSIGN-P") " " :PAR
     (:TT NIL "#P") " reads a following " (:TERM NIL "object")
     ", which must be a " (:TERM NIL "string") ". " :PAR
     (:COMMENT NIL " {\\tt \\#P\"...\"} is equivalent to "
      " {\\tt  \\#.(parse-namestring \"...\")}.")
     (:TT NIL "#P" (:METAVAR NIL "expression")) " is equivalent to "
     (:TT NIL "#.(parse-namestring '" (:METAVAR NIL "expression") ")") ", "
     (:COMMENT NIL " I added this next phrase for clarity. -kmp 23-Aug-93")
     "except that " (:TT NIL "#P") " is not affected by "
     (:VARREF NIL "*read-eval*") ". " :PAR "For information on how the "
     (:TERM NIL "Lisp printer") " prints " (:TERM NIL "pathnames") ", see "
     (:SECREF NIL :PRINTING-PATHNAMES) ". " :PAR
     (:ENDISSUE NIL "PATHNAME-PRINT-READ:SHARPSIGN-P") " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Sharpsign Equal-Sign"))
     (:IDXTEXT NIL "Sharpsign Equal-Sign (reader macro)")
     (:IDXTEXT NIL "Equal-Sign (sharpsign reader macro)")
     (:IDXREF NIL "*print-circle*") " " :PAR
     (:COMMENT NIL "% 22.1.4 36                      ")
     (:TT NIL "#" (:PARAM NIL "n") "=") " " :PAR
     (:TT NIL "#" (:PARAM NIL "n") "=" (:PARAM NIL "object"))
     " reads as whatever " (:TERM NIL "object") " has " (:PARAM NIL "object")
     " as its printed representation. However, that " (:TERM NIL "object")
     " is labeled by " (:PARAM NIL "n")
     ", a required unsigned decimal integer, for possible reference by the syntax "
     (:TT NIL "#" (:PARAM NIL "n") "#") ". The scope of the label is the "
     (:TERM NIL "expression") " being read by the outermost call to "
     (:FUNREF NIL "read") "; within this " (:TERM NIL "expression")
     ", the same label may not appear twice. " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Sharpsign Sharpsign"))
     (:IDXTEXT NIL "Sharpsign Sharpsign (reader macro)")
     (:IDXTEXT NIL "Sharpsign (sharpsign reader macro)")
     (:IDXREF NIL "*print-circle*") " " :PAR
     (:COMMENT NIL "% 22.1.4 37                  ")
     (:TT NIL "#" (:PARAM NIL "n") "#") " " :PAR
     (:TT NIL "#" (:PARAM NIL "n") "#") ", where " (:PARAM NIL "n")
     " is a required unsigned decimal " (:TERM NIL "integer")
     ", provides a reference to some " (:TERM NIL "object") " labeled by "
     (:TT NIL "#" (:PARAM NIL "n") "=") "; that is, "
     (:TT NIL "#" (:PARAM NIL "n") "#") " represents a pointer to the same ("
     (:FUNREF NIL "eq") ") " (:TERM NIL "object") " labeled by "
     (:TT NIL "#" (:PARAM NIL "n") "=")
     ". For example, a structure created in the variable " (:TT NIL "y")
     " by this code: " :PAR
     (:CODE NIL " (setq x (list 'p 'q))
 (setq y (list (list 'a 'b) x 'foo x))
 (rplacd (last y) (cdr y))
")
     " could be represented in this way: " :PAR
     (:CODE NIL " ((a b) . #1=(#2=(p q) foo #2# . #1#))
")
     " Without this notation, but with " (:VARREF NIL "*print-length*")
     " set to " (:TT NIL "10") " and " (:VARREF NIL "*print-circle*")
     " set to " (:MISC NIL "nil") ", the structure would print in this way: "
     :PAR
     (:CODE NIL " ((a b) (p q) foo (p q) (p q) foo (p q) (p q) foo (p q) ...)
")
     " A reference " (:TT NIL "#" (:PARAM NIL "n") "#")
     " may only occur after a label " (:TT NIL "#" (:PARAM NIL "n") "=")
     "; forward references are not permitted. The reference may not appear as the labeled object itself (that is, "
     (:TT NIL "#" (:PARAM NIL "n") "=#" (:PARAM NIL "n") "#")
     ") may not be written because the " (:TERM NIL "object") " labeled by "
     (:TT NIL "#" (:PARAM NIL "n") "=") " is not well defined in this case. "
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Sharpsign Plus"))
     (:IDXTEXT NIL "Sharpsign Plus (reader macro)")
     (:IDXTEXT NIL "Plus (sharpsign reader macro)") (:IDXREF NIL "*features*")
     " " :PAR (:COMMENT NIL "% 22.1.4 38") :PAR (:TT NIL "#+")
     " provides a read-time conditionalization facility; the syntax is "
     (:TT NIL "#+" (:PARAM NIL "test") " " (:PARAM NIL "expression"))
     ". If the " (:TERM NIL "feature expression") " " (:PARAM NIL "test")
     " succeeds, then this textual notation represents an "
     (:TERM NIL "object") " whose printed representation is "
     (:PARAM NIL "expression") ". If the " (:TERM NIL "feature expression") " "
     (:PARAM NIL "test") " fails, then this textual notation is treated as "
     (:TERM NIL "whitespace") (:SUB NIL "2") "; that is, it is as if the “"
     (:TT NIL "#+") " " (:PARAM NIL "test") " " (:PARAM NIL "expression")
     "” did not appear and only a " (:TERM NIL "space")
     " appeared in its place. " :PAR (:COMMENT NIL "% 22.1.4 39")
     "For a detailed description of success and failure in "
     (:TERM NIL "feature expressions") ", see "
     (:SECREF NIL :FEATURE-EXPRESSIONS) ". " :PAR (:COMMENT NIL "% 22.1.4 42")
     (:TT NIL "#+") " operates by first reading the "
     (:TERM NIL "feature expression") " and then skipping over the "
     (:PARAM NIL "form") " if the " (:TERM NIL "feature expression") " fails. "
     (:ISSUE NIL "SHARPSIGN-PLUS-MINUS-PACKAGE:KEYWORD") " While reading the "
     (:PARAM NIL "test") ", the " (:TERM NIL "current package") " is the "
     (:PACKREF NIL "keyword") " " (:TERM NIL "package") ". "
     (:ENDISSUE NIL "SHARPSIGN-PLUS-MINUS-PACKAGE:KEYWORD")
     " Skipping over the " (:PARAM NIL "form") " is accomplished by "
     (:TERM NIL "binding") " " (:VARREF NIL "*read-suppress*") " to "
     (:TERM NIL "true") " and then calling " (:FUNREF NIL "read") ". " :PAR
     "For examples, see " (:SECREF NIL :FEATURE-EXP-EXAMPLES) ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Sharpsign Minus"))
     (:IDXTEXT NIL "Sharpsign Minus (reader macro)")
     (:IDXTEXT NIL "Minus (sharpsign reader macro)") (:IDXREF NIL "*features*")
     " " :PAR (:COMMENT NIL "% 22.1.4 43") :PAR (:TT NIL "#-") " is like "
     (:TT NIL "#+") " except that it skips the " (:PARAM NIL "expression")
     " if the " (:PARAM NIL "test") " succeeds; that is, " :PAR
     (:CODE NIL "#-" (:PARAM NIL "test") " " (:PARAM NIL "expression")
      " ≡ #+(not " (:PARAM NIL "test") ") " (:PARAM NIL "expression") "
")
     " " :PAR "For examples, see " (:SECREF NIL :FEATURE-EXP-EXAMPLES) ". "
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Sharpsign Vertical-Bar"))
     (:IDXTEXT NIL "Sharpsign Vertical-Bar (reader macro)")
     (:IDXTEXT NIL "Vertical-Bar (sharpsign reader macro)")
     (:IDXTEXT NIL "comment") " " :PAR (:COMMENT NIL "% 22.1.4 44      ") :PAR
     (:TT NIL "#|...|#")
     " is treated as a comment by the reader. It must be balanced with respect to other occurrences of "
     (:TT NIL "#|") " and " (:TT NIL "|#")
     ", but otherwise may contain any characters whatsoever. " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Examples of Sharpsign Vertical-Bar"))
      "The following are some examples that exploit the " (:TT NIL "#|...|#")
      " notation: " :PAR
      (:CODE NIL
       ";;; In this example, some debugging code is commented out with #|...|#
;;; Note that this kind of comment can occur in the middle of a line
;;; (because a delimiter marks where the end of the comment occurs)
;;; where a semicolon comment can only occur at the end of a line 
;;; (because it comments out the rest of the line).
 (defun add3 (n) #|(format t \"~&Adding 3 to ~D.\" n)|# (+ n 3))

;;; The examples that follow show issues related to #| ... |# nesting.

;;; In this first example, #| and |# always occur properly paired,
;;; so nesting works naturally.
 (defun mention-fun-fact-1a ()
   (format t \"CL uses ; and #|...|# in comments.\"))
→ MENTION-FUN-FACT-1A
 (mention-fun-fact-1a)
⊳ CL uses ; and #|...|# in comments.
→ NIL
 #| (defun mention-fun-fact-1b ()
      (format t \"CL uses ; and #|...|# in comments.\")) |#
 (fboundp 'mention-fun-fact-1b) → NIL

;;; In this example, vertical-bar followed by sharpsign needed to appear
;;; in a string without any matching sharpsign followed by vertical-bar
;;; having preceded this.  To compensate, the programmer has included a
;;; slash separating the two characters.  In case 2a, the slash is 
;;; unnecessary but harmless, but in case 2b, the slash is critical to
;;; allowing the outer #| ... |# pair match.  If the slash were not present,
;;; the outer comment would terminate prematurely.
 (defun mention-fun-fact-2a ()
   (format t \"Don't use |\\# unmatched or you'll get in trouble!\"))
→ MENTION-FUN-FACT-2A
 (mention-fun-fact-2a)
⊳ Don't use |# unmatched or you'll get in trouble!
→ NIL
 #| (defun mention-fun-fact-2b ()
      (format t \"Don't use |\\# unmatched or you'll get in trouble!\") |#
 (fboundp 'mention-fun-fact-2b) → NIL

;;; In this example, the programmer attacks the mismatch problem in a
;;; different way.  The sharpsign vertical bar in the comment is not needed
;;; for the correct parsing of the program normally (as in case 3a), but 
;;; becomes important to avoid premature termination of a comment when such 
;;; a program is commented out (as in case 3b).
 (defun mention-fun-fact-3a () ; #|
   (format t \"Don't use |# unmatched or you'll get in trouble!\"))
→ MENTION-FUN-FACT-3A
 (mention-fun-fact-3a)
⊳ Don't use |# unmatched or you'll get in trouble!
→ NIL
 #|
 (defun mention-fun-fact-3b () ; #|
   (format t \"Don't use |# unmatched or you'll get in trouble!\"))
 |#
 (fboundp 'mention-fun-fact-3b) → NIL
")
      " " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Notes about Style for Sharpsign Vertical-Bar"))
      "Some text editors that purport to understand Lisp syntax treat any "
      (:TT NIL "|...|")
      " as balanced pairs that cannot nest (as if they were just balanced pairs of the multiple escapes used in notating certain symbols). To compensate for this deficiency, some programmers use the notation "
      (:TT NIL "#||...#||...||#...||#") " instead of "
      (:TT NIL "#|...#|...|#...|#")
      ". Note that this alternate usage is not a different "
      (:TERM NIL "reader macro")
      "; it merely exploits the fact that the additional vertical-bars occur within the comment in a way that tricks certain text editor into better supporting nested comments. As such, one might sometimes see code like: "
      :PAR
      (:CODE NIL " #|| (+ #|| 3 ||# 4 5) ||# 
")
      " " :PAR "Such code is equivalent to: " :PAR
      (:CODE NIL " #| (+ #| 3 |# 4 5) |#
")
      " " :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Sharpsign Less-Than-Sign") :TAGS (:SHARPSIGN-LEFT-ANGLE)) " "
     (:IDXTEXT NIL "Sharpsign Less-Than-Sign (reader macro)")
     (:IDXTEXT NIL "Less-Than-Sign (sharpsign reader macro)") " " :PAR
     (:COMMENT NIL "% 22.1.4 46      ") :PAR (:TT NIL " #<")
     " is not valid reader syntax. The " (:TERM NIL "Lisp reader")
     " will signal an error " (:ISSUE NIL "PARSE-ERROR-STREAM:SPLIT-TYPES")
     " of " (:TERM NIL "type") " " (:TYPEREF NIL "reader-error") " "
     (:ENDISSUE NIL "PARSE-ERROR-STREAM:SPLIT-TYPES") " on encountering "
     (:TT NIL "#<")
     ". This syntax is typically used in the printed representation of "
     (:TERM NIL "objects") " that cannot be read back in. " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Sharpsign Whitespace"))
     (:IDXTEXT NIL "Sharpsign Whitespace") " " :PAR
     (:COMMENT NIL "% 22.1.4 47") :PAR
     (:COMMENT NIL "Used to explicitly mention Newline, Page, Return"
      "but those are not chars in the standard syntax. -kmp 13-May-91")
     :PAR (:TT NIL "#") " followed immediately by " (:TERM NIL "whitespace")
     (:SUB NIL "1") " is not valid reader syntax. The "
     (:TERM NIL "Lisp reader") " will signal an error of " (:TERM NIL "type")
     " " (:TYPEREF NIL "reader-error")
     " if it encounters the reader macro notation "
     (:TT NIL "#" (:ANG NIL "Newline")) " or " (:TT NIL "#" (:ANG NIL "Space"))
     ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Sharpsign Right-Parenthesis"))
     (:IDXTEXT NIL "Sharpsign Right-Parenthesis") " " :PAR
     (:COMMENT NIL "% 22.1.4 48") :PAR "This is not valid reader syntax. " :PAR
     (:COMMENT NIL
      "I added this.  It's alluded to elsewhere that it really signals. -kmp 15-Jan-91")
     "The " (:TERM NIL "Lisp reader") " will signal an error "
     (:ISSUE NIL "PARSE-ERROR-STREAM:SPLIT-TYPES") " of " (:TERM NIL "type")
     " " (:TYPEREF NIL "reader-error") " "
     (:ENDISSUE NIL "PARSE-ERROR-STREAM:SPLIT-TYPES") " " (:COMMENT NIL "(")
     "upon encountering " (:TT NIL "#)") ". " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Re-Reading Abbreviated Expressions"))
    (:IDXTEXT NIL "Dot Dot") (:IDXCODE NIL "..") " "
    (:IDXTEXT NIL "Dot Dot Dot") (:IDXCODE NIL "...") " "
    (:IDXTEXT NIL "Sharpsign Whitespace")
    (:IDXTEXT NIL "Sharpsign Right-Parenthesis") " " :PAR
    (:COMMENT NIL "% 22.1.6 53") "Note that the " (:TERM NIL "Lisp reader")
    " will "
    (:COMMENT NIL
     " Only generally because \"..\" due to print-lines in mid-string won't reliably signal.")
    "generally signal an error of " (:TERM NIL "type") " "
    (:TYPEREF NIL "reader-error") " when reading an " (:TERM NIL "expression")
    (:SUB NIL "2")
    " that has been abbreviated because of length or level limits (see "
    (:VARREF NIL "*print-level*") ", " (:VARREF NIL "*print-length*") ", and "
    (:VARREF NIL "*print-lines*") ") due to restrictions on “" (:TT NIL "..")
    "”, “" (:TT NIL "...") "”, “" (:TT NIL "#") "” followed by "
    (:TERM NIL "whitespace") (:SUB NIL "1") ", " (:COMMENT NIL "(") "and “"
    (:TT NIL "#)") "”. " :PAR))
  :PAR)
 (:CHAPTER
  (:NUM "3" :TITLE ("Evaluation and Compilation") :NUMTAG :CHAP-THREE :NAMETAG
   :EVALUATION-AND-COMPILATION)
  (:SECTION (:TITLE ("Evaluation") :TAGS (:EVALUATION)) " "
   (:COMMENT NIL "%Evaluation") :PAR (:TERM NIL "Execution") " of "
   (:TERM NIL "code")
   " can be accomplished by a variety of means ranging from direct interpretation of a "
   (:TERM NIL "form") " representing a " (:TERM NIL "program")
   " to invocation of " (:TERM NIL "compiled code") " produced by a "
   (:TERM NIL "compiler") ". " :PAR (:NEWTERM (:IDX "evaluation") "Evaluation")
   " is the process by which a " (:TERM NIL "program") " is "
   (:TERM NIL "executed") " in " (:RM NIL " Common Lisp") ". The mechanism of "
   (:TERM NIL "evaluation")
   " is manifested both implicitly through the effect of the "
   (:TERM NIL "Lisp read-eval-print loop")
   ", and explicitly through the presence of the " (:TERM NIL "functions") " "
   (:FUNREF NIL "eval") ", " (:FUNREF NIL "compile") ", "
   (:FUNREF NIL "compile-file") ", and " (:FUNREF NIL "load")
   ". Any of these facilities might share the same execution strategy, or each might use a different one. "
   :PAR "The behavior of a " (:TERM NIL "conforming program") " processed by "
   (:FUNREF NIL "eval") " and by " (:FUNREF NIL "compile-file")
   " might differ; see " (:SECREF NIL :SEMANTIC-CONSTRAINTS) ". " :PAR
   (:TERM NIL "Evaluation")
   " can be understood in terms of a model in which an interpreter recursively traverses a "
   (:TERM NIL "form")
   " performing each step of the computation as it goes. This model, which describes the semantics of "
   (:RM NIL " Common Lisp") " " (:TERM NIL "programs") ", is described in "
   (:SECREF NIL :EVALUATION-MODEL) ". " :PAR
   (:SUBSECTION
    (:TITLE ("Introduction to Environments") :TAGS (:INTRO-TO-ENVS)) " " :PAR
    "A " (:NEWTERM NIL "binding") " is an association between a "
    (:TERM NIL "name") " and that which the name denotes. "
    (:TERM NIL "Bindings") " are " (:TERM NIL "established") " in a "
    (:TERM NIL "lexical environment") " or a "
    (:TERM NIL "dynamic environment") " by particular "
    (:TERM NIL "special operators") ". " :PAR "An "
    (:NEWTERM NIL "environment") " is a set of " (:TERM NIL "bindings")
    " and other information used during evaluation (" (:I NIL "e.g.")
    ",  to associate meanings with names). " :PAR (:TERM NIL "Bindings")
    " in an " (:TERM NIL "environment") " are partitioned into "
    (:NEWTERM (:IDX "namespace") "namespaces") ". A single " (:TERM NIL "name")
    " can simultaneously have more than one associated " (:TERM NIL "binding")
    " per " (:TERM NIL "environment") ", but can have only one associated "
    (:TERM NIL "binding") " per " (:TERM NIL "namespace") ". " :PAR
    (:COMMENT NIL "!!!! Moon: There out to be a list of the namespaces!!"
     "           Do they even have agreed-upon names?")
    :PAR
    (:SUBSUBSECTION (:TITLE ("The Global Environment")) "The "
     (:NEWTERM NIL "global environment") " is that part of an "
     (:TERM NIL "environment") " that contains " (:TERM NIL "bindings")
     " with both " (:TERM NIL "indefinite scope") " and "
     (:TERM NIL "indefinite extent") ". The " (:TERM NIL "global environment")
     " contains, among other things, the following: " :PAR
     (:LIST NIL
      (:ITEM NIL " " (:TERM NIL "bindings") " of "
       (:TERM NIL "dynamic variables") " and " (:TERM NIL "constant variables")
       ". ")
      (:ITEM NIL " " (:TERM NIL "bindings") " of " (:TERM NIL "functions") ", "
       (:TERM NIL "macros") ", and " (:TERM NIL "special operators") ". ")
      (:ITEM NIL (:ISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89")
       (:TERM NIL "bindings") " of " (:TERM NIL "compiler macros") ". "
       (:ENDISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89"))
      (:ITEM NIL " " (:TERM NIL "bindings") " of " (:TERM NIL "type") " and "
       (:TERM NIL "class") " " (:TERM NIL "names") " ")
      (:ITEM NIL " information about " (:TERM NIL "proclamations") ". "))
     " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Dynamic Environments")) "A "
     (:NEWTERM NIL "dynamic environment") " for " (:TERM NIL "evaluation")
     " is that part of an " (:TERM NIL "environment") " that contains "
     (:TERM NIL "bindings") " whose duration is bounded by points of "
     (:TERM NIL "establishment") " and " (:TERM NIL "disestablishment")
     " within the execution of the " (:TERM NIL "form")
     " that established the " (:TERM NIL "binding") ". A "
     (:TERM NIL "dynamic environment")
     " contains, among other things, the following: " :PAR
     (:LIST NIL
      (:ITEM NIL " " (:TERM NIL "bindings") " for "
       (:TERM NIL "dynamic variables") ". ")
      (:ITEM NIL " information about " (:TERM NIL "active") " "
       (:TERM NIL "catch tags") ". ")
      (:ITEM NIL " information about " (:TERM NIL "exit points")
       " established by " (:SPECREF NIL "unwind-protect") ". ")
      (:ITEM NIL " information about " (:TERM NIL "active") " "
       (:TERM NIL "handlers") " and " (:TERM NIL "restarts") ". "))
     " " :PAR "The " (:TERM NIL "dynamic environment")
     " that is active at any given point in the " (:TERM NIL "execution")
     " of a " (:TERM NIL "program")
     " is referred to by definite reference as “the current "
     (:TERM NIL "dynamic environment") ",” or sometimes as just “the "
     (:TERM NIL "dynamic environment") ".” " :PAR "Within a given "
     (:TERM NIL "namespace") ", a " (:TERM NIL "name") " is said to be "
     (:TERM NIL "bound") " in a " (:TERM NIL "dynamic environment")
     " if there is a " (:TERM NIL "binding") " " (:COMMENT NIL "or mapping")
     "associated with its " (:TERM NIL "name") " in the "
     (:TERM NIL "dynamic environment") " or, if not, there is a "
     (:TERM NIL "binding") " " (:COMMENT NIL "or mapping")
     "associated with its name in the " (:TERM NIL "global environment") ". "
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Lexical Environments")) "A "
     (:NEWTERM NIL "lexical environment") " for " (:TERM NIL "evaluation")
     " at some position in a " (:TERM NIL "program") " is that part of the "
     (:TERM NIL "environment") " that contains information having "
     (:TERM NIL "lexical scope") " within the " (:TERM NIL "forms")
     " containing that position. A " (:TERM NIL "lexical environment")
     " contains, among other things, the following: " :PAR
     (:LIST NIL
      (:ITEM NIL " " (:TERM NIL "bindings") " of "
       (:TERM NIL "lexical variables") " and " (:TERM NIL "symbol macros")
       ". ")
      (:ITEM NIL " " (:TERM NIL "bindings") " of " (:TERM NIL "functions")
       " and " (:TERM NIL "macros")
       ". (Implicit in this is information about those "
       (:TERM NIL "compiler macros") " that are locally disabled.) "
       (:COMMENT NIL
        "% Replaced by parenthetical remark on previous bullet. -kmp 5-Dec-91"
        " \\item{\\bull} \\term{bindings} of \\term{compiler macros}"
        " 	     (specifically, information about those \\term{compiler macros} "
        " 	      that are locally disabled)"))
      (:ITEM NIL " " (:TERM NIL "bindings") " of " (:TERM NIL "block tags")
       ". ")
      (:ITEM NIL " " (:TERM NIL "bindings") " of " (:TERM NIL "go tags") ". ")
      (:ITEM NIL " information about " (:TERM NIL "declarations") ". "))
     " " :PAR "The " (:TERM NIL "lexical environment")
     " that is active at any given position in a " (:TERM NIL "program")
     " being semantically processed is referred to by definite reference as “the current "
     (:TERM NIL "lexical environment") ",” or sometimes as just “the "
     (:TERM NIL "lexical environment") ".” " :PAR "Within a given "
     (:TERM NIL "namespace") ", a " (:TERM NIL "name") " is said to be "
     (:TERM NIL "bound") " in a " (:TERM NIL "lexical environment")
     " if there is a " (:TERM NIL "binding") " " (:COMMENT NIL "or mapping")
     "associated with its " (:TERM NIL "name") " in the "
     (:TERM NIL "lexical environment") " or, if not, there is a "
     (:TERM NIL "binding") " " (:COMMENT NIL "or mapping")
     "associated with its name in the " (:TERM NIL "global environment") ". "
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("The Null Lexical Environment") :TAGS (:NULL-LEXICAL-ENV)) " "
      :PAR "The " (:NEWTERM NIL "null lexical environment")
      " is equivalent to the " (:TERM NIL "global environment") ". " :PAR
      "Although in general the representation of an " (:TERM NIL "environment")
      " " (:TERM NIL "object") " is " (:TERM NIL "implementation-dependent")
      ", " (:MISC NIL "nil") " can be used in any situation where an "
      (:TERM NIL "environment") " " (:TERM NIL "object")
      " is called for in order to denote the "
      (:TERM NIL "null lexical environment") ". " :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Environment Objects") :TAGS (:ENV-OBJS)) " " :PAR
     "Some " (:TERM NIL "operators") " make use of an " (:TERM NIL "object")
     ", called an " (:NEWTERM NIL "environment object")
     ", that represents the set of " (:TERM NIL "lexical bindings")
     " needed to perform semantic analysis on a " (:TERM NIL "form")
     " in a given " (:TERM NIL "lexical environment") ". The set of "
     (:TERM NIL "bindings") " in an " (:TERM NIL "environment object")
     " may be a subset of the " (:TERM NIL "bindings")
     " that would be needed to actually perform an " (:TERM NIL "evaluation")
     "; for example, " (:TERM NIL "values") " associated with "
     (:TERM NIL "variable") " " (:TERM NIL "names") " and "
     (:TERM NIL "function names") " in the corresponding "
     (:TERM NIL "lexical environment") " might not be available in an "
     (:TERM NIL "environment object") ". " :PAR "The " (:TERM NIL "type")
     " and nature of an " (:TERM NIL "environment object") " is "
     (:TERM NIL "implementation-dependent") ". The " (:TERM NIL "values")
     " of " (:TERM NIL "environment parameters") " to "
     (:TERM NIL "macro functions") " are examples of "
     (:TERM NIL "environment objects") ". " :PAR "The " (:TERM NIL "object")
     " " (:MISC NIL "nil") " when used as an " (:TERM NIL "environment object")
     " denotes the " (:TERM NIL "null lexical environment") "; see "
     (:SECREF NIL :NULL-LEXICAL-ENV) ". " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("The Evaluation Model") :TAGS (:EVALUATION-MODEL)) " "
    :PAR "A " (:RM NIL " Common Lisp") " system evaluates " (:TERM NIL "forms")
    " with respect to lexical, dynamic, and global " (:TERM NIL "environments")
    ". The following sections describe the components of the "
    (:RM NIL " Common Lisp") " evaluation model. " :PAR
    (:SUBSUBSECTION (:TITLE ("Form Evaluation")) (:TERM NIL "Forms")
     " fall into three categories: "
     (:COMMENT NIL
      "!!!Is this a correct use of self-evaluating? -kmp 09-Apr-91")
     (:TERM NIL "symbols") ", " (:TERM NIL "conses") ", and "
     (:TERM NIL "self-evaluating objects")
     ". The following sections explain these categories. " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Symbols as Forms") :TAGS (:SYMBOLS-AS-FORMS))
      " " :PAR "If a " (:TERM NIL "form") " is a " (:TERM NIL "symbol")
      ", then it is either a " (:TERM NIL "symbol macro") " or a "
      (:TERM NIL "variable") ". " :PAR "The " (:TERM NIL "symbol") " names a "
      (:TERM NIL "symbol macro") " if there is a " (:TERM NIL "binding")
      " of the " (:TERM NIL "symbol") " as a " (:TERM NIL "symbol macro")
      " in the current " (:TERM NIL "lexical environment") " "
      (:ISSUE NIL "ISO-COMPATIBILITY:ADD-SUBSTRATE") " (see "
      (:MACREF NIL "define-symbol-macro") " and "
      (:SPECREF NIL "symbol-macrolet") "). "
      (:ENDISSUE NIL "ISO-COMPATIBILITY:ADD-SUBSTRATE") " If the "
      (:TERM NIL "symbol") " is a " (:TERM NIL "symbol macro")
      ", its expansion function is obtained. The expansion function is a function of two arguments, and is invoked by calling the "
      (:TERM NIL "macroexpand hook")
      " with the expansion function as its first argument, the "
      (:TERM NIL "symbol") " as its second argument, and an "
      (:TERM NIL "environment object") " (corresponding to the current "
      (:TERM NIL "lexical environment") ") as its third argument. The "
      (:TERM NIL "macroexpand hook")
      ", in turn, calls the expansion function with the " (:TERM NIL "form")
      " as its first argument and the " (:TERM NIL "environment")
      " as its second argument. The " (:TERM NIL "value")
      " of the expansion function, which is passed through by the "
      (:TERM NIL "macroexpand hook") ", is a " (:TERM NIL "form")
      ". This resulting " (:TERM NIL "form")
      " is processed in place of the original " (:TERM NIL "symbol") ". " :PAR
      "If a " (:TERM NIL "form") " is a " (:TERM NIL "symbol")
      " that is not a " (:TERM NIL "symbol macro") ", then it is the "
      (:TERM NIL "name") " of a " (:TERM NIL "variable") ", and the "
      (:TERM NIL "value") " of that " (:TERM NIL "variable")
      " is returned. There are three kinds of variables: "
      (:TERM NIL "lexical variables") ", " (:TERM NIL "dynamic variables")
      ", and " (:TERM NIL "constant variables") ". "
      (:COMMENT NIL " global variables.") "A " (:TERM NIL "variable")
      " can store one " (:TERM NIL "object") ". The main operations on a "
      (:TERM NIL "variable") " are to " (:TERM NIL "read") (:SUB NIL "1")
      " and to " (:TERM NIL "write") (:SUB NIL "1") " its " (:TERM NIL "value")
      ". " :PAR (:COMMENT NIL "% 7.1.1 1" "% 7.2.0 2" "% 7.2.0 3") :PAR
      "An error of " (:TERM NIL "type") " " (:TYPEREF NIL "unbound-variable")
      " should be signaled if an " (:TERM NIL "unbound variable")
      " is referenced. " :PAR (:TERM NIL "Non-constant variables") " can be "
      (:TERM NIL "assigned") " by using " (:SPECREF NIL "setq") " or "
      (:TERM NIL "bound") (:SUB NIL "3") " by using " (:SPECREF NIL "let") ". "
      (:NEXTFIGURE (:CAPS T)) " lists some " (:TERM NIL "defined names")
      " that are applicable to assigning, binding, and defining "
      (:TERM NIL "variables") ". " :PAR
      (:TABLE (:NAME ("Some Defined Names Applicable to Variables"))
       (:ROW NIL (:CELL NIL (:VARREF NIL " boundp"))
        (:CELL NIL (:VARREF NIL "let")) (:CELL NIL (:VARREF NIL "progv")))
       (:ROW NIL (:CELL NIL (:VARREF NIL " defconstant"))
        (:CELL NIL (:VARREF NIL "let*")) (:CELL NIL (:VARREF NIL "psetq")))
       (:ROW NIL (:CELL NIL (:VARREF NIL " defparameter"))
        (:CELL NIL (:VARREF NIL "makunbound")) (:CELL NIL (:VARREF NIL "set")))
       (:ROW NIL (:CELL NIL (:VARREF NIL " defvar"))
        (:CELL NIL (:VARREF NIL "multiple-value-bind"))
        (:CELL NIL (:VARREF NIL "setq")))
       (:ROW NIL (:CELL NIL (:VARREF NIL " lambda"))
        (:CELL NIL (:VARREF NIL "multiple-value-setq"))
        (:CELL NIL (:VARREF NIL "symbol-value"))))
      " " :PAR "The following is a description of each kind of variable. " :PAR
      (:SUBSUBSUBSUBSECTION (:TITLE ("Lexical Variables")) "A "
       (:TERM NIL "lexical variable") " is a " (:TERM NIL "variable")
       " that can be referenced only within the " (:TERM NIL "lexical scope")
       " of the " (:TERM NIL "form") " that establishes that "
       (:TERM NIL "variable") "; " (:TERM NIL "lexical variables") " have "
       (:TERM NIL "lexical scope") ". Each time a " (:TERM NIL "form")
       " creates a " (:TERM NIL "lexical binding") " of a "
       (:TERM NIL "variable") ", a " (:TERM NIL "fresh") " "
       (:TERM NIL "binding") " is " (:TERM NIL "established") ". " :PAR
       "Within the " (:TERM NIL "scope") " of a " (:TERM NIL "binding")
       " for a " (:TERM NIL "lexical variable") " " (:TERM NIL "name")
       ", uses of that " (:TERM NIL "name") " as a " (:TERM NIL "variable")
       " are considered to be references to that " (:TERM NIL "binding")
       " except where the " (:TERM NIL "variable") " is "
       (:TERM NIL "shadowed") (:SUB NIL "2") " by a " (:TERM NIL "form")
       " that " (:TERM NIL "establishes") " a " (:TERM NIL "fresh") " "
       (:TERM NIL "binding") " for that " (:TERM NIL "variable") " "
       (:TERM NIL "name") ", or by a " (:TERM NIL "form") " that locally "
       (:TERM NIL "declares") " the " (:TERM NIL "name") " "
       (:DECLREF NIL "special") ". " :PAR "A " (:TERM NIL "lexical variable")
       " always has a " (:TERM NIL "value") ". There is no "
       (:TERM NIL "operator") " that introduces a " (:TERM NIL "binding")
       " for a " (:TERM NIL "lexical variable")
       " without giving it an initial " (:TERM NIL "value")
       ", nor is there any " (:TERM NIL "operator") " that can make a "
       (:TERM NIL "lexical variable") " be " (:TERM NIL "unbound") ". " :PAR
       (:TERM NIL "Bindings") " of " (:TERM NIL "lexical variables")
       " are found in the " (:TERM NIL "lexical environment") ". " :PAR)
      :PAR
      (:SUBSUBSUBSUBSECTION (:TITLE ("Dynamic Variables")) "A "
       (:TERM NIL "variable") " is a " (:TERM NIL "dynamic variable")
       " if one of the following conditions hold: " :PAR
       (:LIST NIL
        (:ITEM NIL " It is locally declared or globally proclaimed "
         (:DECLREF NIL "special") ". " :PAR)
        (:ITEM NIL " It occurs textually within a " (:TERM NIL "form")
         " that creates a " (:TERM NIL "dynamic binding") " for a "
         (:TERM NIL "variable") " of the " (:TERM NIL "same") " "
         (:TERM NIL "name") ", and the " (:TERM NIL "binding") " is not "
         (:TERM NIL "shadowed") (:SUB NIL "2") " by a " (:TERM NIL "form")
         " that creates a " (:TERM NIL "lexical binding") " of the same "
         (:TERM NIL "variable") " " (:TERM NIL "name") ". " :PAR
         (:COMMENT NIL
          "% Is this right? Is there an issue that applies to this? -kmp"
          "% Removed for now because Barrett and Moon balked, too. -kmp 13-Oct-91"
          "  \\item{\\bull} It is not locally declared \\declref{special}, "
          "  and it does not occur textually within a \\term{form} that creates"
          "  a lexical \\term{binding} for a variable of the same name.")
         :PAR))
       " " :PAR
       (:COMMENT NIL
        "!!! Barrett wants to mention \"dynamic scope\" here someplace.")
       "A " (:TERM NIL "dynamic variable")
       " can be referenced at any time in any " (:TERM NIL "program")
       "; there is no textual limitation on references to "
       (:TERM NIL "dynamic variables") ". At any given time, all "
       (:TERM NIL "dynamic variables")
       " with a given name refer to exactly one " (:TERM NIL "binding")
       ", either in the " (:TERM NIL "dynamic environment") " or in the "
       (:TERM NIL "global environment") ". " :PAR (:COMMENT NIL "% 5.1.2 5")
       "The " (:TERM NIL "value") " part of the " (:TERM NIL "binding")
       " for a " (:TERM NIL "dynamic variable")
       " might be empty; in this case, the " (:TERM NIL "dynamic variable")
       " is said to have no " (:TERM NIL "value") ", or to be "
       (:TERM NIL "unbound") ". A " (:TERM NIL "dynamic variable")
       " can be made " (:TERM NIL "unbound") " by using "
       (:FUNREF NIL "makunbound") ". " :PAR "The effect of "
       (:TERM NIL "binding") " a " (:TERM NIL "dynamic variable")
       " is to create a new " (:TERM NIL "binding")
       " to which all references to that " (:TERM NIL "dynamic variable")
       " in any " (:TERM NIL "program") " refer for the duration of the "
       (:TERM NIL "evaluation") " of the " (:TERM NIL "form")
       " that creates the " (:TERM NIL "dynamic binding") ". " :PAR
       (:COMMENT NIL " %!!! Need to merge this in with previous or delete it."
        " %% 5.1.2 4"
        " A \\term{dynamic variable} that is referenced outside the \\term{dynamic extent} of"
        " a \\term{form} that \\term{binds} the \\term{symbol} that names the"
        " variable is a global variable. A global variable is \\term{unbound}"
        " unless and until explicitly assigned a value, except for global"
        " variables defined in this specification or by an implementation.")
       :PAR "A " (:TERM NIL "dynamic variable")
       " can be referenced outside the " (:TERM NIL "dynamic extent") " of a "
       (:TERM NIL "form") " that " (:TERM NIL "binds") " it. Such a "
       (:TERM NIL "variable")
       " is sometimes called a “global variable” but is still in all respects just a "
       (:TERM NIL "dynamic variable") " whose " (:TERM NIL "binding")
       " happens to exist in the " (:TERM NIL "global environment")
       " rather than in some " (:TERM NIL "dynamic environment") ". " :PAR
       (:COMMENT NIL " slight rewording  --sjl 3 Mar 92") "A "
       (:TERM NIL "dynamic variable") " is " (:TERM NIL "unbound")
       " unless and until explicitly assigned a value, except for those variables whose initial value is defined in this specification or by an "
       (:TERM NIL "implementation") ". " :PAR
       (:COMMENT NIL "% Pretty much said above."
        " \\term{Bindings} of \\term{dynamic variables} are found in the \\term{dynamic environment}"
        " or the \\term{global environment}.")
       :PAR)
      :PAR
      (:SUBSUBSUBSUBSECTION
       (:TITLE ("Constant Variables") :TAGS (:CONSTANT-VARS)) " " :PAR
       (:COMMENT NIL "% 1.2.5 6" "% 5.1.2 6") "Certain variables, called "
       (:TERM NIL "constant variables")
       ", are reserved as “named constants.” The consequences are undefined if an attempt is made to assign a value to, or create a "
       (:TERM NIL "binding") " for a " (:TERM NIL "constant variable")
       ", except that a `compatible' redefinition of a "
       (:TERM NIL "constant variable") " using " (:MACREF NIL "defconstant")
       " is permitted; see the " (:TERM NIL "macro") " "
       (:MACREF NIL "defconstant") ". " :PAR (:TERM NIL "Keywords") ", "
       (:TERM NIL "symbols") " defined by " (:RM NIL " Common Lisp") " or the "
       (:TERM NIL "implementation") " as constant (such as " (:MISC NIL "nil")
       ", " (:MISC NIL "t") ", and " (:CONREF NIL "pi") "), and "
       (:TERM NIL "symbols") " declared as constant using "
       (:MACREF NIL "defconstant") " are " (:TERM NIL "constant variables")
       ". " :PAR)
      :PAR
      (:SUBSUBSUBSUBSECTION
       (:TITLE ("Symbols Naming Both Lexical and Dynamic Variables"))
       "The same " (:TERM NIL "symbol") " can name both a "
       (:TERM NIL "lexical variable") " and a " (:TERM NIL "dynamic variable")
       ", but never in the same " (:TERM NIL "lexical environment") ". " :PAR
       "In the following example, the " (:TERM NIL "symbol") " " (:TT NIL "x")
       " is used, at different times, as the " (:TERM NIL "name") " of a "
       (:TERM NIL "lexical variable") " and as the " (:TERM NIL "name")
       " of a " (:TERM NIL "dynamic variable") ". " :PAR
       (:CODE NIL " (let ((x 1))            ;Binds a special variable X
   (declare (special x))
   (let ((x 2))          ;Binds a lexical variable X
     (+ x                ;Reads a lexical variable X
        (locally (declare (special x))
                 x))))   ;Reads a special variable X
→ 3
")
       " " :PAR)
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Conses as Forms")) "A " (:TERM NIL "cons")
      " that is used as a " (:TERM NIL "form") " is called a "
      (:TERM NIL "compound form") ". " :PAR "If the " (:TERM NIL "car")
      " of that " (:TERM NIL "compound form") " is a " (:TERM NIL "symbol")
      ", that " (:TERM NIL "symbol") " is the " (:TERM NIL "name") " of an "
      (:TERM NIL "operator") ", and the " (:TERM NIL "form") " is either a "
      (:TERM NIL "special form") ", a " (:TERM NIL "macro form") ", or a "
      (:TERM NIL "function form") ", depending on the " (:TERM NIL "function")
      " " (:TERM NIL "binding") " of the " (:TERM NIL "operator")
      " in the current " (:TERM NIL "lexical environment") ". If the "
      (:TERM NIL "operator") " is neither a " (:TERM NIL "special operator")
      " nor a " (:TERM NIL "macro name") ", it is assumed to be a "
      (:TERM NIL "function name")
      " (even if there is no definition for such a " (:TERM NIL "function")
      "). " :PAR "If the " (:TERM NIL "car") " of the "
      (:TERM NIL "compound form") " is not a " (:TERM NIL "symbol")
      ", then that " (:TERM NIL "car") " must be a "
      (:TERM NIL "lambda expression") ", in which case the "
      (:TERM NIL "compound form") " is a " (:TERM NIL "lambda form") ". " :PAR
      "How a " (:TERM NIL "compound form")
      " is processed depends on whether it is classified as a "
      (:TERM NIL "special form") ", a " (:TERM NIL "macro form") ", a "
      (:TERM NIL "function form") ", or a " (:TERM NIL "lambda form") ". " :PAR
      (:SUBSUBSUBSUBSECTION (:TITLE ("Special Forms")) "A "
       (:TERM NIL "special form") " is a " (:TERM NIL "form")
       " with special syntax, special evaluation rules, or both, possibly manipulating the evaluation environment, control flow, or both. "
       (:COMMENT NIL " When the operator names a \\term{special form},"
        " the operation is performed using special purpose code "
        " in the current \\term{lexical environment} and \\term{dynamic environments}."
        "% Simplified for Sandra:")
       "A " (:TERM NIL "special operator") " has access to the current "
       (:TERM NIL "lexical environment") " and the current "
       (:TERM NIL "dynamic environment") ". Each "
       (:TERM NIL "special operator") " defines the manner in which its "
       (:TERM NIL "subexpressions") " are treated—which are "
       (:TERM NIL "forms") ", which are special syntax, " (:I NIL "etc.") ". "
       :PAR "Some " (:TERM NIL "special operators")
       " create new lexical or dynamic " (:TERM NIL "environments")
       " for use during the " (:TERM NIL "evaluation") " of "
       (:TERM NIL "subforms") " of the " (:TERM NIL "special form")
       ". For example, " (:SPECREF NIL "block") " creates a new "
       (:TERM NIL "lexical environment")
       " that is the same as the one in force at the point of evaluation of the "
       (:SPECREF NIL "block") " " (:TERM NIL "form") " with the addition of a "
       (:TERM NIL "binding") " of the " (:SPECREF NIL "block") " name to an "
       (:TERM NIL "exit point") " from the " (:SPECREF NIL "block") ". " :PAR
       (:COMMENT NIL
        "Moon observes that this is no different than for any other form:"
        " Generally, \\term{special forms} will return normally, \\term{yielding}"
        " one or more values, but some \\term{special forms} may cause a non-local exit.")
       :PAR "The set of " (:TERM NIL "special operator") " "
       (:TERM NIL "names") " is fixed in " (:RM NIL " Common Lisp")
       "; no way is provided for the user to define a "
       (:TERM NIL "special operator") ". " (:NEXTFIGURE (:CAPS T))
       " lists all of the " (:RM NIL " Common Lisp") " " (:TERM NIL "symbols")
       " that have definitions as " (:TERM NIL "special operators") ". " :PAR
       " "
       (:COMMENT NIL "% 5.1.3 2" "% 7.0.0 5" "% 7.7.0 1" "% 7.8.3 3"
        "% 7.8.3 5" "% 7.8.5 3" "% 7.10.0 1")
       (:ISSUE NIL "COMPILER-LET-CONFUSION:ELIMINATE") " "
       (:ISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
       (:ISSUE NIL "LOAD-TIME-EVAL:R**2-NEW-SPECIAL-FORM") " "
       (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
       (:TABLE
        (:NAME ("Common Lisp Special Operators") :TAGS (:CL-SPECIAL-OPS))
        (:ROW NIL (:CELL NIL (:SPECREF NIL " block"))
         (:CELL NIL (:SPECREF NIL "let*"))
         (:CELL NIL (:SPECREF NIL "return-from")))
        (:ROW NIL (:CELL NIL (:SPECREF NIL " catch"))
         (:CELL NIL (:SPECREF NIL "load-time-value"))
         (:CELL NIL (:SPECREF NIL "setq")))
        (:ROW NIL (:CELL NIL (:SPECREF NIL " eval-when"))
         (:CELL NIL (:SPECREF NIL "locally"))
         (:CELL NIL (:SPECREF NIL "symbol-macrolet")))
        (:ROW NIL (:CELL NIL (:SPECREF NIL " flet"))
         (:CELL NIL (:SPECREF NIL "macrolet"))
         (:CELL NIL (:SPECREF NIL "tagbody")))
        (:ROW NIL (:CELL NIL (:SPECREF NIL " function"))
         (:CELL NIL (:SPECREF NIL "multiple-value-call"))
         (:CELL NIL (:SPECREF NIL "the")))
        (:ROW NIL (:CELL NIL (:SPECREF NIL " go"))
         (:CELL NIL (:SPECREF NIL "multiple-value-prog1"))
         (:CELL NIL (:SPECREF NIL "throw")))
        (:ROW NIL (:CELL NIL (:SPECREF NIL " if"))
         (:CELL NIL (:SPECREF NIL "progn"))
         (:CELL NIL (:SPECREF NIL "unwind-protect")))
        (:ROW NIL (:CELL NIL (:SPECREF NIL " labels"))
         (:CELL NIL (:SPECREF NIL "progv")) (:CELL NIL))
        (:ROW NIL (:CELL NIL (:SPECREF NIL " let"))
         (:CELL NIL (:SPECREF NIL "quote")) (:CELL NIL)))
       " "
       (:COMMENT NIL "Removed COMPILER-LET -kmp 3-Jan-91"
        "Removed WITH-ADDED-METHODS -kmp 7-Jan-91"
        "Removed DECLARE per Moon's comments. -kmp 10-Mar-91"
        "Added LOAD-TIME-VALUE -kmp 26-May-91"
        "Added LOCALLY per Barrett comments. -kmp 13-Oct-91")
       (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
       (:ENDISSUE NIL "LOAD-TIME-EVAL:R**2-NEW-SPECIAL-FORM") " "
       (:ENDISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
       (:ENDISSUE NIL "COMPILER-LET-CONFUSION:ELIMINATE") " " :PAR
       (:COMMENT NIL "% 5.1.3 9"))
      :PAR
      (:SUBSUBSUBSUBSECTION (:TITLE ("Macro Forms")) "If the "
       (:TERM NIL "operator") " names a " (:TERM NIL "macro")
       ", its associated " (:TERM NIL "macro function")
       " is applied to the entire " (:TERM NIL "form")
       " and the result of that application is used in place of the original "
       (:TERM NIL "form") ". " :PAR "Specifically, a " (:TERM NIL "symbol")
       " names a " (:TERM NIL "macro") " in a given "
       (:TERM NIL "lexical environment") " if " (:FUNREF NIL "macro-function")
       " is " (:TERM NIL "true") " of the " (:TERM NIL "symbol") " and that "
       (:TERM NIL "environment") ". The " (:TERM NIL "function")
       " returned by " (:FUNREF NIL "macro-function") " is a "
       (:TERM NIL "function")
       " of two arguments, called the expansion function. The expansion function is invoked by calling the "
       (:TERM NIL "macroexpand hook")
       " with the expansion function as its first argument, the entire "
       (:TERM NIL "macro form") " as its second argument, "
       (:COMMENT NIL "   and the current \\term{lexical environment} "
        " %% KAB thinks this is a bogus distinction."
        " %       (or with the current compilation \\term{environment},"
        " %        if the \\term{form} is being processed by \\funref{compile-file})"
        "% Trying again... -kmp&kab 8-Feb-92")
       "and an " (:TERM NIL "environment object")
       " (corresponding to the current " (:TERM NIL "lexical environment")
       ") as its third argument. The " (:TERM NIL "macroexpand hook")
       ", in turn, calls the expansion function with the " (:TERM NIL "form")
       " as its first argument and the " (:TERM NIL "environment")
       " as its second argument. The " (:TERM NIL "value")
       " of the expansion function, which is passed through by the "
       (:TERM NIL "macroexpand hook") ", is a " (:TERM NIL "form") ". "
       (:COMMENT NIL " (\\funref{macroexpand}"
        " and \\funref{macroexpand-1} attach a second, \\term{generalized boolean} return value"
        " which is always \\term{true} in this context, and hence always ignored.)")
       "The returned " (:TERM NIL "form") " is " (:TERM NIL "evaluated")
       " in place of the original " (:TERM NIL "form") ". " :PAR
       (:ISSUE NIL "SELF-MODIFYING-CODE:FORBID")
       " The consequences are undefined if a " (:TERM NIL "macro function")
       " destructively modifies any part of its " (:TERM NIL "form")
       " argument. " (:ENDISSUE NIL "SELF-MODIFYING-CODE:FORBID") " " :PAR
       (:COMMENT NIL "% 8.0.0 6") "A " (:TERM NIL "macro name") " is not a "
       (:TERM NIL "function designator") ", and cannot be used as the "
       (:PARAM NIL "function") " argument to " (:TERM NIL "functions")
       " such as " (:FUNREF NIL "apply") ", " (:FUNREF NIL "funcall") ", or "
       (:FUNREF NIL "map") ". " :PAR "An " (:TERM NIL "implementation")
       " is free to implement a " (:RM NIL " Common Lisp") " "
       (:TERM NIL "special operator") " as a " (:TERM NIL "macro") ". An "
       (:TERM NIL "implementation") " is free to implement any "
       (:TERM NIL "macro") " " (:TERM NIL "operator") " as a "
       (:TERM NIL "special operator")
       ", but only if an equivalent definition of the " (:TERM NIL "macro")
       " is also provided. "
       (:COMMENT NIL
        " I don't think this adds anything to the above, and it's more confusing."
        " So I commented it out.  --sjl 3 Mar 92" " %% 7.1.1 23"
        " A \\clisp\\ \\term{symbol} may name both a \\term{special operator} "
        " and a \\term{macro}," " %I added this: -kmp -kmp 12-Mar-91"
        " but in that case the definitions must be semantically equivalent.")
       :PAR (:NEXTFIGURE (:CAPS T)) " lists some " (:TERM NIL "defined names")
       " that are applicable to " (:TERM NIL "macros") ". " :PAR
       (:TABLE (:NAME ("Defined names applicable to macros"))
        (:ROW NIL (:CELL NIL (:MACREF NIL " *macroexpand-hook*"))
         (:CELL NIL (:MACREF NIL "macro-function"))
         (:CELL NIL (:MACREF NIL "macroexpand-1")))
        (:ROW NIL (:CELL NIL (:MACREF NIL " defmacro"))
         (:CELL NIL (:MACREF NIL "macroexpand"))
         (:CELL NIL (:SPECREF NIL "macrolet"))))
       " "
       (:COMMENT NIL
        "DEFINE-COMPILER-MACRO and COMPILER-MACRO-FUNCTION removed per Moon. -kmp 10-Mar-91")
       :PAR)
      :PAR
      (:SUBSUBSUBSUBSECTION (:TITLE ("Function Forms") :TAGS (:FUNCTION-FORMS))
       " " :PAR "If the " (:TERM NIL "operator") " is a " (:TERM NIL "symbol")
       " naming a " (:TERM NIL "function") ", the " (:TERM NIL "form")
       " represents a " (:TERM NIL "function form") ", and the "
       (:TERM NIL "cdr") " of the list contains the " (:TERM NIL "forms")
       " which when evaluated will supply the arguments passed to the "
       (:TERM NIL "function") ". " :PAR "When a " (:TERM NIL "function name")
       " is not defined, an error of " (:TERM NIL "type") " "
       (:TYPEREF NIL "undefined-function")
       " should be signaled at run time; see "
       (:SECREF NIL :SEMANTIC-CONSTRAINTS) ". " :PAR "A "
       (:TERM NIL "function form") " is evaluated as follows: " :PAR "The "
       (:TERM NIL "subforms") " in the " (:TERM NIL "cdr") " of the original "
       (:TERM NIL "form")
       " are evaluated in left-to-right order in the current lexical and dynamic "
       (:TERM NIL "environments") ". The " (:TERM NIL "primary value")
       " of each such " (:TERM NIL "evaluation") " becomes an "
       (:TERM NIL "argument") " to the named " (:TERM NIL "function") "; "
       (:COMMENT NIL
        " removed inappropriate reference to Lambda List section.  --sjl 3 Mar 92")
       "any additional " (:TERM NIL "values") " returned by the "
       (:TERM NIL "subforms") " are discarded. " :PAR "The "
       (:TERM NIL "functional value") " of the " (:TERM NIL "operator")
       " is retrieved from the " (:TERM NIL "lexical environment")
       ", and that " (:TERM NIL "function")
       " is invoked with the indicated arguments. " :PAR
       (:COMMENT NIL
        "%How the function treats its arguments, what bindings it establishes, etc. "
        "% does not belong here. -kmp,moon"
        " and a new \\term{lexical environment} is created that contains only"
        " the \\term{bindings} established by \\term{binding} each parameter"
        " name in the lambda list of the \\term{function} with the"
        " corresponding value in the evaluated arguments along with a binding of"
        " the name of the \\term{function} with the \\term{exit point} that"
        " returns from the \\term{function}. This is the lexical "
        " \\term{environment} used for evaluating the body of the \\term{function}.")
       :PAR (:ISSUE NIL "FUNCTION-CALL-EVALUATION-ORDER:MORE-UNSPECIFIED")
       " Although the order of " (:TERM NIL "evaluation") " of the "
       (:TERM NIL "argument") " " (:TERM NIL "subforms")
       " themselves is strictly left-to-right, it is not specified whether the definition of the "
       (:TERM NIL "operator") " in a " (:TERM NIL "function form")
       " is looked up before the " (:TERM NIL "evaluation") " of the "
       (:TERM NIL "argument") " " (:TERM NIL "subforms") ", after the "
       (:TERM NIL "evaluation") " of the " (:TERM NIL "argument") " "
       (:TERM NIL "subforms") ", or between the " (:TERM NIL "evaluation")
       " of any two " (:TERM NIL "argument") " " (:TERM NIL "subforms")
       " if there is more than one such " (:TERM NIL "argument") " "
       (:TERM NIL "subform")
       ". For example, the following might return 23 or 24. " :PAR
       (:CODE NIL " (defun foo (x) (+ x 3))
 (defun bar () (setf (symbol-function 'foo) #'(lambda (x) (+ x 4))))
 (foo (progn (bar) 20))
")
       " " (:ENDISSUE NIL "FUNCTION-CALL-EVALUATION-ORDER:MORE-UNSPECIFIED")
       " " :PAR "A " (:TERM NIL "binding") " for a "
       (:TERM NIL "function name") " can be " (:TERM NIL "established")
       " in one of several ways. A " (:TERM NIL "binding") " for a "
       (:TERM NIL "function name") " in the " (:TERM NIL "global environment")
       " can be " (:TERM NIL "established") " by " (:MACREF NIL "defun") ", "
       (:MACREF NIL "setf") " of " (:MISC NIL "fdefinition") ", "
       (:COMMENT NIL " added symbol-function --sjl 3 Mar 92")
       (:MACREF NIL "setf") " of " (:MISC NIL "symbol-function") ", "
       (:COMMENT NIL "% KAB: Doesn't belong here." "\\macref{defmacro},"
        "\\SETFof{macro-function},")
       (:FUNREF NIL "ensure-generic-function") ", " (:MACREF NIL "defmethod")
       " (implicitly, due to " (:FUNREF NIL "ensure-generic-function") "), or "
       (:MACREF NIL "defgeneric") ". A " (:TERM NIL "binding") " for a "
       (:TERM NIL "function name") " in the " (:TERM NIL "lexical environment")
       " can be " (:TERM NIL "established") " by " (:SPECREF NIL "flet") " or "
       (:SPECREF NIL "labels") ". " (:ISSUE NIL "WITH-ADDED-METHODS:DELETE")
       " " (:COMMENT NIL "\\specref{with-added-methods},")
       (:ENDISSUE NIL "WITH-ADDED-METHODS:DELETE")
       (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
       (:COMMENT NIL "  \\specref{generic-flet}," " or"
        "  \\specref{generic-labels}.")
       (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " " :PAR
       (:COMMENT NIL
        "%Moon thinks this is redundant, so asked that it be deleted. -kmp 11-Mar-91"
        " If a \\term{symbol} that names a \\term{function} appears"
        " as the first element of a function call \\term{form}, then it refers"
        " to the definition established by the innermost" "  \\specref{flet},"
        "  \\specref{labels}," " \\issue{WITH-ADDED-METHODS:DELETE}"
        " %\\specref{with-added-methods},"
        " \\endissue{WITH-ADDED-METHODS:DELETE}%" "  \\specref{generic-flet},"
        " or" "  \\specref{generic-labels}"
        " that textually contains the reference, or to the global definition (if any) if there"
        " is no such containing \\term{form}.  As noted earlier, this use"
        " of \\term{symbols} to name \\term{functions} is"
        " independent of their use in naming dynamic and lexical variables.")
       :PAR (:NEXTFIGURE (:CAPS T)) " lists some " (:TERM NIL "defined names")
       " that are applicable to " (:TERM NIL "functions") ". " :PAR
       (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
       (:ISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
       (:TABLE (:NAME ("Some function-related defined names"))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " apply"))
         (:CELL NIL (:FUNREF NIL "fdefinition"))
         (:CELL NIL (:FUNREF NIL "mapcan")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " call-arguments-limit"))
         (:CELL NIL (:FUNREF NIL "flet")) (:CELL NIL (:FUNREF NIL "mapcar")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " complement"))
         (:CELL NIL (:FUNREF NIL "fmakunbound"))
         (:CELL NIL (:FUNREF NIL "mapcon")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " constantly"))
         (:CELL NIL (:FUNREF NIL "funcall")) (:CELL NIL (:FUNREF NIL "mapl")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " defgeneric"))
         (:CELL NIL (:FUNREF NIL "function"))
         (:CELL NIL (:FUNREF NIL "maplist")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " defmethod"))
         (:CELL NIL (:FUNREF NIL "functionp"))
         (:CELL NIL (:FUNREF NIL "multiple-value-call")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " defun"))
         (:CELL NIL (:FUNREF NIL "labels")) (:CELL NIL (:FUNREF NIL "reduce")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " fboundp"))
         (:CELL NIL (:FUNREF NIL "map"))
         (:CELL NIL (:FUNREF NIL "symbol-function"))))
       " "
       (:COMMENT NIL "Removed GENERIC-FLET, GENERIC-LABELS. -kmp 7-Feb-92"
        "Removed WITH-ADDED-METHODS -kmp 7-Jan-91"
        "Added MAPC, MAPCAR, MAPCAN, MAPLIST, MAPL, MAPCON, "
        " CONSTANTLY, COMPLEMENT, REDUCE, FDEFINITION."
        "Removed LAMBDA-LIST-KEYWORDS."
        "Not including all the things with :TEST, :TEST-NOT, :KEY arguments, though."
        "  -kmp 16-Oct-91")
       (:ENDISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
       (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " " :PAR)
      :PAR
      (:SUBSUBSUBSUBSECTION (:TITLE ("Lambda Forms") :TAGS (:LAMBDA-FORMS)) " "
       :PAR "A " (:TERM NIL "lambda form") " is similar to a "
       (:TERM NIL "function form") ", except that the "
       (:TERM NIL "function name") " is replaced by a "
       (:TERM NIL "lambda expression") ". " :PAR "A " (:TERM NIL "lambda form")
       " is equivalent to using " (:FUNREF NIL "funcall") " of a "
       (:TERM NIL "lexical closure") " of the " (:TERM NIL "lambda expression")
       " on the given " (:TERM NIL "arguments")
       ". (In practice, some compilers are more likely to produce inline code for a "
       (:TERM NIL "lambda form")
       " than for an arbitrary named function that has been declared "
       (:DECLREF NIL "inline")
       "; however, such a difference is not semantic.) " :PAR
       "For further information, see " (:SECREF NIL :LAMBDA-EXPRESSIONS) ". "
       :PAR)
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Self-Evaluating Objects"))
      (:ISSUE NIL "EVAL-OTHER:SELF-EVALUATE") " A " (:TERM NIL "form")
      " that is neither a " (:TERM NIL "symbol") " nor a " (:TERM NIL "cons")
      " is defined to be a " (:TERM NIL "self-evaluating object") ". "
      (:TERM NIL "Evaluating") " such an " (:TERM NIL "object") " "
      (:TERM NIL "yields") " the " (:TERM NIL "same") " " (:TERM NIL "object")
      " as a result. " (:ENDISSUE NIL "EVAL-OTHER:SELF-EVALUATE") " " :PAR
      "Certain specific " (:TERM NIL "symbols") " and " (:TERM NIL "conses")
      " might also happen to be “self-evaluating” but only as a special case of a more general set of rules for the "
      (:TERM NIL "evaluation") " of " (:TERM NIL "symbols") " and "
      (:TERM NIL "conses") "; such " (:TERM NIL "objects")
      " are not considered to be " (:TERM NIL "self-evaluating objects") ". "
      :PAR (:COMMENT NIL " added  --sjl 3 Mar 92")
      "The consequences are undefined if " (:TERM NIL "literal objects")
      " (including " (:TERM NIL "self-evaluating objects")
      ") are destructively modified. " :PAR
      (:SUBSUBSUBSUBSECTION (:TITLE ("Examples of Self-Evaluating Objects"))
       (:TERM NIL "Numbers") ", " (:TERM NIL "pathnames") ", and "
       (:TERM NIL "arrays") " are examples of "
       (:TERM NIL "self-evaluating objects") ". " :PAR
       (:CODE NIL " 3 → 3
 #c(2/3 5/8) → #C(2/3 5/8)
 #p\"S:[BILL]OTHELLO.TXT\" → #P\"S:[BILL]OTHELLO.TXT\"
 #(a b c) → #(A B C)
 \"fred smith\" → \"fred smith\"
")
       " " :PAR)
      :PAR)
     :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Lambda Expressions") :TAGS (:LAMBDA-EXPRESSIONS)) " "
    :PAR
    (:COMMENT NIL
     " I found the last paragraph of this section very confusing, so I"
     " reworded the first paragraph to make it unnecessary.  -- sjl 3 Mar 92")
    :PAR
    (:COMMENT NIL " In a \\term{lambda expression},"
     " the current lexical \\term{environment} is extended by adding the \\term{binding} of"
     " each \\term{parameter} in the \\term{lambda list} of the \\term{lambda expression}"
     " with the corresponding \\term{value} from the \\term{arguments}."
     " This is the \\term{lexical environment} used for evaluating the body"
     " of the \\term{lambda expression}.")
    :PAR "In a " (:TERM NIL "lambda expression")
    ", the body is evaluated in a lexical " (:TERM NIL "environment")
    " that is formed by adding the " (:TERM NIL "binding") " of each "
    (:TERM NIL "parameter") " in the " (:TERM NIL "lambda list")
    " with the corresponding " (:TERM NIL "value") " from the "
    (:TERM NIL "arguments") " to the current lexical "
    (:TERM NIL "environment") ". " :PAR "For further discussion of how "
    (:TERM NIL "bindings") " are " (:TERM NIL "established") " based on the "
    (:TERM NIL "lambda list") ", see " (:SECREF NIL :LAMBDA-LISTS) ". " :PAR
    "The body of a " (:TERM NIL "lambda expression") " is an "
    (:TERM NIL "implicit progn") "; the " (:TERM NIL "values")
    " it returns are returned by the " (:TERM NIL "lambda expression") ". "
    :PAR
    (:COMMENT NIL " When the \\term{function} returns,"
     " the \\term{lexical environment} that was in effect"
     " when the original \\term{form} was evaluated " " is re-established.")
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Closures and Lexical Binding")) "A "
    (:TERM NIL "lexical closure") " is a " (:TERM NIL "function")
    " that can refer to and alter the values of "
    (:TERM NIL "lexical bindings") " " (:TERM NIL "established") " by "
    (:TERM NIL "binding") " " (:TERM NIL "forms")
    " that textually include the function definition. " :PAR
    "Consider this code, where " (:TT NIL "x") " is not declared "
    (:DECLREF NIL "special") ": " :PAR
    (:CODE NIL " (defun two-funs (x)
   (list (function (lambda () x))
         (function (lambda (y) (setq x y)))))
 (setq funs (two-funs 6))
 (funcall (car funs)) → 6
 (funcall (cadr funs) 43) → 43
 (funcall (car funs)) → 43
")
    " " :PAR "The " (:SPECREF NIL "function") " " (:TERM NIL "special form")
    " coerces a " (:TERM NIL "lambda expression") " into a "
    (:TERM NIL "closure") " in which the " (:TERM NIL "lexical environment")
    " in effect when the " (:TERM NIL "special form")
    " is evaluated is captured along with the " (:TERM NIL "lambda expression")
    ". " :PAR "The function " (:TT NIL "two-funs") " returns a "
    (:TERM NIL "list") " of two " (:TERM NIL "functions")
    ", each of which refers to the " (:TERM NIL "binding") " of the variable "
    (:TT NIL "x") " created on entry to the function " (:TT NIL "two-funs")
    " when it was called. "
    (:COMMENT NIL "% For Moon." "with argument \\f{6}.")
    "This variable has the value " (:TT NIL "6") " initially, but "
    (:SPECREF NIL "setq") " can alter this " (:TERM NIL "binding") ". "
    (:COMMENT NIL " %Barrett finds the next sentence confusing." " %Moon, too."
     " The \\term{lexical closure} created for the first "
     " \\term{lambda expression} does not capture the value \\f{6} for \\f{x}"
     " when the \\term{closure} is created.  The second \\term{function} can be"
     " used to alter the variable binding (to \\f{43}, in the example), and"
     " this altered variable binding then becomes accessible to the first"
     " \\term{function}.")
    "The " (:TERM NIL "lexical closure") " created for the first "
    (:TERM NIL "lambda expression") " does not “snapshot” the "
    (:TERM NIL "value") " " (:TT NIL "6") " for " (:TT NIL "x") " when the "
    (:TERM NIL "closure") " is created; rather it captures the "
    (:TERM NIL "binding") " of " (:TT NIL "x") ". The second "
    (:TERM NIL "function") " can be used to alter the " (:TERM NIL "value")
    " in the same (captured) " (:TERM NIL "binding") " (to " (:TT NIL "43")
    ", in the example), and this altered variable binding then affects the value returned by the first "
    (:TERM NIL "function") ". " :PAR (:COMMENT NIL "% 7.1.1 6")
    "In situations where a " (:TERM NIL "closure") " of a "
    (:TERM NIL "lambda expression") " over the same set of "
    (:TERM NIL "bindings")
    " may be produced more than once, the various resulting "
    (:TERM NIL "closures") " may or may not be " (:TERM NIL "identical")
    ", at the discretion of the " (:TERM NIL "implementation")
    ". That is, two " (:TERM NIL "functions")
    " that are behaviorally indistinguishable might or might not be "
    (:TERM NIL "identical") ". Two " (:TERM NIL "functions")
    " that are behaviorally distinguishable are " (:TERM NIL "distinct")
    ". For example: " :PAR
    (:CODE NIL " (let ((x 5) (funs '()))
   (dotimes (j 10)                          
     (push #'(lambda (z)                        
               (if (null z) (setq x 0) (+ x z)))
           funs))
   funs)
")
    " The result of the above " (:TERM NIL "form") " is a " (:TERM NIL "list")
    " of ten " (:TERM NIL "closures") ". Each requires only the "
    (:TERM NIL "binding") " of " (:TT NIL "x") ". It is the same "
    (:TERM NIL "binding") " in each case, but the ten " (:TERM NIL "closure")
    " " (:TERM NIL "objects") " might or might not be " (:TERM NIL "identical")
    ". On the other hand, the result of the " (:TERM NIL "form") " " :PAR
    (:CODE NIL " (let ((funs '()))     
   (dotimes (j 10)
     (let ((x 5))
       (push (function (lambda (z)
                        (if (null z) (setq x 0) (+ x z))))
             funs)))
  funs)
")
    " is also a " (:TERM NIL "list") " of ten " (:TERM NIL "closures")
    ". However, in this case no two of the " (:TERM NIL "closure") " "
    (:TERM NIL "objects") " can be " (:TERM NIL "identical") " because each "
    (:TERM NIL "closure") " is closed over a distinct " (:TERM NIL "binding")
    " of " (:TT NIL "x") ", and these " (:TERM NIL "bindings")
    " can be behaviorally distinguished because of the use of "
    (:SPECREF NIL "setq") ". " :PAR
    (:COMMENT NIL "% 7.1.1 7                        ") "The result of the "
    (:TERM NIL "form") " " :PAR
    (:CODE NIL " (let ((funs '()))
   (dotimes (j 10)
     (let ((x 5))
       (push (function (lambda (z) (+ x z)))
            funs)))
   funs)
")
    " is a " (:TERM NIL "list") " of ten " (:TERM NIL "closure") " "
    (:TERM NIL "objects") " that might or might not be "
    (:TERM NIL "identical") ". A different " (:TERM NIL "binding") " of "
    (:TT NIL "x") " is involved for each " (:TERM NIL "closure") ", but the "
    (:TERM NIL "bindings")
    " cannot be distinguished because their values are the " (:TERM NIL "same")
    " and immutable (there being no occurrence of " (:SPECREF NIL "setq")
    " on " (:TT NIL "x") "). A compiler could internally transform the "
    (:TERM NIL "form") " to " :PAR
    (:CODE NIL " (let ((funs '()))
   (dotimes (j 10)
     (push (function (lambda (z) (+ 5 z)))
           funs))
  funs)
")
    " where the " (:TERM NIL "closures") " may be " (:TERM NIL "identical")
    ". "
    (:COMMENT NIL
     "% Moon thought this was redundant and distracting. -kmp 8-Feb-92"
     " In some \\term{implementations},"
     " two distinct evaluations of the same \\specref{function} \\term{form} might "
     " produce \\term{identical} \\term{closures} if they must be behaviorally"
     " identical with respect to invocation.")
    :PAR (:COMMENT NIL "% 7.1.1 9") "It is possible that a "
    (:TERM NIL "closure")
    " does not close over any variable bindings. In the code fragment " :PAR
    (:CODE NIL " (mapcar (function (lambda (x) (+ x 2))) y)
")
    " the function " (:TT NIL "(lambda (x) (+ x 2))")
    " contains no references to any outside object. In this case, the same "
    (:TERM NIL "closure") " might be returned for all evaluations of the "
    (:SPECREF NIL "function") " " (:TERM NIL "form") ". " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Shadowing") :TAGS (:SHADOWING)) " "
    (:COMMENT NIL "% 5.1.3 10" "% 3.0.0 13"
     " If two \\term{forms} that establish lexical entities with the same"
     " \\term{name} are textually nested, then references within the inner"
     " \\term{form} refer to the entity established by the inner one; the"
     " inner one shadows the outer one.  Outside the inner \\term{form} but"
     " inside the outer one, references refer to the entity established by"
     " the outer \\term{form}.  For example:" "% Rewritten for Sandra:")
    :PAR "If two " (:TERM NIL "forms") " that " (:TERM NIL "establish") " "
    (:TERM NIL "lexical bindings") " with the same " (:TERM NIL "name") " "
    (:MATH NIL (:MI NIL "N")) " are textually nested, then references to "
    (:MATH NIL (:MI NIL "N")) " within the inner " (:TERM NIL "form")
    " refer to the " (:TERM NIL "binding") " established by the inner "
    (:TERM NIL "form") "; the inner " (:TERM NIL "binding") " for "
    (:MATH NIL (:MI NIL "N")) " " (:NEWTERM (:IDX "shadow") "shadows")
    " the outer " (:TERM NIL "binding") " for " (:MATH NIL (:MI NIL "N"))
    ". Outside the inner " (:TERM NIL "form")
    " but inside the outer one, references to " (:MATH NIL (:MI NIL "N"))
    " refer to the " (:TERM NIL "binding") " established by the outer "
    (:TERM NIL "form") ". For example: " :PAR
    (:COMMENT NIL
     "!!! Barrett thinks this doesn't explain, and that we should discuss,"
     "    (let ((x ...)) (let ((x ...)) (declare (special x)) ...))")
    :PAR
    (:CODE NIL " (defun test (x z)
   (let ((z (* x 2)))
     (print z))
   z)
")
    " The " (:TERM NIL "binding") " of the variable " (:TT NIL "z") " by "
    (:SPECREF NIL "let") " shadows the " (:TERM NIL "parameter")
    " binding for the function " (:TT NIL "test")
    ". The reference to the variable " (:TT NIL "z") " in the "
    (:FUNREF NIL "print") " " (:TERM NIL "form") " refers to the "
    (:SPECREF NIL "let") " binding. The reference to " (:TT NIL "z")
    " at the end of the function " (:TT NIL "test") " refers to the "
    (:TERM NIL "parameter") " named " (:TT NIL "z") ". " :PAR
    (:COMMENT NIL
     "!!! What to do with this use of \"construct\"? -kmp 3-Sep-91"
     "% 3.0.0 26")
    "Constructs that are lexically scoped act as if new names were generated for each "
    (:TERM NIL "object")
    " on each execution. Therefore, dynamic shadowing cannot occur. For example: "
    :PAR
    (:CODE NIL " (defun contorted-example (f g x)
   (if (= x 0)
       (funcall f)
       (block here
          (+ 5 (contorted-example g
                                  #'(lambda () (return-from here 4))
                                  (- x 1))))))
")
    " Consider the call " (:TT NIL "(contorted-example nil nil 2)")
    ". This produces " (:TT NIL "4")
    ". During the course of execution, there are three calls to "
    (:TT NIL "contorted-example") ", interleaved with two blocks: " :PAR
    (:CODE NIL " (contorted-example nil nil 2)
   (block here"
     (:SUB NIL "1") " ...)
     (contorted-example nil #'(lambda () (return-from here"
     (:SUB NIL "1") " 4)) 1)
       (block here"
     (:SUB NIL "2") " ...)
         (contorted-example #'(lambda () (return-from here"
     (:SUB NIL "1") " 4))
                            #'(lambda () (return-from here"
     (:SUB NIL "2") " 4))
                            0)
             (funcall f)
                    where f → #'(lambda () (return-from here"
     (:SUB NIL "1") " 4))
                 (return-from here"
     (:SUB NIL "1") " 4)
")
    " At the time the " (:TT NIL "funcall") " is executed there are two "
    (:SPECREF NIL "block") " " (:TERM NIL "exit points")
    " outstanding, each apparently named " (:TT NIL "here") ". The "
    (:SPECREF NIL "return-from") " " (:TERM NIL "form")
    " executed as a result of the " (:TT NIL "funcall")
    " operation refers to the outer outstanding " (:TERM NIL "exit point")
    " (here" (:SUB NIL "1") "), not the inner one (here" (:SUB NIL "2")
    "). It refers to that " (:TERM NIL "exit point")
    " textually visible at the point of execution of "
    (:SPECREF NIL "function") " (here abbreviated by the " (:TT NIL "#'")
    " syntax) that resulted in creation of the " (:TERM NIL "function") " "
    (:TERM NIL "object") " actually invoked by " (:FUNREF NIL "funcall") ". "
    :PAR (:COMMENT NIL "% 3.0.0 27")
    "If, in this example, one were to change the " (:TT NIL "(funcall f)")
    " to " (:TT NIL "(funcall g)") ", then the value of the call "
    (:TT NIL "(contorted-example nil nil 2)") " would be " (:TT NIL "9")
    ". The value would change because " (:FUNREF NIL "funcall")
    " would cause the execution of "
    (:TT NIL "(return-from here" (:SUB NIL "2") " 4)")
    ", thereby causing a return from the inner " (:TERM NIL "exit point")
    " (here" (:SUB NIL "2") "). When that occurs, the value " (:TT NIL "4")
    " is returned from the middle invocation of " (:TT NIL "contorted-example")
    ", " (:TT NIL "5") " is added to that to get " (:TT NIL "9")
    ", and that value is returned from the outer block and the outermost call to "
    (:TT NIL "contorted-example") ". The point is that the choice of "
    (:TERM NIL "exit point")
    " returned from has nothing to do with its being innermost or outermost; rather, it depends on the lexical environment that is packaged up with a "
    (:TERM NIL "lambda expression") " when " (:SPECREF NIL "function")
    " is executed. " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Extent")) (:TT NIL "Contorted-example")
    " works only because the " (:TERM NIL "function") " named by "
    (:TT NIL "f") " is invoked during the " (:TERM NIL "extent") " of the "
    (:TERM NIL "exit point")
    ". Once the flow of execution has left the block, the "
    (:TERM NIL "exit point") " is " (:TERM NIL "disestablished")
    ". For example: " :PAR
    (:CODE NIL " (defun invalid-example ()
   (let ((y (block here #'(lambda (z) (return-from here z)))))
     (if (numberp y) y (funcall y 5))))
")
    " One might expect the call " (:TT NIL "(invalid-example)") " to produce "
    (:TT NIL "5") " by the following incorrect reasoning: "
    (:SPECREF NIL "let") " binds " (:TT NIL "y") " to the value of "
    (:SPECREF NIL "block") "; this value is a " (:TERM NIL "function")
    " resulting from the " (:TERM NIL "lambda expression") ". Because "
    (:TT NIL "y") " is not a number, it is invoked on the value " (:TT NIL "5")
    ". The " (:SPECREF NIL "return-from")
    " should then return this value from the " (:TERM NIL "exit point")
    " named " (:TT NIL "here")
    ", thereby exiting from the block again and giving " (:TT NIL "y")
    " the value " (:TT NIL "5")
    " which, being a number, is then returned as the value of the call to "
    (:TT NIL "invalid-example") ". " :PAR (:COMMENT NIL "% 3.0.0 29")
    "The argument fails only because " (:TERM NIL "exit points") " have "
    (:TERM NIL "dynamic extent")
    ". The argument is correct up to the execution of "
    (:SPECREF NIL "return-from") ". The execution of "
    (:SPECREF NIL "return-from") " should signal an error of "
    (:TERM NIL "type") " " (:TYPEREF NIL "control-error")
    ", however, not because it cannot refer to the " (:TERM NIL "exit point")
    ", but because it does correctly refer to an " (:TERM NIL "exit point")
    " and that " (:TERM NIL "exit point") " has been "
    (:TERM NIL "disestablished") ". " :PAR
    (:COMMENT NIL "% 3.0.0 14" "% 3.0.0 16")
    "A reference by name to a dynamic " (:TERM NIL "exit point")
    " binding such as a " (:TERM NIL "catch tag")
    " refers to the most recently " (:TERM NIL "established") " "
    (:TERM NIL "binding") " of that name that has not been "
    (:TERM NIL "disestablished") ". For example: " :PAR
    (:CODE NIL " (defun fun1 (x)
   (catch 'trap (+ 3 (fun2 x))))
 (defun fun2 (y)
   (catch 'trap (* 5 (fun3 y))))
 (defun fun3 (z)
   (throw 'trap z))
")
    " Consider the call " (:TT NIL "(fun1 7)") ". The result is "
    (:TT NIL "10") ". At the time the " (:SPECREF NIL "throw")
    " is executed, there are two outstanding catchers with the name "
    (:TT NIL "trap") ": one established within procedure " (:TT NIL "fun1")
    ", and the other within procedure " (:TT NIL "fun2")
    ". The latter is the more recent, and so the value " (:TT NIL "7")
    " is returned from " (:SPECREF NIL "catch") " in " (:TT NIL "fun2")
    ". Viewed from within " (:TT NIL "fun3") ", the " (:SPECREF NIL "catch")
    " in " (:TT NIL "fun2") " shadows the one in " (:TT NIL "fun1") ". Had "
    (:TT NIL "fun2") " been defined as " :PAR
    (:CODE NIL " (defun fun2 (y)
   (catch 'snare (* 5 (fun3 y))))
")
    " then the two " (:TERM NIL "exit points") " would have different "
    (:TERM NIL "names") ", and therefore the one in " (:TT NIL "fun1")
    " would not be shadowed. The result would then have been " (:TT NIL "7")
    ". " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Return Values"))
    "Ordinarily the result of calling a " (:TERM NIL "function")
    " is a single " (:TERM NIL "object")
    ". Sometimes, however, it is convenient for a function to compute several "
    (:TERM NIL "objects") " and return them. " :PAR
    (:COMMENT NIL " slight rewording -- sjl 3 Mar 92")
    "In order to receive other than exactly one value from a "
    (:TERM NIL "form") ", one of several " (:TERM NIL "special forms") " or "
    (:TERM NIL "macros") " must be used to request those values. If a "
    (:TERM NIL "form") " produces " (:TERM NIL "multiple values")
    " which were not requested in this way, then the first value is given to the caller and all others are discarded; if the "
    (:TERM NIL "form") " produces zero values, then the caller receives "
    (:MISC NIL "nil") " as a value. " :PAR (:NEXTFIGURE (:CAPS T))
    " lists some " (:TERM NIL "operators") " for receiving "
    (:TERM NIL "multiple values") (:SUB NIL "2") ". These "
    (:TERM NIL "operators") " can be used to specify one or more "
    (:TERM NIL "forms") " to " (:TERM NIL "evaluate") " and where to put the "
    (:TERM NIL "values") " returned by those " (:TERM NIL "forms") ". " :PAR
    (:TABLE (:NAME ("Some operators applicable to receiving multiple values"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " multiple-value-bind"))
      (:CELL NIL (:FUNREF NIL "multiple-value-prog1"))
      (:CELL NIL (:FUNREF NIL "return-from")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " multiple-value-call"))
      (:CELL NIL (:FUNREF NIL "multiple-value-setq"))
      (:CELL NIL (:FUNREF NIL "throw")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " multiple-value-list"))
      (:CELL NIL (:FUNREF NIL "return")) (:CELL NIL)))
    " " :PAR "The " (:TERM NIL "function") " " (:FUNREF NIL "values")
    " can produce " (:TERM NIL "multiple values") (:SUB NIL "2") ". "
    (:TT NIL "(values)") " returns zero values; "
    (:TT NIL "(values " (:PARAM NIL "form") ")") " returns the "
    (:TERM NIL "primary value") " returned by " (:PARAM NIL "form") "; "
    (:TT NIL "(values " (:PARAM NIL "form1") " " (:PARAM NIL "form2") ")")
    " returns two values, the " (:TERM NIL "primary value") " of "
    (:PARAM NIL "form1") " and the " (:TERM NIL "primary value") " of "
    (:PARAM NIL "form2") "; and so on. " :PAR "See "
    (:CONREF NIL "multiple-values-limit") " and " (:FUNREF NIL "values-list")
    ". " :PAR
    (:COMMENT NIL
     "% This little piece of language analysis isn't useful to the spec."
     "% -kmp&kab 13-Oct-91" " "
     " \\term{Multiple values} can result from a \\term{form} under precisely these"
     " circumstances:" " \\beginlist"
     " \\itemitem{\\b{Evaluation and Application}}" " " " \\beginlist"
     " \\itemitem{\\funref{eval}}" " "
     " \\funref{eval} returns \\term{multiple values} if the form given it to"
     " evaluate produces \\term{multiple values}." " "
     " \\itemitem{\\funref{apply}, \\funref{funcall}, \\specref{multiple-value-call}}"
     " "
     " \\funref{apply}, \\funref{funcall}, and \\specref{multiple-value-call}"
     " can return \\term{multiple values} from the function applied or called."
     " \\endlist" " " " \\itemitem{\\b{Sequential Forms}}" " " " \\beginlist"
     " \\itemitem{\\specref{progn}}" " "
     " The special form \\specref{progn} can return \\term{multiple values} resulting"
     " from evaluation of the last \\term{subform}." " "
     " \\itemitem{\\term{implicit progn}}" " "
     " Other situations are referred to as an \\term{implicit progn}, in"
     " which several forms are evaluated and the results of all but the last"
     " form are discarded.  An \\term{implicit progn} returns multiple"
     " values if the last form does.  These situations include the body of a"
     " \\term{lambda expression}, including those constructed implicitly by"
     " \\macref{defmethod}, \\macref{defun}, \\macref{defmacro},"
     " \\issue{DEFINE-COMPILER-MACRO:X3J13-NOV89}"
     " \\macref{define-compiler-macro},"
     " \\endissue{DEFINE-COMPILER-MACRO:X3J13-NOV89}" " \\specref{flet},"
     " \\specref{macrolet}, \\specref{generic-flet}, \\specref{labels},"
     " \\specref{generic-labels}, \\macref{deftype}.  Also included are"
     " bodies of the \\specref{eval-when}, \\specref{progv},"
     " \\specref{let}, \\specref{let*}, \\macref{when},"
     " \\macref{unless}, \\specref{block},"
     " \\macref{multiple-value-bind}, and \\specref{catch} \\term{forms}, as well as"
     " clauses in such conditional \\term{forms} as \\macref{case},"
     " \\macref{typecase}, \\macref{ecase}, \\macref{etypecase},"
     " \\macref{ccase}, and \\macref{ctypecase}. If a body has no"
     " \\term{forms}, a single \\nil\\ is returned." " \\endlist" " "
     " \\itemitem{\\b{Conditional Forms}}" " " " \\beginlist"
     " \\itemitem{\\specref{if}}" " "
     " \\specref{if} can return \\term{multiple values} from whichever \\term{subform} is selected"
     " (the \\i{then} form or the \\i{else} form)." " "
     " \\itemitem{\\macref{and}, \\macref{or}}" " "
     " \\macref{and} and \\macref{or} can return \\term{multiple values} from the last \\term{subform}"
     " but not from \\term{subforms} other than the last." " "
     " \\itemitem{\\macref{cond}}" " "
     " \\macref{cond} can return \\term{multiple values} from the last \\term{subform} of"
     " the \\term{implicit progn} of the selected clause."
     " If, however, the clause selected is a singleton clause,"
     " then only a single value (the \\term{true} value returned by the predicate)"
     " is returned.  This is true even if the singleton clause is"
     " the last clause of the \\macref{cond}.  A final clause"
     " {\\tt (\\i{form})} is not equivalent to {\\tt (t \\i{form})}"
     " because the latter returns \\term{multiple values} from \\i{form}"
     " while the former does not; a final clause of {\\tt (\\i{form})}"
     " is instead equivalent to {\\tt (t (values \\i{forms}))}." " \\endlist"
     " " " \\itemitem{\\b{Returning from a Block}}" " " " \\beginlist"
     " \\itemitem{\\specref{block}}" " "
     " The \\specref{block} special form can return \\term{multiple values} "
     " from its last \\term{subform} when it exits normally.  "
     " If \\specref{return-from} (or \\macref{return}) is used to terminate"
     " the \\term{block} prematurely, then \\specref{return-from} can"
     " return \\term{multiple values} " " %from its \\term{subform} "
     " as the \\term{values} of the terminated \\term{block}."
     " Other \\term{operators} that implicitly create \\term{blocks},"
     " such as \\macref{do}, \\macref{dolist}, \\macref{dotimes}, "
     "         \\macref{prog}, and \\macref{prog*},"
     " also can return \\term{multiple values} specified by"
     " \\specref{return-from} (or \\macref{return})." " "
     " \\itemitem{\\macref{do}}" " "
     " \\macref{do} can return \\term{multiple values} from the last form of the"
     " exit clause, exactly as if the exit clause were a \\macref{cond}"
     " clause.  Similarly, \\macref{dolist} and \\macref{dotimes} can"
     " return \\term{multiple values} from the \\param{result-form} if that is"
     " executed.  \\macref{loop} can return \\term{multiple values} by using"
     " \\macref{return} and \\specref{return-from}.  These situations are"
     " all examples of implicit uses of \\specref{return-from}." " "
     " \\endlist" " " " \\itemitem{\\b{Throwing out of a Catch}}" " "
     " \\beginlist" " " " \\itemitem{\\specref{catch}}" " "
     " The \\specref{catch} \\term{form} returns \\term{multiple values} if"
     " the result form in a \\specref{throw} exiting from"
     " such a catch produces \\term{multiple values}." " \\endlist" " "
     " \\itemitem{\\b{Miscellaneous Situations}}" " " " \\beginlist" " "
     " \\itemitem{\\macref{multiple-value-prog1}}" " "
     " \\specref{multiple-value-prog1} can return \\term{multiple values} from its first"
     " \\term{subform}.  \\macref{prog1} always returns a single value." " "
     " \\itemitem{\\specref{unwind-protect}}" " "
     " \\specref{unwind-protect} returns \\term{multiple values} if the form it protects"
     " returns \\term{multiple values}." " " " \\itemitem{\\specref{the}}" " "
     " \\specref{the} returns \\term{multiple values} if the form it contains returns"
     " \\term{multiple values}." " \\endlist" " \\endlist" " "
     " Among special forms that never return \\term{multiple values} are"
     " \\specref{setq}, \\macref{multiple-value-setq}, \\macref{prog1}, and"
     " \\macref{prog2}." " " " In an ordinary function call,"
     " each argument form produces exactly one argument;  if such a form"
     " returns zero values, \\nil\\ is used for the argument, and if more than one"
     " value, all but the first are discarded."
     " Similarly, conditional \\term{forms} (such as \\specref{if} \\term{forms})"
     " that test the value of a form"
     " will use exactly one value, the first one, from that form and discard the rest;"
     " such \\term{forms} will use \\nil\\ as the test value if zero values are returned."
     "          "))
   :PAR)
  :PAR
  (:SECTION (:TITLE ("Compilation") :TAGS (:COMPILATION)) " "
   (:COMMENT NIL "% Compilation") :PAR
   (:COMMENT NIL " Rob MacLachlan wants some general discussion of inlining..."
    "   The most general statement of what I think that NOTINLINE does is:"
    "   NOTINLINE inhibits any special-casing of calls to the named function."
    "   NOTINLINE requires that the call be done as though there was a run-time"
    "   indirection through the SYMBOL-FUNCTION." "   " "   In particular:"
    "   NOTINLINE inhibits the (otherwise legal) compile-time resolution of"
    "   function calls to the same DEFUN or defined in the same file.  [This is"
    "   indeed explicitly allowed in the semantics of compilation.]"
    "   Implementations should also be encouraged to suppress any sort of inline"
    "   coding when a function (+, CAR, whatever) is declared NOTINLINE.  Although"
    "   users can't portably exploit this (due to the illegality of redefinition),"
    "   some facilities such as TRACE may benefit from this capability."
    "   Of course, it is possible that any of these actions are considered \"inline"
    "   expansion\".  If so, there should at the very least be a glossary entry for"
    "   inline expansion explaining this rather odd interpretation.")
   :PAR " " :PAR
   (:COMMENT NIL
    "The nature of the processing performed during compilation is discussed"
    "in \\secref\\CompilationSemantics.  Following \\secref\\CompilationSemantics\\ is"
    "a discussion of the behavior of \\funref{compile-file} and the"
    "interface between \\funref{compile-file} and \\funref{load}.")
   :PAR
   (:SUBSECTION
    (:TITLE ("Compiler Terminology") :TAGS
     (:COMPILATION-TERMS :CONSTANT-MODIFICATION))
    " " :PAR (:COMMENT NIL " Reference:  Issue CONSTANT-COMPILABLE-TYPES") :PAR
    "The following terminology is used in this section. " :PAR
    (:COMMENT NIL "% Checked to be consistent with glossary. -kmp 27-Jul-93")
    "The " (:NEWTERM NIL "compiler")
    " is a utility that translates code into an "
    (:TERM NIL "implementation-dependent")
    " form that might be represented or executed efficiently. "
    (:COMMENT NIL "% Checked to be consistent with glossary. -kmp 27-Jul-93")
    "The term " (:NEWTERM NIL "compiler") " refers to both of the "
    (:TERM NIL "functions") " " (:FUNREF NIL "compile") " and "
    (:FUNREF NIL "compile-file") ". " :PAR
    (:COMMENT NIL "% Checked to be consistent with glossary. -kmp 27-Jul-93"
     "In this section,")
    "The term " (:NEWTERM NIL "compiled code") " refers to "
    (:TERM NIL "objects") " representing compiled programs, such as "
    (:TERM NIL "objects") " constructed by " (:FUNREF NIL "compile") " or by "
    (:FUNREF NIL "load") " when " (:TERM NIL "loading") " a "
    (:TERM NIL "compiled file") ". " :PAR
    (:COMMENT NIL "% Checked to be consistent with glossary. -kmp 27-Jul-93")
    "The term " (:NEWTERM NIL "implicit compilation") " refers to "
    (:TERM NIL "compilation") " performed during " (:TERM NIL "evaluation")
    ". " :PAR " "
    (:COMMENT NIL "!!! This needs to be revisited. -kmp 12-Mar-91"
     "% Checked to be consistent with glossary. -kmp 27-Jul-93")
    "The term " (:NEWTERM NIL "literal object") " refers to a quoted "
    (:TERM NIL "object") " or a " (:TERM NIL "self-evaluating object")
    " or an " (:TERM NIL "object") " that is a substructure of such an "
    (:TERM NIL "object") ". "
    (:COMMENT NIL
     "% The following info is not in the glossary. -kmp 27-Jul-93")
    "A " (:TERM NIL "constant variable") " is not itself a "
    (:TERM NIL "literal object") ". "
    (:COMMENT NIL
     "% I believe this discussion belongs somewhere other than in this terminology"
     "% section.  I have added notes to the discussion of self-evaluating objects"
     "% and QUOTE.  --sjl 3 Mar 92" " \\issue{CONSTANT-MODIFICATION:DISALLOW}"
     " The consequences are undefined if \\term{literal objects} are destructively modified.  "
     " \\endissue{CONSTANT-MODIFICATION:DISALLOW}"
     "% \\editornote{KMP: I don't think this is really right.  I think that we said that"
     "%  it's ok to modify literal objects in code processed by COMPILE and EVAL. It's only"
     "%  literal objects in file compilation that are suspect, no?}"
     "% \\editornote{SJL: No, it's an error to modify any literal constant.}")
    :PAR
    (:COMMENT NIL
     "% \"constants\" => \"literal constants\" per Moon#4(first public review) -kmp 5-May-93"
     "% Checked to be consistent with glossary. -kmp 27-Jul-93"
     "% Note that there is more specific verbiage here than in Glossary."
     "% (The Glossary cross-references this section.)")
    "The term " (:NEWTERM NIL "coalesce") " is defined as follows. Suppose "
    (:TT NIL "A") " and " (:TT NIL "B") " are two "
    (:TERM NIL "literal constants") " in the " (:TERM NIL "source code")
    ", and that " (:TT NIL "A'") " and " (:TT NIL "B'")
    " are the corresponding " (:TERM NIL "objects") " in the "
    (:TERM NIL "compiled code") ". If " (:TT NIL "A'") " and " (:TT NIL "B'")
    " are " (:FUNREF NIL "eql") " but " (:TT NIL "A") " and " (:TT NIL "B")
    " are not " (:FUNREF NIL "eql") ", then it is said that " (:TT NIL "A")
    " and " (:TT NIL "B") " have been coalesced by the compiler. " :PAR
    (:COMMENT NIL "% Checked to be consistent with glossary. -kmp 27-Jul-93")
    "The term " (:NEWTERM NIL "minimal compilation")
    " refers to actions the compiler must take at " (:TERM NIL "compile time")
    ". These actions are specified in " (:SECREF NIL :COMPILATION-SEMANTICS)
    ". " :PAR
    (:COMMENT NIL "% Checked to be consistent with glossary. -kmp 27-Jul-93")
    "The verb " (:NEWTERM NIL "process") " refers to performing "
    (:TERM NIL "minimal compilation")
    ", determining the time of evaluation for a " (:TERM NIL "form")
    ", and possibly " (:TERM NIL "evaluating") " that " (:TERM NIL "form")
    " (if required). " :PAR
    (:COMMENT NIL "% Checked to be consistent with glossary. -kmp 27-Jul-93")
    "The term " (:NEWTERM NIL "further compilation") " refers to "
    (:TERM NIL "implementation-dependent") " compilation beyond "
    (:TERM NIL "minimal compilation") ". "
    (:COMMENT NIL
     "% The next sentence doesn't appear in the Glossary. -kmp 27-Jul-93")
    "That is, " (:TERM NIL "processing")
    " does not imply complete compilation. Block compilation and generation of machine-specific instructions are examples of further compilation. Further compilation is permitted to take place at "
    (:TERM NIL "run time") ". " :PAR
    (:COMMENT NIL "% Checked to be consistent with glossary. -kmp 27-Jul-93")
    "Four different " (:TERM NIL "environments")
    " relevant to compilation are distinguished: the "
    (:TERM NIL "startup environment") ", the "
    (:TERM NIL "compilation environment") ", the "
    (:TERM NIL "evaluation environment") ", and the "
    (:TERM NIL "run-time environment") ". " :PAR
    (:COMMENT NIL "% Checked to be consistent with glossary. -kmp 27-Jul-93")
    "The " (:NEWTERM NIL "startup environment") " is the "
    (:TERM NIL "environment") " of the " (:TERM NIL "Lisp image")
    " from which the " (:TERM NIL "compiler") " was invoked. " :PAR
    (:COMMENT NIL "% Checked to be consistent with glossary. -kmp 27-Jul-93"
     "% This text is, however, much more verbose/detailed.")
    "The " (:NEWTERM NIL "compilation environment")
    " is maintained by the compiler and is used to hold definitions and declarations to be used internally by the compiler. Only those parts of a definition needed for correct compilation are saved. The "
    (:TERM NIL "compilation environment") " is used as the "
    (:TERM NIL "environment") " " (:TERM NIL "argument")
    " to macro expanders called by the compiler. It is unspecified whether a definition available in the "
    (:TERM NIL "compilation environment") " can be used in an "
    (:TERM NIL "evaluation") " initiated in the "
    (:TERM NIL "startup environment") " or "
    (:TERM NIL "evaluation environment") ". " :PAR
    (:COMMENT NIL "% Checked to be consistent with glossary. -kmp 27-Jul-93")
    "The " (:NEWTERM NIL "evaluation environment") " is a "
    (:TERM NIL "run-time environment")
    " in which macro expanders and code specified by "
    (:SPECREF NIL "eval-when")
    " to be evaluated are evaluated. All evaluations initiated by the "
    (:TERM NIL "compiler") " take place in the "
    (:TERM NIL "evaluation environment") ". " :PAR
    (:COMMENT NIL "% Checked to be consistent with glossary. -kmp 27-Jul-93")
    "The " (:NEWTERM NIL "run-time environment") " is the "
    (:TERM NIL "environment")
    " in which the program being compiled will be executed. " :PAR
    (:COMMENT NIL
     "% This text is missing from, but not inconsistent with, the Glossary. -kmp 27-Jul-93")
    "The " (:TERM NIL "compilation environment") " inherits from the "
    (:TERM NIL "evaluation environment") ", and the "
    (:TERM NIL "compilation environment") " and "
    (:TERM NIL "evaluation environment") " might be " (:TERM NIL "identical")
    ". The " (:TERM NIL "evaluation environment") " inherits from the "
    (:TERM NIL "startup environment") ", and the "
    (:TERM NIL "startup environment") " and "
    (:TERM NIL "evaluation environment") " might be " (:TERM NIL "identical")
    ". " :PAR
    (:COMMENT NIL "% Checked to be consistent with glossary. -kmp 27-Jul-93")
    "The term " (:NEWTERM NIL "compile time")
    " refers to the duration of time that the compiler is processing "
    (:TERM NIL "source code") ". At " (:TERM NIL "compile time") ", only the "
    (:TERM NIL "compilation environment") " and the "
    (:TERM NIL "evaluation environment") " are available. " :PAR
    (:COMMENT NIL "% Checked to be consistent with glossary. -kmp 27-Jul-93")
    "The term " (:NEWTERM NIL "compile-time definition")
    " refers to a definition in the " (:TERM NIL "compilation environment")
    ". For example, when compiling a file, the definition of a function might be retained in the "
    (:TERM NIL "compilation environment") " if it is declared "
    (:DECLREF NIL "inline") ". This definition might not be available in the "
    (:TERM NIL "evaluation environment") ". " :PAR
    (:COMMENT NIL "% Checked to be consistent with glossary. -kmp 27-Jul-93")
    "The term " (:NEWTERM NIL "run time")
    " refers to the duration of time that the loader is loading compiled code or compiled code is being executed. "
    (:COMMENT NIL
     "% The following info is not in the glossary. -kmp 27-Jul-93")
    "At run time, only the " (:TERM NIL "run-time environment")
    " is available. " :PAR
    (:COMMENT NIL "% Checked to be consistent with glossary. -kmp 27-Jul-93")
    "The term " (:NEWTERM NIL "run-time definition")
    " refers to a definition in the " (:TERM NIL "run-time environment") ". "
    :PAR
    (:COMMENT NIL "% Checked to be consistent with glossary. -kmp 27-Jul-93")
    "The term " (:NEWTERM NIL "run-time compiler") " refers to the "
    (:TERM NIL "function") " " (:FUNREF NIL "compile") " or "
    (:TERM NIL "implicit compilation")
    ", for which the compilation and run-time " (:TERM NIL "environments")
    " are maintained in the same " (:TERM NIL "Lisp image") ". "
    (:COMMENT NIL
     "% The following info is not in the glossary. -kmp 27-Jul-93")
    "Note that when the " (:TERM NIL "run-time compiler") " is used, the "
    (:TERM NIL "run-time environment") " and "
    (:TERM NIL "startup environment") " are the same. " :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Compilation Semantics") :TAGS (:COMPILATION-SEMANTICS)) " " :PAR
    "Conceptually, compilation is a process that traverses code, performs certain kinds of syntactic and semantic analyses using information (such as proclamations and "
    (:TERM NIL "macro") " definitions) present in the "
    (:TERM NIL "compilation environment")
    ", and produces equivalent, possibly more efficient code. " :PAR
    (:ISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89") " " :PAR
    (:SUBSUBSECTION (:TITLE ("Compiler Macros") :TAGS (:COMPILER-MACROS)) " "
     :PAR "A " (:TERM NIL "compiler macro") " can be defined for a "
     (:TERM NIL "name") " that also names a " (:TERM NIL "function") " or "
     (:TERM NIL "macro") ". "
     (:COMMENT NIL
      "Given that we have to allow macros, it's too bad we can't just "
      "say \"any operator\" in the previous. Why exclude special forms? -Barrett 13-Oct-91"
      " Changed symbol => function name below; --sjl 3 Mar 92")
     "That is, it is possible for a " (:TERM NIL "function name")
     " to name both a " (:TERM NIL "function") " and a "
     (:TERM NIL "compiler macro") ". " :PAR "A " (:TERM NIL "function name")
     " names a " (:TERM NIL "compiler macro") " if "
     (:FUNREF NIL "compiler-macro-function") " is " (:TERM NIL "true")
     " of the " (:TERM NIL "function name") " in the "
     (:TERM NIL "lexical environment") " in which it appears. Creating a "
     (:TERM NIL "lexical binding") " for the " (:TERM NIL "function name")
     " not only creates a new local " (:TERM NIL "function") " or "
     (:TERM NIL "macro") " definition, but also " (:TERM NIL "shadows")
     (:SUB NIL "2") " the " (:TERM NIL "compiler macro") ". " :PAR "The "
     (:TERM NIL "function") " returned by "
     (:FUNREF NIL "compiler-macro-function") " is a " (:TERM NIL "function")
     " of two arguments, called the expansion function. To expand a "
     (:TERM NIL "compiler macro")
     ", the expansion function is invoked by calling the "
     (:TERM NIL "macroexpand hook")
     " with the expansion function as its first argument, the entire compiler macro "
     (:TERM NIL "form") " as its second argument, and the current compilation "
     (:TERM NIL "environment") " (or with the current lexical "
     (:TERM NIL "environment") ", if the " (:TERM NIL "form")
     " is being processed by something other than "
     (:FUNREF NIL "compile-file") ") as its third argument. The "
     (:TERM NIL "macroexpand hook")
     ", in turn, calls the expansion function with the " (:TERM NIL "form")
     " as its first argument and the " (:TERM NIL "environment")
     " as its second argument. The return value from the expansion function, which is passed through by the "
     (:TERM NIL "macroexpand hook") ", might either be the " (:TERM NIL "same")
     " " (:TERM NIL "form")
     ", or else a form that can, at the discretion of the " (:TERM NIL "code")
     " doing the expansion, be used in place of the original "
     (:TERM NIL "form") ". " :PAR
     (:TABLE (:NAME ("Defined names applicable to compiler macros"))
      (:ROW NIL (:CELL NIL (:MACREF NIL " *macroexpand-hook*"))
       (:CELL NIL (:MACREF NIL "compiler-macro-function"))
       (:CELL NIL (:MACREF NIL "define-compiler-macro"))))
     " " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Purpose of Compiler Macros"))
      "The purpose of the " (:TERM NIL "compiler macro")
      " facility is to permit selective source code transformations as optimization advice to the "
      (:TERM NIL "compiler") ". When a " (:TERM NIL "compound form")
      " is being processed (as by the compiler), if the "
      (:TERM NIL "operator") " names a " (:TERM NIL "compiler macro")
      " then the " (:TERM NIL "compiler macro function")
      " may be invoked on the form, and the resulting expansion recursively processed in preference to performing the usual processing on the original "
      (:TERM NIL "form") " according to its normal interpretation as a "
      (:TERM NIL "function form") " or " (:TERM NIL "macro form") ". " :PAR
      "A " (:TERM NIL "compiler macro function") ", like a "
      (:TERM NIL "macro function") ", is a " (:TERM NIL "function") " of two "
      (:TERM NIL "arguments") ": the entire call " (:TERM NIL "form")
      " and the " (:TERM NIL "environment") ". Unlike an ordinary "
      (:TERM NIL "macro function") ", a " (:TERM NIL "compiler macro function")
      " can decline to provide an expansion merely by returning a value that is the "
      (:TERM NIL "same") " as the original " (:TERM NIL "form")
      ". The consequences are undefined if a "
      (:TERM NIL "compiler macro function")
      " destructively modifies any part of its " (:TERM NIL "form")
      " argument. " :PAR "The " (:TERM NIL "form")
      " passed to the compiler macro function can either be a "
      (:TERM NIL "list") " whose " (:TERM NIL "car")
      " is the function name, or a " (:TERM NIL "list") " whose "
      (:TERM NIL "car") " is " (:FUNREF NIL "funcall") " and whose "
      (:TERM NIL "cadr") " is a list "
      (:TT NIL "(function " (:PARAM NIL "name") ")")
      "; note that this affects destructuring of the form argument by the "
      (:TERM NIL "compiler macro function") ". "
      (:MACREF NIL "define-compiler-macro")
      " arranges for destructuring of arguments to be performed correctly for both possible formats. "
      :PAR
      (:COMMENT NIL
       " Already explained in more detail in the previous section. -- sjl 3 Mar 92"
       " When a \\term{compiler macro function} is called as part of processing by the"
       " evaluator or compiler, it is invoked by calling the \\term{macroexpand hook}.")
      :PAR "When " (:FUNREF NIL "compile-file") " chooses to expand a "
      (:TERM NIL "top level form") " that is a " (:TERM NIL "compiler macro")
      " " (:TERM NIL "form") ", the expansion is also treated as a "
      (:TERM NIL "top level form") " for the purposes of "
      (:SPECREF NIL "eval-when") " processing; see "
      (:SECREF NIL :TOP-LEVEL-FORMS) ". "
      (:COMMENT NIL "% Superfluous. -kmp"
       "(just as would happen for the expansion of a \\term{macro form}).")
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Naming of Compiler Macros"))
      (:TERM NIL "Compiler macros") " may be defined for "
      (:TERM NIL "function names") " that name " (:TERM NIL "macros")
      " as well as " (:TERM NIL "functions") ". "
      (:COMMENT NIL
       "!!! Isn't this said elsewhere? Does it need to be repeated here? -kmp 1-Jun-91"
       " Yes, it's in the packages chapter.  --sjl 5 Mar 92"
       " (It is not permitted to define"
       " a \\term{compiler macro} for a \\term{name} that is an \\term{external symbol} of "
       " \\thepackage{common-lisp}.)")
      :PAR (:TERM NIL "Compiler macro")
      " definitions are strictly global. There is no provision for defining local "
      (:TERM NIL "compiler macros") " in the way that "
      (:SPECREF NIL "macrolet") " defines local " (:TERM NIL "macros")
      ". Lexical bindings of a function name shadow any compiler macro definition associated with the name as well as its global "
      (:TERM NIL "function") " or " (:TERM NIL "macro") " definition. " :PAR
      "Note that the presence of a compiler macro definition does not affect the values returned by "
      (:ISSUE NIL "SYNTACTIC-ENVIRONMENT-ACCESS:RETRACTED-MAR91") " "
      (:COMMENT NIL
       "by \\macref{function-information}, or other accessors [sic]")
      (:ENDISSUE NIL "SYNTACTIC-ENVIRONMENT-ACCESS:RETRACTED-MAR91")
      " functions that access " (:TERM NIL "function") " definitions ("
      (:I NIL "e.g.") ",  " (:FUNREF NIL "fboundp") ") or " (:TERM NIL "macro")
      " definitions (" (:I NIL "e.g.") ",  " (:FUNREF NIL "macroexpand")
      "). Compiler macros are global, and the function "
      (:FUNREF NIL "compiler-macro-function")
      " is sufficient to resolve their interaction with other lexical and global definitions. "
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("When Compiler Macros Are Used"))
      "The presence of a " (:TERM NIL "compiler macro") " definition for a "
      (:TERM NIL "function") " or " (:TERM NIL "macro")
      " indicates that it is desirable for the " (:TERM NIL "compiler")
      " to use the expansion of the " (:TERM NIL "compiler macro")
      " instead of the original " (:TERM NIL "function form") " or "
      (:TERM NIL "macro form")
      ". However, no language processor (compiler, evaluator, or other code walker) is ever required to actually invoke "
      (:TERM NIL "compiler macro functions")
      ", or to make use of the resulting expansion if it does invoke a "
      (:TERM NIL "compiler macro function") ". " :PAR "When the "
      (:TERM NIL "compiler") " encounters a " (:TERM NIL "form")
      " during processing that represents a call to a "
      (:TERM NIL "compiler macro") " " (:TERM NIL "name")
      " (that is not declared " (:DECLREF NIL "notinline") "), the "
      (:TERM NIL "compiler") " might expand the " (:TERM NIL "compiler macro")
      ", and might use the expansion in place of the original "
      (:TERM NIL "form") ". " :PAR "When " (:FUNREF NIL "eval")
      " encounters a " (:TERM NIL "form")
      " during processing that represents a call to a "
      (:TERM NIL "compiler macro") " " (:TERM NIL "name")
      " (that is not declared " (:DECLREF NIL "notinline") "), "
      (:FUNREF NIL "eval") " might expand the " (:TERM NIL "compiler macro")
      ", and might use the expansion in place of the original "
      (:TERM NIL "form") ". " :PAR "There are two situations in which a "
      (:TERM NIL "compiler macro")
      " definition must not be applied by any language processor: " :PAR
      (:LIST NIL
       (:ITEM NIL
        " The global function name binding associated with the compiler macro is shadowed by a lexical binding of the function name. "
        :PAR)
       (:ITEM NIL " The function name has been declared or proclaimed "
        (:DECLREF NIL "notinline")
        " and the call form appears within the scope of the declaration. "))
      " " :PAR "It is unspecified whether " (:TERM NIL "compiler macros")
      " are expanded or used in any other situations. " :PAR
      (:SUBSUBSUBSUBSECTION
       (:TITLE ("Notes about the Implementation of Compiler Macros"))
       "Although it is technically permissible, as described above, for "
       (:FUNREF NIL "eval") " to treat " (:TERM NIL "compiler macros")
       " in the same situations as " (:TERM NIL "compiler")
       " might, this is not necessarily a good idea in "
       (:TERM NIL "interpreted implementations") ". " :PAR
       (:TERM NIL "Compiler macros")
       " exist for the purpose of trading compile-time speed for run-time speed. Programmers who write "
       (:TERM NIL "compiler macros") " tend to assume that the "
       (:TERM NIL "compiler macros") " can take more time than normal "
       (:TERM NIL "functions") " and " (:TERM NIL "macros")
       " in order to produce code which is especially optimal for use at run time. Since "
       (:FUNREF NIL "eval") " in an " (:TERM NIL "interpreted implementation")
       " might perform semantic analysis of the same form multiple times, it might be inefficient in general for the "
       (:TERM NIL "implementation") " to choose to call "
       (:TERM NIL "compiler macros") " on every such " (:TERM NIL "evaluation")
       ". " :PAR
       "Nevertheless, the decision about what to do in these situations is left to each "
       (:TERM NIL "implementation") ". " :PAR)
      :PAR)
     :PAR)
    :PAR (:ENDISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89") " " :PAR
    (:SUBSUBSECTION
     (:TITLE ("Minimal Compilation") :TAGS (:MINIMAL-COMPILATION)) " " :PAR
     (:COMMENT NIL " Fixed major problems in this section."
      " See proposal COMPILED-FUNCTION-REQUIREMENTS:TIGHTEN, item (1)."
      " -- sjl 3 Mar 92")
     :PAR (:TERM NIL "Minimal compilation") " is defined as follows: " :PAR
     (:LIST NIL
      (:ITEM NIL " All " (:TERM NIL "compiler macro")
       (:IDXTERM NIL "compiler macro") " calls appearing in the "
       (:TERM NIL "source code")
       " being compiled are expanded, if at all, at compile time; they will not be expanded at run time. "
       (:ENDISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " " :PAR
       (:COMMENT NIL
        " I made some minor wording changes to this paragraph.  -- sjl 3 Mar 92"))
      (:ITEM NIL " All " (:TERM NIL "macro") (:IDXTERM NIL "macro") " and "
       (:TERM NIL "symbol macro") (:IDXTERM NIL "symbol macro")
       " calls appearing in the source code being compiled are expanded at compile time in such a way that they will not be expanded again at run time. "
       (:SPECREF NIL "macrolet") (:IDXREF NIL "macrolet") " and "
       (:SPECREF NIL "symbol-macrolet") (:IDXREF NIL "symbol-macrolet")
       " are effectively replaced by " (:TERM NIL "forms")
       " corresponding to their bodies in which calls to " (:TERM NIL "macros")
       " are replaced by their expansions. " :PAR
       (:COMMENT NIL
        " I made some minor wording changes to this paragraph.  -- sjl 3 Mar 92"))
      (:ITEM NIL " The first " (:TERM NIL "argument") " in a "
       (:SPECREF NIL "load-time-value") (:IDXREF NIL "load-time-value") " "
       (:TERM NIL "form") " in " (:TERM NIL "source code") " processed by "
       (:FUNREF NIL "compile") (:IDXREF NIL "compile") " is "
       (:TERM NIL "evaluated") " at " (:TERM NIL "compile time") "; in "
       (:TERM NIL "source code") " processed by " (:FUNREF NIL "compile-file")
       (:IDXREF NIL "compile-file") ", the compiler arranges for it to be "
       (:TERM NIL "evaluated") " at " (:TERM NIL "load time")
       ". In either case, the result of the " (:TERM NIL "evaluation")
       " is remembered and used later as the value of the "
       (:SPECREF NIL "load-time-value") " " (:TERM NIL "form") " at "
       (:TERM NIL "execution time") ". " :PAR
       (:COMMENT NIL
        " I think the previous paragraph was supposed to replace this one, not"
        " augment it.  It adds nothing but confusion.  -- sjl 3 Mar 92"
        " \\specref{load-time-value} forms in the source code will be evaluated"
        " at compile time when compiled by \\funref{compile} or at load time"
        " when compiled by \\funref{compile-file}, and the result of"
        " evaluation will be used as a constant at run time.")))
     " " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Semantic Constraints") :TAGS (:SEMANTIC-CONSTRAINTS)) " " :PAR
     (:COMMENT NIL
      "% Removed per Dalton #1 (first public review). -kmp 10-May-93"
      " % Fixed some garbled language in this section."
      " % See proposal COMPILE-ENVIRONMENT-CONSISTENCY:CLARIFY."
      " % -- sjl 3 Mar 92" " "
      " Conforming code must be structured so that its results and observable"
      " side effects are the same whether or not compilation takes place."
      " Additional constraints about the consistency of the compilation and"
      " run-time \\term{environments} imply additional semantic constraints on"
      " conforming programs.  Conforming programs obeying these constraints"
      " have the same behavior whether evaluated or compiled." " "
      " The following are the semantic constraints:" "% and replaced with:")
     :PAR "All " (:TERM NIL "conforming programs")
     " must obey the following constraints, which are designed to minimize the observable differences between compiled and interpreted programs: "
     :PAR
     (:LIST NIL
      (:ITEM NIL " Definitions of any referenced " (:TERM NIL "macros")
       " must be present in the " (:TERM NIL "compilation environment")
       ". Any " (:TERM NIL "form") " that is a " (:TERM NIL "list")
       " beginning with a " (:TERM NIL "symbol") " that does not name a "
       (:TERM NIL "special operator") " or a " (:TERM NIL "macro")
       " defined in the " (:TERM NIL "compilation environment")
       " is treated by the compiler as a function call. " :PAR
       (:COMMENT NIL " This garbled item also replaced.  -- sjl 3 Mar 92"
        "  \\itemitem{\\bull} Any binding of a \\term{variable} not declared"
        " \\declref{special} is a lexical binding."))
      (:ITEM NIL " " (:DECLREF NIL "Special") " proclamations for "
       (:TERM NIL "dynamic variables") " must be made in the "
       (:TERM NIL "compilation environment") ". Any " (:TERM NIL "binding")
       " for which there is no " (:DECLREF NIL "special")
       " declaration or proclamation in the "
       (:TERM NIL "compilation environment")
       " is treated by the compiler as a " (:TERM NIL "lexical binding") ". "
       :PAR (:COMMENT NIL " Minor rewording.  -- sjl 3 Mar 92."))
      (:ITEM NIL " The definition of a function that is defined and declared "
       (:DECLREF NIL "inline") " in the " (:TERM NIL "compilation environment")
       " must be the same at run time. " :PAR
       (:COMMENT NIL
        "% Barrett didn't like this.  The paragraph that follows is a negotiated rewrite to clarify."
        "% -kmp 13-Oct-91"
        "  \\itemitem{\\bull} Within a named function $F$, a recursive call to $F$"
        " refers to $F$, unless that function has been declared \\declref{notinline}.")
       :PAR)
      (:ITEM NIL " Within a " (:TERM NIL "function") " named "
       (:MATH NIL (:MI NIL "F"))
       ", the compiler may (but is not required to) assume that an apparent recursive call to a "
       (:TERM NIL "function") " named " (:MATH NIL (:MI NIL "F"))
       " refers to the same definition of " (:MATH NIL (:MI NIL "F"))
       ", unless that function has been declared " (:DECLREF NIL "notinline")
       ". The consequences of redefining such a recursively defined "
       (:TERM NIL "function") " " (:MATH NIL (:MI NIL "F"))
       " while it is executing are undefined. " :PAR)
      (:ITEM NIL
       " A call within a file to a named function that is defined in the same file refers to that function, unless that function has been declared "
       (:DECLREF NIL "notinline")
       ". The consequences are unspecified if functions are redefined individually at run time or multiply defined in the same file. "
       :PAR
       (:COMMENT NIL " I believe this item has been made unnecessary by issue"
        " LISP-SYMBOL-REDEFINITION.  -- sjl 3 Mar 92"
        " \\itemitem{\\bull} A call to a built-in Common Lisp function refers to"
        "that function.  Any built-in \\clisp\\ function might be proclaimed \\declref{inline}.")
       :PAR)
      (:ITEM NIL
       " The argument syntax and number of return values for all functions whose "
       (:DECLREF NIL "ftype")
       " is declared at compile time must remain the same at run time. " :PAR
       (:COMMENT NIL " Reference:  CLtL page 69"
        "\"same\" => \"similar\" per Moon"))
      (:ITEM NIL " " (:TERM NIL "Constant variables") " defined in the "
       (:TERM NIL "compilation environment") " must have a "
       (:TERM NIL "similar") " value at run time. A reference to "
       (:COMMENT NIL "the name of a constant") "a "
       (:TERM NIL "constant variable") " in " (:TERM NIL "source code")
       " is equivalent to a reference to "
       (:COMMENT NIL "an \\term{object} \\funref{eql} to") "a "
       (:TERM NIL "literal") " " (:TERM NIL "object") " that is the "
       (:TERM NIL "value") " of the " (:TERM NIL "constant variable") ". " :PAR
       (:COMMENT NIL
        " The following paragraph from issue COMPILE-ENVIRONMENT-CONSISTENCY"
        "    seems likely to change:"
        " No, we later voted down the proposal to change it. -- sjl 3 Mar 92"))
      (:ITEM NIL " Type definitions made with " (:MACREF NIL "deftype") " or "
       (:MACREF NIL "defstruct") " in the "
       (:TERM NIL "compilation environment")
       " must retain the same definition at run time. Classes defined by "
       (:MACREF NIL "defclass") " in the "
       (:TERM NIL "compilation environment")
       " must be defined at run time to have the same "
       (:TERM NIL "superclasses") " and same " (:TERM NIL "metaclass") ". "
       :PAR "This implies that " (:TERM NIL "subtype") "/"
       (:TERM NIL "supertype") " relationships of "
       (:TERM NIL "type specifiers") " must not change between "
       (:TERM NIL "compile time") " and " (:TERM NIL "run time") ". " :PAR
       (:COMMENT NIL " Ref:  CLtL page 153"))
      (:ITEM NIL " Type declarations present in the compilation "
       (:TERM NIL "environment")
       " must accurately describe the corresponding values at run time; otherwise, the consequences are undefined. It is permissible for an unknown "
       (:TERM NIL "type")
       " to appear in a declaration at compile time, though a warning might be signaled in such a case. "
       :PAR)
      (:ITEM NIL " Except in the situations explicitly listed above, a "
       (:TERM NIL "function") " defined in the "
       (:TERM NIL "evaluation environment")
       " is permitted to have a different definition or a different "
       (:TERM NIL "signature")
       " at run time, and the run-time definition prevails. " :PAR))
     " " :PAR (:TERM NIL "Conforming programs")
     " should not be written using any additional assumptions about consistency between the run-time "
     (:TERM NIL "environment") " and the startup, evaluation, and compilation "
     (:TERM NIL "environments") ". " :PAR
     "Except where noted, when a compile-time and a run-time definition are different, one of the following occurs at run time: "
     :PAR
     (:LIST NIL
      (:ITEM NIL " an error of " (:TERM NIL "type") " " (:TYPEREF NIL "error")
       " is signaled ")
      (:ITEM NIL " the compile-time definition prevails ")
      (:ITEM NIL " the run-time definition prevails " :PAR))
     " " :PAR "If the " (:TERM NIL "compiler") " processes a "
     (:TERM NIL "function form") " whose " (:TERM NIL "operator")
     " is not defined at compile time, no error is signaled at compile time. "
     :PAR))
   (:SUBSECTION (:TITLE ("File Compilation") :TAGS (:FILE-COMPILATION)) " "
    :PAR "The " (:TERM NIL "function") " " (:FUNREF NIL "compile-file")
    " performs compilation of " (:TERM NIL "forms")
    " in a file following the rules specified in "
    (:SECREF NIL :COMPILATION-SEMANTICS)
    ", and produces an output file that can be loaded by using "
    (:FUNREF NIL "load") ". " :PAR "Normally, the "
    (:TERM NIL "top level forms") " appearing in a file compiled with "
    (:FUNREF NIL "compile-file")
    " are evaluated only when the resulting compiled file is loaded, and not when the file is compiled. However, "
    (:COMMENT NIL " the use of ``must'' is problematic here  --sjl 7 Mar 92"
     "some forms in the file must be evaluated at compile time so the")
    "it is typically the case that some forms in the file need to be evaluated at compile time so the remainder of the file can be read and compiled correctly. "
    :PAR "The " (:SPECREF NIL "eval-when") " " (:TERM NIL "special form")
    " can be used to control whether a " (:TERM NIL "top level form")
    " is evaluated at compile time, load time, or both. It is possible to specify any of three situations with "
    (:SPECREF NIL "eval-when") ", denoted by the symbols "
    (:KWD NIL "compile-toplevel") ", " (:KWD NIL "load-toplevel") ", and "
    (:KWD NIL "execute") ". For top level " (:SPECREF NIL "eval-when")
    " forms, " (:KWD NIL "compile-toplevel")
    " specifies that the compiler must evaluate the body at compile time, and "
    (:TT NIL " :load-toplevel")
    " specifies that the compiler must arrange to evaluate the body at load time. For non-top level "
    (:SPECREF NIL "eval-when") " forms, " (:KWD NIL "execute")
    " specifies that the body must be executed in the run-time "
    (:TERM NIL "environment") ". " :PAR "The behavior of this "
    (:TERM NIL "form")
    " can be more precisely understood in terms of a model of how "
    (:FUNREF NIL "compile-file")
    " processes forms in a file to be compiled. There are two processing modes, called “not-compile-time” and “compile-time-too”. "
    :PAR "Successive forms are read from the file by "
    (:FUNREF NIL "compile-file")
    " and processed in not-compile-time mode; in this mode, "
    (:FUNREF NIL "compile-file")
    " arranges for forms to be evaluated only at load time and not at compile time. When "
    (:FUNREF NIL "compile-file")
    " is in compile-time-too mode, forms are evaluated both at compile time and load time. "
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Processing of Top Level Forms") :TAGS (:TOP-LEVEL-FORMS)) " "
     :PAR "Processing of " (:TERM NIL "top level forms")
     " in the file compiler is defined as follows: " :PAR
     (:LIST NIL
      (:ITEM NIL "1. If the " (:TERM NIL "form") " is a "
       (:TERM NIL "compiler macro form") " (not disabled by a "
       (:DECLREF NIL "notinline") " " (:TERM NIL "declaration") "), "
       (:COMMENT NIL " Not clear what ``expand'' means here.  --sjl 7 Mar 92"
        "the \\term{implementation} might or might not choose to expand the \\term{form} and,")
       "the " (:TERM NIL "implementation")
       " might or might not choose to compute the "
       (:TERM NIL "compiler macro expansion") " of the " (:TERM NIL "form")
       " and, having performed the expansion, might or might not choose to process the result as a "
       (:TERM NIL "top level form")
       " in the same processing mode (compile-time-too or not-compile-time). "
       (:COMMENT NIL "% Added for Moon. -kmp 16-Feb-92")
       "If it declines to obtain or use the expansion, it must process the original "
       (:TERM NIL "form") ". "
       (:ENDISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89") " " :PAR)
      (:ITEM NIL "2. If the form is a " (:TERM NIL "macro form") ", "
       (:COMMENT NIL "% Probably better to do without this. -kmp,kab 13-Oct-91"
        " \\issue{DEFINE-COMPILER-MACRO:X3J13-NOV89}"
        " (and was not processed as a \\term{compiler macro}),"
        " \\endissue{DEFINE-COMPILER-MACRO:X3J13-NOV89}"
        " Not clear what ``expand'' means here.  --sjl 7 Mar 92"
        "it is expanded and the result is processed as a \\term{top level form} in")
       "its " (:TERM NIL "macro expansion") " is computed and processed as a "
       (:TERM NIL "top level form")
       " in the same processing mode (compile-time-too or not-compile-time). "
       :PAR)
      (:ITEM NIL "3. If the form is a " (:SPECREF NIL "progn")
       " form, each of its body " (:TERM NIL "forms")
       " is sequentially processed as a " (:TERM NIL "top level form")
       " in the same processing mode. " :PAR)
      (:ITEM NIL "4. If the form is a " (:SPECREF NIL "locally") ", "
       (:SPECREF NIL "macrolet") ", or " (:SPECREF NIL "symbol-macrolet") ", "
       (:FUNREF NIL "compile-file")
       " establishes the appropriate bindings and processes the body forms as "
       (:TERM NIL "top level forms")
       " with those bindings in effect in the same processing mode. (Note that this implies that the lexical "
       (:TERM NIL "environment") " in which " (:TERM NIL "top level forms")
       " are processed is not necessarily the "
       (:TERM NIL "null lexical environment") ".) " :PAR)
      (:ITEM NIL "5. If the form is an " (:SPECREF NIL "eval-when")
       (:IDXREF NIL "eval-when") " form, it is handled according to "
       (:NEXTFIGURE NIL) ". " :PAR
       (:FIGURE NIL "  "
        (:TABLE (:NAME NIL)
         (:ROW NIL (:CELL NIL (:B NIL "CT")) (:CELL NIL (:B NIL "LT"))
          (:CELL NIL (:B NIL "E")) (:CELL NIL (:B NIL "Mode"))
          (:CELL NIL (:B NIL "Action")) (:CELL NIL (:B NIL "New Mode")))
         (:ROW (:RULE T) (:CELL NIL " Yes") (:CELL NIL "Yes") (:CELL NIL "—")
          (:CELL NIL "—") (:CELL NIL "Process") (:CELL NIL "compile-time-too"))
         (:ROW NIL (:CELL NIL " No") (:CELL NIL "Yes") (:CELL NIL "Yes")
          (:CELL NIL " CTT") (:CELL NIL "Process")
          (:CELL NIL "compile-time-too"))
         (:ROW NIL (:CELL NIL " No") (:CELL NIL "Yes") (:CELL NIL "Yes")
          (:CELL NIL " NCT") (:CELL NIL "Process")
          (:CELL NIL "not-compile-time"))
         (:ROW NIL (:CELL NIL " No") (:CELL NIL "Yes") (:CELL NIL "No")
          (:CELL NIL "—") (:CELL NIL "Process") (:CELL NIL "not-compile-time"))
         (:ROW NIL (:CELL NIL " Yes") (:CELL NIL "No") (:CELL NIL "—")
          (:CELL NIL "—") (:CELL NIL "Evaluate") (:CELL NIL "—"))
         (:ROW NIL (:CELL NIL " No") (:CELL NIL "No") (:CELL NIL "Yes")
          (:CELL NIL " CTT") (:CELL NIL "Evaluate") (:CELL NIL "—"))
         (:ROW NIL (:CELL NIL " No") (:CELL NIL "No") (:CELL NIL "Yes")
          (:CELL NIL " NCT") (:CELL NIL "Discard") (:CELL NIL "—"))
         (:ROW NIL (:CELL NIL " No") (:CELL NIL "No") (:CELL NIL "No")
          (:CELL NIL "—") (:CELL NIL "Discard") (:CELL NIL "—")))
        " " (:CAPTION NIL "EVAL-WHEN processing") " ")
       " " :PAR "Column " (:B NIL "CT") " indicates whether "
       (:KWD NIL "compile-toplevel") " is specified. Column " (:B NIL "LT")
       " indicates whether " (:KWD NIL "load-toplevel")
       " is specified. Column " (:B NIL "E") " indicates whether "
       (:KWD NIL "execute") " is specified. Column " (:B NIL "Mode")
       " indicates the processing mode; a dash (—) indicates that the processing mode is not relevant. "
       :PAR "The " (:B NIL "Action") " column specifies one of three actions: "
       :PAR
       (:LIST NIL
        (:ITEM NIL (:B NIL "Process:") " process the body as "
         (:TERM NIL "top level forms") " in the specified mode. " :PAR)
        (:ITEM NIL (:B NIL "Evaluate:")
         " evaluate the body in the dynamic execution context of the compiler, using the "
         (:TERM NIL "evaluation environment")
         " as the global environment and the "
         (:TERM NIL "lexical environment") " in which the "
         (:SPECREF NIL "eval-when") " appears. " :PAR)
        (:ITEM NIL (:B NIL "Discard:") " ignore the " (:TERM NIL "form") ". "))
       " " :PAR "The " (:B NIL "New Mode")
       " column indicates the new processing mode. A dash (—) indicates the compiler remains in its current mode. "
       :PAR)
      (:ITEM NIL "6. Otherwise, the form is a " (:TERM NIL "top level form")
       " that is not one of the special cases. In compile-time-too mode, the compiler first evaluates the form in the evaluation "
       (:TERM NIL "environment")
       " and then minimally compiles it. In not-compile-time mode, the "
       (:TERM NIL "form") " is simply minimally compiled. All "
       (:TERM NIL "subforms") " are treated as "
       (:TERM NIL "non-top-level forms") ". " :PAR "Note that "
       (:TERM NIL "top level forms")
       " are processed in the order in which they textually appear in the file and that each "
       (:TERM NIL "top level form")
       " read by the compiler is processed before the next is read. However, the order of processing (including macro expansion) of "
       (:TERM NIL "subforms") " that are not " (:TERM NIL "top level forms")
       " and the order of further compilation is unspecified as long as Common Lisp semantics are preserved. "
       :PAR))
     " " :PAR (:SPECREF NIL "eval-when")
     " forms cause compile-time evaluation only at top level. Both "
     (:KWD NIL "compile-toplevel") " and " (:KWD NIL "load-toplevel")
     " situation specifications are ignored for "
     (:TERM NIL "non-top-level forms") ". For "
     (:TERM NIL "non-top-level forms") ", an " (:SPECREF NIL "eval-when")
     " specifying the " (:KWD NIL "execute") " situation is treated as an "
     (:TERM NIL "implicit progn") " including the " (:TERM NIL "forms")
     " in the body of the " (:SPECREF NIL "eval-when") " " (:TERM NIL "form")
     "; otherwise, the " (:TERM NIL "forms") " in the body are ignored. " :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Processing of Defining Macros") :TAGS (:DEFINING-MACROS)) " "
      :PAR
      (:COMMENT NIL
       " The material below was in its own section (3.2.6), but I think it"
       " logically belongs here.  --sjl 3 Mar 92")
      :PAR (:ISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
      :PAR "Defining " (:TERM NIL "macros") " (such as "
      (:MACREF NIL "defmacro") " or " (:MACREF NIL "defvar")
      ") appearing within a file being processed by "
      (:FUNREF NIL "compile-file")
      " normally have compile-time side effects which affect how subsequent "
      (:TERM NIL "forms") " in the same " (:TERM NIL "file")
      " are compiled. A convenient model for explaining how these side effects happen is that the defining macro expands into one or more "
      (:SPECREF NIL "eval-when") " " (:TERM NIL "forms")
      ", and that the calls which cause the compile-time side effects to happen appear in the body of an "
      (:TT NIL "(eval-when (:compile-toplevel) ...)") " " (:TERM NIL "form")
      ". " :PAR
      (:COMMENT NIL "RPG: What does this mean and is it worth saying?"
       "Sandra: I think it's fairly important for this information to remain,"
       "  since it's what licenses implementations to use what we've been calling "
       "  \"remote environments\" to keep track of compile-time definitions."
       "KAB: I agree.")
      "The compile-time side effects may cause information about the definition to be stored differently than if the defining macro had been processed in the `normal' way (either interpretively or by loading the compiled file). "
      :PAR "In particular, the information stored by the defining "
      (:TERM NIL "macros")
      " at compile time might or might not be available to the interpreter (either during or after compilation), or during subsequent calls to the "
      (:TERM NIL "compiler")
      ". For example, the following code is nonportable because it assumes that the "
      (:TERM NIL "compiler") " stores the macro definition of " (:TT NIL "foo")
      " where it is available to the interpreter: " :PAR
      (:CODE NIL " (defmacro foo (x) `(car ,x))
 (eval-when (:execute :compile-toplevel :load-toplevel)
   (print (foo '(a b c))))
")
      " " :PAR
      "A portable way to do the same thing would be to include the macro definition inside the "
      (:SPECREF NIL "eval-when") " " (:TERM NIL "form") ", as in: " :PAR
      (:CODE NIL " (eval-when (:execute :compile-toplevel :load-toplevel)
   (defmacro foo (x) `(car ,x))
   (print (foo '(a b c))))
")
      " " :PAR
      (:ENDISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
      :PAR (:COMMENT NIL " end of moved material.") :PAR
      (:NEXTFIGURE (:CAPS T))
      " lists macros that make definitions available both in the compilation and run-time "
      (:TERM NIL "environments")
      ". It is not specified whether definitions made available in the "
      (:TERM NIL "compilation environment") " are available in the evaluation "
      (:TERM NIL "environment")
      ", nor is it specified whether they are available in subsequent compilation units or subsequent invocations of the compiler. As with "
      (:SPECREF NIL "eval-when")
      ", these compile-time side effects happen only when the defining macros appear at top level. "
      :PAR (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
      (:ISSUE NIL "PROCLAIM-ETC-IN-COMPILE-FILE:NEW-MACRO") " "
      (:ISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89") " "
      (:ISSUE NIL "CLOS-MACRO-COMPILATION:MINIMAL") " "
      (:COMMENT NIL
       " Removed DEFGENERIC, DEFINE-METHOD-COMBINATION, and DEFMETHOD for KAB."
       " He says they \"might\" but don't have to. -kmp 8-Feb-92")
      (:TABLE
       (:NAME ("Defining Macros That Affect the Compile-Time Environment"))
       (:ROW NIL (:CELL NIL (:MACREF NIL " declaim"))
        (:CELL NIL (:MACREF NIL "define-modify-macro"))
        (:CELL NIL (:MACREF NIL "defsetf")))
       (:ROW NIL (:CELL NIL (:MACREF NIL " defclass"))
        (:CELL NIL (:MACREF NIL "define-setf-expander"))
        (:CELL NIL (:MACREF NIL "defstruct")))
       (:ROW NIL (:CELL NIL (:MACREF NIL " defconstant"))
        (:CELL NIL (:MACREF NIL "defmacro"))
        (:CELL NIL (:MACREF NIL "deftype")))
       (:ROW NIL (:CELL NIL (:MACREF NIL " define-compiler-macro"))
        (:CELL NIL (:MACREF NIL "defpackage"))
        (:CELL NIL (:MACREF NIL "defvar")))
       (:ROW NIL (:CELL NIL (:MACREF NIL " define-condition"))
        (:CELL NIL (:MACREF NIL "defparameter")) (:CELL NIL)))
      " " :PAR (:ENDISSUE NIL "CLOS-MACRO-COMPILATION:MINIMAL") " "
      (:ENDISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89") " "
      (:ENDISSUE NIL "PROCLAIM-ETC-IN-COMPILE-FILE:NEW-MACRO") " "
      (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Constraints on Macros and Compiler Macros") :TAGS
       (:CONSTRAINTS-ON-MACROS))
      " " :PAR
      (:COMMENT NIL
       " Fixed major omission -- issue MACRO-SUBFORMS-TOP-LEVEL-P had not"
       " been incorporated into the document yet.   --sjl 3 Mar 92")
      (:ISSUE NIL "MACRO-SUBFORMS-TOP-LEVEL-P:ADD-CONSTRAINTS") " " :PAR
      "Except where explicitly stated otherwise, no " (:TERM NIL "macro")
      " defined in the " (:RM NIL " Common Lisp")
      " standard produces an expansion that could cause any of the "
      (:TERM NIL "subforms") " of the " (:TERM NIL "macro form")
      " to be treated as " (:TERM NIL "top level forms") ". If an "
      (:TERM NIL "implementation") " also provides a "
      (:TERM NIL "special operator") " definition of a "
      (:RM NIL " Common Lisp") " " (:TERM NIL "macro") ", the "
      (:TERM NIL "special operator")
      " definition must be semantically equivalent in this respect. " :PAR
      (:TERM NIL "Compiler macro")
      " expansions must also have the same top level evaluation semantics as the "
      (:TERM NIL "form") " which they replace. This is of concern both to "
      (:TERM NIL "conforming implementations") " and to "
      (:TERM NIL "conforming programs") ". " :PAR
      (:ENDISSUE NIL "MACRO-SUBFORMS-TOP-LEVEL-P:ADD-CONSTRAINTS") " ")
     :PAR)
    :PAR)
   :PAR
   (:COMMENT NIL
    "% Moon thought this section was stupid and wanted it moved into next section."
    " \\beginsubSection{Compiler/Loader Interface}"
    " % Reference: Issue QUOTE-SEMANTICS" "  " "  "
    " \\endsubSection%{Compiler/Loader Interface}")
   :PAR
   (:SUBSECTION
    (:TITLE ("Literal Objects in Compiled Files") :TAGS
     (:LITERALS-IN-COMPILED-FILES))
    " " :PAR (:COMMENT NIL " Reference: Issue QUOTE-SEMANTICS") :PAR
    (:COMMENT NIL
     "\"constants\" => \"literal objects\" per Moon #4(first public review) --kmp 5-May-93")
    :PAR "The functions " (:FUNREF NIL "eval") " and " (:FUNREF NIL "compile")
    " are required to ensure that " (:TERM NIL "literal objects")
    " referenced within the resulting interpreted or compiled code objects are the "
    (:TERM NIL "same") " as the corresponding " (:TERM NIL "objects")
    " in the " (:TERM NIL "source code") ". " (:FUNREF NIL "compile-file")
    ", on the other hand, must produce a " (:TERM NIL "compiled file")
    " that, when loaded with " (:FUNREF NIL "load") ", constructs the "
    (:TERM NIL "objects") " defined by the " (:TERM NIL "source code")
    " and produces references to them. " :PAR "In the case of "
    (:FUNREF NIL "compile-file") ", " (:TERM NIL "objects") " constructed by "
    (:FUNREF NIL "load") " of the " (:TERM NIL "compiled file")
    " cannot be spoken of as being the " (:TERM NIL "same") " as the "
    (:TERM NIL "objects") " constructed at compile time, because the "
    (:TERM NIL "compiled file") " may be loaded into a different "
    (:TERM NIL "Lisp image")
    " than the one in which it was compiled. This section defines the concept of "
    (:TERM NIL "similarity") " which relates " (:TERM NIL "objects") " in the "
    (:TERM NIL "evaluation environment") " to the corresponding "
    (:TERM NIL "objects") " in the " (:TERM NIL "run-time environment") ". "
    :PAR "The constraints on " (:TERM NIL "literal objects")
    " described in this section apply only to " (:FUNREF NIL "compile-file")
    "; " (:FUNREF NIL "eval") " and " (:FUNREF NIL "compile")
    " do not copy or coalesce constants. " :PAR
    (:SUBSUBSECTION
     (:TITLE ("Externalizable Objects") :TAGS (:EXTERNALIZABLE-OBJECTS)) " "
     :PAR (:ISSUE NIL "CONSTANT-COMPILABLE-TYPES:SPECIFY")
     " The fact that the " (:TERM NIL "file compiler") " represents "
     (:TERM NIL "literal") " " (:TERM NIL "objects") " externally in a "
     (:TERM NIL "compiled file")
     " and must later reconstruct suitable equivalents of those "
     (:TERM NIL "objects") " when that " (:TERM NIL "file")
     " is loaded imposes a need for constraints on the nature of the "
     (:TERM NIL "objects") " that can be used as " (:TERM NIL "literal") " "
     (:TERM NIL "objects") " in " (:TERM NIL "code") " to be processed by the "
     (:TERM NIL "file compiler") ". " :PAR "An " (:TERM NIL "object")
     " that can be used as a " (:TERM NIL "literal") " " (:TERM NIL "object")
     " in " (:TERM NIL "code") " to be processed by the "
     (:TERM NIL "file compiler") " is called an "
     (:NEWTERM NIL "externalizable object") ". " :PAR "We define that two "
     (:TERM NIL "objects") " are " (:NEWTERM NIL "similar")
     " if they satisfy a two-place conceptual equivalence predicate (defined below), which is independent of the "
     (:TERM NIL "Lisp image") " so that the two " (:TERM NIL "objects")
     " in different " (:TERM NIL "Lisp images")
     " can be understood to be equivalent under this predicate. Further, by inspecting the definition of this conceptual predicate, the programmer can anticipate what aspects of an "
     (:TERM NIL "object") " are reliably preserved by "
     (:TERM NIL "file compilation") ". " :PAR "The "
     (:TERM NIL "file compiler") " must cooperate with the "
     (:TERM NIL "loader") " in order to assure that in each case where an "
     (:TERM NIL "externalizable object") " is processed as a "
     (:TERM NIL "literal object") ", the " (:TERM NIL "loader")
     " will construct a " (:TERM NIL "similar") " " (:TERM NIL "object") ". "
     :PAR "The set of " (:TERM NIL "objects") " that are "
     (:NEWTERM (:IDX "externalizable object") "externalizable objects")
     " are those for which the new conceptual term “" (:TERM NIL "similar")
     "” is defined, such that when a " (:TERM NIL "compiled file") " is "
     (:TERM NIL "loaded") ", an " (:TERM NIL "object")
     " can be constructed which can be shown to be " (:TERM NIL "similar")
     " to the original " (:TERM NIL "object") " which existed at the time the "
     (:TERM NIL "file compiler") " was operating. "
     (:ENDISSUE NIL "CONSTANT-COMPILABLE-TYPES:SPECIFY") " " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Similarity of Literal Objects") :TAGS (:SIMILARITY)) " " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Similarity of Aggregate Objects")) "Of the "
      (:TERM NIL "types") " over which " (:TERM NIL "similarity")
      " is defined, some are treated as aggregate objects. For these types, "
      (:TERM NIL "similarity") " is defined recursively. We say that an "
      (:TERM NIL "object")
      " of these types has certain “basic qualities” and to satisfy the "
      (:TERM NIL "similarity")
      " relationship, the values of the corresponding qualities of the two "
      (:TERM NIL "objects") " must also be similar. " :PAR)
     :PAR
     (:COMMENT NIL
      " What was left of this section made no sense at all, so I removed"
      " the whole thing.  --sjl 3 Mar 92"
      " \\beginsubsubsubsection{Similarity of Circular Objects}"
      " %Moon: I think this section is BS and should be deleted, but RPG might disagree."
      " "
      " %!!! This discussion needs to be reworked since we're not doing \"depth-limited gunk\" anymore."
      " This kind of definition has problems with any circular or ``infinitely"
      " recursive'' object such as a list that is an element of itself.  "
      " %% !!!! RPG thinks we should flush this part.  But that leaves the previous sentence"
      " %% in a precarious situation.  I see no reason really why circular objects are"
      " %% a problem.  Can't we just use the same tricks that make printing circular objects work?"
      " %% And if that's right, how do I express it??" " %% -kmp 26-Jan-92"
      " % We use"
      " % the idea of depth-limited comparison, and say that two objects are"
      " % \\term{similar} if they are \\term{similar} at all finite levels.  This"
      " % idea is implicit in the definitions below, and applies in all the"
      " % places where qualities of two \\term{objects} are required to be \\term{similar}."
      "  " " \\endsubsubsubsection%{Similarity of Circular Objects}")
     :PAR
     (:COMMENT NIL " The following terms are used throughout this proposal:"
      " " "   The term \"constant\" [now \"literal object\" -kmp 8-Oct-91]"
      "   refers to a quoted object or self-evaluating object,"
      "   not a constant variable." " "
      "   The term \"source code\" is used to refer to the objects constructed"
      "   when COMPILE-FILE calls READ, and additional objects constructed by"
      "   macroexpansion during COMPILE-FILE." " "
      "   The term \"compiled code\" is used to refer to objects constructed by "
      "   LOAD." " ")
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Definition of Similarity")) "Two "
      (:TERM NIL "objects") " " (:MATH NIL (:MI NIL "S")) " (in "
      (:TERM NIL "source code") ") and " (:MATH NIL (:MI NIL "C")) " (in "
      (:TERM NIL "compiled code") ") are defined to be " (:TERM NIL "similar")
      " if and only if they are both of one of the " (:TERM NIL "types")
      " listed here (or defined by the " (:TERM NIL "implementation")
      ") and they both satisfy all additional requirements of "
      (:TERM NIL "similarity") " indicated for that " (:TERM NIL "type") ". "
      :PAR
      (:LIST NIL
       (:ITEM NIL (:TYPEREF NIL "number") " " :PAR "Two " (:TERM NIL "numbers")
        " " (:MATH NIL (:MI NIL "S")) " and " (:MATH NIL (:MI NIL "C")) " are "
        (:TERM NIL "similar") " if they are of the same " (:TERM NIL "type")
        " and represent the same mathematical value. " :PAR)
       (:ITEM NIL (:TYPEREF NIL "character") " " :PAR
        (:COMMENT NIL
         " Two \\term{characters} $S$ and $C$ are \\term{similar} if they both "
         " represent the same \\term{character}."
         "% Tentatively replaced. Mail sent to Quinquevirate to confirm. -kmp 29-Jan-92"
         "% Lots of mail ensued (\"Similarity of characters\"), but this looks like it'll do for now."
         "% We should maybe return to it later in Public Review when there's more time. -kmp 4-Feb-92")
        :PAR "Two " (:TERM NIL "simple") " " (:TERM NIL "characters") " "
        (:MATH NIL (:MI NIL "S")) " and " (:MATH NIL (:MI NIL "C")) " are "
        (:TERM NIL "similar") " if they have " (:TERM NIL "similar") " "
        (:TERM NIL "code") " " (:TERM NIL "attributes") ". " :PAR
        (:TERM NIL "Implementations") " providing additional, "
        (:TERM NIL "implementation-defined") " " (:TERM NIL "attributes")
        " must define whether and how " (:TERM NIL "non-simple") " "
        (:TERM NIL "characters") " can be regarded as " (:TERM NIL "similar")
        ". " :PAR)
       (:ITEM NIL (:TYPEREF NIL "symbol") " " :PAR "Two "
        (:TERM NIL "apparently uninterned") " " (:TERM NIL "symbols") " "
        (:MATH NIL (:MI NIL "S")) " and " (:MATH NIL (:MI NIL "C")) " are "
        (:TERM NIL "similar") " if their "
        (:COMMENT NIL "% Per Moon#6 (first public review). -kmp 5-May-93"
         "\\term{print names}")
        (:TERM NIL "names") " are " (:TERM NIL "similar") ". " :PAR
        (:ISSUE NIL "COMPILE-FILE-SYMBOL-HANDLING:NEW-REQUIRE-CONSISTENCY")
        " Two " (:TERM NIL "interned") " symbols " (:MATH NIL (:MI NIL "S"))
        " and " (:MATH NIL (:MI NIL "C")) " are " (:TERM NIL "similar")
        " if their " (:TERM NIL "names") " are " (:TERM NIL "similar")
        ", and if either " (:MATH NIL (:MI NIL "S")) " is accessible in the "
        (:TERM NIL "current package") " at compile time and "
        (:MATH NIL (:MI NIL "C")) " is accessible in the "
        (:TERM NIL "current package") " at load time, or "
        (:MATH NIL (:MI NIL "C")) " is accessible in the "
        (:TERM NIL "package") " that is " (:TERM NIL "similar") " to the "
        (:TERM NIL "home package") " of " (:MATH NIL (:MI NIL "S")) ". " :PAR
        "(Note that " (:TERM NIL "similarity") " of "
        (:COMMENT NIL "% Per Moon#6 (first public review). -kmp 5-May-93"
         "\\term{interned}")
        (:TERM NIL "symbols") " is dependent on neither the "
        (:TERM NIL "current readtable") " nor how the " (:TERM NIL "function")
        " " (:FUNREF NIL "read") " would parse the " (:TERM NIL "characters")
        " in the " (:TERM NIL "name") " of the " (:TERM NIL "symbol") ".) "
        (:ENDISSUE NIL "COMPILE-FILE-SYMBOL-HANDLING:NEW-REQUIRE-CONSISTENCY")
        " " :PAR)
       (:ITEM NIL (:TYPEREF NIL "package") " " :PAR "Two "
        (:TERM NIL "packages") " " (:MATH NIL (:MI NIL "S")) " and "
        (:MATH NIL (:MI NIL "C")) " are " (:TERM NIL "similar") " if their "
        (:TERM NIL "names") " are " (:TERM NIL "similar") ". " :PAR
        "Note that although a " (:TERM NIL "package") " " (:TERM NIL "object")
        " is an " (:TERM NIL "externalizable object")
        ", the programmer is responsible for ensuring that the corresponding "
        (:TERM NIL "package")
        " is already in existence when code referencing it as a "
        (:TERM NIL "literal") " " (:TERM NIL "object") " is "
        (:TERM NIL "loaded") ". The " (:TERM NIL "loader")
        " finds the corresponding " (:TERM NIL "package") " "
        (:TERM NIL "object") " as if by calling " (:FUNREF NIL "find-package")
        " with that " (:TERM NIL "name") " as an " (:TERM NIL "argument")
        ". An error is signaled by the " (:TERM NIL "loader") " if no "
        (:TERM NIL "package") " exists at load time. " :PAR)
       (:ITEM NIL (:TYPEREF NIL "random-state") " " :PAR "Two "
        (:TERM NIL "random states") " " (:MATH NIL (:MI NIL "S")) " and "
        (:MATH NIL (:MI NIL "C")) " are " (:TERM NIL "similar") " if "
        (:MATH NIL (:MI NIL "S"))
        " would always produce the same sequence of pseudo-random numbers as a "
        (:TERM NIL "copy") (:SUB NIL "5") " of " (:MATH NIL (:MI NIL "C"))
        " when given as the " (:PARAM NIL "random-state") " "
        (:TERM NIL "argument") " to the " (:TERM NIL "function") " "
        (:FUNREF NIL "random") ", assuming equivalent " (:PARAM NIL "limit")
        " " (:TERM NIL "arguments") " in each case. " :PAR "(Note that since "
        (:MATH NIL (:MI NIL "C")) " has been processed by the "
        (:TERM NIL "file compiler") ", it cannot be used directly as an "
        (:TERM NIL "argument") " to " (:FUNREF NIL "random") " because "
        (:FUNREF NIL "random") " would perform a side effect.) " :PAR)
       (:ITEM NIL (:TYPEREF NIL "cons") " " :PAR "Two " (:TERM NIL "conses")
        ", " (:MATH NIL (:MI NIL "S")) " and " (:MATH NIL (:MI NIL "C"))
        ", are " (:TERM NIL "similar") " if the " (:TERM NIL "car")
        (:SUB NIL "2") " of " (:MATH NIL (:MI NIL "S")) " is "
        (:TERM NIL "similar") " to the " (:TERM NIL "car") (:SUB NIL "2")
        " of " (:MATH NIL (:MI NIL "C")) ", and the " (:TERM NIL "cdr")
        (:SUB NIL "2") " of " (:MATH NIL (:MI NIL "S")) " is "
        (:TERM NIL "similar") " to the " (:TERM NIL "cdr") (:SUB NIL "2")
        " of " (:MATH NIL (:MI NIL "C")) ". " :PAR)
       (:ITEM NIL (:TYPEREF NIL "array") " " :PAR "Two one-dimensional "
        (:TERM NIL "arrays") ", " (:MATH NIL (:MI NIL "S")) " and "
        (:MATH NIL (:MI NIL "C")) ", are " (:TERM NIL "similar") " if the "
        (:TERM NIL "length") " of " (:MATH NIL (:MI NIL "S")) " is "
        (:TERM NIL "similar") " to the " (:TERM NIL "length") " of "
        (:MATH NIL (:MI NIL "C")) ", the "
        (:TERM NIL "actual array element type") " of "
        (:MATH NIL (:MI NIL "S")) " is " (:TERM NIL "similar") " to the "
        (:TERM NIL "actual array element type") " of "
        (:MATH NIL (:MI NIL "C")) ", and each " (:TERM NIL "active") " "
        (:TERM NIL "element") " of " (:MATH NIL (:MI NIL "S")) " is "
        (:TERM NIL "similar") " to the corresponding " (:TERM NIL "element")
        " of " (:MATH NIL (:MI NIL "C")) ". " :PAR "Two " (:TERM NIL "arrays")
        " of " (:TERM NIL "rank") " other than one, " (:MATH NIL (:MI NIL "S"))
        " and " (:MATH NIL (:MI NIL "C")) ", are " (:TERM NIL "similar")
        " if the " (:TERM NIL "rank") " of " (:MATH NIL (:MI NIL "S")) " is "
        (:TERM NIL "similar") " to the " (:TERM NIL "rank") " of "
        (:MATH NIL (:MI NIL "C")) ", each " (:TERM NIL "dimension")
        (:SUB NIL "1") " of " (:MATH NIL (:MI NIL "S")) " is "
        (:TERM NIL "similar") " to the corresponding " (:TERM NIL "dimension")
        (:SUB NIL "1") " of " (:MATH NIL (:MI NIL "C")) ", the "
        (:TERM NIL "actual array element type") " of "
        (:MATH NIL (:MI NIL "S")) " is " (:TERM NIL "similar") " to the "
        (:TERM NIL "actual array element type") " of "
        (:MATH NIL (:MI NIL "C")) ", and each " (:TERM NIL "element") " of "
        (:MATH NIL (:MI NIL "S")) " is " (:TERM NIL "similar")
        " to the corresponding " (:TERM NIL "element") " of "
        (:MATH NIL (:MI NIL "C")) ". " :PAR "In addition, if "
        (:MATH NIL (:MI NIL "S")) " is a " (:TERM NIL "simple array") ", then "
        (:MATH NIL (:MI NIL "C")) " must also be a " (:TERM NIL "simple array")
        ". If " (:MATH NIL (:MI NIL "S")) " is a "
        (:TERM NIL "displaced array") ", has a " (:TERM NIL "fill pointer")
        ", or is " (:TERM NIL "actually adjustable") ", "
        (:MATH NIL (:MI NIL "C"))
        " is permitted to lack any or all of these qualities. " :PAR)
       (:ITEM NIL (:TYPEREF NIL "hash-table") " " :PAR "Two "
        (:TERM NIL "hash tables") " " (:MATH NIL (:MI NIL "S")) " and "
        (:MATH NIL (:MI NIL "C")) " are " (:TERM NIL "similar")
        " if they meet the following three requirements: " :PAR
        (:LIST NIL
         (:ITEM NIL "1. They both have the same test (" (:I NIL "e.g.")
          ",  they are both " (:FUNREF NIL "eql") " " (:TERM NIL "hash tables")
          "). " :PAR)
         (:ITEM NIL
          "2. There is a unique one-to-one correspondence between the keys of the two "
          (:TERM NIL "hash tables") ", such that the corresponding keys are "
          (:TERM NIL "similar") ". " :PAR)
         (:ITEM NIL
          "3. For all keys, the values associated with two corresponding keys are "
          (:TERM NIL "similar") ". "))
        " " :PAR
        "If there is more than one possible one-to-one correspondence between the keys of "
        (:MATH NIL (:MI NIL "S")) " and " (:MATH NIL (:MI NIL "C"))
        ", the consequences are unspecified. A "
        (:TERM NIL "conforming program") " cannot use a table such as "
        (:MATH NIL (:MI NIL "S")) " as an "
        (:TERM NIL "externalizable constant") ". " :PAR)
       (:ITEM NIL (:TYPEREF NIL "pathname") " " :PAR "Two "
        (:TERM NIL "pathnames") " " (:MATH NIL (:MI NIL "S")) " and "
        (:MATH NIL (:MI NIL "C")) " are " (:TERM NIL "similar")
        " if all corresponding " (:TERM NIL "pathname components") " are "
        (:TERM NIL "similar") ". " :PAR)
       (:ITEM NIL (:TYPEREF NIL "function") " " :PAR
        (:ISSUE NIL "CONSTANT-FUNCTION-COMPILATION:NO") " "
        (:TERM NIL "Functions") " are not "
        (:TERM NIL "externalizable objects") ". "
        (:ENDISSUE NIL "CONSTANT-FUNCTION-COMPILATION:NO") " " :PAR)
       (:ITEM NIL (:TYPEREF NIL "structure-object") " and "
        (:TYPEREF NIL "standard-object") " " :PAR
        (:ISSUE NIL "LOAD-OBJECTS:MAKE-LOAD-FORM")
        " A general-purpose concept of " (:TERM NIL "similarity")
        " does not exist for " (:TERM NIL "structures") " and "
        (:TERM NIL "standard objects") ". However, a "
        (:TERM NIL "conforming program") " is permitted to define a "
        (:FUNREF NIL "make-load-form") " " (:TERM NIL "method") " for any "
        (:TERM NIL "class") " " (:MATH NIL (:MI NIL "K")) " defined by that "
        (:TERM NIL "program") " that is a " (:TERM NIL "subclass")
        " of either " (:TYPEREF NIL "structure-object") " or "
        (:TYPEREF NIL "standard-object") ". The effect of such a "
        (:TERM NIL "method") " is to define that an " (:TERM NIL "object") " "
        (:MATH NIL (:MI NIL "S")) " of " (:TERM NIL "type") " "
        (:MATH NIL (:MI NIL "K")) " in " (:TERM NIL "source code") " is "
        (:TERM NIL "similar") " to an " (:TERM NIL "object") " "
        (:MATH NIL (:MI NIL "C")) " of " (:TERM NIL "type") " "
        (:MATH NIL (:MI NIL "K")) " in " (:TERM NIL "compiled code") " if "
        (:MATH NIL (:MI NIL "C")) " was constructed from " (:TERM NIL "code")
        " produced by calling " (:FUNREF NIL "make-load-form") " on "
        (:MATH NIL (:MI NIL "S")) ". "
        (:ENDISSUE NIL "LOAD-OBJECTS:MAKE-LOAD-FORM") " " :PAR))
      " " :PAR))
    :PAR
    (:SUBSUBSECTION (:TITLE ("Extensions to Similarity Rules")) "Some "
     (:TERM NIL "objects") ", such as " (:TERM NIL "streams") ", "
     (:TYPEREF NIL "readtables") ", and " (:TYPEREF NIL "methods") " are not "
     (:TERM NIL "externalizable objects")
     " under the definition of similarity given above. That is, such "
     (:TERM NIL "objects") " may not portably appear as " (:TERM NIL "literal")
     " " (:TERM NIL "objects") " in " (:TERM NIL "code")
     " to be processed by the " (:TERM NIL "file compiler") ". " :PAR "An "
     (:TERM NIL "implementation")
     " is permitted to extend the rules of similarity, so that other kinds of "
     (:TERM NIL "objects") " are " (:TERM NIL "externalizable objects")
     " for that " (:TERM NIL "implementation") ". " :PAR "If for some kind of "
     (:TERM NIL "object") ", " (:TERM NIL "similarity")
     " is neither defined by this specification nor by the "
     (:TERM NIL "implementation") ", then the " (:TERM NIL "file compiler")
     " must signal an error upon encountering such an " (:TERM NIL "object")
     " as a " (:TERM NIL "literal constant") ". " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Additional Constraints on Externalizable Objects") :TAGS
      (:CALLING-MAKE-LOAD-FORM))
     "If two " (:TERM NIL "literal objects")
     " appearing in the source code for a single file processed with "
     (:COMMENT NIL "\\funref{compile-file}") "the " (:TERM NIL "file compiler")
     " are the " (:TERM NIL "identical") ", the corresponding "
     (:TERM NIL "objects") " in the " (:TERM NIL "compiled code")
     " must also be the " (:TERM NIL "identical") ". "
     (:ISSUE NIL "CONSTANT-COLLAPSING:GENERALIZE") " "
     (:COMMENT NIL " However, if two \\term{objects} are \\funref{eql} in the"
      " compiled code, the corresponding \\term{objects} in the source code"
      " might not have been \\funref{eql}.  "
      " \\term{Objects} \\oftype{array}, \\typeref{character}, \\typeref{cons}, "
      " \\typeref{hash-table}, \\typeref{number}, \\typeref{pathname}, "
      " \\typeref{random-state}, and \\typeref{string} may be coalesced"
      " if they are similar.")
     "With the exception of " (:TERM NIL "symbols") " and "
     (:TERM NIL "packages") ", any two " (:COMMENT NIL "constants")
     (:TERM NIL "literal objects") " in " (:TERM NIL "code")
     " being processed by " (:COMMENT NIL "\\funref{compile-file}") "the "
     (:TERM NIL "file compiler") " may be " (:TERM NIL "coalesced")
     " if and only if they are " (:TERM NIL "similar")
     "; if they are either both " (:TERM NIL "symbols") " or both "
     (:TERM NIL "packages") ", they may only be " (:TERM NIL "coalesced")
     " if and only if they are " (:TERM NIL "identical") ". "
     (:ENDISSUE NIL "CONSTANT-COLLAPSING:GENERALIZE") " " :PAR
     (:ISSUE NIL "CONSTANT-CIRCULAR-COMPILATION:YES") " " (:TERM NIL "Objects")
     " containing circular references can "
     (:COMMENT NIL "legitimately appear as constants to be compiled.") "be "
     (:TERM NIL "externalizable objects") ". The " (:TERM NIL "file compiler")
     " is required to preserve " (:FUNREF NIL "eql")
     "ness of substructures within a " (:TERM NIL "file") ". "
     (:COMMENT NIL "compiled with \\funref{compile-file}.") "Preserving "
     (:FUNREF NIL "eql") "ness means that subobjects that are "
     (:COMMENT NIL "\\funref{eql} ") "the " (:TERM NIL "same") " in the "
     (:TERM NIL "source code") " must " (:COMMENT NIL "remain ") "be "
     (:COMMENT NIL "\\funref{eql}") "the " (:TERM NIL "same") " "
     (:COMMENT NIL "after being compiled.") "in the corresponding "
     (:TERM NIL "compiled code") ". "
     (:COMMENT NIL "that is, things don't get \"less EQL\" after compilation."
      "(Note that coalescing of constants implies that things may get \"more"
      "EQL\".)")
     (:ENDISSUE NIL "CONSTANT-CIRCULAR-COMPILATION:YES") " " :PAR
     "In addition, the following are constraints on the handling of "
     (:TERM NIL "literal objects") " by the " (:TERM NIL "file compiler") ": "
     :PAR
     (:LIST NIL
      (:ITEM NIL (:B NIL "array:") " If an " (:TERM NIL "array")
       " in the source code is a " (:TERM NIL "simple array")
       ", then the corresponding " (:TERM NIL "array")
       " in the compiled code will also be a " (:TERM NIL "simple array")
       ". If an " (:TERM NIL "array")
       " in the source code is displaced, has a " (:TERM NIL "fill pointer")
       ", or is " (:TERM NIL "actually adjustable") ", the corresponding "
       (:TERM NIL "array")
       " in the compiled code might lack any or all of these qualities. If an "
       (:TERM NIL "array")
       " in the source code has a fill pointer, then the corresponding "
       (:TERM NIL "array")
       " in the compiled code might be only the size implied by the fill pointer. "
       :PAR)
      (:ITEM NIL (:B NIL "packages:")
       " The loader is required to find the corresponding "
       (:TERM NIL "package") " " (:TERM NIL "object") " as if by calling "
       (:FUNREF NIL "find-package")
       " with the package name as an argument. An error of " (:TERM NIL "type")
       " " (:TYPEREF NIL "package-error") " is signaled if no "
       (:TERM NIL "package") " of that name exists at load time. " :PAR
       (:COMMENT NIL
        "!!! Barmar notes that this is not a constraint on the compiler (as list heading suggests)"))
      (:ITEM NIL (:B NIL "random-state:") " A constant "
       (:TERM NIL "random state")
       " object cannot be used as the state argument to the "
       (:TERM NIL "function") " " (:FUNREF NIL "random") " because "
       (:FUNREF NIL "random") " modifies this data structure. " :PAR)
      (:ITEM NIL (:B NIL "structure, standard-object:") " "
       (:TERM NIL "Objects") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "structure-object") " and "
       (:TYPEREF NIL "standard-object")
       " may appear in compiled constants if there is an appropriate "
       (:FUNREF NIL "make-load-form") " method defined for that "
       (:TERM NIL "type") ". " :PAR (:ISSUE NIL "LOAD-OBJECTS:MAKE-LOAD-FORM")
       "  "
       (:COMMENT NIL " %\\funref{compile-file} " " The \\term{file compiler}"
        " calls \\funref{make-load-form} on any \\term{object}"
        " that is referenced as a \\term{literal object}"
        " if the \\term{object}'s \\term{metaclass} is"
        "      \\typeref{standard-class}, \\typeref{structure-class}, "
        " %   any user-defined \\term{metaclass} "
        " %    \\editornote{KMP: Do we want to talk about user-defined metaclasses?}"
        " %    that is not a \\term{subclass} of \\typeref{built-in-class},"
        "   or any of a possibly empty \\term{implementation-defined} set"
        "       of other \\term{metaclasses}." " %\\funref{compile-file} "
        " The \\term{file compiler}" " will call \\funref{make-load-form} "
        " once for any given \\term{object} within a single \\term{file}."
        " Barrett: Commented out the above, replacing it with appropriately"
        "          massaged text from newer issue.")
       (:ISSUE NIL "MAKE-LOAD-FORM-CONFUSION:REWRITE") " The "
       (:TERM NIL "file compiler") " calls " (:FUNREF NIL "make-load-form")
       " on any " (:TERM NIL "object") " that is referenced as a "
       (:TERM NIL "literal object") " if the " (:TERM NIL "object") " is a "
       (:TERM NIL "generalized instance") " of "
       (:TYPEREF NIL "standard-object") ", " (:TYPEREF NIL "structure-object")
       ", " (:TYPEREF NIL "condition") ", or any of a (possibly empty) "
       (:TERM NIL "implementation-dependent") " set of other "
       (:TERM NIL "classes") ". The " (:TERM NIL "file compiler")
       " only calls " (:FUNREF NIL "make-load-form") " once for any given "
       (:TERM NIL "object") " within a single " (:TERM NIL "file") ". "
       (:ENDISSUE NIL "MAKE-LOAD-FORM-CONFUSION:REWRITE") " "
       (:ENDISSUE NIL "LOAD-OBJECTS:MAKE-LOAD-FORM") " " :PAR
       (:ISSUE NIL "COMPILE-FILE-SYMBOL-HANDLING:NEW-REQUIRE-CONSISTENCY") " ")
      (:ITEM NIL (:B NIL "symbol:") " In order to guarantee that "
       (:TERM NIL "compiled files") " can be " (:TERM NIL "loaded")
       " correctly, users must ensure that the " (:TERM NIL "packages")
       " referenced in those " (:TERM NIL "files")
       " are defined consistently at compile time and load time. "
       (:TERM NIL "Conforming programs")
       " must satisfy the following requirements: " :PAR
       (:LIST NIL
        (:ITEM NIL "1. The " (:TERM NIL "current package") " when a "
         (:TERM NIL "top level form") " in the " (:TERM NIL "file")
         " is processed by " (:FUNREF NIL "compile-file")
         " must be the same as the " (:TERM NIL "current package") " when the "
         (:TERM NIL "code") " corresponding to that "
         (:TERM NIL "top level form") " in the " (:TERM NIL "compiled file")
         " is executed by " (:FUNREF NIL "load") ". In particular: " :PAR
         (:LIST NIL
          (:ITEM NIL "a. Any " (:TERM NIL "top level form") " in a "
           (:TERM NIL "file") " that alters the " (:TERM NIL "current package")
           " must change it to a " (:TERM NIL "package") " of the same "
           (:TERM NIL "name") " both at compile time and at load time. " :PAR)
          (:ITEM NIL "b. If the first " (:TERM NIL "non-atomic") " "
           (:TERM NIL "top level form") " in the " (:TERM NIL "file")
           " is not an " (:MACREF NIL "in-package") " " (:TERM NIL "form")
           ", then the " (:TERM NIL "current package") " at the time "
           (:FUNREF NIL "load") " is called must be a " (:TERM NIL "package")
           " with the same " (:TERM NIL "name") " as the package that was the "
           (:TERM NIL "current package") " at the time "
           (:FUNREF NIL "compile-file") " was called. "))
         " " :PAR)
        (:ITEM NIL "2. For all " (:TERM NIL "symbols")
         " appearing lexically within a " (:TERM NIL "top level form")
         " that were " (:TERM NIL "accessible") " in the "
         (:TERM NIL "package") " that was the " (:TERM NIL "current package")
         " during processing of that " (:TERM NIL "top level form")
         " at compile time, but whose " (:TERM NIL "home package")
         " was another " (:TERM NIL "package")
         ", at load time there must be a " (:TERM NIL "symbol")
         " with the same " (:TERM NIL "name") " that is "
         (:TERM NIL "accessible") " in both the load-time "
         (:TERM NIL "current package") " and in the " (:TERM NIL "package")
         " with the same " (:TERM NIL "name") " as the compile-time "
         (:TERM NIL "home package") ". " :PAR)
        (:ITEM NIL "3. For all " (:TERM NIL "symbols") " represented in the "
         (:TERM NIL "compiled file") " that were "
         (:TERM NIL "external symbols") " in their " (:TERM NIL "home package")
         " at compile time, there must be a " (:TERM NIL "symbol")
         " with the same " (:TERM NIL "name") " that is an "
         (:TERM NIL "external symbol") " in the " (:TERM NIL "package")
         " with the same " (:TERM NIL "name") " at load time. "))
       " " :PAR "If any of these conditions do not hold, the "
       (:TERM NIL "package") " in which the " (:TERM NIL "loader")
       " looks for the affected " (:TERM NIL "symbols") " is unspecified. "
       (:TERM NIL "Implementations")
       " are permitted to signal an error or to define this behavior. "
       (:ENDISSUE NIL "COMPILE-FILE-SYMBOL-HANDLING:NEW-REQUIRE-CONSISTENCY")
       " " :PAR))
     " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Exceptional Situations in the Compiler") :TAGS
     (:FILE-COMPILER-EXCEPTIONS))
    " " :PAR (:ISSUE NIL "COMPILER-DIAGNOSTICS:USE-HANDLER") " "
    (:COMMENT NIL
     "% The following text was added by COMPILER-DIAGNOSTICS and then later removed."
     "\\funref{compile-file} is required to handle the \\misc{abort} restart by"
     "aborting the smallest feasible part of the compilation."
     "\\funref{compile-file} is allowed to establish a default"
     "condition handler.  If such a condition handler is established,"
     "however, it must first resignal the \\term{condition} to give any"
     "user-established handlers a chance to \\term{handle} it.  If all user error"
     "handlers decline, the default handler \\term{handles} the "
     "\\term{condition} in an implementation-specific way; for example, it might turn "
     "errors into warnings.")
    (:ENDISSUE NIL "COMPILER-DIAGNOSTICS:USE-HANDLER") " " :PAR
    (:ISSUE NIL "COMPILER-WARNING-STREAM") " "
    (:ISSUE NIL "COMPILER-DIAGNOSTICS:USE-HANDLER") " "
    (:COMMENT NIL
     "\\funref{compile-file} is permitted to issue warnings through \\term{error output}.")
    (:ENDISSUE NIL "COMPILER-DIAGNOSTICS:USE-HANDLER") " "
    (:ENDISSUE NIL "COMPILER-WARNING-STREAM") " " :PAR
    (:COMMENT NIL " Reference:  Issue COMPILER-DIAGNOSTICS"
     " The STYLE-WARNING condition needs to be integrated into the section"
     "     describing the hierarchy of condition types.")
    :PAR (:FUNREF NIL "compile") " and " (:FUNREF NIL "compile-file")
    " are permitted to signal errors and warnings, including errors due to compile-time processing of "
    (:TT NIL "(eval-when (:compile-toplevel) ...)")
    " forms, macro expansion, and conditions signaled by the compiler itself. "
    :PAR (:TERM NIL "Conditions") " of " (:TERM NIL "type") " "
    (:TYPEREF NIL "error")
    " might be signaled by the compiler in situations where the compilation cannot proceed without intervention. "
    :PAR "In addition to situations for which the standard specifies that "
    (:TERM NIL "conditions") " of " (:TERM NIL "type") " "
    (:TYPEREF NIL "warning")
    " must or might be signaled, warnings might be signaled in situations where the compiler can determine that the consequences are undefined or that a run-time error will be signaled. Examples of this situation are as follows: violating type declarations, altering or assigning the value of a constant defined with "
    (:MACREF NIL "defconstant")
    ", calling built-in Lisp functions with a wrong number of arguments or malformed keyword argument lists, and using unrecognized declaration specifiers. "
    :PAR
    "The compiler is permitted to issue warnings about matters of programming style as conditions of "
    (:TERM NIL "type") " " (:TYPEREF NIL "style-warning")
    ". Examples of this situation are as follows: redefining a function using a different argument list, calling a function with a wrong number of arguments, not declaring "
    (:DECLREF NIL "ignore")
    " of a local variable that is not referenced, and referencing a variable declared "
    (:DECLREF NIL "ignore") ". "
    (:COMMENT NIL
     "% KAB didn't think this one was very convincing. KMP was not sure but figured"
     "% it wouldn't hurt anything to remove it."
     "   and using \\term{declaration specifiers} "
     " 	described in the standard but ignored by the compiler.")
    :PAR "Both " (:FUNREF NIL "compile") " and " (:FUNREF NIL "compile-file")
    " are permitted (but not required) to " (:TERM NIL "establish") " a "
    (:TERM NIL "handler") " for " (:TERM NIL "conditions") " of "
    (:TERM NIL "type") " " (:TYPEREF NIL "error")
    ". For example, they might signal a warning, and restart compilation from some "
    (:TERM NIL "implementation-dependent")
    " point in order to let the compilation proceed without manual intervention. "
    :PAR "Both " (:FUNREF NIL "compile") " and " (:FUNREF NIL "compile-file")
    " return three values, the second two indicating whether the source code being compiled contained errors and whether style warnings were issued. "
    :PAR (:COMMENT NIL " Reference:  issue WITH-COMPILATION-UNIT") :PAR
    "Some warnings might be deferred until the end of compilation. See "
    (:MACREF NIL "with-compilation-unit") ". " :PAR
    (:COMMENT NIL
     " This paragraph is redundant, so I removed it.  --sjl 3 Mar 92"
     " \\issue{COMPILER-DIAGNOSTICS:USE-HANDLER}"
     " \\funref{compile-file} is permitted, but not required, to establish a \\term{handler}"
     " for \\typeref{error} \\term{conditions}.  For example, such a \\term{handler} might issue"
     " a warning and restart compilation from some \\term{implementation-dependent} "
     " point in order to let the compilation proceed without manual intervention."
     " \\endissue{COMPILER-DIAGNOSTICS:USE-HANDLER}")
    :PAR)
   :PAR
   (:COMMENT NIL " merged section \"File Compilation of Top Level Forms\" with"
    " section \"Processing of Defining Macros\", above.  --sjl  3 Mar 92"))
  :PAR
  (:SECTION (:TITLE ("Declarations") :TAGS (:DECLARATIONS)) " " :PAR
   (:NEWTERM (:IDX "declaration") "Declarations")
   " provide a way of specifying information for use by program processors, such as the evaluator or the compiler. "
   :PAR (:NEWTERM (:IDX "local declaration") "Local declarations")
   " can be embedded in executable code using " (:MISC NIL "declare") ". "
   (:NEWTERM (:IDX "global declaration") "Global declarations") ", or "
   (:NEWTERM (:IDX "proclamation") "proclamations") ", are established by "
   (:FUNREF NIL "proclaim") " or " (:MACREF NIL "declaim") ". " :PAR
   (:COMMENT NIL "% 9.3.0 1") "The " (:SPECREF NIL "the") " "
   (:TERM NIL "special form") " provides a shorthand notation for making a "
   (:TERM NIL "local declaration") " about the " (:TERM NIL "type") " of the "
   (:TERM NIL "value") " of a given " (:TERM NIL "form") ". "
   (:COMMENT NIL "% 9.0.0 4"
    " This is redundant with the next sentence.  --sjl 3 Mar 92"
    " The consequences are undefined if a program violates a type declaration."
    "% 9.2.0 1")
   :PAR (:COMMENT NIL "% 9.2.0 6")
   "The consequences are undefined if a program violates a "
   (:TERM NIL "declaration") " or a " (:TERM NIL "proclamation") ". " :PAR
   (:SUBSECTION (:TITLE ("Minimal Declaration Processing Requirements"))
    "In general, an " (:TERM NIL "implementation") " is free to ignore "
    (:TERM NIL "declaration specifiers") " except for the "
    (:DECLREF NIL "declaration") (:IDXREF NIL "declaration") ", "
    (:DECLREF NIL "notinline") (:IDXREF NIL "notinline") ", "
    (:DECLREF NIL "safety") (:IDXREF NIL "safety") ", and "
    (:DECLREF NIL "special") (:IDXREF NIL "special") " "
    (:TERM NIL "declaration specifiers") ". " :PAR "A "
    (:DECLREF NIL "declaration") " " (:TERM NIL "declaration")
    " must suppress warnings about unrecognized " (:TERM NIL "declarations")
    " of the kind that it declares. If an " (:TERM NIL "implementation")
    " does not produce warnings about unrecognized declarations, it may safely ignore this "
    (:TERM NIL "declaration") ". " :PAR "A " (:DECLREF NIL "notinline") " "
    (:TERM NIL "declaration") " must be recognized by any "
    (:TERM NIL "implementation") " that supports inline functions or "
    (:TERM NIL "compiler macros") " in order to disable those facilities. An "
    (:TERM NIL "implementation") " that does not use inline functions or "
    (:TERM NIL "compiler macros") " may safely ignore this "
    (:TERM NIL "declaration") ". " :PAR "A " (:DECLREF NIL "safety") " "
    (:TERM NIL "declaration")
    " that increases the current safety level must always be recognized. An "
    (:TERM NIL "implementation")
    " that always processes code as if safety were high may safely ignore this "
    (:TERM NIL "declaration") ". " :PAR "A " (:DECLREF NIL "special") " "
    (:TERM NIL "declaration") " must be processed by all "
    (:TERM NIL "implementations") ". " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Declaration Specifiers")) "A "
    (:NEWTERM NIL "declaration specifier") " is an " (:TERM NIL "expression")
    " that can appear at top level of a " (:MISC NIL "declare")
    " expression or a " (:MACREF NIL "declaim") " form, or as the argument to "
    (:FUNREF NIL "proclaim") ". It is a " (:TERM NIL "list") " whose "
    (:TERM NIL "car") " is a " (:TERM NIL "declaration identifier")
    ", and whose " (:TERM NIL "cdr")
    " is data interpreted according to rules specific to the "
    (:TERM NIL "declaration identifier") ". " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Declaration Identifiers")) (:NEXTFIGURE (:CAPS T))
    " shows a list of all " (:TERM NIL "declaration identifiers")
    (:IDXTERM NIL "declaration identifier") " defined by this standard. " :PAR
    (:ISSUE NIL "DECLARE-FUNCTION-AMBIGUITY:DELETE-FTYPE-ABBREVIATION") " "
    (:TABLE (:NAME ("Common Lisp Declaration Identifiers"))
     (:ROW NIL (:CELL NIL (:DECLREF NIL " declaration"))
      (:CELL NIL (:DECLREF NIL "ignore")) (:CELL NIL (:DECLREF NIL "special")))
     (:ROW NIL (:CELL NIL (:DECLREF NIL " dynamic-extent"))
      (:CELL NIL (:DECLREF NIL "inline")) (:CELL NIL (:DECLREF NIL "type")))
     (:ROW NIL (:CELL NIL (:DECLREF NIL " ftype"))
      (:CELL NIL (:DECLREF NIL "notinline")) (:CELL NIL))
     (:ROW NIL (:CELL NIL (:DECLREF NIL " ignorable"))
      (:CELL NIL (:DECLREF NIL "optimize")) (:CELL NIL)))
    " " (:COMMENT NIL "FUNCTION removed.")
    (:ENDISSUE NIL "DECLARE-FUNCTION-AMBIGUITY:DELETE-FTYPE-ABBREVIATION") " "
    :PAR (:COMMENT NIL "% 9.2.0 20")
    "An implementation is free to support other ("
    (:TERM NIL "implementation-defined") ") "
    (:TERM NIL "declaration identifiers") " as well. "
    (:COMMENT NIL
     " Sections 3.2.2.3 and 3.2.5 both classify this as an ordinary warning."
     " --sjl 3 Mar 92" " A warning \\oftype{style-warning} might be issued")
    "A warning might be issued if a " (:TERM NIL "declaration identifier")
    " is not among those defined above, "
    (:COMMENT NIL "Added for Barmar:   -kmp 11-Jan-91")
    "is not defined by the " (:TERM NIL "implementation") ", is not a "
    (:TERM NIL "type") " " (:TERM NIL "name")
    ", and has not been declared in a " (:DECLREF NIL "declaration") " "
    (:TERM NIL "proclamation") ". " :PAR
    (:COMMENT NIL
     " I can't figure out where this paragraph came from, and I'm convinced"
     " it's wrong.  Issue DECLARATION-SCOPE was intended to assign consistent"
     " scoping rules to all declarations based only on whether they are ``bound''"
     " or ``free''.  Allowing random scoping rules will also totally defeat"
     " the proposed define-declaration extensions.  --sjl 7 Mar 92"
     "For \\term{implementation-defined} \\term{declaration identifiers},"
     "the \\term{scope} of \\term{free declarations} and \\term{bound declarations}"
     "is \\term{implementation-defined}.")
    :PAR
    (:SUBSUBSECTION (:TITLE ("Shorthand notation for Type Declarations")) "A "
     (:TERM NIL "type specifier") " can be used as a "
     (:TERM NIL "declaration identifier") ". "
     (:TT NIL "(" (:PARAM NIL "type-specifier") " "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "var"))) ")")
     " is taken as shorthand for "
     (:TT NIL "(type " (:PARAM NIL "type-specifier") " "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "var"))) ")")
     ". " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Declaration Scope") :TAGS (:DECL-SCOPE)) " " :PAR
    (:COMMENT NIL
     " Declarations can be divided into two kinds: those that concern "
     " the \\term{bindings} of variables, and those that do not."
     " The \\declref{special} declaration falls into both classes."
     " Declarations that concern \\term{variable} \\term{bindings} apply"
     " only to the \\term{bindings} made by the \\term{form} at the head of "
     " whose body they appear.  " " "
     " All declarations introduced with \\misc{declare} fall into two classes:"
     " \\term{bound declarations} and \\term{free declarations}."
     " \\term{Bound declarations} affect both a binding and any references;"
     " \\term{free declarations} affect only references."
     " Some declarations may be used in either way, depending on context."
     "% The above rewritten with help from Sandra and Moon. -kmp 22-Aug-91")
    :PAR (:TERM NIL "Declarations")
    " can be divided into two kinds: those that apply to the "
    (:TERM NIL "bindings") " of " (:TERM NIL "variables") " or "
    (:TERM NIL "functions") "; and those that do not apply to "
    (:TERM NIL "bindings") ". " :PAR "A " (:TERM NIL "declaration")
    " that appears at the head of a binding " (:TERM NIL "form")
    " and applies to a " (:TERM NIL "variable") " or " (:TERM NIL "function")
    " " (:TERM NIL "binding") " made by that " (:TERM NIL "form")
    " is called a " (:NEWTERM NIL "bound declaration") "; such a "
    (:TERM NIL "declaration") " affects both the " (:TERM NIL "binding")
    " and any references within the " (:TERM NIL "scope") " of the "
    (:TERM NIL "declaration") ". " :PAR (:TERM NIL "Declarations")
    " that are not " (:TERM NIL "bound declarations") " are called "
    (:NEWTERM (:IDX "free declaration") "free declarations") ". " :PAR
    (:COMMENT NIL " \\term{Free declarations} that apply to"
     " \\term{bindings} affect only references to those \\term{bindings}.  ")
    "A " (:TERM NIL "free declaration") " in a " (:TERM NIL "form") " "
    (:MATH NIL (:MI NIL "F") (:MN NIL "1")) " that applies to a "
    (:TERM NIL "binding") " for a " (:TERM NIL "name") " "
    (:MATH NIL (:MI NIL "N")) " " (:TERM NIL "established") " by some "
    (:TERM NIL "form") " " (:MATH NIL (:MI NIL "F") (:MN NIL "2")) " of which "
    (:MATH NIL (:MI NIL "F") (:MN NIL "1")) " is a " (:TERM NIL "subform")
    " affects only references to " (:MATH NIL (:MI NIL "N")) " within "
    (:MATH NIL (:MI NIL "F") (:MN NIL "1"))
    "; it does not to apply to other references to " (:MATH NIL (:MI NIL "N"))
    " outside of " (:MATH NIL (:MI NIL "F") (:MN NIL "1"))
    ", nor does it affect the manner in which the " (:TERM NIL "binding")
    " of " (:MATH NIL (:MI NIL "N")) " by "
    (:MATH NIL (:MI NIL "F") (:MN NIL "2")) " is " (:TERM NIL "established")
    ". " :PAR (:TERM NIL "Declarations") " that do not apply to "
    (:TERM NIL "bindings") " can only appear as "
    (:TERM NIL "free declarations") ". " :PAR
    (:COMMENT NIL
     " Common Lisp prohibits binding the same name twice in the same binding form."
     " It has been proposed that multiple bindings be permitted for LET*, DO*, PROG* "
     " forms and for &AUX variables in lambda expressions, but never approved. "
     " In an implementation which permits multiple bindings, `bound' declarations"
     " should probably be treated as if there were a separate `bound' declaration "
     " for each of the bindings, but for us to say so would really go beyond the"
     " scope of this document.  As such, we'll just not say anything and leave it to"
     " any implementation which defines that circumstance to also define the relationship"
     " to bound declarations. -kmp 22-Aug-91")
    :PAR
    (:COMMENT NIL
     "% Rewritten by Sandra in response to Margolin #7, Dalton #3, Moon #7 (First Public Review)"
     " %% 9.1"
     " Some \\term{forms} contain pieces of code that, properly speaking,"
     " are not part of the body of the \\term{form}.  Examples of this"
     " are initialization forms that provide values for bound variables,"
     " and the result forms of iteration \\term{forms}." " "
     " \\issue{DECLARATION-SCOPE:NO-HOISTING}" "  "
     " The \\term{scope} of a \\term{declaration} located at the head of "
     " a \\term{special form}, \\term{macro form}, or \\term{lambda expression} is as follows:"
     " \\beginlist" " \\itemitem{1.}"
     " It always includes the body forms as well as any \\term{step} or exit \\term{forms}."
     " \\itemitem{2.}"
     " It also includes the \\term{scope} of the name binding, if any, to which "
     " it applies (\\specref{let}, \\misc{lambda},  \\specref{flet},  \\macref{do}, etc. "
     " introduce name bindings; \\specref{locally} does not)." " \\endlist" " "
     " %!!!! RPG: I'm tired but this doesn't make sense to me at all."
     " This prescription depends on the fact that the \\term{scope} of name bindings"
     " is already well-defined."
     " Whether or not a particular declaration affects an initialization form "
     " (such as for \\specref{let} or \\specref{let*}) "
     " depends solely on whether it is"
     " applied to a variable or function name being bound whose \\term{scope}"
     " includes such \\term{forms}.  "
     " In this sense, the above specification limits the"
     " \\term{scope} of declarations for name bindings to be exactly the "
     " \\term{scope} of the" " name binding itself. "
     " There is no ``hoisting'' for declarations in \\term{special forms} or "
     " \\term{lambda expressions}; "
     " the only initialization forms affected by a declaration "
     " are those included indirectly, by the effect, if any, that a "
     " declaration has on a name binding. " " Thus there is no"
     " ``hoisting'' of the special declarations in the following example:" " "
     " % \\code" " %  (defun bar (x y)           ;[1] 1st occurrence of x"
     " %    (let ((old-x x)          ;[2] 2nd occurrence of x "
     " %          (x y))             ;[3] 3rd occurrence of x"
     " %      (declare (special x))" " %      (list old-x x)))" " % \\endcode"
     " % " " % Laubsch: ?"
     " % Barmar: Say what [the above] example is supposed to return."
     " % RPG: Also, say explicitly which bindings and references are special."
     " " " \\code" "  (let ((x 1))                ;[1] 1st occurrence of x"
     "    (declare (special x))     ;[2] 2nd occurrence of x"
     "    (let ((x 2))              ;[3] 3rd occurrence of x"
     "      (let ((old-x x)         ;[4] 4th occurrence of x"
     "            (x 3))            ;[5] 5th occurrence of x"
     "        (declare (special x)) ;[6] 6th occurrence of x"
     "        (list old-x x))))     ;[7] 7th occurrence of x" " \\EV (2 3)"
     " \\endcode" " "
     " The first occurrence of \\f{x} \\term{establishes} a \\term{dynamic binding}"
     " of \\f{x} because of the \\declref{special} \\term{declaration} for \\f{x}"
     " in the second line.  The third occurrence of \\f{x} \\term{establishes} a"
     " \\term{lexical binding} of \\f{x} (because there is no \\declref{special}"
     " \\term{declaration} in the corresponding \\macref{let} \\term{form})."
     " The fourth occurrence of \\f{x} \\term{x} is a reference to the"
     " \\term{lexical binding} of \\f{x} established in the third line."
     " The fifth occurrence of \\f{x} \\term{establishes} a \\term{dynamic binding}"
     " of \\term{x} for the body of the \\macref{let} \\term{form} that begins on"
     " that line because of the \\declref{special} \\term{declaration} for \\f{x}"
     " in the sixth line. The reference to \\f{x} in the fourth line is not"
     " affected by the \\declref{special} \\term{declaration} in the sixth line "
     " because that reference is not within the ``would-be \\term{lexical scope}''"
     " of the \\term{variable} \\f{x} in the fifth line.  The reference to \\f{x}"
     " in the seventh line is a reference to the \\term{dynamic binding} of \\term{x}"
     " \\term{established} in the fifth line." " "
     " Those declarations not correlated with any name \\term{binding} do"
     " not cover any of the initialization forms; their \\term{scope} only"
     " includes the body as well as any ``stepper'' or result forms.  In a"
     " sense, the above specification limits the \\term{scope} of these"
     " kinds of declarations to be the same as an arbitrary name "
     " \\term{binding} in a \\specref{let}, \\specref{flet}, "
     " \\issue{WITH-ADDED-METHODS:DELETE}" " %\\macref{with-added-methods},"
     " \\endissue{WITH-ADDED-METHODS:DELETE}"
     " \\issue{GENERIC-FLET-POORLY-DESIGNED:DELETE}"
     " %\\specref{generic-flet}," " %\\specref{generic-labels},"
     " \\endissue{GENERIC-FLET-POORLY-DESIGNED:DELETE}"
     " and \\specref{labels}" " \\term{form}."
     " %[See also the issue DECLARE-TYPE-FREE.]" " "
     " In the following:\\idxref{notinline}" " " " \\code"
     "  (lambda (&optional (x (foo 1))) ;[1]"
     "    (declare (notinline foo))     ;[2]"
     "    (foo x))                      ;[3]" " \\endcode" " "
     " the \\term{call} to \\f{foo} in the first line might be "
     " compiled inline even though the \\term{call} to \\f{foo} in"
     " the third line must not be.  This is because"
     " the \\declref{notinline} \\term{declaration}"
     " for \\f{foo} in the second line applies only to the body on the"
     " third line.  In order to suppress inlining for both \\term{calls}, "
     " one might write:\\idxref{notinline}" " " " \\code"
     "  (locally (declare (notinline foo)) ;[1]"
     "    (lambda (&optional (x (foo 1)))  ;[2]"
     "      (foo x)))                      ;[3]" " \\endcode" " "
     " or, alternatively:\\idxref{notinline}" " " " \\code"
     "  (lambda (&optional                               ;[1]"
     "             (x (locally (declare (notinline foo)) ;[2]"
     "                  (foo 1))))                       ;[3]"
     "    (declare (notinline foo))                      ;[4]"
     "    (foo x))                                       ;[5]" " \\endcode" " "
     " In the following:\\idxterm{type declaration}" " " " \\code"
     "  (defun foo (x)                               ;[1]"
     "    (if (typep x 'integer)                     ;[2]"
     "        (list (let ((y (+ x 42)))              ;[3]"
     "                (declare (fixnum x y))         ;[4]"
     "                y)                             ;[5]"
     "              (+ x 42))                        ;[6]"
     "        `(foo ,x)))                            ;[7]" " \\endcode" " "
     " \\f{x} is not initially (\\eg in the first line) known to be a \\term{fixnum} "
     " since the scope of the \\declref{fixnum} \\term{declaration} for \\f{x} in the fourth line"
     " covers only the body of the \\macref{let} form in the fifth line, but not the"
     " \\term{initialization form} for \\f{y} in the third line.  The compiler can assume that"
     " \\f{x} is not greater than the value of \\f{(- most-positive-fixnum 42)} because \\f{y}"
     " has been declared to be a \\term{fixnum} in the fourth line."
     " Even so, neither the \\term{call} to \\funref{+} in the third line "
     "              nor the one in the sixth line "
     " may be optimized into \\term{calls} to \\term{implementation-dependent} "
     " \\term{fixnum}-only arithmetic operators,"
     " just in case the call to \\f{foo} looks something like:" " " " \\code"
     "  (foo (- most-negative-fixnum 1))" " \\endcode" " "
     " In following:\\idxterm{type declaration}" " " " \\code"
     "  (defun foo (x)                               ;[1]"
     "    (if (typep x 'integer)                     ;[2]"
     "        (list (let ((y (+ x 42)))              ;[3]"
     "                (declare (fixnum x))           ;[4]"
     "                x                              ;[5]"
     "                y)                             ;[6]"
     "              (+ x 42))                        ;[7]"
     "        `(foo ,x)))                            ;[8]" " \\endcode" " "
     " \\f{x} can be determined to be a \\term{fixnum} throughout "
     " the third through seventh lines, but only by inference"
     " from the fact that the reference to \\f{x} in the fifth line"
     " (the only reference to which the \\declref{fixnum} \\term{declaration}"
     " in the fourth line applies) "
     " is known to be a \\term{fixnum}.  Since the compiler is capable of detecting that"
     " there are no \\term{assignments} to \\f{x}, it may reason that \\f{x} is a \\term{fixnum}"
     " throughout even though there is no explicit \\term{declaration}."
     " However, since there is no \\declref{fixnum} \\term{declaration} for \\f{y} (as there"
     " was in the previous example), the compiler may not assume that the result of the"
     " addition in the third line is a \\term{fixnum}.  Therefore, "
     " neither \\term{call} to \\funref{+} (one the third and seventh lines) "
     " may be optimized into \\term{calls} to \\term{implementation-dependent} "
     " \\term{fixnum}-only arithmetic operators,"
     " just in case the call to \\term{foo} looks something like:" " "
     " \\code" "  (foo most-positive-fixnum)" " \\endcode" " "
     " However, in the following:\\idxterm{type declaration}" " " " \\code"
     "  (defun foo (x)                               ;[1]"
     "    (if (typep x 'integer)                     ;[2]"
     "        (list (let ((y (the fixnum (+ x 42)))) ;[3]"
     "                (declare (fixnum x y))         ;[4]"
     "                x                              ;[5]"
     "                y)                             ;[6]"
     "              (+ x 42))                        ;[7]"
     "        `(foo ,x)))                            ;[8]" " \\endcode" " "
     " the compiler can infer that \\f{x} is a \\term{fixnum} throughout "
     " the third through seventh lines by reasoning similar"
     " to that for the previous example.  Further, it can infer that the result of the "
     " call to \\funref{+} in the third line is a \\term{fixnum} because of the \\declref{fixnum}"
     " \\term{declaration} in the fourth line.  Consequently, that \\term{call} to \\funref{+}"
     " may be optimized into a \\term{call} to an \\term{implementation-dependent} "
     " \\term{fixnum}-only arithmetic operator.  Further, the \\term{call} to \\funref{+}"
     " in the seventh line may be similarly optimized because the compiler can prove that"
     " the \\f{x} in that line has the same \\term{value}." " "
     " \\endissue{DECLARATION-SCOPE:NO-HOISTING}")
    :PAR (:ISSUE NIL "DECLARATION-SCOPE:NO-HOISTING") " "
    (:ISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
    (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " The "
    (:TERM NIL "scope") " of a " (:TERM NIL "bound declaration")
    " is the same as the "
    (:COMMENT NIL "% Per X3J13. -kmp 5-Oct-93" "\\term{scope}")
    (:TERM NIL "lexical scope") " of the " (:TERM NIL "binding")
    " to which it applies; " (:COMMENT NIL "% Added per X3J13. -kmp 5-Oct-93")
    "for " (:TERM NIL "special variables") ", this means the "
    (:TERM NIL "scope") " that the " (:TERM NIL "binding")
    " would have had had it been a " (:TERM NIL "lexical binding") ". " :PAR
    "Unless explicitly stated otherwise, the " (:TERM NIL "scope") " of a "
    (:TERM NIL "free declaration") " includes only the body "
    (:TERM NIL "subforms") " of the " (:TERM NIL "form")
    " at whose head it appears, and no other " (:TERM NIL "subforms") ". The "
    (:TERM NIL "scope") " of " (:TERM NIL "free declarations")
    " specifically does not include " (:TERM NIL "initialization forms")
    " for " (:TERM NIL "bindings") " established by the " (:TERM NIL "form")
    " containing the " (:TERM NIL "declarations") ". " :PAR "Some "
    (:TERM NIL "iteration forms") " include step, end-test, or result "
    (:TERM NIL "subforms") " that are also included in the "
    (:TERM NIL "scope") " of " (:TERM NIL "declarations")
    " that appear in the " (:TERM NIL "iteration form") ". Specifically, the "
    (:TERM NIL "iteration forms") " and " (:TERM NIL "subforms")
    " involved are: " :PAR
    (:LIST NIL
     (:ITEM NIL " " (:MACREF NIL "do") ", " (:MACREF NIL "do*") ": "
      (:PARAM NIL "step-forms") ", " (:PARAM NIL "end-test-form") ", and "
      (:PARAM NIL "result-forms") ". ")
     (:ITEM NIL " " (:MACREF NIL "dolist") ", " (:MACREF NIL "dotimes") ": "
      (:PARAM NIL "result-form") " ")
     (:ITEM NIL " " (:MACREF NIL "do-all-symbols") ", "
      (:MACREF NIL "do-external-symbols") ", " (:MACREF NIL "do-symbols") ": "
      (:PARAM NIL "result-form") " "))
    " " (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
    (:ENDISSUE NIL "WITH-ADDED-METHODS:DELETE") " " :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of Declaration Scope"))
     "Here is an example illustrating the " (:TERM NIL "scope") " of "
     (:TERM NIL "bound declarations") ". " :PAR
     (:CODE NIL " (let ((x 1))                ;[1] 1st occurrence of x
   (declare (special x))     ;[2] 2nd occurrence of x
   (let ((x 2))              ;[3] 3rd occurrence of x
     (let ((old-x x)         ;[4] 4th occurrence of x
           (x 3))            ;[5] 5th occurrence of x
       (declare (special x)) ;[6] 6th occurrence of x
       (list old-x x))))     ;[7] 7th occurrence of x
→ (2 3)
")
     " " :PAR "The first occurrence of " (:TT NIL "x") " "
     (:TERM NIL "establishes") " a " (:TERM NIL "dynamic binding") " of "
     (:TT NIL "x") " because of the " (:DECLREF NIL "special") " "
     (:TERM NIL "declaration") " for " (:TT NIL "x")
     " in the second line. The third occurrence of " (:TT NIL "x") " "
     (:TERM NIL "establishes") " a " (:TERM NIL "lexical binding") " of "
     (:TT NIL "x") " (because there is no " (:DECLREF NIL "special") " "
     (:TERM NIL "declaration") " in the corresponding " (:SPECREF NIL "let")
     " " (:TERM NIL "form") "). The fourth occurrence of " (:TT NIL "x") " "
     (:TT NIL "x") " is a reference to the " (:TERM NIL "lexical binding")
     " of " (:TT NIL "x")
     " established in the third line. The fifth occurrence of " (:TT NIL "x")
     " " (:TERM NIL "establishes") " a " (:TERM NIL "dynamic binding") " of "
     (:TT NIL "x") " for the body of the " (:SPECREF NIL "let") " "
     (:TERM NIL "form") " that begins on that line because of the "
     (:DECLREF NIL "special") " " (:TERM NIL "declaration") " for "
     (:TT NIL "x") " in the sixth line. The reference to " (:TT NIL "x")
     " in the fourth line is not affected by the " (:DECLREF NIL "special") " "
     (:TERM NIL "declaration")
     " in the sixth line because that reference is not within the “would-be "
     (:TERM NIL "lexical scope") "” of the " (:TERM NIL "variable") " "
     (:TT NIL "x") " in the fifth line. The reference to " (:TT NIL "x")
     " in the seventh line is a reference to the "
     (:TERM NIL "dynamic binding") " of " (:TT NIL "x") " "
     (:TERM NIL "established") " in the fifth line. " :PAR
     "Here is another example, to illustrate the " (:TERM NIL "scope") " of a "
     (:TERM NIL "free declaration") ". In the following: " :PAR
     (:CODE NIL " (lambda (&optional (x (foo 1))) ;[1]
   (declare (notinline foo))     ;[2]
   (foo x))                      ;[3]
")
     " " :PAR "the " (:TERM NIL "call") " to " (:TT NIL "foo")
     " in the first line might be compiled inline even though the "
     (:TERM NIL "call") " to " (:TT NIL "foo")
     " in the third line must not be. This is because the "
     (:DECLREF NIL "notinline") " " (:TERM NIL "declaration") " for "
     (:TT NIL "foo")
     " in the second line applies only to the body on the third line. In order to suppress inlining for both "
     (:TERM NIL "calls") ", one might write: " :PAR
     (:CODE NIL " (locally (declare (notinline foo)) ;[1]
   (lambda (&optional (x (foo 1)))  ;[2]
     (foo x)))                      ;[3]
")
     " " :PAR "or, alternatively: " :PAR
     (:CODE NIL " (lambda (&optional                               ;[1]
            (x (locally (declare (notinline foo)) ;[2]
                 (foo 1))))                       ;[3]
   (declare (notinline foo))                      ;[4]
   (foo x))                                       ;[5]
")
     " " :PAR "Finally, here is an example that shows the " (:TERM NIL "scope")
     " of " (:TERM NIL "declarations") " in an " (:TERM NIL "iteration form")
     ". " :PAR
     (:CODE NIL " (let ((x  1))                     ;[1]
   (declare (special x))           ;[2]
     (let ((x 2))                  ;[3]
       (dotimes (i x x)            ;[4]
         (declare (special x)))))  ;[5]
→ 1
")
     " " :PAR "In this example, the first reference to " (:TT NIL "x")
     " on the fourth line is to the " (:TERM NIL "lexical binding") " of "
     (:TT NIL "x")
     " established on the third line. However, the second occurrence of "
     (:TT NIL "x") " on the fourth line lies within the " (:TERM NIL "scope")
     " of the " (:TERM NIL "free declaration")
     " on the fifth line (because this is the " (:PARAM NIL "result-form")
     " of the " (:MACREF NIL "dotimes") ") and therefore refers to the "
     (:TERM NIL "dynamic binding") " of " (:TT NIL "x") ". "
     (:ENDISSUE NIL "DECLARATION-SCOPE:NO-HOISTING") " " :PAR)
    :PAR))
  :PAR
  (:SECTION (:TITLE ("Lambda Lists") :TAGS (:LAMBDA-LISTS)) " " :PAR "A "
   (:NEWTERM NIL "lambda list") " is a " (:TERM NIL "list")
   " that specifies a set of " (:TERM NIL "parameters") " (sometimes called "
   (:TERM NIL "lambda variables") ") and a protocol for receiving "
   (:TERM NIL "values") " for those " (:TERM NIL "parameters") ". " :PAR
   (:COMMENT NIL
    " \\term{Lambda list keywords} do not belong to \\thepackage{keyword};"
    " a \\term{lambda list keyword} is a \\term{symbol} "
    " whose name begins with an \\term{ampersand}.")
   :PAR "There are several kinds of " (:TERM NIL "lambda lists") ". " :PAR
   (:TABLE (:NAME ("What Kind of Lambda Lists to Use"))
    (:ROW NIL (:CELL NIL "Context") (:CELL NIL "Kind of Lambda List"))
    (:ROW NIL (:CELL NIL (:MACREF NIL "defun") (:TERM NIL "form"))
     (:CELL NIL (:TERM NIL "ordinary lambda list")))
    (:ROW NIL (:CELL NIL (:MACREF NIL "defmacro") (:TERM NIL "form"))
     (:CELL NIL (:TERM NIL "macro lambda list")))
    (:ROW NIL (:CELL NIL (:TERM NIL "lambda expression"))
     (:CELL NIL (:TERM NIL "ordinary lambda list")))
    (:ROW NIL
     (:CELL NIL (:SPECREF NIL "flet") " local " (:TERM NIL "function")
      " definition ")
     (:CELL NIL (:TERM NIL "ordinary lambda list")))
    (:ROW NIL
     (:CELL NIL (:SPECREF NIL "labels") " local " (:TERM NIL "function")
      " definition ")
     (:CELL NIL (:TERM NIL "ordinary lambda list")))
    (:ROW NIL
     (:CELL NIL (:MACREF NIL "handler-case") (:PARAM NIL "clause")
      " specification ")
     (:CELL NIL (:TERM NIL "ordinary lambda list")))
    (:ROW NIL
     (:CELL NIL (:MACREF NIL "restart-case") (:PARAM NIL "clause")
      " specification ")
     (:CELL NIL (:TERM NIL "ordinary lambda list")))
    (:ROW NIL
     (:CELL NIL (:SPECREF NIL "macrolet") " local " (:TERM NIL "macro")
      " definition ")
     (:CELL NIL (:TERM NIL "macro lambda list")))
    (:ROW NIL (:CELL NIL (:MACREF NIL "define-method-combination"))
     (:CELL NIL (:TERM NIL "ordinary lambda list")))
    (:ROW NIL
     (:CELL NIL (:MACREF NIL "define-method-combination")
      (:KWD NIL "arguments") " option ")
     (:CELL NIL
      (:COMMENT NIL
       "Moon thought :arguments for DEFINE-METHOD-COMBINATION took an ordinary lambda list,"
       "but Barrett (comment #3, first public review) observes that &whole is permissible."
       "Time to make a new kind of list.")
      (:TERM NIL "define-method-combination arguments lambda list")))
    (:ROW NIL
     (:CELL NIL (:MACREF NIL "defstruct") (:KWD NIL "constructor") " option ")
     (:CELL NIL (:TERM NIL "boa lambda list")))
    (:ROW NIL (:CELL NIL (:MACREF NIL "defgeneric") (:TERM NIL "form"))
     (:CELL NIL (:TERM NIL "generic function lambda list")))
    (:ROW NIL
     (:CELL NIL (:MACREF NIL "defgeneric") (:TERM NIL "method") " clause ")
     (:CELL NIL (:TERM NIL "specialized lambda list")))
    (:ROW NIL (:CELL NIL (:MACREF NIL "defmethod") (:TERM NIL "form"))
     (:CELL NIL (:TERM NIL "specialized lambda list")))
    (:ROW NIL (:CELL NIL (:MACREF NIL "defsetf") (:TERM NIL "form"))
     (:CELL NIL (:TERM NIL "defsetf lambda list")))
    (:ROW NIL
     (:CELL NIL (:MACREF NIL "define-setf-expander") (:TERM NIL "form"))
     (:CELL NIL (:TERM NIL "macro lambda list")))
    (:ROW NIL (:CELL NIL (:MACREF NIL "deftype") (:TERM NIL "form"))
     (:CELL NIL (:TERM NIL "deftype lambda list")))
    (:ROW NIL (:CELL NIL (:MACREF NIL "destructuring-bind") (:TERM NIL "form"))
     (:CELL NIL (:TERM NIL "destructuring lambda list")))
    (:ROW NIL
     (:CELL NIL
      (:COMMENT NIL
       "\\specref{generic-flet} \\term{form}                & \\term{generic function lambda list} \\cr"
       "\\specref{generic-flet} \\term{method} clause       & \\term{specialized lambda list}      \\cr"
       "\\specref{generic-labels} \\term{form}              & \\term{generic function lambda list} \\cr"
       "\\specref{generic-labels} \\term{method} clause     & \\term{specialized lambda list}      \\cr"
       "\\specref{generic-function} \\term{form}		   & \\term{generic function lambda list} \\cr"
       "\\specref{generic-function} \\term{method} clause   & \\term{specialized lambda list}      \\cr"
       " Added define-modify-macro and define-compiler-macro --sjl 5 Mar 92")
      (:MACREF NIL "define-compiler-macro") (:TERM NIL "form"))
     (:CELL NIL (:TERM NIL "macro lambda list")))
    (:ROW NIL
     (:CELL NIL (:MACREF NIL "define-modify-macro") (:TERM NIL "form"))
     (:CELL NIL (:TERM NIL "define-modify-macro lambda list"))))
   " " :PAR (:NEXTFIGURE (:CAPS T)) " lists some " (:TERM NIL "defined names")
   " that are applicable to " (:TERM NIL "lambda lists") ". " :PAR
   (:TABLE (:NAME ("Defined names applicable to lambda lists"))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " lambda-list-keywords"))
     (:CELL NIL (:FUNREF NIL "lambda-parameters-limit")) (:CELL NIL)))
   " " :PAR
   (:SUBSECTION
    (:TITLE ("Ordinary Lambda Lists") :TAGS (:ORDINARY-LAMBDA-LISTS)) " " :PAR
    "An " (:NEWTERM NIL "ordinary lambda list")
    " is used to describe how a set of " (:TERM NIL "arguments")
    " is received by an " (:TERM NIL "ordinary") " " (:TERM NIL "function")
    ". The " (:TERM NIL "defined names") " in " (:NEXTFIGURE NIL)
    " are those which use " (:TERM NIL "ordinary lambda lists") ": " :PAR
    (:COMMENT NIL
     "!!! This table is just a seed and probably incomplete. -kmp 2-Aug-91"
     "Added RESTART-CASE and HANDLER-CASE per Moon #9 (first public review). -kmp 6-May-93")
    (:TABLE (:NAME ("Standardized Operators that use Ordinary Lambda Lists"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " define-method-combination"))
      (:CELL NIL (:FUNREF NIL "handler-case"))
      (:CELL NIL (:FUNREF NIL "restart-case")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " defun"))
      (:CELL NIL (:FUNREF NIL "labels")) (:CELL NIL))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " flet"))
      (:CELL NIL (:FUNREF NIL "lambda")) (:CELL NIL)))
    " " :PAR "An " (:TERM NIL "ordinary lambda list") " can contain the "
    (:TERM NIL "lambda list keywords") " shown in " (:NEXTFIGURE NIL) ". " :PAR
    (:TABLE (:NAME ("Lambda List Keywords used by Ordinary Lambda Lists"))
     (:ROW NIL (:CELL NIL (:KEYREF NIL "allow-other-keys"))
      (:CELL NIL (:KEYREF NIL "key")) (:CELL NIL (:KEYREF NIL "rest")))
     (:ROW NIL (:CELL NIL (:KEYREF NIL "aux"))
      (:CELL NIL (:KEYREF NIL "optional")) (:CELL NIL)))
    " " :PAR "Each " (:TERM NIL "element") " of a " (:TERM NIL "lambda list")
    " is either a parameter specifier or a " (:TERM NIL "lambda list keyword")
    ". " (:COMMENT NIL "%5.2.2 26")
    "Implementations are free to provide additional "
    (:TERM NIL "lambda list keywords") ". For a list of all "
    (:TERM NIL "lambda list keywords") " used by the implementation, see "
    (:CONREF NIL "lambda-list-keywords") ". " :PAR "The syntax for "
    (:TERM NIL "ordinary lambda lists") " is as follows: " :PAR :PAR " "
    (:BNF (:NAME "lambda-list") "(" (:STAR NIL (:CURLY NIL (:PARAM NIL "var")))
     (:BR NIL) "  "
     (:BRAC NIL (:KEYWORD NIL " &optional") " "
      (:STAR NIL
       (:CURLY NIL (:PARAM NIL "var") " | "
        (:PAREN NIL (:PARAM NIL "var") " "
         (:BRAC NIL "init-form " (:BRAC NIL "supplied-p-parameter"))))))
     (:BR NIL) "  " (:BRAC NIL (:KEYWORD NIL " &rest") " " (:PARAM NIL "var"))
     (:BR NIL) "  " (:TT NIL "[") (:KEYWORD NIL " &key") " "
     (:STAR NIL
      (:CURLY NIL (:PARAM NIL "var") " | "
       (:PAREN NIL
        (:CURLY NIL (:PARAM NIL "var") " | "
         (:PAREN NIL (:PARAM NIL "keyword-name") " " (:PARAM NIL "var")))
        " " (:BRAC NIL "init-form " (:BRAC NIL "supplied-p-parameter")))))
     " " (:BRAC NIL (:KEYWORD NIL " &allow-other-keys")) (:TT NIL "]")
     (:BR NIL) "  "
     (:BRAC NIL (:KEYWORD NIL " &aux") " "
      (:STAR NIL
       (:CURLY NIL (:PARAM NIL "var") " | "
        (:PAREN NIL (:PARAM NIL "var") " "
         (:BRAC NIL (:PARAM NIL "init-form"))))))
     ")" (:BR NIL))
    " " :PAR (:COMMENT NIL "% 5.2.2 3") "A " (:PARAM NIL "var") " or "
    (:PARAM NIL "supplied-p-parameter") " must be a " (:TERM NIL "symbol")
    " that is not the name of a " (:TERM NIL "constant variable") ". " :PAR
    "An " (:PARAM NIL "init-form") " can be any " (:TERM NIL "form") ". "
    (:COMMENT NIL "% 5.2.2 22") "Whenever any " (:PARAM NIL "init-form")
    " is evaluated for any parameter specifier, that " (:TERM NIL "form")
    " may refer to any parameter variable to the left of the specifier in which the "
    (:PARAM NIL "init-form") " appears, including any "
    (:PARAM NIL "supplied-p-parameter")
    " variables, and may rely on the fact that no other parameter variable has yet been bound (including its own parameter variable). "
    :PAR "A " (:PARAM NIL "keyword-name") " can be any " (:TERM NIL "symbol")
    ", but by convention is normally a " (:TERM NIL "keyword") (:SUB NIL "1")
    "; all " (:TERM NIL "standardized") " " (:TERM NIL "functions")
    " follow that convention. " :PAR (:COMMENT NIL "% 5.2.2 4") "An "
    (:TERM NIL "ordinary lambda list")
    " has five parts, any or all of which may be empty. For information about the treatment of argument mismatches, see "
    (:SECREF NIL :FUNCALL-ERROR-CHECKING) ". " :PAR
    (:COMMENT NIL "% 5.2.2 9" "% 5.2.2 11") :PAR
    (:SUBSUBSECTION (:TITLE ("Specifiers for the required parameters"))
     "These are all the parameter specifiers up to the first "
     (:TERM NIL "lambda list keyword") "; if there are no "
     (:TERM NIL "lambda list keywords")
     ", then all the specifiers are for required parameters. Each required parameter is specified by a parameter variable "
     (:PARAM NIL "var") ". " (:PARAM NIL "var")
     " is bound as a lexical variable unless it is declared "
     (:DECLREF NIL "special") ". " :PAR
     (:COMMENT NIL
      "!!! Moon: There has been a cleanup that says when an error is signaled.")
     "If there are " (:TT NIL "n") " required parameters (" (:TT NIL "n")
     " may be zero), there must be at least " (:TT NIL "n")
     " passed arguments, and the required parameters are bound to the first "
     (:TT NIL "n") " passed arguments; see "
     (:SECREF NIL :FUNCALL-ERROR-CHECKING)
     ". The other parameters are then processed using any remaining arguments. "
     :PAR)
    :PAR (:COMMENT NIL "% 5.2.2 12")
    (:SUBSUBSECTION (:TITLE ("Specifiers for optional parameters"))
     (:IDXKEYREF NIL "optional") " " :PAR "If " (:KEYREF NIL "optional")
     " is present, the optional parameter specifiers are those following "
     (:KEYREF NIL "optional") " up to the next "
     (:TERM NIL "lambda list keyword")
     " or the end of the list. If optional parameters are specified, then each one is processed as follows. If any unprocessed arguments remain, then the parameter variable "
     (:PARAM NIL "var")
     " is bound to the next remaining argument, just as for a required parameter. If no arguments remain, however, then "
     (:PARAM NIL "init-form")
     " is evaluated, and the parameter variable is bound to the resulting value (or to "
     (:MISC NIL "nil") " if no " (:PARAM NIL "init-form")
     " appears in the parameter specifier). If another variable name "
     (:PARAM NIL "supplied-p-parameter")
     " appears in the specifier, it is bound to " (:TERM NIL "true")
     " if an argument had been available, and to " (:TERM NIL "false")
     " if no argument remained (and therefore " (:PARAM NIL "init-form")
     " had to be evaluated). " (:PARAM NIL "Supplied-p-parameter")
     " is bound not to an argument but to a value indicating whether or not an argument had been supplied for the corresponding "
     (:PARAM NIL "var") ". " :PAR)
    :PAR (:COMMENT NIL "% 5.2.2 13")
    (:SUBSUBSECTION (:TITLE ("A specifier for a rest parameter"))
     (:IDXKEYREF NIL "rest") " " :PAR (:KEYREF NIL "rest")
     ", if present, must be followed by a single " (:TERM NIL "rest parameter")
     " specifier, which in turn must be followed by another "
     (:TERM NIL "lambda list keyword") " or the end of the "
     (:TERM NIL "lambda list")
     ". After all optional parameter specifiers have been processed, then there may or may not be a "
     (:TERM NIL "rest parameter") ". If there is a "
     (:TERM NIL "rest parameter") ", it is bound to a " (:TERM NIL "list")
     " of all as-yet-unprocessed arguments. If no unprocessed arguments remain, the "
     (:TERM NIL "rest parameter") " is bound to the " (:TERM NIL "empty list")
     ". If there is no " (:TERM NIL "rest parameter") " and there are no "
     (:TERM NIL "keyword parameters") ", then an error "
     (:COMMENT NIL
      "% Per Barrett #10 -- the actual type is more specific, and specified elsewhere. -kmp 7-May-93"
      "\\oftype{error}")
     "should be signaled if any unprocessed arguments remain; see "
     (:SECREF NIL :FUNCALL-ERROR-CHECKING) ". The value of a "
     (:TERM NIL "rest parameter")
     " is permitted, but not required, to share structure with the last argument to "
     (:FUNREF NIL "apply") ". " :PAR)
    (:IDXKEYREF NIL "key") " " (:IDXKEYREF NIL "allow-other-keys") " " :PAR
    (:COMMENT NIL "% 5.2.2 14")
    (:SUBSUBSECTION (:TITLE ("Specifiers for keyword parameters"))
     (:ISSUE NIL "PLIST-DUPLICATES:ALLOW") " "
     (:COMMENT NIL
      "!!! I didn't integrate item 5 of PLIST-DUPLICATES because it seemed dangerous"
      "    to change this section for very little apparent gain.  There was no technical"
      "    change implied by that item. -kmp 14-Jul-93")
     "If " (:KEYREF NIL "key") " is present, all specifiers up to the next "
     (:TERM NIL "lambda list keyword") " or the end of the " (:TERM NIL "list")
     " are keyword parameter specifiers. When keyword parameters are processed, the same arguments are processed that would be made into a "
     (:TERM NIL "list") " for a " (:TERM NIL "rest parameter")
     ". It is permitted to specify both " (:KEYREF NIL "rest") " and "
     (:KEYREF NIL "key")
     ". In this case the remaining arguments are used for both purposes; that is, all remaining arguments are made into a "
     (:TERM NIL "list") " for the " (:TERM NIL "rest parameter")
     ", and are also processed for the " (:KEYREF NIL "key") " parameters. "
     (:ISSUE NIL "ARGUMENT-MISMATCH-ERROR-AGAIN:CONSISTENT") " If "
     (:KEYREF NIL "key")
     " is specified, there must remain an even number of arguments; see "
     (:SECREF NIL :ODD-NUMBER-OF-KEY-ARGS) ". "
     (:ENDISSUE NIL "ARGUMENT-MISMATCH-ERROR-AGAIN:CONSISTENT")
     " These arguments are considered as pairs, the first argument in each pair being interpreted as a name and the second as the corresponding value. The first "
     (:TERM NIL "object") " of each pair must be a " (:TERM NIL "symbol")
     "; see " (:SECREF NIL :INVALID-KEY-ARGS)
     ". The keyword parameter specifiers may optionally be followed by the "
     (:TERM NIL "lambda list keyword") " " (:KEYREF NIL "allow-other-keys")
     ". " :PAR (:COMMENT NIL "% 5.2.2 16")
     "In each keyword parameter specifier must be a name " (:PARAM NIL "var")
     " for the parameter variable. "
     (:ISSUE NIL "KEYWORD-ARGUMENT-NAME-PACKAGE:ANY") " If the "
     (:PARAM NIL "var") " appears alone or in a "
     (:TT NIL "(" (:PARAM NIL "var") " " (:PARAM NIL "init-form") ")")
     " combination, the keyword name used when matching "
     (:TERM NIL "arguments") " to " (:TERM NIL "parameters") " is a "
     (:TERM NIL "symbol") " in the " (:PACKREF NIL "keyword") " "
     (:TERM NIL "package") " whose " (:TERM NIL "name") " is the "
     (:TERM NIL "same") " (under " (:FUNREF NIL "string=") ") as "
     (:PARAM NIL "var") "'s. If the notation "
     (:TT NIL "((" (:PARAM NIL "keyword-name") " " (:PARAM NIL "var") ") "
      (:PARAM NIL "init-form") ")")
     " is used, then the keyword name used to match " (:TERM NIL "arguments")
     " to " (:TERM NIL "parameters") " is " (:PARAM NIL "keyword-name")
     ", which may be a " (:TERM NIL "symbol") " in any " (:TERM NIL "package")
     ". (Of course, if it is not a " (:TERM NIL "symbol") " in the "
     (:PACKREF NIL "keyword") " " (:TERM NIL "package")
     ", it does not necessarily self-evaluate, so care must be taken when calling the function to make sure that normal evaluation still yields the keyword name.) "
     (:ENDISSUE NIL "KEYWORD-ARGUMENT-NAME-PACKAGE:ANY") " Thus " :PAR
     (:CODE NIL " (defun foo (&key radix (type 'integer)) ...)
")
     " means exactly the same as " :PAR
     (:CODE NIL
      " (defun foo (&key ((:radix radix)) ((:type type) 'integer)) ...)
")
     " " :PAR
     "The keyword parameter specifiers are, like all parameter specifiers, effectively processed from left to right. For each keyword parameter specifier, if there is an argument pair whose name matches that specifier's name (that is, the names are "
     (:FUNREF NIL "eq")
     "), then the parameter variable for that specifier is bound to the second item (the value) of that argument pair. If more than one such argument pair matches, the leftmost argument pair is used. If no such argument pair exists, then the "
     (:PARAM NIL "init-form")
     " for that specifier is evaluated and the parameter variable is bound to that value (or to "
     (:MISC NIL "nil") " if no " (:PARAM NIL "init-form") " was specified). "
     (:PARAM NIL "supplied-p-parameter") " is treated as for "
     (:KEYREF NIL "optional") " parameters: it is bound to " (:TERM NIL "true")
     " if there was a matching argument pair, and to " (:TERM NIL "false")
     " otherwise. " :PAR (:COMMENT NIL "% 5.2.2 17")
     "Unless keyword argument checking is suppressed, an argument pair must a name matched by a parameter specifier; see "
     (:SECREF NIL :UNRECOGNIZED-KEY-ARGS) ". " :PAR
     (:COMMENT NIL "% 5.2.2 20"
      " This makes no sense any more because the text referred to has been"
      " rephrased and moved into its own section below.  -- sjl 3 Mar 92"
      " If either condition obtains,")
     "If keyword argument checking is suppressed, then it is permitted for an argument pair to match no parameter specifier, and the argument pair is ignored, but such an argument pair is accessible through the "
     (:TERM NIL "rest parameter")
     " if one was supplied. The purpose of these mechanisms is to allow sharing of argument lists among several "
     (:TERM NIL "lambda expressions")
     " and to allow either the caller or the called "
     (:TERM NIL "lambda expression")
     " to specify that such sharing may be taking place. " :PAR
     (:ISSUE NIL "ALLOW-OTHER-KEYS-NIL:PERMIT") " Note that if "
     (:KEYREF NIL "key") " is present, a keyword argument of "
     (:KWD NIL "allow-other-keys")
     " is always permitted—regardless of whether the associated value is "
     (:TERM NIL "true") " or " (:TERM NIL "false")
     ". However, if the value is " (:TERM NIL "false")
     ", other non-matching keywords are not tolerated (unless "
     (:KEYREF NIL "allow-other-keys") " was used). " :PAR
     "Furthermore, if the receiving argument list specifies a regular argument which would be flagged by "
     (:KWD NIL "allow-other-keys") ", then " (:KWD NIL "allow-other-keys")
     " has both its special-cased meaning (identifying whether additional keywords are permitted) and its normal meaning (data flow into the function in question). "
     (:ENDISSUE NIL "ALLOW-OTHER-KEYS-NIL:PERMIT") " "
     (:ENDISSUE NIL "PLIST-DUPLICATES:ALLOW") " " :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Suppressing Keyword Argument Checking") :TAGS
       (:SUPPRESSING-KEY-ARG-CHECKS))
      " " :PAR "If " (:KEYREF NIL "allow-other-keys") " was specified in the "
      (:TERM NIL "lambda list") " of a " (:TERM NIL "function") ", "
      (:TERM NIL "keyword") (:SUB NIL "2") " " (:TERM NIL "argument")
      " checking is suppressed in calls to that " (:TERM NIL "function") ". "
      :PAR "If the " (:KWD NIL "allow-other-keys") " " (:TERM NIL "argument")
      " is " (:TERM NIL "true") " in a call to a " (:TERM NIL "function") ", "
      (:TERM NIL "keyword") (:SUB NIL "2") " " (:TERM NIL "argument")
      " checking is suppressed "
      (:COMMENT NIL
       "% Clarified per Moon #10 (first public review). -kmp 6-May-93"
       "in calls to that \\term{function}.")
      "in that call. " :PAR "The " (:KWD NIL "allow-other-keys") " "
      (:TERM NIL "argument") " is permissible in all situations involving "
      (:TERM NIL "keyword") (:SUB NIL "2") " " (:TERM NIL "arguments")
      ", even when its associated " (:TERM NIL "value") " is "
      (:TERM NIL "false") ". " :PAR
      (:SUBSUBSUBSUBSECTION
       (:TITLE ("Examples of Suppressing Keyword Argument Checking"))
       (:CODE NIL
        ";;; The caller can supply :ALLOW-OTHER-KEYS T to suppress checking.
 ((lambda (&key x) x) :x 1 :y 2 :allow-other-keys t) → 1
;;; The callee can use &ALLOW-OTHER-KEYS to suppress checking.
 ((lambda (&key x &allow-other-keys) x) :x 1 :y 2) → 1
;;; :ALLOW-OTHER-KEYS NIL is always permitted.
 ((lambda (&key) t) :allow-other-keys nil) → T
;;; As with other keyword arguments, only the left-most pair
;;; named :ALLOW-OTHER-KEYS has any effect.
 ((lambda (&key x) x) 
  :x 1 :y 2 :allow-other-keys t :allow-other-keys nil)
→ 1
;;; Only the left-most pair named :ALLOW-OTHER-KEYS has any effect,
;;; so in safe code this signals a PROGRAM-ERROR (and might enter the
;;; debugger).  In unsafe code, the consequences are undefined.
 ((lambda (&key x) x)                   ;This call is not valid
  :x 1 :y 2 :allow-other-keys nil :allow-other-keys t)
")
       " " :PAR)
      :PAR)
     :PAR)
    :PAR (:COMMENT NIL "% 5.2.2 21")
    (:SUBSUBSECTION
     (:TITLE ("Specifiers for " (:KEYREF NIL "aux") " variables"))
     (:IDXKEYREF NIL "aux") " " :PAR "These are not really parameters. If the "
     (:TERM NIL "lambda list keyword") " " (:KEYREF NIL "aux")
     " is present, all specifiers after it are auxiliary variable specifiers. After all parameter specifiers have been processed, the auxiliary variable specifiers (those following "
     (:KEYWORD NIL " &aux")
     ") are processed from left to right. For each one, "
     (:PARAM NIL "init-form") " is evaluated and " (:PARAM NIL "var")
     " is bound to that value (or to " (:MISC NIL "nil") " if no "
     (:PARAM NIL "init-form") " was specified). " (:KEYREF NIL "aux")
     " variable processing is analogous to " (:SPECREF NIL "let*")
     " processing. " :PAR
     (:CODE NIL " (lambda (x y &aux (a (car x)) (b 2) c) (list x y a b c))
    ≡ (lambda (x y) (let* ((a (car x)) (b 2) c) (list x y a b c)))
")
     " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of Ordinary Lambda Lists"))
     "Here are some examples involving " (:TERM NIL "optional parameters")
     " and " (:TERM NIL "rest parameters") ": " :PAR
     (:CODE NIL " ((lambda (a b) (+ a (* b 3))) 4 5) → 19
 ((lambda (a &optional (b 2)) (+ a (* b 3))) 4 5) → 19
 ((lambda (a &optional (b 2)) (+ a (* b 3))) 4) → 10
 ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x)))
→ (2 NIL 3 NIL NIL)
 ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x)) 6)
→ (6 T 3 NIL NIL)
 ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x)) 6 3)
→ (6 T 3 T NIL)
 ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x)) 6 3 8)
→ (6 T 3 T (8))
 ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x))
  6 3 8 9 10 11)
→ (6 t 3 t (8 9 10 11))
")
     " " :PAR "Here are some examples involving "
     (:TERM NIL "keyword parameters") ": " :PAR
     (:CODE NIL " ((lambda (a b &key c d) (list a b c d)) 1 2) → (1 2 NIL NIL)
 ((lambda (a b &key c d) (list a b c d)) 1 2 :c 6) → (1 2 6 NIL)
 ((lambda (a b &key c d) (list a b c d)) 1 2 :d 8) → (1 2 NIL 8)
 ((lambda (a b &key c d) (list a b c d)) 1 2 :c 6 :d 8) → (1 2 6 8)
 ((lambda (a b &key c d) (list a b c d)) 1 2 :d 8 :c 6) → (1 2 6 8)
 ((lambda (a b &key c d) (list a b c d)) :a 1 :d 8 :c 6) → (:a 1 6 8)
 ((lambda (a b &key c d) (list a b c d)) :a :b :c :d) → (:a :b :d NIL)
 ((lambda (a b &key ((:sea c)) d) (list a b c d)) 1 2 :sea 6) → (1 2 6 NIL)
 ((lambda (a b &key ((c c)) d) (list a b c d)) 1 2 'c 6) → (1 2 6 NIL)
")
     " " :PAR "Here are some examples involving "
     (:TERM NIL "optional parameters") ", " (:TERM NIL "rest parameters")
     ", and " (:TERM NIL "keyword parameters") " together: " :PAR
     (:CODE NIL " ((lambda (a &optional (b 3) &rest x &key c (d a))
    (list a b c d x)) 1)   
→ (1 3 NIL 1 ()) 
 ((lambda (a &optional (b 3) &rest x &key c (d a))
    (list a b c d x)) 1 2)
→ (1 2 NIL 1 ())
 ((lambda (a &optional (b 3) &rest x &key c (d a))
    (list a b c d x)) :c 7)
→ (:c 7 NIL :c ())
 ((lambda (a &optional (b 3) &rest x &key c (d a))
    (list a b c d x)) 1 6 :c 7)
→ (1 6 7 1 (:c 7))
 ((lambda (a &optional (b 3) &rest x &key c (d a))
    (list a b c d x)) 1 6 :d 8)
→ (1 6 NIL 8 (:d 8))
 ((lambda (a &optional (b 3) &rest x &key c (d a))
    (list a b c d x)) 1 6 :d 8 :c 9 :d 10)
→ (1 6 9 8 (:d 8 :c 9 :d 10))
")
     " " :PAR (:COMMENT NIL "% 5.2.2 28") "As an example of the use of "
     (:KEYREF NIL "allow-other-keys") " and " (:KWD NIL "allow-other-keys")
     ", consider a " (:TERM NIL "function")
     " that takes two named arguments of its own and also accepts additional named arguments to be passed to "
     (:FUNREF NIL "make-array") ": " :PAR
     (:CODE NIL " (defun array-of-strings (str dims &rest named-pairs
                          &key (start 0) end &allow-other-keys)
   (apply #'make-array dims
          :initial-element (subseq str start end)
          :allow-other-keys t
          named-pairs))
")
     " " :PAR "This " (:TERM NIL "function") " takes a " (:TERM NIL "string")
     " and dimensioning information and returns an " (:TERM NIL "array")
     " of the specified dimensions, each of whose elements is the specified "
     (:TERM NIL "string") ". However, " (:KWD NIL "start") " and "
     (:KWD NIL "end")
     " named arguments may be used to specify that a substring of the given "
     (:TERM NIL "string") " should be used. In addition, the presence of "
     (:KEYREF NIL "allow-other-keys") " in the " (:TERM NIL "lambda list")
     " indicates that the caller may supply additional named arguments; the "
     (:TERM NIL "rest parameter")
     " provides access to them. These additional named arguments are passed to "
     (:FUNREF NIL "make-array") ". The " (:TERM NIL "function") " "
     (:FUNREF NIL "make-array") " normally does not allow the named arguments "
     (:KWD NIL "start") " and " (:KWD NIL "end")
     " to be used, and an error should be signaled if such named arguments are supplied to "
     (:FUNREF NIL "make-array") ". However, the presence in the call to "
     (:FUNREF NIL "make-array") " of the named argument "
     (:KWD NIL "allow-other-keys") " with a " (:TERM NIL "true")
     " value causes any extraneous named arguments, including "
     (:KWD NIL "start") " and " (:KWD NIL "end")
     ", to be acceptable and ignored. " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Generic Function Lambda Lists") :TAGS (:GF-LAMBDA-LISTS)) " "
    :PAR "A " (:NEWTERM NIL "generic function lambda list")
    " is used to describe the overall shape of the argument list to be accepted by a "
    (:TERM NIL "generic function") ". Individual " (:TERM NIL "method") " "
    (:TERM NIL "signatures") " might contribute additional "
    (:TERM NIL "keyword parameters") " to the " (:TERM NIL "lambda list")
    " of the " (:TERM NIL "effective method") ". " :PAR
    (:COMMENT NIL
     "% Might as well not use a table while there's only one. -kmp 15-Feb-92")
    "A " (:TERM NIL "generic function lambda list") " is used by "
    (:MACREF NIL "defgeneric") ". "
    (:COMMENT NIL
     " \\Thenextfigure\\ lists the \\term{operators} that use \\term{generic function lambda lists}."
     " "
     " %!!! This table is just a seed and might be incomplete. -kmp 2-Aug-91"
     " \\issue{GENERIC-FLET-POORLY-DESIGNED:DELETE}"
     " \\displaythree{Standardized Operators that use Generic Function Lambda Lists}{"
     " defgeneric&&\\cr" " % defgeneric&generic-function&\\cr"
     " % generic-flet&generic-labels&\\cr" " }"
     " \\endissue{GENERIC-FLET-POORLY-DESIGNED:DELETE}")
    :PAR "A " (:TERM NIL "generic function lambda list")
    " has the following syntax: " :PAR :PAR " "
    (:BNF (:NAME "lambda-list") "(" (:STAR NIL (:CURLY NIL (:PARAM NIL "var")))
     (:BR NIL) "  "
     (:BRAC NIL (:KEYWORD NIL " &optional") " "
      (:STAR NIL
       (:CURLY NIL (:PARAM NIL "var") " | " (:PAREN NIL (:PARAM NIL "var")))))
     (:BR NIL) "  " (:BRAC NIL (:KEYWORD NIL " &rest") " " (:PARAM NIL "var"))
     (:BR NIL) "  " (:TT NIL "[") (:KEYWORD NIL " &key") " "
     (:STAR NIL
      (:CURLY NIL (:PARAM NIL "var") " | "
       (:PAREN NIL
        (:CURLY NIL (:PARAM NIL "var") " | "
         (:PAREN NIL (:PARAM NIL "keyword-name") " " (:PARAM NIL "var"))))))
     " " (:BRAC NIL (:KEYWORD NIL " &allow-other-keys")) (:TT NIL "]") ")"
     (:BR NIL))
    " " :PAR "A " (:TERM NIL "generic function lambda list")
    " can contain the " (:TERM NIL "lambda list keywords") " shown in "
    (:NEXTFIGURE NIL) ". " :PAR
    (:TABLE
     (:NAME ("Lambda List Keywords used by Generic Function Lambda Lists"))
     (:ROW NIL (:CELL NIL (:KEYREF NIL "allow-other-keys"))
      (:CELL NIL (:KEYREF NIL "optional")) (:CELL NIL))
     (:ROW NIL (:CELL NIL (:KEYREF NIL "key")) (:CELL NIL (:KEYREF NIL "rest"))
      (:CELL NIL)))
    " " :PAR "A " (:TERM NIL "generic function lambda list")
    " differs from an " (:TERM NIL "ordinary lambda list")
    " in the following ways: " :PAR
    (:LIST NIL
     (:ITEM NIL (:B NIL " Required arguments") " " :PAR
      (:COMMENT NIL " %Per Barmar. -kmp 28-Dec-90" " %At least one"
       "% Per Moon. -kmp 16-Feb-92")
      "Zero or more " (:TERM NIL "required parameters") " must be specified. "
      :PAR)
     (:ITEM NIL (:B NIL " Optional and keyword arguments") " " :PAR
      (:TERM NIL "Optional parameters") " and "
      (:TERM NIL "keyword parameters")
      " may not have default initial value forms nor use supplied-p parameters. "
      :PAR)
     (:ITEM NIL (:B NIL " Use of " (:KEYREF NIL "aux")) " " :PAR "The use of "
      (:KEYREF NIL "aux") " is not allowed. "))
    " " :PAR)
   :PAR " "
   (:SUBSECTION
    (:TITLE ("Specialized Lambda Lists") :TAGS (:SPECIALIZED-LAMBDA-LISTS)) " "
    :PAR "A " (:NEWTERM NIL "specialized lambda list") " is used to "
    (:TERM NIL "specialize") " a " (:TERM NIL "method") " for a particular "
    (:TERM NIL "signature") " and to describe how " (:TERM NIL "arguments")
    " matching that " (:TERM NIL "signature") " are received by the "
    (:TERM NIL "method") ". The " (:TERM NIL "defined names") " in "
    (:NEXTFIGURE NIL) " use " (:TERM NIL "specialized lambda lists")
    " in some way; see the dictionary entry for each for information about how. "
    :PAR
    (:COMMENT NIL
     "!!! This table is just a seed and probably incomplete. -kmp 2-Aug-91")
    (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
    (:TABLE
     (:NAME ("Standardized Operators that use Specialized Lambda Lists"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " defmethod"))
      (:CELL NIL (:FUNREF NIL "defgeneric")) (:CELL NIL)))
    " "
    (:COMMENT NIL
     " GENERIC-FUNCTION, GENERIC-FLET, and GENERIC-LABELS removed.")
    (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " " :PAR "A "
    (:TERM NIL "specialized lambda list") " can contain the "
    (:TERM NIL "lambda list keywords") " shown in " (:NEXTFIGURE NIL) ". " :PAR
    (:TABLE (:NAME ("Lambda List Keywords used by Specialized Lambda Lists"))
     (:ROW NIL (:CELL NIL (:KEYREF NIL "allow-other-keys"))
      (:CELL NIL (:KEYREF NIL "key")) (:CELL NIL (:KEYREF NIL "rest")))
     (:ROW NIL (:CELL NIL (:KEYREF NIL "aux"))
      (:CELL NIL (:KEYREF NIL "optional")) (:CELL NIL)))
    " " :PAR "A " (:TERM NIL "specialized lambda list")
    " is syntactically the same as an " (:TERM NIL "ordinary lambda list")
    " except that each " (:TERM NIL "required parameter")
    " may optionally be associated with a " (:TERM NIL "class") " or "
    (:TERM NIL "object") " for which that " (:TERM NIL "parameter") " is "
    (:TERM NIL "specialized") ". " :PAR :PAR " "
    (:BNF (:NAME "lambda-list") "("
     (:STAR NIL
      (:CURLY NIL (:PARAM NIL "var") " | "
       (:PAREN NIL (:PARAM NIL "var") " "
        (:BRAC NIL (:PARAM NIL "specializer")))))
     (:BR NIL) " "
     (:BRAC NIL (:KEYWORD NIL " &optional") " "
      (:STAR NIL
       (:CURLY NIL (:PARAM NIL "var") " | "
        (:PAREN NIL (:PARAM NIL "var") " "
         (:BRAC NIL "init-form " (:BRAC NIL "supplied-p-parameter"))))))
     (:BR NIL) " " (:BRAC NIL (:KEYWORD NIL " &rest") " " (:PARAM NIL "var"))
     (:BR NIL) " "
     (:BRAC NIL (:KEYWORD NIL " &key") " "
      (:STAR NIL
       (:CURLY NIL (:PARAM NIL "var") " | "
        (:PAREN NIL
         (:CURLY NIL (:PARAM NIL "var") " | "
          (:PAREN NIL (:PARAM NIL "keyword-name") " " (:PARAM NIL "var")))
         " " (:BRAC NIL "init-form " (:BRAC NIL "supplied-p-parameter")))))
      " " (:BRAC NIL (:KEYWORD NIL " &allow-other-keys")))
     (:BR NIL) " "
     (:BRAC NIL (:KEYWORD NIL " &aux") " "
      (:STAR NIL
       (:CURLY NIL (:PARAM NIL "var") " | "
        (:PAREN NIL (:PARAM NIL "var") " "
         (:BRAC NIL (:PARAM NIL "init-form"))))))
     ")" (:BR NIL))
    " " :PAR (:COMMENT NIL "!!! Need to write more.") :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Macro Lambda Lists") :TAGS
     (:MACRO-LAMBDA-LISTS :EXTRA-DESTRUCTURE-INFO))
    " " :PAR "A " (:NEWTERM NIL "macro lambda list") " is used in describing "
    (:TERM NIL "macros") " defined by the " (:TERM NIL "operators") " in "
    (:NEXTFIGURE NIL) ". " :PAR
    (:COMMENT NIL
     "!!! This table is just a seed and probably incomplete. -kmp 2-Aug-91"
     " I added define-compiler-macro --sjl 5 Mar 92")
    (:TABLE (:NAME ("Operators that use Macro Lambda Lists"))
     (:ROW NIL (:CELL NIL (:MACREF NIL " define-compiler-macro"))
      (:CELL NIL (:MACREF NIL "defmacro"))
      (:CELL NIL (:SPECREF NIL "macrolet")))
     (:ROW NIL (:CELL NIL (:MACREF NIL " define-setf-expander")) (:CELL NIL)
      (:CELL NIL)))
    " " :PAR "With the additional restriction that an "
    (:TERM NIL "environment parameter")
    " may appear only once (at any of the positions indicated), a "
    (:TERM NIL "macro lambda list") " has the following syntax: " :PAR
    (:COMMENT NIL "% Some changes here per X3J13. -kmp 05-Oct-93") :PAR "  "
    (:BNF (:NAME "reqvars")
     (:STAR NIL (:CURLY NIL (:PARAM NIL "var") " | " (:DOWN NIL "pattern"))))
    " "
    (:BNF (:NAME "optvars")
     (:BRAC NIL (:KEYWORD NIL " &optional") " "
      (:STAR NIL
       (:CURLY NIL (:PARAM NIL "var") " | "
        (:PAREN NIL (:CURLY NIL (:PARAM NIL "var") " | " (:DOWN NIL "pattern"))
         " " (:BRAC NIL "init-form " (:BRAC NIL "supplied-p-parameter")))))))
    " "
    (:BNF (:NAME "restvar")
     (:BRAC NIL
      (:CURLY NIL (:KEYWORD NIL " &rest") " | " (:KEYWORD NIL " &body")) " "
      (:PARAM NIL
       (:CURLY NIL (:PARAM NIL "var") " | " (:DOWN NIL "pattern")))))
    " "
    (:BNF (:NAME "keyvars") "[" (:KEYWORD NIL " &key") " "
     (:STAR NIL
      (:CURLY NIL (:PARAM NIL "var") " | "
       (:PAREN NIL
        (:CURLY NIL (:PARAM NIL "var") " | "
         (:PAREN NIL (:PARAM NIL "keyword-name") " "
          (:CURLY NIL (:PARAM NIL "var") " | " (:DOWN NIL "pattern"))))
        " " (:BRAC NIL "init-form " (:BRAC NIL "supplied-p-parameter")))))
     (:BR NIL) " " (:BRAC NIL (:KEYWORD NIL " &allow-other-keys")) "]")
    " "
    (:BNF (:NAME "auxvars")
     (:BRAC NIL (:KEYWORD NIL " &aux") " "
      (:STAR NIL
       (:CURLY NIL (:PARAM NIL "var") " | "
        (:PAREN NIL (:CURLY NIL (:PARAM NIL "var") " | " (:DOWN NIL "pattern"))
         " " (:BRAC NIL (:PARAM NIL "init-form")))))))
    " "
    (:BNF (:NAME "envvar")
     (:BRAC NIL (:KEYWORD NIL " &environment") " " (:PARAM NIL "var")))
    " "
    (:COMMENT NIL
     "Per X3J13 (05-Oct-93), prohibit destructuring of whole variable. -kmp")
    (:BNF (:NAME "wholevar")
     (:BRAC NIL (:KEYWORD NIL " &whole") " " (:PARAM NIL "var")))
    " "
    (:BNF (:NAME "lambda-list") "(" (:DOWN NIL "wholevar") " "
     (:DOWN NIL "envvar") " " (:DOWN NIL "reqvars") " " (:DOWN NIL "envvar")
     " " (:DOWN NIL "optvars") " " (:DOWN NIL "envvar") (:BR NIL) " "
     (:DOWN NIL "restvar") " " (:DOWN NIL "envvar") " " (:DOWN NIL "keyvars")
     " " (:DOWN NIL "envvar") " " (:DOWN NIL "auxvars") " "
     (:DOWN NIL "envvar") ") |" (:BR NIL) " (" (:DOWN NIL "wholevar") " "
     (:DOWN NIL "envvar") " " (:DOWN NIL "reqvars") " " (:DOWN NIL "envvar")
     " " (:DOWN NIL "optvars") " " (:DOWN NIL "envvar") " " (:TT NIL ".") " "
     (:COMMENT NIL "Per x3j13, \"\\down{restvar}\" => \"var\"")
     (:PARAM NIL "var") ")")
    " "
    (:BNF (:NAME "pattern")
     (:PAREN NIL (:DOWN NIL "wholevar") " " (:DOWN NIL "reqvars") " "
      (:DOWN NIL "optvars") " " (:DOWN NIL "restvar") " " (:DOWN NIL "keyvars")
      " " (:DOWN NIL "auxvars"))
     " |" (:BR NIL) " "
     (:PAREN NIL (:DOWN NIL "wholevar") " " (:DOWN NIL "reqvars") " "
      (:DOWN NIL "optvars") " " (:TT NIL ".") " "
      (:COMMENT NIL "Per x3j13, \"\\down{restvar}\" => \"var\"")
      (:PARAM NIL "var")))
    "  " :PAR " " :PAR "A " (:TERM NIL "macro lambda list") " can contain the "
    (:TERM NIL "lambda list keywords") " shown in " (:NEXTFIGURE NIL) ". " :PAR
    (:TABLE (:NAME ("Lambda List Keywords used by Macro Lambda Lists"))
     (:ROW NIL (:CELL NIL (:KEYREF NIL "allow-other-keys"))
      (:CELL NIL (:KEYREF NIL "environment")) (:CELL NIL (:KEYREF NIL "rest")))
     (:ROW NIL (:CELL NIL (:KEYREF NIL "aux")) (:CELL NIL (:KEYREF NIL "key"))
      (:CELL NIL (:KEYREF NIL "whole")))
     (:ROW NIL (:CELL NIL (:KEYREF NIL "body"))
      (:CELL NIL (:KEYREF NIL "optional")) (:CELL NIL)))
    " " :PAR (:TERM NIL "Optional parameters") " (introduced by "
    (:KEYREF NIL "optional") ") and " (:TERM NIL "keyword parameters")
    " (introduced by " (:KEYREF NIL "key") ") can be supplied in a "
    (:TERM NIL "macro lambda list") ", just as in an "
    (:TERM NIL "ordinary lambda list")
    ". Both may contain default initialization forms and "
    (:TERM NIL "supplied-p parameters") ". " :PAR (:COMMENT NIL "% 8.1.0 10")
    (:KEYREF NIL "body") (:IDXKEYREF NIL "body")
    " is identical in function to " (:KEYREF NIL "rest")
    ", but it can be used to inform certain output-formatting and editing functions that the remainder of the "
    (:TERM NIL "form")
    " is treated as a body, and should be indented accordingly. Only one of "
    (:KEYREF NIL "body") " or " (:KEYREF NIL "rest")
    " can be used at any particular level; see "
    (:SECREF NIL :DESTRUCTURING-BY-LAMBDA-LISTS) ". "
    (:ISSUE NIL "DEFMACRO-LAMBDA-LIST:TIGHTEN-DESCRIPTION") " "
    (:KEYREF NIL "body") " can appear at any level of a "
    (:TERM NIL "macro lambda list") "; for details, see "
    (:SECREF NIL :DESTRUCTURING-BY-LAMBDA-LISTS) ". "
    (:ENDISSUE NIL "DEFMACRO-LAMBDA-LIST:TIGHTEN-DESCRIPTION") " " :PAR
    (:COMMENT NIL "% 8.1.0 11") (:KEYREF NIL "whole") (:IDXKEYREF NIL "whole")
    " is followed by a single variable that is bound to the entire macro-call form; this is the value that the "
    (:TERM NIL "macro function") " receives as its first argument. "
    (:ISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " "
    (:COMMENT NIL
     "\\keyref{whole} and the following variable should appear first in the \\term{lambda list},")
    "If " (:KEYREF NIL "whole")
    " and a following variable appear, they must appear first in "
    (:PARAM NIL "lambda-list") ", "
    (:ENDISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92")
    " before any other parameter or " (:TERM NIL "lambda list keyword") ". "
    (:ISSUE NIL "DEFMACRO-LAMBDA-LIST:TIGHTEN-DESCRIPTION") " "
    (:KEYREF NIL "whole") " can appear at any level of a "
    (:TERM NIL "macro lambda list") ". At inner levels, the "
    (:KEYREF NIL "whole")
    " variable is bound to the corresponding part of the argument, as with "
    (:KEYREF NIL "rest") ", but unlike " (:KEYREF NIL "rest")
    ", other arguments are also allowed. The use of " (:KEYREF NIL "whole")
    " does not affect the pattern of arguments specified. "
    (:COMMENT NIL "% Per moon" "by \\macref{defmacro}.")
    (:ENDISSUE NIL "DEFMACRO-LAMBDA-LIST:TIGHTEN-DESCRIPTION") " " :PAR
    (:COMMENT NIL "% 8.1.0 12") (:KEYREF NIL "environment")
    (:IDXKEYREF NIL "environment")
    " is followed by a single variable that is bound to an "
    (:TERM NIL "environment") " representing the "
    (:TERM NIL "lexical environment") " in which the "
    (:COMMENT NIL
     " I have clarified the bit about compilation environments below, so this"
     " is no longer necessary.  --sjl 5 Mar 92"
     " macro call is to be interpreted---this is either the \\term{lexical environment}"
     " or the compilation \\term{environment}.")
    "macro call is to be interpreted. This " (:TERM NIL "environment") " "
    (:COMMENT NIL "%sandra's suggested deletion" "might not be the"
     "complete \\term{lexical environment}; it ")
    "should be used with " (:ISSUE NIL "MACRO-FUNCTION-ENVIRONMENT:YES") " "
    (:FUNREF NIL "macro-function") ", "
    (:ENDISSUE NIL "MACRO-FUNCTION-ENVIRONMENT:YES") " "
    (:ISSUE NIL "GET-SETF-METHOD-ENVIRONMENT:ADD-ARG") " "
    (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
    (:FUNREF NIL "get-setf-expansion") ", "
    (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
    (:ENDISSUE NIL "GET-SETF-METHOD-ENVIRONMENT:ADD-ARG") " "
    (:ISSUE NIL "SYNTACTIC-ENVIRONMENT-ACCESS:RETRACTED-MAR91") " "
    (:COMMENT NIL " \\funref{variable-information}, "
     " \\funref{function-information}, \\funref{declaration-information},"
     " \\funref{augment-environment}, \\funref{parse-macro}, \\funref{enclose}")
    (:ENDISSUE NIL "SYNTACTIC-ENVIRONMENT-ACCESS:RETRACTED-MAR91") " "
    (:ISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89") " "
    (:FUNREF NIL "compiler-macro-function") ", "
    (:COMMENT NIL
     "\\funref{compiler-macroexpand}, \\funref{compiler-macroexpand-1},")
    (:ENDISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89") " and "
    (:FUNREF NIL "macroexpand") " "
    (:COMMENT NIL " !!! Sandra:"
     "   This isn't correct.  Environments should also be used with things like"
     "   SUBTYPEP and CONSTANTP, and not \"only\" to make local macro definitions"
     "   available."
     " I have reworded this; see replacement text below.  --sjl 5 Mar 92"
     " for the sake of any local macro definitions"
     " that the \\specref{macrolet} \\term{form} might have"
     " established within that  \\term{environment}.  ")
    "(for example) in computing the expansion of the macro, to ensure that any "
    (:TERM NIL "lexical bindings") " or definitions established in the "
    (:TERM NIL "compilation environment") " are taken into account. "
    (:ISSUE NIL "DEFMACRO-LAMBDA-LIST:TIGHTEN-DESCRIPTION") " "
    (:KEYREF NIL "environment") " can only appear at the top level of a "
    (:TERM NIL "macro lambda list")
    ", and can only appear once, but can appear anywhere in that list; "
    (:ENDISSUE NIL "DEFMACRO-LAMBDA-LIST:TIGHTEN-DESCRIPTION") " "
    (:ISSUE NIL "&ENVIRONMENT-BINDING-ORDER:FIRST") " the "
    (:KEYREF NIL "environment") " " (:TERM NIL "parameter") " is "
    (:TERM NIL "bound") " along with " (:KEYREF NIL "whole")
    " before any other " (:TERM NIL "variables") " in the "
    (:TERM NIL "lambda list") ", regardless of where "
    (:KEYREF NIL "environment") " appears in the " (:TERM NIL "lambda list")
    ". " (:ENDISSUE NIL "&ENVIRONMENT-BINDING-ORDER:FIRST") " "
    (:ISSUE NIL "MACRO-ENVIRONMENT-EXTENT:DYNAMIC") " The "
    (:TERM NIL "object") " that is bound to the "
    (:TERM NIL "environment parameter") " has " (:TERM NIL "dynamic extent")
    ". "
    (:COMMENT NIL "% Moon: Redundant." " the consequences are undefined if "
     " the \\term{object} that is bound to the"
     " \\term{environment parameter} is referred to outside the \\term{dynamic extent} "
     " of the macro call.")
    (:ENDISSUE NIL "MACRO-ENVIRONMENT-EXTENT:DYNAMIC") " " :PAR
    (:COMMENT NIL "% 8.1.0 24") "Destructuring allows a "
    (:TERM NIL "macro lambda list")
    " to express the structure of a macro call syntax. If no "
    (:TERM NIL "lambda list keywords") " appear, then the "
    (:TERM NIL "macro lambda list") " is a " (:TERM NIL "tree")
    " containing parameter names at the leaves. "
    (:COMMENT NIL
     "The following wording revised to be more explicit. -kmp 2-Aug-91")
    "The pattern and the " (:TERM NIL "macro form") " must have compatible "
    (:TERM NIL "tree structure") "; that is, their "
    (:TERM NIL "tree structure")
    " must be equivalent, or it must differ only in that some "
    (:TERM NIL "leaves") " of the pattern match " (:TERM NIL "non-atomic") " "
    (:TERM NIL "objects") " of the " (:TERM NIL "macro form") ". "
    (:ISSUE NIL "ARGUMENT-MISMATCH-ERROR-AGAIN:CONSISTENT")
    " For information about error detection in this " (:TERM NIL "situation")
    ", see " (:SECREF NIL :DESTRUCTURING-MISMATCH) ". "
    (:ENDISSUE NIL "ARGUMENT-MISMATCH-ERROR-AGAIN:CONSISTENT") " " :PAR
    (:COMMENT NIL
     " I thought it was important to mention that macro lambda lists can be"
     " dotted before talking about the restriction about dotted macro forms"
     " below.  This paragraph was formerly in its own subsection at the very"
     " end.  --sjl 5 Mar 92")
    :PAR " "
    (:COMMENT NIL "% 8.1.0 15"
     "Destructuring specifies that \\macref{defmacro} allows any \\term{lambda list}"
     "% For Moon:")
    "A destructuring " (:TERM NIL "lambda list")
    " (whether at top level or embedded) " (:COMMENT NIL "to")
    "can be dotted, ending in a parameter name. This situation is treated exactly as if the parameter name that ends the "
    (:TERM NIL "list") " had appeared preceded by " (:KEYREF NIL "rest") ". "
    :PAR
    (:COMMENT NIL
     "!!! Barmar suggests changing \"subexpression\" to \"subform\" here."
     "    He writes:  The point is that the automatic destructuring can only handle"
     "     dotted lists when &rest or .var are used, or when the dotted list is a subform"
     "     that matches a variable in the lambda list.")
    (:ISSUE NIL "DOTTED-MACRO-FORMS:ALLOW") " It is permissible for a "
    (:TERM NIL "macro") " " (:TERM NIL "form") " (or a "
    (:TERM NIL "subexpression") " of a " (:TERM NIL "macro") " "
    (:TERM NIL "form") ") to be a " (:TERM NIL "dotted list") " only when "
    (:TT NIL "(... &rest var)") " or " (:TT NIL "(... . var)")
    " is used to match it. It is the responsibility of the "
    (:TERM NIL "macro") " to recognize and deal with such situations. "
    (:EDITORNOTE NIL
     "KMP: Apparently the dotted-macro-forms cleanup doesn't allow for the macro to `manually' notice dotted forms and fix them as well. It shouldn't be required that this be done only by &REST or a dotted pattern; it should only matter that ultimately the non-macro result of a full-macro expansion not contain dots. Anyway, I plan to address this editorially unless someone raises an objection.")
    (:COMMENT NIL "!!! 16-Jan-91") (:ENDISSUE NIL "DOTTED-MACRO-FORMS:ALLOW")
    " " :PAR
    (:SUBSUBSECTION
     (:TITLE ("Destructuring by Lambda Lists") :TAGS
      (:DESTRUCTURING-BY-LAMBDA-LISTS))
     " " :PAR
     (:COMMENT NIL "% 8.1.0 14"
      " minor rewording to use new terminology -- sjl 5 Mar 92")
     "Anywhere in a " (:TERM NIL "macro lambda list")
     " where a parameter name can appear, and where "
     (:TERM NIL "ordinary lambda list") " syntax (as described in "
     (:SECREF NIL :ORDINARY-LAMBDA-LISTS) ") does not otherwise allow a "
     (:TERM NIL "list") ", a " (:TERM NIL "destructuring lambda list")
     " can appear in place of the parameter name. When this is done, then the argument that would match the parameter is treated as a (possibly dotted) "
     (:TERM NIL "list")
     ", to be used as an argument list for satisfying the parameters in the embedded "
     (:TERM NIL "lambda list") ". This is known as destructuring. " :PAR
     (:COMMENT NIL "%% Moon's destructuring wording") :PAR
     (:COMMENT NIL "Note that data-directed destructuring"
      "is what Common Lisp has, and you would not want to include the parts"
      "about program-directed destructuring, which Common Lisp has not adopted."
      "Lambda-list-directed destructuring is what defmacro and destructuring-bind"
      "do in Common Lisp.")
     :PAR "Destructuring is the process of decomposing a compound "
     (:TERM NIL "object")
     " into its component parts, using an abbreviated, declarative syntax, rather than writing it out by hand using the primitive component-accessing functions. Each component part is bound to a variable. "
     (:COMMENT NIL
      " I don't believe the following two sentences are relevant to the"
      " current state of Common Lisp.  --sjl 5 Mar 92" " The variables"
      " can either be \\term{assigned} or \\term{bound}.  As an extension, some "
      " component parts can be ignored and not assigned to a variable.")
     :PAR
     (:COMMENT NIL "% KAB wanted this flushed. -kmp 9-Feb-92"
      " Destructuring is most often used to take apart \\term{trees}."
      " However it also makes sense to destructure \\term{vectors}"
      " and \\macref{defstruct}-defined structures.  "
      " Note that in the latter case an \\term{object} is being destructured"
      " whose components are identified by name,"
      " rather than by position as in the case of "
      " \\term{trees} and \\term{vectors}.  "
      "%Barmar wanted this flushed since it isn't valid. I concur. -kmp 28-Dec-90"
      " In fact"
      " the idea of destructuring can sensibly be extended to compound objects"
      " that are not primitive \\term{objects} of Lisp, "
      " but have conceptual components."
      " Thus a \\term{rational} number can be destructured into its numerator and"
      " denominator, a \\term{two-way stream} "
      " into its input and output components, a"
      " byte specifier into its position and size, or"
      " the multiple values of a \\term{function} into the individual values.  The"
      " important point is that the conceptual operation of extracting several"
      " components of a compound \\term{object} is common to all of these applications.")
     :PAR
     (:COMMENT NIL "Destructuring of \\term{trees} "
      "is especially important in programs such as macros"
      "and compilers that manipulate Lisp code, because Lisp code is represented"
      "as trees.")
     :PAR "A destructuring operation requires an " (:TERM NIL "object")
     " to be decomposed, a pattern that specifies what components are to be extracted, and the names of the variables whose values are to be the components. "
     (:COMMENT NIL
      "% KMP: I removed this because I couldn't figure out what the non-SETQ case was."
      "%      Seems like it was probably referring to DESETQ, which isn't in the language."
      " In the non-\\specref{setq} case,"
      " a destructuring operation requires a body that"
      " constitutes the scope of the variables to be bound.")
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Data-directed Destructuring by Lambda Lists"))
      "In data-directed destructuring, the pattern is a sample "
      (:TERM NIL "object") " of the " (:TERM NIL "type")
      " to be decomposed. Wherever a component is to be extracted, a "
      (:TERM NIL "symbol") " appears in the pattern; this "
      (:TERM NIL "symbol")
      " is the name of the variable whose value will be that component. "
      (:COMMENT NIL "% This is just rationale, not description. -kmp 2-Aug-91"
       " Data-directed destructuring " " only works well"
       " for \\term{trees} and \\term{vectors}.  "
       " The components to be extracted must be"
       " identified by position rather than by name.  Data-directed destructuring"
       " cannot be extended to \\term{objects} such as "
       " \\term{rationals} whose components"
       " are not allowed to be \\term{symbols}, "
       " and cannot be extended to conceptual"
       " \\term{objects} such as multiple values, where it is impossible to create a"
       " sample \\term{object}.")
      :PAR
      (:SUBSUBSUBSUBSECTION
       (:TITLE ("Examples of Data-directed Destructuring by Lambda Lists"))
       "An example pattern is " :PAR (:TT NIL " (a b c)") " " :PAR
       "which destructures a list of three elements. The variable "
       (:TT NIL "a") " is assigned to the first element, " (:TT NIL "b")
       " to the second, etc. A more complex example is " :PAR
       (:TT NIL " ((first . rest) . more)") " " :PAR
       "The important features of data-directed destructuring are its syntactic simplicity and the ability to extend it to lambda-list-directed destructuring. "
       :PAR)
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Lambda-list-directed Destructuring by Lambda Lists"))
      "An extension of data-directed destructuring of " (:TERM NIL "trees")
      " is lambda-list-directed destructuring. This derives from the analogy between the three-element destructuring pattern "
      :PAR (:TT NIL " (first second third)") " " :PAR "and the three-argument "
      (:TERM NIL "lambda list") " " :PAR (:TT NIL " (first second third)") " "
      :PAR
      (:COMMENT NIL
       "The \\term{lambda list} of a function can be thought of as destructuring the"
       "list of arguments to which the function was \\term{applied}."
       "In most Lisp"
       "implementations this list is only conceptual most of the time, for the"
       "sake of efficiency.")
      :PAR
      "Lambda-list-directed destructuring is identical to data-directed destructuring if no "
      (:TERM NIL "lambda list keywords")
      " appear in the pattern. Any list in the pattern (whether a sub-list or the whole pattern itself) that contains a "
      (:TERM NIL "lambda list keyword")
      " is interpreted specially. Elements of the list to the left of the first "
      (:TERM NIL "lambda list keyword")
      " are treated as destructuring patterns, as usual, but the remaining elements of the list are treated like a function's "
      (:TERM NIL "lambda list")
      " except that where a variable would normally be required, an arbitrary destructuring pattern is allowed. Note that in case of ambiguity, "
      (:TERM NIL "lambda list")
      " syntax is preferred over destructuring syntax. Thus, after "
      (:KEYREF NIL "optional")
      " a list of elements is a list of a destructuring pattern and a default value form. "
      :PAR "The detailed behavior of each " (:TERM NIL "lambda list keyword")
      " in a lambda-list-directed destructuring pattern is as follows: " :PAR
      (:LIST NIL
       (:ITEM NIL (:KEYREF NIL "optional") " " :PAR
        "Each following element is a variable or a list of a destructuring pattern, a default value form, and a supplied-p variable. The default value and the supplied-p variable can be omitted. If the list being destructured ends early, so that it does not have an element to match against this destructuring (sub)-pattern, the default form is evaluated and destructured instead. The supplied-p variable receives the value "
        (:MISC NIL "nil") " if the default form is used, " (:MISC NIL "t")
        " otherwise. " :PAR)
       (:ITEM NIL (:KEYREF NIL "rest") ", " (:KEYREF NIL "body") " " :PAR
        "The next element is a destructuring pattern that matches the rest of the list. "
        (:KEYREF NIL "body") " is identical to " (:KEYREF NIL "rest")
        " but declares that what is being matched is a list of forms that constitutes the body of "
        (:TERM NIL "form") ". This next element must be the last unless a "
        (:TERM NIL "lambda list keyword") " follows it. " :PAR)
       (:ITEM NIL (:KEYREF NIL "aux") " " :PAR
        "The remaining elements are not destructuring patterns at all, but are auxiliary variable bindings. "
        (:COMMENT NIL "This does not make a whole lot of sense when"
         "the destructuring is being used to \\specref{setq} rather than to bind variables.")
        :PAR)
       (:ITEM NIL (:KEYREF NIL "whole") " " :PAR
        "The next element is a destructuring pattern that matches the entire form in a macro, or the entire "
        (:TERM NIL "subexpression") " at inner levels. "
        (:ISSUE NIL "DEFMACRO-LAMBDA-LIST:TIGHTEN-DESCRIPTION") " "
        (:COMMENT NIL "% Take out next sentences due to DEFMACRO-LAMBDA-LIST"
         "\\keyref{whole} only makes sense in \\macref{defmacro} and only at top level."
         "This next element must be the last unless a \\term{lambda list keyword} "
         "follows it.")
        (:ENDISSUE NIL "DEFMACRO-LAMBDA-LIST:TIGHTEN-DESCRIPTION") " " :PAR)
       (:ITEM NIL (:KEYREF NIL "key") " " :PAR
        "Each following element is one of "
        (:LIST NIL (:ITEM NIL " a " (:TERM NIL "variable") ", " :PAR)
         (:ITEM NIL
          "or a list of a variable, an optional initialization form, and an optional supplied-p variable. "
          :PAR)
         (:ITEM NIL
          "or a list of a list of a keyword and a destructuring pattern, an optional initialization form, and an optional supplied-p variable. "))
        " The rest of the list being destructured is taken to be alternating keywords and values and is taken apart appropriately. "
        :PAR)
       (:ITEM NIL (:KEYREF NIL "allow-other-keys") " " :PAR
        "Stands by itself. "))
      " "
      (:COMMENT NIL
       "list which is a sub-list of the pattern and the corresponding sub-list of"
       "the object being destructured is muddled in places.}")
      :PAR)
     :PAR
     (:COMMENT NIL
      " \\beginsubsubsubsection{Additional Information about Destructuring by Lambda Lists}"
      " \\DefineSection{ExtraDestructureInfo}")
     :PAR
     (:COMMENT NIL
      " I moved the text about dotted lambda lists to earlier in this section."
      " -- sjl 5 Mar 92")
     :PAR
     (:COMMENT NIL
      " \\endsubsubsubsection%{Additional Information about Destructuring by Lambda Lists}")
     :PAR)
    :PAR)
   :PAR (:COMMENT NIL " This entire section is new.  --sjl 5 Mar 92")
   (:SUBSECTION
    (:TITLE ("Destructuring Lambda Lists") :TAGS (:DESTRUCTURING-LAMBDA-LISTS))
    " " :PAR "A " (:NEWTERM NIL "destructuring lambda list") " is used by "
    (:MACREF NIL "destructuring-bind") ". " :PAR
    (:TERM NIL "Destructuring lambda lists") " are closely related to "
    (:TERM NIL "macro lambda lists") "; see " (:SECREF NIL :MACRO-LAMBDA-LISTS)
    ". A " (:TERM NIL "destructuring lambda list") " can contain all of the "
    (:TERM NIL "lambda list keywords") " listed for "
    (:TERM NIL "macro lambda lists") " except for " (:KEYREF NIL "environment")
    ", and supports destructuring in the same way. Inner "
    (:TERM NIL "lambda lists") " nested within a "
    (:TERM NIL "macro lambda list") " have the syntax of "
    (:TERM NIL "destructuring lambda lists") ". " :PAR "A "
    (:TERM NIL "destructuring lambda list") " has the following syntax: " :PAR
    :PAR "  "
    (:BNF (:NAME "reqvars")
     (:STAR NIL
      (:CURLY NIL (:PARAM NIL "var") " | " (:DOWN NIL "lambda-list"))))
    " "
    (:BNF (:NAME "optvars")
     (:BRAC NIL (:KEYWORD NIL " &optional") " "
      (:STAR NIL
       (:CURLY NIL (:PARAM NIL "var") " | "
        (:PAREN NIL
         (:CURLY NIL (:PARAM NIL "var") " | " (:DOWN NIL "lambda-list")) " "
         (:BRAC NIL "init-form " (:BRAC NIL "supplied-p-parameter")))))))
    " "
    (:BNF (:NAME "restvar")
     (:BRAC NIL
      (:CURLY NIL (:KEYWORD NIL " &rest") " | " (:KEYWORD NIL " &body")) " "
      (:PARAM NIL
       (:CURLY NIL (:PARAM NIL "var") " | " (:DOWN NIL "lambda-list")))))
    " "
    (:BNF (:NAME "keyvars") "[" (:KEYWORD NIL " &key") " "
     (:STAR NIL
      (:CURLY NIL (:PARAM NIL "var") " | "
       (:PAREN NIL
        (:CURLY NIL (:PARAM NIL "var") " | "
         (:PAREN NIL (:PARAM NIL "keyword-name") " "
          (:CURLY NIL (:PARAM NIL "var") " | " (:DOWN NIL "lambda-list"))))
        " " (:BRAC NIL "init-form " (:BRAC NIL "supplied-p-parameter")))))
     (:BR NIL) " " (:BRAC NIL (:KEYWORD NIL " &allow-other-keys")) "]")
    " "
    (:BNF (:NAME "auxvars")
     (:BRAC NIL (:KEYWORD NIL " &aux") " "
      (:STAR NIL
       (:CURLY NIL (:PARAM NIL "var") " | "
        (:PAREN NIL
         (:CURLY NIL (:PARAM NIL "var") " | " (:DOWN NIL "lambda-list")) " "
         (:BRAC NIL (:PARAM NIL "init-form")))))))
    " "
    (:BNF (:NAME "envvar")
     (:BRAC NIL (:KEYWORD NIL " &environment") " " (:PARAM NIL "var")))
    " "
    (:COMMENT NIL
     "Per X3J13 (05-Oct-93), prohibit destructuring of whole variable. -kmp")
    (:BNF (:NAME "wholevar")
     (:BRAC NIL (:KEYWORD NIL " &whole") " " (:PARAM NIL "var")))
    " "
    (:BNF (:NAME "lambda-list")
     (:PAREN NIL (:DOWN NIL "wholevar") " " (:DOWN NIL "reqvars") " "
      (:DOWN NIL "optvars") " " (:DOWN NIL "restvar") " " (:DOWN NIL "keyvars")
      " " (:DOWN NIL "auxvars"))
     " |" (:BR NIL) " "
     (:PAREN NIL (:DOWN NIL "wholevar") " " (:DOWN NIL "reqvars") " "
      (:DOWN NIL "optvars") " " (:TT NIL ".") " "
      (:COMMENT NIL "Per x3j13, \"\\down{restvar}\" => \"var\"")
      (:PARAM NIL "var")))
    "  " :PAR " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Boa Lambda Lists") :TAGS (:BOA-LAMBDA-LISTS)) " "
    :PAR "A " (:NEWTERM NIL "boa lambda list") " is a "
    (:TERM NIL "lambda list") " that is syntactically like an "
    (:TERM NIL "ordinary lambda list") ", but that is processed in “"
    (:B NIL "b") "y " (:B NIL "o") "rder of " (:B NIL "a") "rgument” style. "
    :PAR "A " (:TERM NIL "boa lambda list") " is used only in a "
    (:MACREF NIL "defstruct") " " (:TERM NIL "form")
    ", when explicitly specifying the " (:TERM NIL "lambda list")
    " of a constructor " (:TERM NIL "function")
    " (sometimes called a “boa constructor”). " :PAR
    (:COMMENT NIL "% 19.6.0 2") "The " (:KEYREF NIL "optional") ", "
    (:KEYREF NIL "rest") ", " (:KEYREF NIL "aux") ", "
    (:ISSUE NIL "DEFSTRUCT-CONSTRUCTOR-KEY-MIXTURE:ALLOW-KEY") " "
    (:KEYREF NIL "key") ", and " (:KEYREF NIL "allow-other-keys") " "
    (:ENDISSUE NIL "DEFSTRUCT-CONSTRUCTOR-KEY-MIXTURE:ALLOW-KEY") " "
    (:TERM NIL "lambda list keywords") " are recognized in a "
    (:TERM NIL "boa lambda list") ". The way these "
    (:TERM NIL "lambda list keywords") " differ from their use in an "
    (:TERM NIL "ordinary lambda list") " follows. " :PAR
    "Consider this example, which describes how " (:MACREF NIL "defstruct")
    " processes its " (:KWD NIL "constructor") " option. " :PAR
    (:CODE NIL " (:constructor create-foo
         (a &optional b (c 'sea) &rest d &aux e (f 'eff)))
")
    " " :PAR "This defines " (:TT NIL "create-foo")
    " to be a constructor of one or more arguments. The first argument is used to initialize the "
    (:TT NIL "a") " slot. The second argument is used to initialize the "
    (:TT NIL "b")
    " slot. If there isn't any second argument, then the default value given in the body of the "
    (:MACREF NIL "defstruct")
    " (if given) is used instead. The third argument is used to initialize the "
    (:TT NIL "c") " slot. If there isn't any third argument, then the symbol "
    (:TT NIL "sea")
    " is used instead. Any arguments following the third argument are collected into a "
    (:TERM NIL "list") " and used to initialize the " (:TT NIL "d")
    " slot. If there are three or fewer arguments, then " (:MISC NIL "nil")
    " is placed in the " (:TT NIL "d") " slot. The " (:TT NIL "e")
    " slot is not initialized; its initial value is "
    (:TERM NIL "implementation-defined") ". Finally, the " (:TT NIL "f")
    " slot is initialized to contain the symbol " (:TT NIL "eff") ". "
    (:ISSUE NIL "DEFSTRUCT-CONSTRUCTOR-KEY-MIXTURE:ALLOW-KEY") " "
    (:KEYREF NIL "key") " and " (:KEYREF NIL "allow-other-keys")
    " arguments default in a manner similar to that of "
    (:KEYREF NIL "optional") " arguments: if no default is supplied in the "
    (:TERM NIL "lambda list")
    " then the default value given in the body of the "
    (:MACREF NIL "defstruct") " (if given) is used instead. "
    (:COMMENT NIL "% Removed per Moon as redundant."
     " then the slot initform is used;"
     " otherwise the slot is not initialized, its initial value is"
     " undefined.                                ")
    "For example: " :PAR
    (:CODE NIL
     " (defstruct (foo (:constructor CREATE-FOO (a &optional b (c 'sea)
                                             &key (d 2)
                                             &aux e (f 'eff))))
   (a 1) (b 2) (c 3) (d 4) (e 5) (f 6))
 
 (create-foo 10) → #S(FOO A 10 B 2 C SEA D 2 E "
     (:TERM NIL "implementation-dependent") " F EFF)
 (create-foo 10 'bee 'see :d 'dee) 
→ #S(FOO A 10 B BEE C SEE D DEE E "
     (:TERM NIL "implementation-dependent") " F EFF)
")
    " " :PAR "If keyword arguments of the form "
    (:TT NIL "((" (:I NIL "key") " " (:I NIL "var") ") "
     (:BRAC NIL (:I NIL "default") " " (:BRAC NIL (:I NIL "svar"))) ")")
    " are specified, the " (:TERM NIL "slot") " " (:TERM NIL "name")
    " is matched with " (:I NIL "var") " (not " (:I NIL "key") "). " :PAR
    (:COMMENT NIL "% 19.6.0 3") "The actions taken in the " (:TT NIL "b")
    " and " (:TT NIL "e")
    " cases were carefully chosen to allow the user to specify all possible behaviors. The "
    (:KEYREF NIL "aux")
    " variables can be used to completely override the default initializations given in the body. "
    :PAR (:ISSUE NIL "BOA-AUX-INITIALIZATION:ERROR-ON-READ")
    " If no default value is supplied for an " (:TERM NIL "aux variable")
    " variable, the consequences are undefined if an attempt is later made to read the corresponding "
    (:TERM NIL "slot")
    "'s value before a value is explicitly assigned. If such a "
    (:TERM NIL "slot") " has a " (:KWD NIL "type")
    " option specified, this suppressed initialization does not imply a type mismatch situation; the declared type is only required to apply when the "
    (:TERM NIL "slot") " is finally assigned. "
    (:ENDISSUE NIL "BOA-AUX-INITIALIZATION:ERROR-ON-READ") " " :PAR
    (:COMMENT NIL "% 19.6.0 4")
    "With this definition, the following can be written: " :PAR
    (:CODE NIL " (create-foo 1 2)
")
    " instead of " :PAR
    (:CODE NIL " (make-foo :a 1 :b 2)
")
    " and " (:TT NIL "create-foo")
    " provides defaulting different from that of " (:TT NIL "make-foo") ". "
    :PAR
    "Additional arguments that do not correspond to slot names but are merely present to supply values used in subsequent initialization computations are allowed. For example, in the definition "
    :PAR
    (:CODE NIL " (defstruct (frob (:constructor create-frob
                  (a &key (b 3 have-b) (c-token 'c) 
                          (c (list c-token (if have-b 7 2))))))
         a b c)
")
    " " :PAR "the " (:TT NIL " c-token")
    " argument is used merely to supply a value used in the initialization of the "
    (:TT NIL " c") " slot. The " (:TERM NIL "supplied-p parameters")
    " associated with " (:TERM NIL "optional parameters") " and "
    (:TERM NIL "keyword parameters") " might also be used this way. " :PAR
    (:ENDISSUE NIL "DEFSTRUCT-CONSTRUCTOR-KEY-MIXTURE:ALLOW-KEY") " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Defsetf Lambda Lists") :TAGS (:DEFSETF-LAMBDA-LISTS))
    " " :PAR "A " (:NEWTERM NIL "defsetf lambda list") " is used by "
    (:MACREF NIL "defsetf") ". " :PAR "A " (:TERM NIL "defsetf lambda list")
    " has the following syntax: " :PAR
    (:COMMENT NIL
     "I added &allow-other-keys here because it seemed stupid for that to be missing"
     "if &key was possible.")
    :PAR " "
    (:BNF (:NAME "lambda-list") "(" (:STAR NIL (:CURLY NIL (:PARAM NIL "var")))
     (:BR NIL) " "
     (:BRAC NIL (:KEYWORD NIL " &optional") " "
      (:STAR NIL
       (:CURLY NIL (:PARAM NIL "var") " | "
        (:PAREN NIL (:PARAM NIL "var") " "
         (:BRAC NIL "init-form " (:BRAC NIL "supplied-p-parameter"))))))
     (:BR NIL) " " (:BRAC NIL (:KEYWORD NIL " &rest") " " (:PARAM NIL "var"))
     (:BR NIL) " " (:TT NIL "[") (:KEYWORD NIL " &key") " "
     (:STAR NIL
      (:CURLY NIL (:PARAM NIL "var") " | "
       (:PAREN NIL
        (:CURLY NIL (:PARAM NIL "var") " | "
         (:PAREN NIL (:PARAM NIL "keyword-name") " " (:PARAM NIL "var")))
        " " (:BRAC NIL "init-form " (:BRAC NIL "supplied-p-parameter")))))
     " " (:BRAC NIL (:KEYWORD NIL " &allow-other-keys")) (:TT NIL "]")
     (:BR NIL) " "
     (:BRAC NIL (:KEYWORD NIL " &environment") " " (:PARAM NIL "var")))
    " " :PAR "A " (:TERM NIL "defsetf lambda list") " can contain the "
    (:TERM NIL "lambda list keywords") " shown in " (:NEXTFIGURE NIL) ". " :PAR
    (:COMMENT NIL
     "I also added &environment, per discussion with Sandra and Quinquevirate.")
    (:TABLE (:NAME ("Lambda List Keywords used by Defsetf Lambda Lists"))
     (:ROW NIL (:CELL NIL (:KEYREF NIL "allow-other-keys"))
      (:CELL NIL (:KEYREF NIL "key")) (:CELL NIL (:KEYREF NIL "rest")))
     (:ROW NIL (:CELL NIL (:KEYREF NIL "environment"))
      (:CELL NIL (:KEYREF NIL "optional")) (:CELL NIL)))
    " " :PAR "A " (:TERM NIL "defsetf lambda list") " differs from an "
    (:TERM NIL "ordinary lambda list")
    " only in that it does not permit the use of " (:KEYREF NIL "aux")
    ", and that it permits use of " (:KEYREF NIL "environment")
    ", which introduces an " (:TERM NIL "environment parameter") ". " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Deftype Lambda Lists") :TAGS (:DEFTYPE-LAMBDA-LISTS))
    " " :PAR "A " (:NEWTERM NIL "deftype lambda list") " is used by "
    (:MACREF NIL "deftype") ". " :PAR "A " (:TERM NIL "deftype lambda list")
    " has the same syntax as a " (:TERM NIL "macro lambda list")
    ", and can therefore contain the " (:TERM NIL "lambda list keywords")
    " as a " (:TERM NIL "macro lambda list") ". " :PAR
    (:ISSUE NIL "DEFTYPE-DESTRUCTURING:YES") " "
    (:ISSUE NIL "DEFTYPE-KEY:ALLOW") " A " (:TERM NIL "deftype lambda list")
    " differs from a " (:TERM NIL "macro lambda list") " only in that if no "
    (:PARAM NIL "init-form") " is supplied for an "
    (:TERM NIL "optional parameter") " or " (:TERM NIL "keyword parameter")
    " in the " (:PARAM NIL "lambda-list") ", the default " (:TERM NIL "value")
    " for that " (:TERM NIL "parameter") " is the " (:TERM NIL "symbol") " "
    (:MISC NIL "*") " (rather than " (:MISC NIL "nil") "). "
    (:ENDISSUE NIL "DEFTYPE-KEY:ALLOW") " "
    (:ENDISSUE NIL "DEFTYPE-DESTRUCTURING:YES") " " :PAR)
   :PAR
   (:COMMENT NIL " This entire section is new.  Some info paraphrased from the"
    " old dictionary entry for define-modify-macro.  --sjl 5 Mar 92")
   (:SUBSECTION
    (:TITLE ("Define-modify-macro Lambda Lists") :TAGS
     (:DEFINE-MODIFY-MACRO-LAMBDA-LISTS))
    " " :PAR "A " (:NEWTERM NIL "define-modify-macro lambda list")
    " is used by " (:MACREF NIL "define-modify-macro") ". " :PAR "A "
    (:TERM NIL "define-modify-macro lambda list") " can contain the "
    (:TERM NIL "lambda list keywords") " shown in " (:NEXTFIGURE NIL) ". " :PAR
    (:TABLE
     (:NAME ("Lambda List Keywords used by Define-modify-macro Lambda Lists"))
     (:ROW NIL (:CELL NIL (:KEYREF NIL "optional"))
      (:CELL NIL (:KEYREF NIL "rest"))))
    " " :PAR (:TERM NIL "Define-modify-macro lambda lists") " are similar to "
    (:TERM NIL "ordinary lambda lists")
    ", but do not support keyword arguments. "
    (:MACREF NIL "define-modify-macro")
    " has no need match keyword arguments, and a " (:TERM NIL "rest parameter")
    " is sufficient. " (:TERM NIL "Aux variables")
    " are also not supported, since " (:MACREF NIL "define-modify-macro")
    " has no body " (:TERM NIL "forms") " which could refer to such "
    (:TERM NIL "bindings") ". See the " (:TERM NIL "macro") " "
    (:MACREF NIL "define-modify-macro") ". " :PAR)
   :PAR
   (:COMMENT NIL
    " This entire section is new, per Barrett #3 (first public review).")
   (:SUBSECTION
    (:TITLE ("Define-method-combination Arguments Lambda Lists") :TAGS
     (:DEF-METH-COMB-ARGS-LAMBDA-LISTS))
    " " :PAR "A "
    (:NEWTERM NIL "define-method-combination arguments lambda list")
    " is used by the " (:KWD NIL "arguments") " option to "
    (:MACREF NIL "define-method-combination") ". " :PAR "A "
    (:TERM NIL "define-method-combination arguments lambda list")
    " can contain the " (:TERM NIL "lambda list keywords") " shown in "
    (:NEXTFIGURE NIL) ". " :PAR
    (:TABLE
     (:NAME
      ("Lambda List Keywords used by Define-method-combination arguments Lambda Lists"))
     (:ROW NIL (:CELL NIL (:KEYREF NIL "allow-other-keys"))
      (:CELL NIL (:KEYREF NIL "key")) (:CELL NIL (:KEYREF NIL "rest")))
     (:ROW NIL (:CELL NIL (:KEYREF NIL "aux"))
      (:CELL NIL (:KEYREF NIL "optional")) (:CELL NIL (:KEYREF NIL "whole"))))
    " " :PAR (:TERM NIL "Define-method-combination arguments lambda lists")
    " are similar to " (:TERM NIL "ordinary lambda lists")
    ", but also permit the use of " (:KEYREF NIL "whole") ". " :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Syntactic Interaction of Documentation Strings and Declarations")
     :TAGS (:DOC-VS-DECLS))
    " " :PAR (:COMMENT NIL "% 8.1.0 8") :PAR "In a number of situations, a "
    (:TERM NIL "documentation string") " can appear amidst a series of "
    (:MISC NIL "declare") " " (:TERM NIL "expressions")
    " prior to a series of " (:TERM NIL "forms") ". " :PAR
    "In that case, if a " (:TERM NIL "string") " " (:MATH NIL (:MI NIL "S"))
    " appears where a " (:TERM NIL "documentation string")
    " is permissible and is not followed by either a " (:MISC NIL "declare")
    " " (:TERM NIL "expression") " or a " (:TERM NIL "form") " then "
    (:MATH NIL (:MI NIL "S")) " is taken to be a " (:TERM NIL "form")
    "; otherwise, " (:MATH NIL (:MI NIL "S")) " is taken as a "
    (:TERM NIL "documentation string")
    ". The consequences are unspecified if more than one such "
    (:TERM NIL "documentation string") " is present. " :PAR))
  :PAR
  (:SECTION
   (:TITLE ("Error Checking in Function Calls") :TAGS
    (:FUNCALL-ERROR-CHECKING))
   " " (:COMMENT NIL "% Error Checking in Function Calls") :PAR
   (:ISSUE NIL "ARGUMENT-MISMATCH-ERROR:MORE-CLARIFICATIONS") " " :PAR
   (:SUBSECTION (:TITLE ("Argument Mismatch Detection"))
    (:SUBSUBSECTION
     (:TITLE ("Safe and Unsafe Calls") :TAGS (:SAFE-AND-UNSAFE-CALLS)) " " :PAR
     "A " (:TERM NIL "call") " is a " (:NEWTERM NIL "safe call")
     " if each of the following is either " (:TERM NIL "safe") " "
     (:TERM NIL "code") " or " (:TERM NIL "system code") " (other than "
     (:TERM NIL "system code") " that results from "
     (:TERM NIL "macro expansion") " of " (:TERM NIL "programmer code") "): "
     (:LIST NIL (:ITEM NIL " the " (:TERM NIL "call") ". ")
      (:ITEM NIL " the definition of the " (:TERM NIL "function") " being "
       (:TERM NIL "called") ". ")
      (:ITEM NIL " the point of " (:TERM NIL "functional evaluation") " "))
     " " :PAR "The following special cases require some elaboration: " :PAR
     (:LIST NIL
      (:ITEM NIL " If the " (:TERM NIL "function") " being called is a "
       (:TERM NIL "generic function") ", it is considered " (:TERM NIL "safe")
       " if all of the following are "
       (:ISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " "
       (:COMMENT NIL
        " \"safe\" => \"safe code or system code\" per Moon #12 (first public review).")
       (:TERM NIL "safe code") " or " (:TERM NIL "system code") ": "
       (:ENDISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " " :PAR
       (:LIST NIL
        (:ITEM NIL "– its definition (if it was defined explicitly). ")
        (:ITEM NIL "– the " (:TERM NIL "method") " definitions for all "
         (:TERM NIL "applicable") " " (:TERM NIL "methods") ". ")
        (:ITEM NIL "– the definition of its " (:TERM NIL "method combination")
         ". "))
       " " :PAR)
      (:ITEM NIL " For the form "
       (:TT NIL "(coerce " (:PARAM NIL "x") " 'function)") ", where "
       (:PARAM NIL "x") " is a " (:TERM NIL "lambda expression")
       ", the value of the " (:TERM NIL "optimize quality") " "
       (:DECLREF NIL "safety") " in the global environment at the time the "
       (:FUNREF NIL "coerce") " is " (:TERM NIL "executed")
       " applies to the resulting " (:TERM NIL "function") ". " :PAR
       (:ISSUE NIL "SYNTACTIC-ENVIRONMENT-ACCESS:RETRACTED-MAR91") " "
       (:COMMENT NIL " \\itemitem{\\bull}"
        " For the form \\f{(enclose \\param{x} \\param{env})}, "
        " where \\param{x} is a \\term{lambda expression},"
        " the value of the \\term{optimize quality} \\declref{safety}"
        " in the \\term{environment} \\term{object} \\param{env} applies"
        " to the resulting \\term{function}.")
       (:ENDISSUE NIL "SYNTACTIC-ENVIRONMENT-ACCESS:RETRACTED-MAR91") " " :PAR
       (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
       (:COMMENT NIL " \\itemitem{\\bull}"
        " For     \\macref{generic-function},"
        "         \\specref{generic-flet},"
        "     and \\specref{generic-labels}"
        " \\term{forms}, the value of the \\term{optimize quality} \\declref{safety}"
        " in the \\term{lexical environment} in which the form appears applies"
        " to the resulting \\term{generic functions} and \\term{method} definitions.")
       (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " " :PAR)
      (:ITEM NIL " For a call to the " (:TERM NIL "function") " "
       (:FUNREF NIL "ensure-generic-function") ", the value of the "
       (:TERM NIL "optimize quality") " " (:DECLREF NIL "safety") " in the "
       (:TERM NIL "environment") " " (:TERM NIL "object") " passed as the "
       (:KWD NIL "environment") " " (:TERM NIL "argument")
       " applies to the resulting " (:TERM NIL "generic function") ". " :PAR)
      (:ITEM NIL " For a call to " (:FUNREF NIL "compile") " with a "
       (:TERM NIL "lambda expression") " as the " (:TERM NIL "argument")
       ", the value of the " (:TERM NIL "optimize quality") " "
       (:FUNREF NIL "safety") " in the " (:TERM NIL "global environment")
       " at the time " (:FUNREF NIL "compile") " is " (:TERM NIL "called")
       " applies to the resulting " (:TERM NIL "compiled function") ". " :PAR)
      (:ITEM NIL " For a call to " (:FUNREF NIL "compile")
       " with only one argument, if the original definition of the "
       (:TERM NIL "function") " was " (:TERM NIL "safe")
       ", then the resulting " (:TERM NIL "compiled function") " must also be "
       (:TERM NIL "safe") ". " :PAR)
      (:ITEM NIL " A " (:TERM NIL "call") " to a " (:TERM NIL "method") " by "
       (:FUNREF NIL "call-next-method") " must be considered "
       (:TERM NIL "safe") " if each of the following is "
       (:ISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " "
       (:COMMENT NIL
        " \"safe\" => \"safe code or system code\" per Moon #12 (first public review).")
       (:TERM NIL "safe code") " or " (:TERM NIL "system code") ": "
       (:ENDISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " " :PAR
       (:LIST NIL
        (:ITEM NIL "– the definition of the " (:TERM NIL "generic function")
         " (if it was defined explicitly). ")
        (:ITEM NIL "– the " (:TERM NIL "method") " definitions for all "
         (:TERM NIL "applicable") " " (:TERM NIL "methods") ". ")
        (:ITEM NIL "– the definition of the " (:TERM NIL "method combination")
         ". ")
        (:ITEM NIL "– the point of entry into the body of the "
         (:TERM NIL "method defining form") ", where the "
         (:TERM NIL "binding") " of " (:FUNREF NIL "call-next-method")
         " is established. ")
        (:ITEM NIL "– the point of " (:TERM NIL "functional evaluation")
         " of the name " (:FUNREF NIL "call-next-method") ". "))
       " " :PAR))
     " " :PAR "An " (:NEWTERM NIL "unsafe call") " is a " (:TERM NIL "call")
     " that is not a " (:TERM NIL "safe call") ". " :PAR
     "The informal intent is that the " (:TERM NIL "programmer")
     " can rely on a " (:TERM NIL "call") " to be " (:TERM NIL "safe")
     ", even when " (:TERM NIL "system code")
     " is involved, if all reasonable steps have been taken to ensure that the "
     (:TERM NIL "call") " is " (:TERM NIL "safe") ". For example, if a "
     (:TERM NIL "programmer") " calls " (:FUNREF NIL "mapcar") " from "
     (:TERM NIL "safe") " " (:TERM NIL "code") " and supplies a "
     (:TERM NIL "function") " that was " (:TERM NIL "compiled") " as "
     (:TERM NIL "safe") ", the " (:TERM NIL "implementation")
     " is required to ensure that " (:FUNREF NIL "mapcar") " makes a "
     (:TERM NIL "safe call") " as well. " :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Error Detection Time in Safe Calls") :TAGS
       (:SAFE-CALL-DETECTION-TIME))
      " " :PAR "If an error is signaled in a " (:TERM NIL "safe call")
      ", the exact point of the " (:TERM NIL "signal") " is "
      (:TERM NIL "implementation-dependent")
      ". In particular, it might be signaled at compile time or at run time, and if signaled at run time, it might be prior to, during, or after "
      (:TERM NIL "executing") " the " (:TERM NIL "call")
      ". However, it is always prior to the execution of the body of the "
      (:TERM NIL "function") " being " (:TERM NIL "called") ". " :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Too Few Arguments"))
     "It is not permitted to supply too few " (:TERM NIL "arguments") " to a "
     (:TERM NIL "function") ". " (:COMMENT NIL "For Moon:")
     "Too few arguments means fewer " (:TERM NIL "arguments")
     " than the number of " (:TERM NIL "required parameters") " for the "
     (:TERM NIL "function") ". " :PAR
     (:ISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " "
     (:COMMENT NIL "% Per Moon #12 (first public review). -kmp 8-May-93"
      "Otherwise, in a \\term{safe call},")
     "If this " (:TERM NIL "situation") " occurs in a " (:TERM NIL "safe call")
     ", " (:ENDISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "program-error")
     " must be signaled; and in an " (:TERM NIL "unsafe call") " the "
     (:TERM NIL "situation") " has undefined consequences. " :PAR
     (:ISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " "
     (:COMMENT NIL
      "% Commented out as redundant, per Moon #12 (first public review)."
      "% I sure hope this doesn't lead to confusion down the road...  -kmp 8-May-93"
      "If an error is signaled in a \\term{safe call},"
      "the exact point of the \\term{signal} is \\term{implementation-dependent};"
      "\\seesection\\SafeCallDetectionTime.")
     (:ENDISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " " :PAR)
    (:COMMENT NIL " ========================================")
    (:SUBSUBSECTION (:TITLE ("Too Many Arguments"))
     "It is not permitted to supply too many " (:TERM NIL "arguments") " to a "
     (:TERM NIL "function") ". Too many arguments means more "
     (:TERM NIL "arguments") " than the number of "
     (:TERM NIL "required parameters") " plus the number of "
     (:TERM NIL "optional parameters") "; however, if the "
     (:TERM NIL "function") " uses " (:KEYREF NIL "rest") " or "
     (:KEYREF NIL "key")
     ", it is not possible for it to receive too many arguments. " :PAR
     (:ISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " "
     (:COMMENT NIL "% Per Moon #12 (first public review). -kmp 8-May-93"
      "Otherwise, in a \\term{safe call},")
     "If this " (:TERM NIL "situation") " occurs in a " (:TERM NIL "safe call")
     ", " (:ENDISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "program-error")
     " must be signaled; and in an " (:TERM NIL "unsafe call") " the "
     (:TERM NIL "situation") " has undefined consequences. " :PAR
     (:ISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " "
     (:COMMENT NIL
      "% Commented out as redundant, per Moon #12 (first public review)."
      "% I sure hope this doesn't lead to confusion down the road...  -kmp 8-May-93"
      "If an error is signaled in a \\term{safe call},"
      "the exact point of the \\term{signal} is \\term{implementation-dependent};"
      "\\seesection\\SafeCallDetectionTime.")
     (:ENDISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " " :PAR)
    (:COMMENT NIL " ========================================")
    (:SUBSUBSECTION
     (:TITLE ("Unrecognized Keyword Arguments") :TAGS (:UNRECOGNIZED-KEY-ARGS))
     " " :PAR "It is not permitted to supply a keyword argument to a "
     (:TERM NIL "function") " using a name that is not recognized by that "
     (:TERM NIL "function")
     " unless keyword argument checking is suppressed as described in "
     (:SECREF NIL :SUPPRESSING-KEY-ARG-CHECKS) ". " :PAR
     (:ISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " "
     (:COMMENT NIL "% Per Moon #12 (first public review). -kmp 8-May-93"
      "Otherwise, in a \\term{safe call},")
     "If this " (:TERM NIL "situation") " occurs in a " (:TERM NIL "safe call")
     ", " (:ENDISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "program-error")
     " must be signaled; and in an " (:TERM NIL "unsafe call") " the "
     (:TERM NIL "situation") " has undefined consequences. " :PAR
     (:ISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " "
     (:COMMENT NIL
      "% Commented out as redundant, per Moon #12 (first public review)."
      "% I sure hope this doesn't lead to confusion down the road...  -kmp 8-May-93"
      "If an error is signaled in a \\term{safe call},"
      "the exact point of the \\term{signal} is \\term{implementation-dependent};"
      "\\seesection\\SafeCallDetectionTime.")
     (:ENDISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " " :PAR)
    (:COMMENT NIL " ========================================")
    (:SUBSUBSECTION
     (:TITLE ("Invalid Keyword Arguments") :TAGS (:INVALID-KEY-ARGS)) " " :PAR
     "It is not permitted to supply a keyword argument to a "
     (:TERM NIL "function") " using a name that is not a " (:TERM NIL "symbol")
     ". " :PAR (:ISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " "
     (:COMMENT NIL "% Per Moon #12 (first public review). -kmp 8-May-93"
      "Otherwise, in a \\term{safe call},")
     "If this " (:TERM NIL "situation") " occurs in a " (:TERM NIL "safe call")
     ", " (:ENDISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "program-error")
     " must be signaled unless keyword argument checking is suppressed as described in "
     (:SECREF NIL :SUPPRESSING-KEY-ARG-CHECKS) "; and in an "
     (:TERM NIL "unsafe call") " the " (:TERM NIL "situation")
     " has undefined consequences. " :PAR
     (:ISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " "
     (:COMMENT NIL
      "% Commented out as redundant, per Moon #12 (first public review)."
      "% I sure hope this doesn't lead to confusion down the road...  -kmp 8-May-93"
      "If an error is signaled in a \\term{safe call},"
      "the exact point of the \\term{signal} is \\term{implementation-dependent};"
      "\\seesection\\SafeCallDetectionTime.")
     (:ENDISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " " :PAR)
    (:COMMENT NIL " ========================================")
    (:SUBSUBSECTION
     (:TITLE ("Odd Number of Keyword Arguments") :TAGS
      (:ODD-NUMBER-OF-KEY-ARGS))
     " " :PAR (:ISSUE NIL "ARGUMENT-MISMATCH-ERROR-AGAIN:CONSISTENT") " " :PAR
     "An odd number of " (:TERM NIL "arguments")
     " must not be supplied for the " (:TERM NIL "keyword parameters") ". "
     :PAR (:ISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " "
     (:COMMENT NIL "% Per Moon #12 (first public review). -kmp 8-May-93"
      "Otherwise, in a \\term{safe call},")
     "If this " (:TERM NIL "situation") " occurs in a " (:TERM NIL "safe call")
     ", " (:ENDISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "program-error")
     " must be signaled unless keyword argument checking is suppressed as described in "
     (:SECREF NIL :SUPPRESSING-KEY-ARG-CHECKS) "; and in an "
     (:TERM NIL "unsafe call") " the " (:TERM NIL "situation")
     " has undefined consequences. " :PAR
     (:ISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " "
     (:COMMENT NIL
      "% Commented out as redundant, per Moon #12 (first public review)."
      "% I sure hope this doesn't lead to confusion down the road...  -kmp 8-May-93"
      "If an error is signaled in a \\term{safe call},"
      "the exact point of the \\term{signal} is \\term{implementation-dependent};"
      "\\seesection\\SafeCallDetectionTime.")
     (:ENDISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " " :PAR
     (:ENDISSUE NIL "ARGUMENT-MISMATCH-ERROR-AGAIN:CONSISTENT") " " :PAR)
    (:COMMENT NIL " ========================================")
    (:SUBSUBSECTION
     (:TITLE ("Destructuring Mismatch") :TAGS (:DESTRUCTURING-MISMATCH)) " "
     :PAR (:ISSUE NIL "ARGUMENT-MISMATCH-ERROR-AGAIN:CONSISTENT") " " :PAR
     "When matching a " (:TERM NIL "destructuring lambda list") " against a "
     (:TERM NIL "form") ", the pattern and the " (:TERM NIL "form")
     " must have compatible " (:TERM NIL "tree structure") ", as described in "
     (:SECREF NIL :EXTRA-DESTRUCTURE-INFO) ". " :PAR "Otherwise, in a "
     (:TERM NIL "safe call") ", an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "program-error") " must be signaled; and in an "
     (:TERM NIL "unsafe call") " the " (:TERM NIL "situation")
     " has undefined consequences. " :PAR
     (:ISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " "
     (:COMMENT NIL
      "% Commented out as redundant, per Moon #12 (first public review)."
      "% I sure hope this doesn't lead to confusion down the road...  -kmp 8-May-93"
      "If an error is signaled in a \\term{safe call},"
      "the exact point of the \\term{signal} is \\term{implementation-dependent};"
      "\\seesection\\SafeCallDetectionTime.")
     (:ENDISSUE NIL "ARGUMENT-MISMATCH-ERROR-MOON:FIX") " " :PAR
     (:ENDISSUE NIL "ARGUMENT-MISMATCH-ERROR-AGAIN:CONSISTENT") " " :PAR)
    (:COMMENT NIL " ========================================")
    (:SUBSUBSECTION (:TITLE ("Errors When Calling a Next Method")) "If "
     (:FUNREF NIL "call-next-method") " is called with "
     (:TERM NIL "arguments") ", the ordered set of " (:TERM NIL "applicable")
     " " (:TERM NIL "methods") " for the changed set of "
     (:TERM NIL "arguments") " for " (:FUNREF NIL "call-next-method")
     " must be the same as the ordered set of " (:TERM NIL "applicable") " "
     (:TERM NIL "methods") " for the original " (:TERM NIL "arguments")
     " to the " (:TERM NIL "generic function")
     ", or else an error should be signaled. " :PAR
     "The comparison between the set of methods applicable to the new arguments and the set applicable to the original arguments is insensitive to order differences among methods with the same specializers. "
     :PAR "If " (:FUNREF NIL "call-next-method") " is called with "
     (:TERM NIL "arguments") " that specify a different ordered set of "
     (:TERM NIL "applicable") " methods and there is no "
     (:TERM NIL "next method")
     " available, the test for different methods and the associated error signaling (when present) takes precedence over calling "
     (:FUNREF NIL "no-next-method") ". " :PAR)
    :PAR)
   :PAR (:ENDISSUE NIL "ARGUMENT-MISMATCH-ERROR:MORE-CLARIFICATIONS") " ")
  :PAR
  (:SECTION
   (:TITLE ("Traversal Rules and Side Effects") :TAGS (:TRAVERSAL-RULES)) " "
   (:COMMENT NIL " Traversal Rules and Side Effects") :PAR
   (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " " :PAR
   "The consequences are undefined "
   (:COMMENT NIL " (but in general no error will be signaled) ") "when "
   (:TERM NIL "code") " executed during an " (:TERM NIL "object-traversing")
   " operation " (:COMMENT NIL "!!! Barmar wants them listed.")
   "destructively modifies the " (:TERM NIL "object")
   " in a way that might affect the ongoing traversal operation. In particular, the following rules apply. "
   (:LIST NIL
    (:ITEM NIL (:B NIL "List traversal") " " :PAR "For " (:TERM NIL "list")
     " traversal operations, the " (:TERM NIL "cdr") " chain of the "
     (:TERM NIL "list") " is not allowed to be destructively modified. " :PAR)
    (:ITEM NIL (:B NIL "Array traversal") " " :PAR "For " (:TERM NIL "array")
     " traversal operations, the " (:TERM NIL "array")
     " is not allowed to be adjusted and its " (:TERM NIL "fill pointer")
     ", if any, is not allowed to be changed. " :PAR)
    (:ITEM NIL (:B NIL "Hash-table traversal") " " :PAR "For "
     (:TERM NIL "hash table")
     " traversal operations, new elements may not be added or deleted except that the element corresponding to the current hash key may be changed or removed. "
     :PAR)
    (:ITEM NIL (:B NIL "Package traversal") " " :PAR
     (:COMMENT NIL
      "KMP: Isn't this already said in general for object-traversal elsewhere?"
      "Barmar: Loop?" "KMP: With-package-iterator?" "RPG: Leave it here.")
     "For " (:TERM NIL "package") " traversal operations (" (:I NIL "e.g.")
     ",  " (:MACREF NIL "do-symbols") "), new " (:TERM NIL "symbols")
     " may not be " (:TERM NIL "interned") " in or " (:TERM NIL "uninterned")
     " from the " (:TERM NIL "package") " being traversed or any "
     (:TERM NIL "package") " that it uses except that the current "
     (:TERM NIL "symbol") " may be " (:TERM NIL "uninterned") " from the "
     (:TERM NIL "package") " being traversed. " :PAR))
   " "
   (:COMMENT NIL "These rules only apply to "
    "\\term{object} manipulators that are not inherently" "  destructive. ")
   :PAR (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " ")
  :PAR
  (:SECTION (:TITLE ("Destructive Operations") :TAGS (:DESTRUCTIVE-OPERATIONS))
   " " (:COMMENT NIL " Destructive Operations") :PAR
   (:ISSUE NIL "DESTRUCTIVE-OPERATIONS:SPECIFY") " "
   (:SUBSECTION (:TITLE ("Modification of Literal Objects"))
    "The consequences are undefined if " (:TERM NIL "literal") " "
    (:TERM NIL "objects")
    " are destructively modified. For this purpose, the following operations are considered "
    (:TERM NIL "destructive") ": " :PAR
    (:LIST NIL
     (:ITEM NIL (:TYPEREF NIL "random-state") " " :PAR
      (:COMMENT NIL " Using it as an argument to the function RANDOM.") :PAR
      "Using it as an " (:TERM NIL "argument") " to the "
      (:TERM NIL "function") " " (:FUNREF NIL "random") ". " :PAR)
     (:ITEM NIL (:TYPEREF NIL "cons") " " :PAR
      (:COMMENT NIL
       " Altering or destructively modifying the CAR or CDR of the cons.")
      :PAR "Changing the " (:TERM NIL "car") (:SUB NIL "1") " or "
      (:TERM NIL "cdr") (:SUB NIL "1") " of the " (:TERM NIL "cons")
      ", or performing a " (:TERM NIL "destructive") " operation on an "
      (:TERM NIL "object") " which is either the " (:TERM NIL "car")
      (:SUB NIL "2") " or the " (:TERM NIL "cdr") (:SUB NIL "2") " of the "
      (:TERM NIL "cons") ". " :PAR)
     (:ITEM NIL (:TYPEREF NIL "array") " " :PAR
      (:COMMENT NIL " Altering or destructively modifying any array element;"
       " changing the fill pointer, dimensions, or displacement of"
       " the array (regardless of whether the array is actually adjustable);"
       " or altering the contents of any array that is displaced to this array"
       " or that otherwise shares its contents with this array.")
      :PAR "Storing a new value into some element of the " (:TERM NIL "array")
      ", or performing a " (:TERM NIL "destructive") " operation on an "
      (:TERM NIL "object") " that is already such an " (:TERM NIL "element")
      ". " :PAR "Changing the " (:TERM NIL "fill pointer") ", "
      (:TERM NIL "dimensions") ", or displacement of the " (:TERM NIL "array")
      " (regardless of whether the " (:TERM NIL "array") " is "
      (:TERM NIL "actually adjustable") "). " :PAR "Performing a "
      (:TERM NIL "destructive") " operation on another " (:TERM NIL "array")
      " that is displaced to the " (:TERM NIL "array")
      " or that otherwise shares its contents with the " (:TERM NIL "array")
      ". " :PAR)
     (:ITEM NIL (:TYPEREF NIL "hash-table") " " :PAR
      (:COMMENT NIL
       " Altering or destructively modifying any key or its corresponding"
       " value, or adding or removing entries from the hash table.")
      :PAR "Performing a " (:TERM NIL "destructive") " operation on any "
      (:TERM NIL "key") ". " :PAR "Storing a new " (:TERM NIL "value")
      (:SUB NIL "4") " for any " (:TERM NIL "key") ", or performing a "
      (:TERM NIL "destructive") " operation on any " (:TERM NIL "object")
      " that is such a " (:TERM NIL "value") ". " :PAR
      "Adding or removing entries from the " (:TERM NIL "hash table") ". "
      :PAR)
     (:ITEM NIL (:TYPEREF NIL "structure-object") " " :PAR
      (:COMMENT NIL
       " Altering or destructively modifying the contents of any slot.")
      :PAR "Storing a new value into any slot, or performing a "
      (:TERM NIL "destructive") " operation on an " (:TERM NIL "object")
      " that is the value of some slot. " :PAR)
     (:ITEM NIL (:TYPEREF NIL "standard-object") " " :PAR
      (:COMMENT NIL
       " Altering or destructively modifying the contents of any slot, or"
       " changing the class of the object.")
      :PAR "Storing a new value into any slot, or performing a "
      (:TERM NIL "destructive") " operation on an " (:TERM NIL "object")
      " that is the value of some slot. " :PAR "Changing the class of the "
      (:TERM NIL "object") " (" (:I NIL "e.g.") ",  using the "
      (:TERM NIL "function") " " (:FUNREF NIL "change-class") "). " :PAR)
     (:ITEM NIL (:TYPEREF NIL "readtable") " " :PAR
      (:COMMENT NIL
       " Altering the readtable-case; altering the syntax type of any"
       " character in this readtable; altering the reader macro function"
       " associated with any character in this readtable; or altering the"
       " reader macro functions associated with characters defined as "
       " dispatching macro characters in this readtable.")
      :PAR "Altering the " (:TERM NIL "readtable case") ". " :PAR
      "Altering the syntax type of any character in this readtable. " :PAR
      "Altering the " (:TERM NIL "reader macro function")
      " associated with any " (:TERM NIL "character") " in the "
      (:TERM NIL "readtable") ", or altering the "
      (:TERM NIL "reader macro functions") " associated with "
      (:TERM NIL "characters") " defined as "
      (:TERM NIL "dispatching macro characters") " in the "
      (:TERM NIL "readtable") ". " :PAR)
     (:ITEM NIL (:TYPEREF NIL "stream") " " :PAR
      (:COMMENT NIL
       " Performing I/O operations on the stream, or closing the stream.")
      :PAR "Performing I/O operations on the " (:TERM NIL "stream") ", or "
      (:TERM NIL "closing") " the " (:TERM NIL "stream") ". " :PAR)
     (:ITEM NIL "All other standardized types " :PAR
      "[This category includes, for example, " (:TYPEREF NIL "character") ", "
      (:TYPEREF NIL "condition") ", " (:TYPEREF NIL "function") ", "
      (:TYPEREF NIL "method-combination") ", " (:TYPEREF NIL "method") ", "
      (:TYPEREF NIL "number") ", " (:TYPEREF NIL "package") ", "
      (:TYPEREF NIL "pathname") ", " (:TYPEREF NIL "restart") ", and "
      (:TYPEREF NIL "symbol") ".] " :PAR
      (:COMMENT NIL
       " (including number, character, symbol, package, pathname, function,"
       "  method, method-combination, condition, restart)"
       " There are no destructive operations defined on these data types.")
      :PAR "There are no " (:TERM NIL "standardized") " "
      (:TERM NIL "destructive") " operations defined on " (:TERM NIL "objects")
      " of these " (:TERM NIL "types") ". " :PAR))
    " " :PAR)
   (:ENDISSUE NIL "DESTRUCTIVE-OPERATIONS:SPECIFY") " " :PAR
   (:SUBSECTION (:TITLE ("Transfer of Control during a Destructive Operation"))
    "Should a transfer of control out of a " (:TERM NIL "destructive")
    " operation occur (" (:I NIL "e.g.")
    ",  due to an error) the state of the " (:PARAM NIL "object")
    " being modified is " (:TERM NIL "implementation-dependent") ". " :PAR
    (:SUBSUBSECTION
     (:TITLE
      ("Examples of Transfer of Control during a Destructive Operation"))
     "The following examples illustrate some of the many ways in which the "
     (:TERM NIL "implementation-dependent")
     " nature of the modification can manifest itself. " :PAR
     (:CODE NIL " (let ((a (list 2 1 4 3 7 6 'five)))
   (ignore-errors (sort a #'<))
   a)
→ (1 2 3 4 6 7 FIVE)
OR→ (2 1 4 3 7 6 FIVE)
OR→ (2)

 (prog foo ((a (list 1 2 3 4 5 6 7 8 9 10)))
   (sort a #'(lambda (x y) (if (zerop (random 5)) (return-from foo a) (> x y)))))
→ (1 2 3 4 5 6 7 8 9 10)
OR→ (3 4 5 6 2 7 8 9 10 1)
OR→ (1 2 4 3)
")
     " " :PAR)
    :PAR)
   :PAR)
  :PAR
  (:DICTIONARY NIL :PAR
   (:COMMENT NIL " Evaluation Control" " Macros" " Declarations"
    " Introspection")
   :PAR
   (:COMMENT NIL
    "-------------------- Lambda Expressions --------------------")
   :PAR (:COMMENT NIL "%% ========== LAMBDA (symbol)") :PAR
   (:COM (:NAME "lambda" :FTYPE "Symbol") (:ISSUE NIL "DECLS-AND-DOC") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "lambda")
      (:ARGLIST NIL "lambda-list "
       (:INTERLEAVE NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration")))
        " | " (:PARAM NIL "documentation"))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form")))))
     " " :PAR)
    (:PART (:NAME "Arguments") " " :PAR (:PARAM NIL "lambda-list") "—an "
     (:TERM NIL "ordinary lambda list") ". " :PAR (:PARAM NIL "declaration")
     "—a " (:MISC NIL "declare") " " (:TERM NIL "expression")
     "; not evaluated. " :PAR (:PARAM NIL "documentation") "—a "
     (:TERM NIL "string") "; not evaluated. " :PAR (:PARAM NIL "form") "—a "
     (:TERM NIL "form") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "lambda expression")
     " is a " (:TERM NIL "list") " that can be used in place of a "
     (:TERM NIL "function name") " in certain contexts to denote a "
     (:TERM NIL "function")
     " by directly describing its behavior rather than indirectly by referring to the name of an "
     (:TERM NIL "established") " " (:TERM NIL "function") ". " :PAR
     (:PARAM NIL "Documentation") " is attached to the denoted "
     (:PARAM NIL "function") " (if any is actually created) as a "
     (:TERM NIL "documentation string") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "function") ", "
     (:SPECREF NIL "documentation") ", " (:SECREF NIL :LAMBDA-EXPRESSIONS) ", "
     (:SECREF NIL :LAMBDA-FORMS) ", " (:SECREF NIL :DOC-VS-DECLS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The " (:TERM NIL "lambda form") " " :PAR
     (:CODE NIL " ((lambda " (:PARAM NIL "lambda-list") " . "
      (:PARAM NIL "body") ") . " (:PARAM NIL "arguments") ")
")
     " " :PAR "is semantically equivalent to the " (:TERM NIL "function form")
     " " :PAR
     (:CODE NIL " (funcall #'(lambda " (:PARAM NIL "lambda-list") " . "
      (:PARAM NIL "body") ") . " (:PARAM NIL "arguments") ")
")
     " " :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== LAMBDA (macro)") :PAR
   (:ISSUE NIL "ISO-COMPATIBILITY:ADD-SUBSTRATE") " "
   (:COM (:NAME "lambda" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR (:COMMENT NIL "% 7.6.0 7")
     (:DEF (:KIND "macro") (:NAMES NIL "lambda")
      (:ARGLIST NIL "lambda-list "
       (:INTERLEAVE NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration")))
        " | " (:PARAM NIL "documentation"))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:PARAM NIL "function")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "lambda-list")
     "—an " (:TERM NIL "ordinary lambda list") ". " :PAR
     (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR
     (:PARAM NIL "documentation") "—a " (:TERM NIL "string")
     "; not evaluated. " :PAR (:PARAM NIL "form") "—a " (:TERM NIL "form") ". "
     :PAR (:PARAM NIL "function") "—a " (:TERM NIL "function") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "Provides a shorthand notation for a " (:SPECREF NIL "function") " "
     (:TERM NIL "special form") " involving a " (:TERM NIL "lambda expression")
     " such that: " :PAR
     (:CODE NIL "    (lambda " (:PARAM NIL "lambda-list") " "
      (:INTERLEAVE NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration")))
       " | " (:PARAM NIL "documentation"))
      " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))) ")
 ≡ (function (lambda "
      (:PARAM NIL "lambda-list") " "
      (:INTERLEAVE NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration")))
       " | " (:PARAM NIL "documentation"))
      " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))) "))
 ≡ #'(lambda "
      (:PARAM NIL "lambda-list") " "
      (:INTERLEAVE NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration")))
       " | " (:PARAM NIL "documentation"))
      " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))) ")
")
     " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (funcall (lambda (x) (+ x 3)) 4) → 7
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MISC NIL "lambda") " (symbol) " :PAR)
    (:PART (:NAME "Notes") " " :PAR "This macro could be implemented by: " :PAR
     (:CODE NIL "(defmacro lambda (&whole form &rest bvl-decls-and-body)
  (declare (ignore bvl-decls-and-body))
  `#',form)
")
     " " :PAR))
   (:ENDISSUE NIL "ISO-COMPATIBILITY:ADD-SUBSTRATE") " " :PAR
   (:COMMENT NIL
    "-------------------- Evaluation Control --------------------")
   :PAR (:COMMENT NIL "%% ========== COMPILE") :PAR
   (:COM (:NAME "compile" :FTYPE "Function") (:ISSUE NIL "FUNCTION-NAME:LARGE")
    " "
    (:COMMENT NIL
     "%\\param{Name} has been changed to \\param{function-name} throughout.}")
    (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "compile")
      (:ARGLIST NIL "name " (:KEYWORD NIL " &optional") " definition")
      (:VALUES NIL "function, warnings-p, failure-p"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "function name") ", or " (:MISC NIL "nil") ". " :PAR
     (:COMMENT NIL "% 25.1.0 5") (:PARAM NIL "definition") "—a "
     (:TERM NIL "lambda expression") " or a " (:TERM NIL "function")
     ". The default is the function definition of " (:PARAM NIL "name")
     " if it names a " (:TERM NIL "function") ", or the "
     (:TERM NIL "macro function") " of " (:PARAM NIL "name") " if it names a "
     (:TERM NIL "macro") ". The consequences are undefined if no "
     (:PARAM NIL "definition") " is supplied when the " (:PARAM NIL "name")
     " is " (:MISC NIL "nil") ". " :PAR (:COMMENT NIL "% 25.1.0 6")
     (:PARAM NIL "function") "—the " (:PARAM NIL "function-name") ", "
     (:ISSUE NIL "COMPILED-FUNCTION-REQUIREMENTS:TIGHTEN") " or a "
     (:TERM NIL "compiled function") ". "
     (:ENDISSUE NIL "COMPILED-FUNCTION-REQUIREMENTS:TIGHTEN") " " :PAR
     (:PARAM NIL "warnings-p") "—a " (:TERM NIL "generalized boolean") ". "
     :PAR (:PARAM NIL "failure-p") "—a " (:TERM NIL "generalized boolean") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR "Compiles an "
     (:TERM NIL "interpreted function") ". "
     (:COMMENT NIL
      "% Moon: Intent is compilation envirionment = startup environment."
      "%       Just delete this phrase, I think."
      "in the current \\term{dynamic environment}.")
     :PAR (:FUNREF NIL "compile") " produces a "
     (:TERM NIL "compiled function") " from " (:PARAM NIL "definition")
     ". If the " (:PARAM NIL "definition") " is a "
     (:TERM NIL "lambda expression") ", it is coerced to a "
     (:TERM NIL "function") ". "
     (:ISSUE NIL "COMPILE-ARGUMENT-PROBLEMS-AGAIN:FIX") " If the "
     (:PARAM NIL "definition") " is already a " (:TERM NIL "compiled function")
     ", " (:FUNREF NIL "compile") " either produces that function itself ("
     (:I NIL "i.e.") ",  is an identity operation) or an equivalent function. "
     (:ENDISSUE NIL "COMPILE-ARGUMENT-PROBLEMS-AGAIN:FIX") " " :PAR
     (:EDITORNOTE NIL
      "KMP: There are a number of ambiguities here that still need resolution.")
     (:COMMENT NIL "!!!" " Cases of interest:"
      " Given: (defmacro foist (x) `(car ,x))" " What do these do:"
      "  (compile 'foist (macro-function 'foist))"
      "  (compile 'foist (symbol-function 'foist))"
      "  (compile 'foist '(lambda (x y) (+ x y)))")
     "If the " (:PARAM NIL "name") " is " (:MISC NIL "nil") ", the resulting "
     (:TERM NIL "compiled function") " is returned directly as the "
     (:TERM NIL "primary value") ". If a " (:TERM NIL "non-nil") " "
     (:PARAM NIL "name") " is given, then the resulting "
     (:TERM NIL "compiled function") " replaces the existing "
     (:TERM NIL "function") " definition of " (:PARAM NIL "name") " and the "
     (:PARAM NIL "name") " is returned as the " (:TERM NIL "primary value")
     "; if " (:PARAM NIL "name") " is a " (:TERM NIL "symbol") " that names a "
     (:TERM NIL "macro") ", its " (:TERM NIL "macro function")
     " is updated and the " (:PARAM NIL "name") " is returned as the "
     (:TERM NIL "primary value") ". " :PAR
     (:COMMENT NIL
      " I moved this paragraph so it isn't in the middle of the discussion"
      " of compiler diagnostics.  --sjl 7 Mar 92")
     (:ISSUE NIL "QUOTE-SEMANTICS:NO-COPYING") " "
     (:COMMENT NIL " Constants -> Literal objects. -kmp 15-Jan-91")
     (:TERM NIL "Literal objects") " appearing in code processed by the "
     (:FUNREF NIL "compile") " function are neither copied nor "
     (:TERM NIL "coalesced") ". The code resulting from the execution of "
     (:FUNREF NIL "compile") " references " (:TERM NIL "objects") " that are "
     (:FUNREF NIL "eql") " to the corresponding " (:TERM NIL "objects")
     " in the source code. " (:ENDISSUE NIL "QUOTE-SEMANTICS:NO-COPYING") " "
     :PAR (:ISSUE NIL "COMPILER-DIAGNOSTICS:USE-HANDLER") " "
     (:FUNREF NIL "compile") " is permitted, but not required, to "
     (:TERM NIL "establish") " a " (:TERM NIL "handler") " for "
     (:TERM NIL "conditions") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") ". For example, the " (:TERM NIL "handler")
     " might issue a warning and restart compilation from some "
     (:TERM NIL "implementation-dependent")
     " point in order to let the compilation proceed without manual intervention. "
     (:ENDISSUE NIL "COMPILER-DIAGNOSTICS:USE-HANDLER") " " :PAR "The "
     (:TERM NIL "secondary value") ", " (:PARAM NIL "warnings-p") ", is "
     (:TERM NIL "false") " "
     (:COMMENT NIL " clarify ``compiler diagnostics''  --sjl 7 Mar 92"
      "if no compiler diagnostics were issued, and \\term{true} otherwise.")
     "if no " (:TERM NIL "conditions") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") " or " (:TYPEREF NIL "warning")
     " were detected by the compiler, and " (:TERM NIL "true") " otherwise. "
     :PAR "The " (:TERM NIL "tertiary value") ", " (:PARAM NIL "failure-p")
     ", is " (:TERM NIL "false") " "
     (:COMMENT NIL " clarify ``compiler diagnostics''  --sjl 7 Mar 92"
      "if no compiler diagnostics other than \\term{style warnings} were issued."
      "A value of \\term{true} indicates that there were serious compiler diagnostics"
      "issued, or that other \\term{conditions} \\oftype{error} or \\typeref{warning}"
      "(but not \\oftype{style-warning}) were signaled during compilation.")
     "if no " (:TERM NIL "conditions") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") " or " (:TYPEREF NIL "warning") " (other than "
     (:TYPEREF NIL "style-warning") ") were detected by the compiler, and "
     (:TERM NIL "true") " otherwise. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun foo () \"bar\") → FOO
 (compiled-function-p #'foo) → "
      (:TERM NIL "implementation-dependent") "
 (compile 'foo) → FOO 
 (compiled-function-p #'foo) → "
      (:TERM NIL "true") "
 (setf (symbol-function 'foo)
       (compile nil '(lambda () \"replaced\"))) → #<Compiled-Function>
 (foo) → \"replaced\"
")
     " "
     (:COMMENT NIL " (defun foo ...) \\EV foo  ;A function definition."
      " (compile 'foo) \\EV foo   ;Compile it."
      "                          ;Now foo runs faster.")
     :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     (:ISSUE NIL "COMPILER-WARNING-STREAM") " " (:VARREF NIL "*error-output*")
     ", " (:ENDISSUE NIL "COMPILER-WARNING-STREAM") " "
     (:VARREF NIL "*macroexpand-hook*") ". " :PAR
     "The presence of macro definitions and proclamations. " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "COMPILE-ARGUMENT-PROBLEMS-AGAIN:FIX")
     " The consequences are undefined if the "
     (:TERM NIL "lexical environment") " surrounding the "
     (:TERM NIL "function") " to be compiled contains any "
     (:TERM NIL "bindings") " other than those for " (:TERM NIL "macros") ", "
     (:TERM NIL "symbol macros") ", or " (:TERM NIL "declarations") ". " :PAR
     (:COMMENT NIL
      " The consequences are undefined if the \\term{function} to be compiled"
      " was defined in a \\term{non-null lexical environment}.")
     :PAR
     (:COMMENT NIL
      " The consequences are unspecified if the \\term{function} is already a"
      " \\term{compiled function}.")
     (:ENDISSUE NIL "COMPILE-ARGUMENT-PROBLEMS-AGAIN:FIX") " " :PAR
     (:COMMENT NIL
      "% should be an error signaled if name is nil and no definition is supplied."
      "% also if function is already compiled."
      "ERROR and WARNING conditions may be signaled within "
      "    COMPILE or COMPILE-FILE, including arbitrary errors which may "
      "    occur due to compile-time processing of (EVAL-WHEN (:COMPILE-TOPLEVEL) ...) "
      "    forms or macro expansion." " ")
     :PAR
     (:COMMENT NIL
      " The following information is mostly redundant with info in the chapter 3"
      " concept section, and contains some inconsistencies.  Better to just"
      " put in a cross-reference.  --sjl 4 mar 92"
      " \\issue{COMPILER-DIAGNOSTICS:USE-HANDLER}"
      " The following list considers only "
      " those conditions signaled by the compiler as"
      "     opposed to within the compiler." "  "
      "     An error \\oftype{error} might be signaled by the compiler in"
      "         situations where the compilation cannot proceed without"
      "         intervention." "         Examples include"
      " 	    file open errors and" "    	    syntax errors." "  "
      " An error \\oftype{warning} might be signaled by the compiler in "
      " situations where the standard explicitly states "
      " that a warning must, should, or might be signaled."
      " Also, an error \\oftype{warning} might be signaled "
      " by the compiler in situations where the compiler can determine "
      " that a situation with undefined consequences or that would cause"
      " an error to be signaled would result at runtime." " Examples include"
      "  violation of type declarations,"
      "  \\term{assigning} or \\term{binding} a \\term{constant variable},"
      "  calling a built-in Lisp function with the wrong number of arguments"
      "    or malformed keyword argument lists,"
      "  referencing a variable declared \\declref{ignore}, "
      "  and the usage of unrecognized declaration specifiers." "  "
      " The compiler is permitted to signal errors \\oftype{style-warning}"
      " about matters of programming style. Although \\term{style warnings} might "
      " be signaled in these situations, no implementation is required to "
      " signal them. However, if an implementation does choose to signal an"
      " error about matters of programming style, "
      " that error is \\oftype{style-warning} and is signaled by a call to \\funref{warn}."
      " Examples include"
      "  redefinition of a \\term{function} with a different argument list,"
      "  calling a \\term{function} with the wrong number of arguments,"
      "  \\term{accessing} unreferenced local variables not declared \\declref{ignore}, "
      "  and usage of declaration specifiers described in the standard but ignored by the compiler."
      "  " " \\issue{COMPILER-WARNING-STREAM}"
      " %%This is now implied by the remarks about using WARN above."
      " %\\funref{compile} is permitted to issue warnings through \\term{error output}."
      " \\endissue{COMPILER-WARNING-STREAM}" " "
      " \\endissue{COMPILER-DIAGNOSTICS:USE-HANDLER}")
     :PAR
     "For information about errors detected during the compilation process, see "
     (:SECREF NIL :FILE-COMPILER-EXCEPTIONS) ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "compile-file") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== EVAL")
   (:COM (:NAME "eval" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "eval") (:ARGLIST NIL "form")
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "form") "—a "
     (:TERM NIL "form") ". " :PAR (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " " (:TERM NIL "yielded") " by the "
     (:TERM NIL "evaluation") " of " (:PARAM NIL "form") ". " :PAR
     (:COMMENT NIL "% Goes without saying. -kmp 8-Aug-91" " %% 7.9.2 4"
      " Returns multiple values if \\param{form} produces multiple values.")
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 20.1.0 2")
     "Evaluates " (:PARAM NIL "form") " in the current "
     (:TERM NIL "dynamic environment") " and the "
     (:TERM NIL "null lexical environment") ". " :PAR
     (:COMMENT NIL "% 20.1.0 1") (:FUNREF NIL "eval")
     " is a user interface to the evaluator. " :PAR (:COMMENT NIL "% 8.2.0 5")
     "The evaluator expands macro calls as if through the use of "
     (:FUNREF NIL "macroexpand-1") ". " :PAR
     (:COMMENT NIL "%% 9.1.0 3"
      "It is an error to attempt to evaluate a declaration."
      "Those \\term{forms} that permit declarations to appear"
      "perform explicit checks for their presence.")
     :PAR (:ISSUE NIL "QUOTE-SEMANTICS:NO-COPYING")
     " Constants appearing in code processed by " (:FUNREF NIL "eval")
     " are not copied nor coalesced. The code resulting from the execution of "
     (:FUNREF NIL "eval") " references " (:TERM NIL "objects") " that are "
     (:FUNREF NIL "eql") " to the corresponding " (:TERM NIL "objects")
     " in the source code. " (:ENDISSUE NIL "QUOTE-SEMANTICS:NO-COPYING") " "
     :PAR (:COMMENT NIL "!!! Barmar: What about compiler macros?") :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq form '(1+ a) a 999) → 999
 (eval form) → 1000
 (eval 'form) → (1+ A)
 (let ((a '(this would break if eval used local value))) (eval form))
→ 1000
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:ISSUE NIL "EVALHOOK-STEP-CONFUSION:X3J13-NOV-89") " "
     (:COMMENT NIL "\\funref{evalhook}," "\\funref{applyhook},")
     (:ENDISSUE NIL "EVALHOOK-STEP-CONFUSION:X3J13-NOV-89") " "
     (:FUNREF NIL "macroexpand-1") ", " (:SECREF NIL :EVALUATION-MODEL) " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 20.1.0 4")
     "To obtain the current dynamic value of a " (:TERM NIL "symbol")
     ", use of " (:FUNREF NIL "symbol-value")
     " is equivalent (and usually preferable) to use of " (:FUNREF NIL "eval")
     ". " :PAR (:COMMENT NIL "% 20.1.0 3") "Note that an " (:FUNREF NIL "eval")
     " " (:TERM NIL "form") " involves two levels of " (:TERM NIL "evaluation")
     " for its " (:TERM NIL "argument") ". First, " (:PARAM NIL "form") " is "
     (:TERM NIL "evaluated")
     " by the normal argument evaluation mechanism as would occur with any "
     (:TERM NIL "call") ". The " (:TERM NIL "object")
     " that results from this normal " (:TERM NIL "argument") " "
     (:TERM NIL "evaluation") " becomes the " (:TERM NIL "value") " of the "
     (:PARAM NIL "form") " " (:TERM NIL "parameter") ", and is then "
     (:TERM NIL "evaluated") " as part of the " (:FUNREF NIL "eval") " "
     (:TERM NIL "form") ". For example: " :PAR
     (:CODE NIL " (eval (list 'cdr (car '((quote (a . b)) c)))) → b
")
     " The " (:TERM NIL "argument") " " (:TERM NIL "form") " "
     (:TT NIL "(list 'cdr (car '((quote (a . b)) c)))")
     " is evaluated in the usual way to produce the " (:TERM NIL "argument")
     " " (:TT NIL "(cdr (quote (a . b)))") "; "
     (:COMMENT NIL " this is then given to \\funref{eval} "
      " because \\funref{eval} is being called explicitly," " and ")
     (:FUNREF NIL "eval") " then evaluates its " (:TERM NIL "argument") ", "
     (:TT NIL "(cdr (quote (a . b)))") ", to produce " (:TT NIL "b")
     ". Since a single " (:TERM NIL "evaluation") " already occurs for any "
     (:TERM NIL "argument") " " (:TERM NIL "form") " in any "
     (:TERM NIL "function form") ", " (:FUNREF NIL "eval")
     " is sometimes said to perform “an extra level of evaluation.” " :PAR
     (:ISSUE NIL "EVALHOOK-STEP-CONFUSION:FIX") " "
     (:COMMENT NIL " Hooks are provided for user-supplied debugging routines"
      " to obtain control during the execution of an interpretive evaluator."
      " \\funref{evalhook} and \\funref{applyhook} provide alternative"
      " interfaces to the evaluator mechanism for use by these debugging routines.")
     (:ENDISSUE NIL "EVALHOOK-STEP-CONFUSION:FIX") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== EVAL-WHEN")
   (:COM (:NAME "eval-when" :FTYPE "Special Operator")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "eval-when")
      (:ARGLIST NIL
       (:PAREN NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "situation")))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "EVAL-WHEN-NON-TOP-LEVEL:GENERALIZE-EVAL-NEW-KEYWORDS") " "
     (:PARAM NIL "situation") "—One of the " (:TERM NIL "symbols") " "
     (:KWD NIL "compile-toplevel") (:IDXKWD NIL "compile-toplevel") ", "
     (:KWD NIL "load-toplevel") (:IDXKWD NIL "load-toplevel") ", "
     (:KWD NIL "execute") (:IDXKWD NIL "execute") ", " (:MISC NIL "compile")
     (:IDXREF NIL "compile") ", " (:MISC NIL "load") (:IDXREF NIL "load")
     ", or " (:MISC NIL "eval") (:IDXREF NIL "eval") ". " :PAR "The use of "
     (:MISC NIL "eval") ", " (:MISC NIL "compile") ", and " (:MISC NIL "load")
     " is deprecated. "
     (:ISSUE NIL "EVAL-WHEN-OBSOLETE-KEYWORDS:X3J13-MAR-1993") " "
     (:COMMENT NIL
      "They are supported when \\specref{eval-when} is a \\term{top level form},"
      "but their meaning is not defined elsewhere.")
     (:ENDISSUE NIL "EVAL-WHEN-OBSOLETE-KEYWORDS:X3J13-MAR-1993") " "
     (:ENDISSUE NIL "EVAL-WHEN-NON-TOP-LEVEL:GENERALIZE-EVAL-NEW-KEYWORDS") " "
     :PAR (:PARAM NIL "forms") "—an " (:TERM NIL "implicit progn") ". " :PAR
     (:PARAM NIL "results") "—the " (:TERM NIL "values") " of the "
     (:TERM NIL "forms") " if they are executed, or " (:MISC NIL "nil")
     " if they are not. " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "%% 5.3.3 2"
      "\\specref{eval-when} specifies when a particular body"
      "of code is to be evaluated." "%% 5.3.3 1.5"
      "\\specref{eval-when} allows pieces of code to"
      "be executed only at compile time, only in compiled code, or"
      "when interpreted but not compiled.  "
      "If no \\param{forms} are executed, \\specref{eval-when} returns"
      "\\nil." "%% 5.3.3 3"
      "\\f{eval} specifies that the interpreter should process the body."
      "\\f{compile} specifies that the compiler should evaluate the body"
      "at compile time in the compilation context."
      "\\f{load} specifies that the compiler should arrange to evaluate"
      "the forms in the body when the compiled file containing the"
      "\\specref{eval-when} form is \\term{loaded}."
      "The body of \\specref{eval-when} is processed as an implicit"
      "\\specref{progn}, but only in the allowed \\param{situations}.")
     (:ISSUE NIL "EVAL-WHEN-NON-TOP-LEVEL:GENERALIZE-EVAL-NEW-KEYWORDS")
     " The body of an " (:SPECREF NIL "eval-when") " form is processed as an "
     (:TERM NIL "implicit progn") ", but only in the "
     (:PARAM NIL "situations") " listed. "
     (:COMMENT NIL "Each \\param{situation} must be a symbol,"
      "  either COMPILE, LOAD, or EVAL.")
     :PAR
     (:COMMENT NIL
      " The file compilation section only describe processing by COMPILE-FILE."
      " We must say something explicit here about EVAL and COMPILE."
      " (The last paragraph from the eval-when cleanup has gotten lost.)"
      " I have rewritten this below to include the missing info.  --sjl 5 Mar 92")
     :PAR
     (:COMMENT NIL
      "  The use of the \\param{situations} \\kwd{compile-toplevel} ({\\tt compile}) and "
      " \\kwd{load-toplevel} ({\\tt load}) controls whether and when processing"
      "   occurs for \\term{top level forms}. The use of "
      " the situation \\kwd{execute} ({\\tt eval}) controls whether"
      "   processing occurs for \\term{non-top-level forms}." " "
      " For a description of \\specref{eval-when} processing, \\seesection\\FileCompilation.")
     :PAR "The use of the " (:PARAM NIL "situations") " "
     (:KWD NIL "compile-toplevel") " (or " (:TT NIL " compile") ") and "
     (:KWD NIL "load-toplevel") " (or " (:TT NIL " load")
     ") controls whether and when " (:TERM NIL "evaluation") " occurs when "
     (:SPECREF NIL "eval-when") " appears as a " (:TERM NIL "top level form")
     " in code processed by " (:FUNREF NIL "compile-file") ". See "
     (:SECREF NIL :FILE-COMPILATION) ". " :PAR "The use of the "
     (:PARAM NIL "situation") " " (:KWD NIL "execute") " (or "
     (:TT NIL " eval") ") controls whether evaluation occurs for other "
     (:SPECREF NIL "eval-when") " " (:TERM NIL "forms")
     "; that is, those that are not " (:TERM NIL "top level forms")
     ", or those in code processed by " (:FUNREF NIL "eval") " or "
     (:VARREF NIL "compile") ". If the " (:KWD NIL "execute")
     " situation is specified in such a " (:TERM NIL "form") ", then the body "
     (:PARAM NIL "forms") " are processed as an " (:TERM NIL "implicit progn")
     "; otherwise, the " (:SPECREF NIL "eval-when") " " (:TERM NIL "form")
     " returns " (:MISC NIL "nil") ". " :PAR
     (:COMMENT NIL "  The \\specref{eval-when} "
      "construct can be more precisely understood in terms of"
      "  a model of how the file compiler, COMPILE-FILE, processes forms in a"
      "  file to be compiled.")
     :PAR
     (:COMMENT NIL "When  successive \\term{forms} are "
      "read from the file by \\funref{compile-file},"
      "these \\term{top level forms} are normally processed in "
      "  not-compile-time mode. There is one other mode, called "
      "  compile-time-too mode, that is also used for processing \\term{top level forms}."
      "  The \\specref{eval-when} special form "
      "is used to annotate a program"
      "  in a way that allows the program doing the processing to select"
      "  the appropriate mode." " " "When \\funref{compile-file}"
      "encounters an \\specref{eval-when} form, the \\term{form}"
      "is handled according to" "the table in \\thenextfigure." " " "\\boxfig"
      "\\tabskip \\dimen0 plus .5 fil"
      "\\halign to \\hsize {#\\hfil\\tabskip \\dimen0 plus 1fil&#\\hfil\\tabskip "
      "\\dimen0 plus .5 fil&#\\hfil\\tabskip \\dimen0 plus 1fil&#\\hfil\\tabskip \\dimen0 plus 1fil"
      "&#\\hfil\\cr " "\\noalign{\\vskip -9pt}"
      "\\hfil{\\bf A} & {\\bf B} & {\\bf C} & {\\bf D}& {\\bf Action} \\cr"
      "& & & & \\cr"
      "   Yes &  Yes  &--     &--             &Process body in compile-time-too"
      "mode\\cr"
      "   No   &Yes  &Yes    &Yes            &Process body in compile-time-too mode\\cr"
      "   No    &Yes  &Yes    &No             &Process body in not-compile-time mode\\cr"
      "   No    &Yes  &No     &--             &Process body in not-compile-time mode\\cr"
      "   Yes   &No   &--     &--             &Evaluate body\\cr"
      "   No    &No   &Yes    &Yes            &Evaluate body\\cr"
      "   No    &No   &Yes    &No             &do nothing\\cr"
      "   No    &No   &No     &--             &do nothing\\cr"
      "\\noalign{\\vskip -9pt}" "}}"
      "\\caption{\\specref{eval-when} processing}" "\\endfig"
      "Column A indicates"
      "Column B indicates \\kwd{load-toplevel} processing."
      "Column C indicates {\\tt    :execute} processing."
      "Column D indicates  compile-time-too processing." "   "
      "  Process body means to process the body (using the procedure "
      "  outlined in this subsection) as an implicit toplevel \\specref{progn}."
      " " " "
      "  Evaluate body means to evaluate the body \\param{forms} as an "
      "  \\term{implicit progn} in the" "  % dynamic execution context"
      "  \\term{dynamic environment} of the compiler and in the"
      "  \\term{lexical environment} in which the \\specref{eval-when} appears."
      "          " "  For an \\specref{eval-when} "
      "form that is not a \\term{top level form},  "
      "if the \\kwd{execute} situation is specified,"
      "the body of the \\specref{eval-when}"
      "is treated as an \\term{implicit progn}.  Otherwise, the "
      "\\specref{eval-when}" "  form returns \\nil."
      "An \\specref{eval-when} form is a \\term{non-top-level form}"
      "if it is one of the following: "
      "in the interpreter, in \\funref{compile}, or in \\funref{compile-file}"
      "but not a \\term{top level form}. ")
     (:ENDISSUE NIL "EVAL-WHEN-NON-TOP-LEVEL:GENERALIZE-EVAL-NEW-KEYWORDS") " "
     :PAR
     (:COMMENT NIL
      "!!! Barmar: Redundant.  (KMP: I'll have to think about that.)")
     (:ISSUE NIL "DEFINING-MACROS-NON-TOP-LEVEL:ALLOW") " "
     (:SPECREF NIL "eval-when") " normally appears as a "
     (:TERM NIL "top level form")
     ", but it is meaningful for it to appear as a "
     (:TERM NIL "non-top-level form")
     ". However, the compile-time side effects described in "
     (:SECREF NIL :COMPILATION) " only take place when "
     (:SPECREF NIL "eval-when") " appears as a " (:TERM NIL "top level form")
     ". " (:ENDISSUE NIL "DEFINING-MACROS-NON-TOP-LEVEL:ALLOW") " " :PAR
     (:COMMENT NIL
      "\\specref{eval-when} is meaningful only as a \\term{top level form}.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:COMMENT NIL
      "!!! Are the EVAL-WHEN return values correct?? -kmp 29-Aug-91")
     :PAR
     (:COMMENT NIL
      "% Moon: Why isn't this compile toplevel? Maybe this example is not portable?"
      "%       It's an obfuscating example anyway. Delete it." " \\code"
      "  (setq temp 3) \\EV 3 "
      "  (eval-when (:compile-toplevel) (setq temp 2)) \\EV NIL "
      "  temp \\EV 3 " "  (eval-when (:execute) (setq temp 2)) \\EV 2 "
      "  temp \\EV 2 " " \\endcode")
     :PAR (:COMMENT NIL "% 5.3.3 10") "One example of the use of "
     (:SPECREF NIL "eval-when")
     " is that for the compiler to be able to read a file properly when it uses user-defined "
     (:TERM NIL "reader macros") ", it is necessary to write " :PAR
     (:CODE NIL " (eval-when (:compile-toplevel :load-toplevel :execute)
   (set-macro-character #\\$ #'(lambda (stream char)
                                (declare (ignore char))
                                (list 'dollar (read stream))))) → T
")
     " This causes the call to " (:FUNREF NIL "set-macro-character")
     " to be executed in the compiler's execution environment, thereby modifying its reader syntax table. "
     :PAR
     (:CODE NIL
      ";;;     The EVAL-WHEN in this case is not at toplevel, so only the :EXECUTE
;;;     keyword is considered. At compile time, this has no effect.
;;;     At load time (if the LET is at toplevel), or at execution time
;;;     (if the LET is embedded in some other form which does not execute
;;;     until later) this sets (SYMBOL-FUNCTION 'FOO1) to a function which
;;;     returns 1.
 (let ((x 1))
   (eval-when (:execute :load-toplevel :compile-toplevel)
     (setf (symbol-function 'foo1) #'(lambda () x))))

;;;     If this expression occurs at the toplevel of a file to be compiled,
;;;     it has BOTH a compile time AND a load-time effect of setting
;;;     (SYMBOL-FUNCTION 'FOO2) to a function which returns 2.
 (eval-when (:execute :load-toplevel :compile-toplevel)
   (let ((x 2))
     (eval-when (:execute :load-toplevel :compile-toplevel)
       (setf (symbol-function 'foo2) #'(lambda () x)))))

;;;     If this expression occurs at the toplevel of a file to be compiled,
;;;     it has BOTH a compile time AND a load-time effect of setting the
;;;     function cell of FOO3 to a function which returns 3.
 (eval-when (:execute :load-toplevel :compile-toplevel)
   (setf (symbol-function 'foo3) #'(lambda () 3)))
 
;;; #4: This always does nothing. It simply returns NIL.
 (eval-when (:compile-toplevel)
   (eval-when (:compile-toplevel) 
     (print 'foo4)))

;;;     If this form occurs at toplevel of a file to be compiled, FOO5 is
;;;     printed at compile time. If this form occurs in a non-top-level
;;;     position, nothing is printed at compile time. Regardless of context,
;;;     nothing is ever printed at load time or execution time.
 (eval-when (:compile-toplevel) 
   (eval-when (:execute)
     (print 'foo5)))
 
;;;     If this form occurs at toplevel of a file to be compiled, FOO6 is
;;;     printed at compile time.  If this form occurs in a non-top-level
;;;     position, nothing is printed at compile time. Regardless of context,
;;;     nothing is ever printed at load time or execution time.
 (eval-when (:execute :load-toplevel)
   (eval-when (:compile-toplevel)
     (print 'foo6)))
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "compile-file") ", "
     (:SECREF NIL :COMPILATION) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:ISSUE NIL "EVAL-WHEN-NON-TOP-LEVEL:GENERALIZE-EVAL-NEW-KEYWORDS")
     " The following effects are logical consequences of the definition of "
     (:SPECREF NIL "eval-when") ": " :PAR
     (:LIST NIL
      (:ITEM NIL " Execution of a single " (:SPECREF NIL "eval-when")
       " expression executes the body code at most once. " :PAR)
      (:ITEM NIL " " (:TERM NIL "Macros") " intended for use in "
       (:TERM NIL "top level forms")
       " should be written so that side-effects are done by the "
       (:TERM NIL "forms")
       " in the macro expansion. The macro-expander itself should not do the side-effects. "
       :PAR "For example: " :PAR "Wrong: " :PAR
       (:CODE NIL " (defmacro foo ()
   (really-foo)
   `(really-foo))
")
       " " :PAR "Right: " :PAR
       (:CODE NIL " (defmacro foo ()
   `(eval-when (:compile-toplevel :execute :load-toplevel) (really-foo)))
")
       " " :PAR "Adherence to this convention means that such "
       (:TERM NIL "macros") " behave intuitively when appearing as "
       (:TERM NIL "non-top-level forms") ". " :PAR)
      (:ITEM NIL " Placing a variable binding around an "
       (:SPECREF NIL "eval-when")
       " reliably captures the binding because the compile-time-too mode cannot occur ("
       (:I NIL "i.e.") ",  introducing a variable binding means that the "
       (:SPECREF NIL "eval-when") " is not a " (:TERM NIL "top level form")
       "). For example, " :PAR
       (:CODE NIL " (let ((x 3))
   (eval-when (:execute :load-toplevel :compile-toplevel) (print x)))
")
       " " :PAR "prints " (:TT NIL " 3") " at execution (" (:I NIL "i.e.")
       ",  load) time, and does not print anything at compile time. This is important so that expansions of "
       (:MACREF NIL "defun") " and " (:MACREF NIL "defmacro")
       " can be done in terms of " (:SPECREF NIL "eval-when")
       " and can correctly capture the " (:TERM NIL "lexical environment") ". "
       :PAR
       (:CODE NIL " (defun bar (x) (defun foo () (+ x 3)))
")
       " " :PAR "might expand into " :PAR
       (:CODE NIL " (defun bar (x) 
   (progn (eval-when (:compile-toplevel) 
            (compiler::notice-function-definition 'foo '(x)))
          (eval-when (:execute :load-toplevel)
            (setf (symbol-function 'foo) #'(lambda () (+ x 3))))))
")
       " " :PAR "which would be treated by the above rules the same as " :PAR
       (:CODE NIL " (defun bar (x) 
   (setf (symbol-function 'foo) #'(lambda () (+ x 3))))
")
       " " :PAR "when the definition of " (:TT NIL "bar") " is not a "
       (:TERM NIL "top level form") ". "))
     " " :PAR
     (:ENDISSUE NIL "EVAL-WHEN-NON-TOP-LEVEL:GENERALIZE-EVAL-NEW-KEYWORDS") " "
     :PAR))
   " " :PAR
   (:COMMENT NIL "% Replaced per X3J13. -kmp 05-Oct-93"
    " %%% ========== LOAD-TIME-VALUE"
    " \\begincom{load-time-value}\\ftype{Special Operator}      "
    " \\issue{LOAD-TIME-EVAL:R**3-NEW-SPECIAL-FORM}" " " " \\label Syntax::"
    " "
    " \\DefspecWithValues load-time-value {form {\\opt} read-only-p} {object}"
    " " " \\label Arguments and Values::         " " "
    " \\param{form}---a \\term{form}; \\evalspecial." " "
    " \\param{read-only-p}---one of the \\term{symbols} \\t\\ or \\nil; \\noeval."
    " "
    " \\param{object}---the \\term{primary value} resulting from evaluating \\param{form}."
    " " " \\label Description::" " "
    " \\specref{load-time-value} provides a mechanism for delaying evaluation of \\param{form}"
    " until the expression is in the run-time environment; \\seesection\\Compilation."
    "  "
    " \\param{Read-only-p} designates whether the result can be considered a"
    " \\term{constant object}. If \\nil\\ (the default), the result must be considered "
    " ordinary, modifiable data. If \\t, the result is a read-only quantity"
    " that can, if appropriate to the \\term{implementation}, "
    " be copied into read-only space and/or \\term{coalesced} with \\term{similar}"
    " \\term{constant objects} from other \\term{programs}." " "
    " If a \\specref{load-time-value} expression is processed by \\funref{compile-file},"
    " the compiler performs its normal semantic processing (such as macro expansion "
    " and translation into machine code) on \\param{form}, but arranges for the"
    " execution of \\param{form} to occur at load time in a \\term{null lexical environment}, "
    " with the result of this \\term{evaluation} then being treated as "
    " %an immediate quantity" " a \\term{literal object}"
    " at run time.  It is guaranteed that the evaluation of \\param{form} "
    " will take place only once when the \\term{file} is \\term{loaded}, but "
    " the order of evaluation with respect to the evaluation of"
    " \\term{top level forms} in the file is \\term{implementation-dependent}."
    " \\idxtext{order of evaluation}\\idxtext{evaluation order}" "  "
    " If a \\specref{load-time-value} expression appears within a function compiled"
    " with \\funref{compile}, the \\param{form} is evaluated at compile time in a"
    " \\term{null lexical environment}.  The result of this compile-time evaluation "
    " is treated as" " %an immediate quantity" " a \\term{literal object}"
    " in the compiled code.  " "  "
    " If a \\specref{load-time-value} expression is processed by \\funref{eval},"
    " \\param{form} is evaluated in a \\term{null lexical environment}, "
    " and one value is returned.  Implementations that implicitly compile"
    " (or partially compile) expressions processed by \\funref{eval} "
    " %\"can\" => \"might\".  Barrett thought \"can\" was clumsy."
    " might evaluate \\param{form} only once, at the time this compilation is performed.  "
    " %This is intentionally similar to the"
    " %   freedom which implementations are given for the time of expanding"
    " %   macros in interpreted code." "  "
    " If the \\term{same} \\term{list} \\f{(load-time-value \\param{form})} is"
    " evaluated or compiled more than once, it is \\term{implementation-dependent}"
    " whether \\param{form} is evaluated only once or is evaluated more than once."
    " This can happen both when an expression being evaluated or compiled shares"
    " substructure, and when the \\term{same} \\term{form} is processed by \\funref{eval} or "
    " \\funref{compile} multiple times.                               "
    " Since a \\specref{load-time-value} expression can be"
    "   referenced in more than one place and can be evaluated multiple times"
    "   by \\funref{eval}, it is "
    " \\term{implementation-dependent} whether each execution returns"
    "   a fresh \\term{object} "
    " or returns the same \\term{object} as some other execution."
    "   Users must use caution when destructively modifying the resulting"
    "   \\term{object}." " "
    " If two lists \\f{(load-time-value \\param{form})} "
    " that are the \\term{same} under \\funref{equal} but are not \\term{identical}"
    " are evaluated or compiled,"
    " their values always come from distinct evaluations of \\param{form}."
    " %Per Barrett: \"These forms\" => \"Their values\""
    " Their \\term{values} may not be coalesced" " %Added per Barmar:"
    " unless \\param{read-only-p} is \\t." "  " " \\label Examples:\\None."
    "  " " \\label Affected By:\\None." " "
    " \\label Exceptional Situations:\\None." " " " \\label See Also::" " "
    " \\funref{compile-file}," " \\funref{compile}," " \\funref{eval},"
    " {\\secref\\MinimalCompilation}," " {\\secref\\Compilation}" " "
    " \\label Notes::" " "
    " \\specref{load-time-value} must appear outside of quoted structure in a"
    " ``for \\term{evaluation}'' position.  In situations which would appear to call"
    " for use of \\specref{load-time-value} within a quoted structure, "
    " the \\term{backquote} \\term{reader macro} is probably called for;"
    " \\seesection\\Backquote." " "
    " \\endissue{LOAD-TIME-EVAL:R**3-NEW-SPECIAL-FORM}"
    "                                                                         "
    " \\endcom")
   :PAR (:COMMENT NIL "%% ========== LOAD-TIME-VALUE")
   (:COM (:NAME "load-time-value" :FTYPE "Special Operator")
    (:ISSUE NIL "LOAD-TIME-EVAL:R**3-NEW-SPECIAL-FORM") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "load-time-value")
      (:ARGLIST NIL "form " (:KEYWORD NIL " &optional") " read-only-p")
      (:VALUES NIL "object"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "form") "—a "
     (:TERM NIL "form") "; evaluated as described below. " :PAR
     (:PARAM NIL "read-only-p") "—a " (:TERM NIL "boolean") "; not evaluated. "
     :PAR (:PARAM NIL "object") "—the " (:TERM NIL "primary value")
     " resulting from evaluating " (:PARAM NIL "form") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:SPECREF NIL "load-time-value")
     " provides a mechanism for delaying evaluation of " (:PARAM NIL "form")
     " until the expression is in the run-time environment; see "
     (:SECREF NIL :COMPILATION) ". " :PAR (:PARAM NIL "Read-only-p")
     " designates whether the result can be considered a "
     (:TERM NIL "constant object") ". If " (:MISC NIL "t")
     ", the result is a read-only quantity that can, if appropriate to the "
     (:TERM NIL "implementation") ", be copied into read-only space and/or "
     (:TERM NIL "coalesced") " with " (:TERM NIL "similar") " "
     (:TERM NIL "constant objects") " from other " (:TERM NIL "programs")
     ". If " (:MISC NIL "nil")
     " (the default), the result must be neither copied nor coalesced; it must be considered to be potentially modifiable data. "
     :PAR "If a " (:SPECREF NIL "load-time-value")
     " expression is processed by " (:FUNREF NIL "compile-file")
     ", the compiler performs its normal semantic processing (such as macro expansion and translation into machine code) on "
     (:PARAM NIL "form") ", but arranges for the execution of "
     (:PARAM NIL "form") " to occur at load time in a "
     (:TERM NIL "null lexical environment") ", with the result of this "
     (:TERM NIL "evaluation") " then being treated as "
     (:COMMENT NIL "an immediate quantity") "a " (:TERM NIL "literal object")
     " at run time. It is guaranteed that the evaluation of "
     (:PARAM NIL "form") " will take place only once when the "
     (:TERM NIL "file") " is " (:TERM NIL "loaded")
     ", but the order of evaluation with respect to the evaluation of "
     (:TERM NIL "top level forms") " in the file is "
     (:TERM NIL "implementation-dependent") ". "
     (:IDXTEXT NIL "order of evaluation") (:IDXTEXT NIL "evaluation order") " "
     :PAR "If a " (:SPECREF NIL "load-time-value")
     " expression appears within a function compiled with "
     (:FUNREF NIL "compile") ", the " (:PARAM NIL "form")
     " is evaluated at compile time in a "
     (:TERM NIL "null lexical environment")
     ". The result of this compile-time evaluation is treated as "
     (:COMMENT NIL "an immediate quantity") "a " (:TERM NIL "literal object")
     " in the compiled code. " :PAR "If a " (:SPECREF NIL "load-time-value")
     " expression is processed by " (:FUNREF NIL "eval") ", "
     (:PARAM NIL "form") " is evaluated in a "
     (:TERM NIL "null lexical environment")
     ", and one value is returned. Implementations that implicitly compile (or partially compile) expressions processed by "
     (:FUNREF NIL "eval") " "
     (:COMMENT NIL
      "\"can\" => \"might\".  Barrett thought \"can\" was clumsy.")
     "might evaluate " (:PARAM NIL "form")
     " only once, at the time this compilation is performed. "
     (:COMMENT NIL "This is intentionally similar to the"
      "   freedom which implementations are given for the time of expanding"
      "   macros in interpreted code.")
     :PAR "If the " (:TERM NIL "same") " " (:TERM NIL "list") " "
     (:TT NIL "(load-time-value " (:PARAM NIL "form") ")")
     " is evaluated or compiled more than once, it is "
     (:TERM NIL "implementation-dependent") " whether " (:PARAM NIL "form")
     " is evaluated only once or is evaluated more than once. This can happen both when an expression being evaluated or compiled shares substructure, and when the "
     (:TERM NIL "same") " " (:TERM NIL "form") " is processed by "
     (:FUNREF NIL "eval") " or " (:FUNREF NIL "compile")
     " multiple times. Since a " (:SPECREF NIL "load-time-value")
     " expression can be referenced in more than one place and can be evaluated multiple times by "
     (:FUNREF NIL "eval") ", it is " (:TERM NIL "implementation-dependent")
     " whether each execution returns a fresh " (:TERM NIL "object")
     " or returns the same " (:TERM NIL "object")
     " as some other execution. Users must use caution when destructively modifying the resulting "
     (:TERM NIL "object") ". " :PAR "If two lists "
     (:TT NIL "(load-time-value " (:PARAM NIL "form") ")") " that are the "
     (:TERM NIL "same") " under " (:FUNREF NIL "equal") " but are not "
     (:TERM NIL "identical")
     " are evaluated or compiled, their values always come from distinct evaluations of "
     (:PARAM NIL "form") ". "
     (:COMMENT NIL "Per Barrett: \"These forms\" => \"Their values\"") "Their "
     (:TERM NIL "values") " may not be coalesced "
     (:COMMENT NIL "Added per Barmar:") "unless " (:PARAM NIL "read-only-p")
     " is " (:MISC NIL "t") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      ";;; The function INCR1 always returns the same value, even in different images.
;;; The function INCR2 always returns the same value in a given image, 
;;; but the value it returns might vary from image to image.
(defun incr1 (x) (+ x #.(random 17)))
(defun incr2 (x) (+ x (load-time-value (random 17))))

;;; The function FOO1-REF references the nth element of the first of 
;;; the *FOO-ARRAYS* that is available at load time.  It is permissible for
;;; that array to be modified (e.g., by SET-FOO1-REF); FOO1-REF will see the
;;; updated values.
(defvar *foo-arrays* (list (make-array 7) (make-array 8)))
(defun foo1-ref (n) (aref (load-time-value (first *my-arrays*) nil) n))
(defun set-foo1-ref (n val) 
  (setf (aref (load-time-value (first *my-arrays*) nil) n) val))

;;; The function BAR1-REF references the nth element of the first of 
;;; the *BAR-ARRAYS* that is available at load time.  The programmer has
;;; promised that the array will be treated as read-only, so the system 
;;; can copy or coalesce the array.
(defvar *bar-arrays* (list (make-array 7) (make-array 8)))
(defun bar1-ref (n) (aref (load-time-value (first *my-arrays*) t) n))

;;; This use of LOAD-TIME-VALUE permits the indicated vector to be coalesced
;;; even though NIL was specified, because the object was already read-only
;;; when it was written as a literal vector rather than created by a constructor.
;;; User programs must treat the vector v as read-only.
(defun baz-ref (n)
  (let ((v (load-time-value #(A B C) nil)))
    (values (svref v n) v)))

;;; This use of LOAD-TIME-VALUE permits the indicated vector to be coalesced
;;; even though NIL was specified in the outer situation because T was specified
;;; in the inner situation.  User programs must treat the vector v as read-only.
(defun baz-ref (n)
  (let ((v (load-time-value (load-time-value (vector 1 2 3) t) nil)))
    (values (svref v n) v)))
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "compile-file") ", "
     (:FUNREF NIL "compile") ", " (:FUNREF NIL "eval") ", "
     (:SECREF NIL :MINIMAL-COMPILATION) ", " (:SECREF NIL :COMPILATION) " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:SPECREF NIL "load-time-value")
     " must appear outside of quoted structure in a “for "
     (:TERM NIL "evaluation")
     "” position. In situations which would appear to call for use of "
     (:SPECREF NIL "load-time-value") " within a quoted structure, the "
     (:TERM NIL "backquote") " " (:TERM NIL "reader macro")
     " is probably called for; see " (:SECREF NIL :BACKQUOTE) ". " :PAR
     "Specifying " (:MISC NIL "nil") " for " (:PARAM NIL "read-only-p")
     " is not a way to force an object to become modifiable if it has already been made read-only. It is only a way to say that, for an object that is modifiable, this operation is not intended to make that object read-only. "
     :PAR (:ENDISSUE NIL "LOAD-TIME-EVAL:R**3-NEW-SPECIAL-FORM") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== QUOTE")
   (:COM (:NAME "quote" :FTYPE "Special Operator")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "quote")
      (:ARGLIST NIL "object") (:VALUES NIL "object"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") "; not evaluated. " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.1.1 3") "The "
     (:SPECREF NIL "quote") " " (:TERM NIL "special operator") " just returns "
     (:PARAM NIL "object") ". " :PAR (:COMMENT NIL " added  --sjl 3 Mar 92")
     "The consequences are undefined if " (:TERM NIL "literal objects")
     " (including " (:TERM NIL "quoted objects")
     ") are destructively modified. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq a 1) → 1
 (quote (setq a 3)) → (SETQ A 3)
 a → 1
 'a → A
 ''a → (QUOTE A) 
 '''a → (QUOTE (QUOTE A))
 (setq a 43) → 43
 (list a (cons a 3)) → (43 (43 . 3))
 (list (quote a) (quote (cons a 3))) → (A (CONS A 3)) 
 1 → 1
 '1 → 1
 \"foo\" → \"foo\"
 '\"foo\" → \"foo\"
 (car '(a b)) → A
 '(car '(a b)) → (CAR (QUOTE (A B)))
 #(car '(a b)) → #(CAR (QUOTE (A B)))
 '#(car '(a b)) → #(CAR (QUOTE (A B)))
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :EVALUATION) ", "
     (:SECREF NIL :QUOTE-MACRO) ", "
     (:ISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:SECREF NIL :CONSTANT-MODIFICATION) " "
     (:ENDISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The textual notation "
     (:TT NIL "'" (:PARAM NIL "object")) " is equivalent to "
     (:TT NIL "(quote " (:PARAM NIL "object") ")") "; see "
     (:SECREF NIL :CONSTANT-MODIFICATION) ". " :PAR (:COMMENT NIL "% 7.1.0 1")
     "Some " (:TERM NIL "objects") ", called "
     (:TERM NIL "self-evaluating objects") ", do not require quotation by "
     (:SPECREF NIL "quote") ". However, " (:TERM NIL "symbols") " and "
     (:TERM NIL "lists")
     " are used to represent parts of programs, and so would not be useable as constant data in a program without "
     (:SPECREF NIL "quote") ". Since " (:SPECREF NIL "quote")
     " suppresses the " (:TERM NIL "evaluation") " of these "
     (:TERM NIL "objects") ", they become data rather than program. " :PAR))
   " " :PAR (:COMMENT NIL "-------------------- Macros --------------------")
   :PAR (:COMMENT NIL "%% ========== COMPILER-MACRO-FUNCTION")
   (:COM (:NAME "compiler-macro-function" :FTYPE "Accessor")
    (:ISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "compiler-macro-function")
      (:ARGLIST NIL "name " (:KEYWORD NIL " &optional") " environment")
      (:VALUES NIL "function"))
     " " (:ISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " "
     (:DEF (:KIND "setf") (:NAMES NIL "compiler-macro-function")
      (:ARGLIST NIL "name " (:KEYWORD NIL " &optional") " environment")
      (:NEW-VALUE NIL "new-function"))
     " " (:ENDISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " "
     :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "function name") ". " :PAR (:PARAM NIL "environment") "—an "
     (:TERM NIL "environment") " " (:TERM NIL "object") ". " :PAR
     (:PARAM NIL "function") ", " (:PARAM NIL "new-function") "—a "
     (:TERM NIL "compiler macro function") ", or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:TERM NIL "Accesses") " the "
     (:TERM NIL "compiler macro function") " named " (:PARAM NIL "name")
     ", if any, in the " (:PARAM NIL "environment") ". " :PAR "A value of "
     (:MISC NIL "nil") " denotes the absence of a "
     (:TERM NIL "compiler macro function") " named " (:PARAM NIL "name") ". "
     :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92")
     " The consequences are undefined if " (:PARAM NIL "environment") " is "
     (:TERM NIL "non-nil") " in a use of " (:MACREF NIL "setf") " of "
     (:MISC NIL "compiler-macro-function") ". "
     (:ENDISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "define-compiler-macro")
     ", " (:SECREF NIL :COMPILER-MACROS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DEFINE-COMPILER-MACRO")
   (:COM (:NAME "define-compiler-macro" :FTYPE "Macro")
    (:ISSUE NIL "DECLS-AND-DOC") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "define-compiler-macro")
      (:ARGLIST NIL "name lambda-list "
       (:INTERLEAVE NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration")))
        " | " (:PARAM NIL "documentation"))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL "name"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "function name") ". " :PAR
     (:COMMENT NIL " tweaked.  --sjl 5 Mar 92 "
      " \\param{lambda-list}---a \\term{lambda list}; "
      "  can contain the lambda list keywords" "   \\keyref{allow-other-keys},"
      "   \\keyref{aux}," "   \\keyref{body}," "   \\keyref{environment},"
      "   \\keyref{key}," "   \\keyref{optional}, " "   \\keyref{rest},"
      "  and " "  \\keyref{whole}.")
     (:PARAM NIL "lambda-list") "—a " (:TERM NIL "macro lambda list") ". " :PAR
     (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR
     (:PARAM NIL "documentation") "—a " (:TERM NIL "string")
     "; not evaluated. " :PAR (:PARAM NIL "form") "—a " (:TERM NIL "form") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:EDITORNOTE NIL
      "KMP: This definition probably needs to be fully expanded to not refer through the definition of defmacro, but should suffice for now.")
     " "
     (:COMMENT NIL
      " If this rewriting happens, be sure to copy the compile-time side-effects"
      " info from DEFMACRO too.  -- sjl 5 Mar 92")
     :PAR "This is the normal mechanism for defining a "
     (:TERM NIL "compiler macro function")
     ". Its manner of definition is the same as for " (:MACREF NIL "defmacro")
     "; the only differences are: " :PAR
     (:LIST NIL
      (:ITEM NIL " The " (:PARAM NIL "name") " can be a "
       (:TERM NIL "function name") " naming any " (:TERM NIL "function") " or "
       (:TERM NIL "macro") ". " :PAR)
      (:ITEM NIL " The expander function is installed as a "
       (:TERM NIL "compiler macro function") " for the " (:PARAM NIL "name")
       ", rather than as a " (:TERM NIL "macro function") ". " :PAR)
      (:ITEM NIL " The " (:KEYREF NIL "whole")
       " argument is bound to the form argument that is passed to the "
       (:TERM NIL "compiler macro function")
       ". The remaining lambda-list parameters are specified as if this form contained the function name in the "
       (:TERM NIL "car") " and the actual arguments in the " (:TERM NIL "cdr")
       ", but if the " (:TERM NIL "car") " of the actual form is the symbol "
       (:FUNREF NIL "funcall")
       ", then the destructuring of the arguments is actually performed using its "
       (:TERM NIL "cddr") " instead. " :PAR)
      (:ITEM NIL (:ISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX")
       (:PARAM NIL "Documentation") " is attached as a "
       (:TERM NIL "documentation string") " to " (:PARAM NIL "name")
       " (as kind " (:SPECREF NIL "compiler-macro") ") and to the "
       (:TERM NIL "compiler macro function") ". "
       (:ENDISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " " :PAR)
      (:ITEM NIL " Unlike an ordinary " (:TERM NIL "macro") ", a "
       (:TERM NIL "compiler macro")
       " can decline to provide an expansion merely by returning a form that is the "
       (:TERM NIL "same") " as the original (which can be obtained by using "
       (:KEYREF NIL "whole") "). "))
     " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun square (x) (expt x 2)) → SQUARE
 (define-compiler-macro square (&whole form arg)
   (if (atom arg)
       `(expt ,arg 2)
       (case (car arg)
         (square (if (= (length arg) 2)
                     `(expt ,(nth 1 arg) 4)
                     form))
         (expt   (if (= (length arg) 3)
                     (if (numberp (nth 2 arg))
                         `(expt ,(nth 1 arg) ,(* 2 (nth 2 arg)))
                         `(expt ,(nth 1 arg) (* 2 ,(nth 2 arg))))
                     form))
         (otherwise `(expt ,arg 2))))) → SQUARE
 (square (square 3)) → 81
 (macroexpand '(square x)) → (SQUARE X), "
      (:TERM NIL "false") "
 (funcall (compiler-macro-function 'square) '(square x) nil)
→ (EXPT X 2)
 (funcall (compiler-macro-function 'square) '(square (square x)) nil)
→ (EXPT X 4)
 (funcall (compiler-macro-function 'square) '(funcall #'square x) nil)
→ (EXPT X 2)

 (defun distance-positional (x1 y1 x2 y2)
   (sqrt (+ (expt (- x2 x1) 2) (expt (- y2 y1) 2))))
→ DISTANCE-POSITIONAL
 (defun distance (&key (x1 0) (y1 0) (x2 x1) (y2 y1))
   (distance-positional x1 y1 x2 y2))
→ DISTANCE
 (define-compiler-macro distance (&whole form
                                  &rest key-value-pairs
                                  &key (x1 0  x1-p)
                                       (y1 0  y1-p)
                                       (x2 x1 x2-p)
                                       (y2 y1 y2-p)
                                  &allow-other-keys
                                  &environment env)
   (flet ((key (n) (nth (* n 2) key-value-pairs))
          (arg (n) (nth (1+ (* n 2)) key-value-pairs))
          (simplep (x)
            (let ((expanded-x (macroexpand x env)))
              (or (constantp expanded-x env)
                  (symbolp expanded-x)))))
     (let ((n (/ (length key-value-pairs) 2)))
       (multiple-value-bind (x1s y1s x2s y2s others)
           (loop for (key) on key-value-pairs by #'cddr
                 count (eq key ':x1) into x1s
                 count (eq key ':y1) into y1s
                 count (eq key ':x2) into x2s
                 count (eq key ':y1) into y2s
                 count (not (member key '(:x1 :x2 :y1 :y2)))
                   into others
                 finally (return (values x1s y1s x2s y2s others)))
         (cond ((and (= n 4)
                     (eq (key 0) :x1)
                     (eq (key 1) :y1)
                     (eq (key 2) :x2)
                     (eq (key 3) :y2))
                `(distance-positional ,x1 ,y1 ,x2 ,y2))
               ((and (if x1-p (and (= x1s 1) (simplep x1)) t)
                     (if y1-p (and (= y1s 1) (simplep y1)) t)
                     (if x2-p (and (= x2s 1) (simplep x2)) t)
                     (if y2-p (and (= y2s 1) (simplep y2)) t)
                     (zerop others))
                `(distance-positional ,x1 ,y1 ,x2 ,y2))
               ((and (< x1s 2) (< y1s 2) (< x2s 2) (< y2s 2)
                     (zerop others))
                (let ((temps (loop repeat n collect (gensym))))
                  `(let ,(loop for i below n
                               collect (list (nth i temps) (arg i)))
                     (distance
                       ,@(loop for i below n
                               append (list (key i) (nth i temps)))))))
               (t form))))))
→ DISTANCE
 (dolist (form
           '((distance :x1 (setq x 7) :x2 (decf x) :y1 (decf x) :y2 (decf x))
             (distance :x1 (setq x 7) :y1 (decf x) :x2 (decf x) :y2 (decf x))
             (distance :x1 (setq x 7) :y1 (incf x))
             (distance :x1 (setq x 7) :y1 (incf x) :x1 (incf x))
             (distance :x1 a1 :y1 b1 :x2 a2 :y2 b2)
             (distance :x1 a1 :x2 a2 :y1 b1 :y2 b2)
             (distance :x1 a1 :y1 b1 :z1 c1 :x2 a2 :y2 b2 :z2 c2)))
   (print (funcall (compiler-macro-function 'distance) form nil)))
⊳ (LET ((#:G6558 (SETQ X 7))
⊳       (#:G6559 (DECF X))
⊳       (#:G6560 (DECF X))
⊳       (#:G6561 (DECF X)))
⊳   (DISTANCE :X1 #:G6558 :X2 #:G6559 :Y1 #:G6560 :Y2 #:G6561)) 
⊳ (DISTANCE-POSITIONAL (SETQ X 7) (DECF X) (DECF X) (DECF X)) 
⊳ (LET ((#:G6567 (SETQ X 7))
⊳       (#:G6568 (INCF X)))
⊳   (DISTANCE :X1 #:G6567 :Y1 #:G6568)) 
⊳ (DISTANCE :X1 (SETQ X 7) :Y1 (INCF X) :X1 (INCF X)) 
⊳ (DISTANCE-POSITIONAL A1 B1 A2 B2) 
⊳ (DISTANCE-POSITIONAL A1 B1 A2 B2) 
⊳ (DISTANCE :X1 A1 :Y1 B1 :Z1 C1 :X2 A2 :Y2 B2 :Z2 C2) 
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "compiler-macro-function")
     ", " (:MACREF NIL "defmacro") ", " (:FUNREF NIL "documentation") ", "
     (:SECREF NIL :DOC-VS-DECLS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The consequences of writing a "
     (:TERM NIL "compiler macro") " definition for a function in the "
     (:PACKREF NIL "common-lisp") " " (:TERM NIL "package")
     " are undefined; it is quite possible that in some "
     (:TERM NIL "implementations")
     " such an attempt would override an equivalent or equally important definition. In general, it is recommended that a programmer only write "
     (:TERM NIL "compiler macro") " definitions for " (:TERM NIL "functions")
     " he or she personally maintains–writing a " (:TERM NIL "compiler macro")
     " definition for a function maintained elsewhere is normally considered a violation of traditional rules of modularity and data abstraction. "
     :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DEFMACRO")
   (:COM (:NAME "defmacro" :FTYPE "Macro") (:ISSUE NIL "DECLS-AND-DOC") " "
    :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "defmacro")
      (:ARGLIST NIL "name lambda-list "
       (:INTERLEAVE NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration")))
        " | " (:PARAM NIL "documentation"))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL "name"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "symbol") ". "
     (:COMMENT NIL "!!! maybe call it a \"user symbol\" ?? -kmp 2-Aug-91") :PAR
     (:COMMENT NIL "% 8.1.0 9" "% 8.1.0 10" "% 8.1.0 11" "% 8.1.0 12")
     (:PARAM NIL "lambda-list") "—a " (:TERM NIL "macro lambda list") ". " :PAR
     (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR
     (:PARAM NIL "documentation") "—a " (:TERM NIL "string")
     "; not evaluated. " :PAR (:PARAM NIL "form") "—a " (:TERM NIL "form") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 8.1.0 6") "Defines "
     (:PARAM NIL "name") " as a " (:TERM NIL "macro") " by associating a "
     (:TERM NIL "macro function") " with that " (:PARAM NIL "name")
     " in the global environment. "
     (:ISSUE NIL "DEFINING-MACROS-NON-TOP-LEVEL:ALLOW") " "
     (:COMMENT NIL " Reworded garbled text.  --sjl 7 Mar 92"
      "When the \\term{macro function} is called,"
      "the \\param{forms} are evaluated in"
      "the \\term{lexical environment} in which the \\macref{defmacro} form was evaluated.")
     "The " (:TERM NIL "macro function") " is defined in the same "
     (:TERM NIL "lexical environment") " in which the "
     (:MACREF NIL "defmacro") " " (:TERM NIL "form") " appears. "
     (:ENDISSUE NIL "DEFINING-MACROS-NON-TOP-LEVEL:ALLOW") " " :PAR
     (:COMMENT NIL "% 8.1.0 7") "The parameter variables in "
     (:PARAM NIL "lambda-list")
     " are bound to destructured portions of the macro call. " :PAR
     "The expansion function accepts two arguments, a " (:TERM NIL "form")
     " and an " (:TERM NIL "environment") ". The expansion function returns a "
     (:TERM NIL "form") ". The body of the expansion function is specified by "
     (:PARAM NIL "forms") ". " (:PARAM NIL "Forms")
     " are executed in order. The value of the last " (:PARAM NIL "form")
     " executed is returned as the expansion of the " (:TERM NIL "macro") ". "
     (:ISSUE NIL "FLET-IMPLICIT-BLOCK:YES") " "
     (:ISSUE NIL "DEFMACRO-BLOCK-SCOPE:EXCLUDES-BINDINGS") " The body "
     (:PARAM NIL "forms") " of the expansion function (but not the "
     (:PARAM NIL "lambda-list") ") "
     (:ENDISSUE NIL "DEFMACRO-BLOCK-SCOPE:EXCLUDES-BINDINGS")
     " are implicitly enclosed in a " (:TERM NIL "block") " whose name is "
     (:PARAM NIL "name") ". " (:ENDISSUE NIL "FLET-IMPLICIT-BLOCK:YES") " "
     :PAR "The " (:PARAM NIL "lambda-list")
     " conforms to the requirements described in "
     (:SECREF NIL :MACRO-LAMBDA-LISTS) ". " :PAR
     (:ISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " "
     (:PARAM NIL "Documentation") " is attached as a "
     (:TERM NIL "documentation string") " to " (:PARAM NIL "name") " (as kind "
     (:SPECREF NIL "function") ") and to the " (:TERM NIL "macro function")
     ". " (:ENDISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " " :PAR
     (:COMMENT NIL "% 8.1.0 17") (:MACREF NIL "defmacro")
     " can be used to redefine a " (:TERM NIL "macro") " or to replace a "
     (:TERM NIL "function") " definition with a " (:TERM NIL "macro")
     " definition. " :PAR
     (:COMMENT NIL "% sandra says this is redundant"
      "The consequences are undefined if a \\term{special form} is redefined"
      "using \\macref{defmacro}.")
     :PAR (:ISSUE NIL "RECURSIVE-DEFTYPE:EXPLICITLY-VAGUE")
     " Recursive expansion of the " (:TERM NIL "form")
     " returned must terminate, including the expansion of other "
     (:TERM NIL "macros") " which are " (:TERM NIL "subforms") " of other "
     (:TERM NIL "forms") " returned. " :PAR
     (:COMMENT NIL "% Per Moon#13 (first public review) -kmp 5-May-93")
     "The consequences are undefined if the result of fully macroexpanding "
     (:COMMENT NIL "a form contains any non-constant circular list structure.")
     "a " (:TERM NIL "form") " contains any " (:TERM NIL "circular") " "
     (:TERM NIL "list structure") " except in " (:TERM NIL "literal objects")
     ". " (:ENDISSUE NIL "RECURSIVE-DEFTYPE:EXPLICITLY-VAGUE") " " :PAR
     (:ISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     (:COMMENT NIL " added qualification about top-level-ness  --sjl 5 Mar 92")
     "If a " (:MACREF NIL "defmacro") " " (:TERM NIL "form") " appears as a "
     (:TERM NIL "top level form") ", the " (:TERM NIL "compiler")
     " must store the " (:TERM NIL "macro")
     " definition at compile time, so that occurrences of the macro later on in the file can be expanded correctly. Users must ensure that the body of the "
     (:TERM NIL "macro")
     " can be evaluated at compile time if it is referenced within the "
     (:TERM NIL "file") " being " (:TERM NIL "compiled") ". "
     (:ENDISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defmacro mac1 (a b) \"Mac1 multiplies and adds\" 
            `(+ ,a (* ,b 3))) → MAC1 
 (mac1 4 5) → 19 
 (documentation 'mac1 'function) → \"Mac1 multiplies and adds\" 
 (defmacro mac2 (&optional (a 2 b) (c 3 d) &rest x) `'(,a ,b ,c ,d ,x)) → MAC2 
 (mac2 6) → (6 T 3 NIL NIL) 
 (mac2 6 3 8) → (6 T 3 T (8)) 
 (defmacro mac3 (&whole r a &optional (b 3) &rest x &key c (d a))
    `'(,r ,a ,b ,c ,d ,x)) → MAC3 
 (mac3 1 6 :d 8 :c 9 :d 10) → ((MAC3 1 6 :D 8 :C 9 :D 10) 1 6 9 8 (:D 8 :C 9 :D 10)) 
")
     " "
     (:COMMENT NIL " (defmacro mac4" "      (&whole (su &rest (p &rest q)) a "
      "              &optional (b 3) &rest x &key c (d a))"
      "    `'(,su ,p ,a ,b ,c ,d ,x)) \\EV MAC4 "
      " (mac4 1 6 :d 8 :c 9 :d 10) \\EV (MAC4 1 1 6 9 8 (:D 8 :C 9 :D 10)) ")
     :PAR
     (:COMMENT NIL "An example of destructuring follows:" " " "\\code"
      " (defmacro halibut ((mouth eye1 eye2)"
      "                    ((fin1 length1) (fin2 length2))"
      "                    tail)" " ...)" "\\endcode"
      "Now consider this macro call:" " " "\\code"
      " (halibut (m (car eyes) (cdr eyes))"
      "          ((f1 (count-scales f1)) (f2 (count-scales f2)))"
      "          my-favorite-tail) \\EV NIL" "\\endcode"
      "This would cause the expansion function to receive the "
      "values in \\thenextfigure\\ for its parameters:" " " "\\boxfig"
      "\\tabskip \\dimen0 plus .5 fil"
      "\\halign to \\hsize {#\\hfil\\tabskip \\dimen0 plus 1fil&#\\hfil\\cr "
      "\\noalign{\\vskip -9pt}"
      "\\hfil{{\\sl Parameter\\/}} & {{\\sl Value\\/}} \\cr"
      "\\noalign{\\vskip 2pt\\hrule\\vskip 2pt}" "mouth & m \\cr"
      "eye1 & (car eyes) \\cr" "eye2 & (cdr eyes) \\cr" "fin1 & f1 \\cr"
      "length1 & (count-scales f1) \\cr" "fin2 & f2 \\cr"
      "length2 & (count-scales f2) \\cr" "tail & my-favorite-tail \\cr"
      "\\noalign{\\vskip -9pt}                              " "}}"
      "\\caption{Destructuring example expansion function values}" "\\endfig"
      "The following macro call would be in error because there would be no"
      "argument form to match the parameter \\f{length1}:" " " "\\code"
      " (halibut (m (car eyes) (cdr eyes))"
      "          ((f1) (f2 (count-scales f2)))" "          my-favorite-tail)"
      "\\endcode"
      "The following macro call would be in error because a \\term{symbol} appears"
      "in the call where the structure of the \\term{lambda list} requires a "
      "\\term{list}:" " " "\\code" " (halibut my-favorite-head"
      "          ((f1 (count-scales f1)) (f2 (count-scales f2)))"
      "          my-favorite-tail)" "\\endcode"
      "The fact that the value of the variable \\f{my-favorite-head}"
      "might happen to be a \\term{list} is irrelevant here.  It is the macro call"
      "itself whose structure must match that of the \\macref{defmacro} "
      "\\term{lambda list}." " " "%% 8.1.0 25"
      "The use of \\term{lambda list keywords} is illustrated as follows."
      "Suppose it is convenient within the expansion"
      "function for \\f{halibut} to be able to refer to the \\term{list}"
      "whose components are called \\f{mouth}, \\f{eye1}, and \\f{eye2} "
      "as \\f{head}." "This may be written as follows:" " " "\\code"
      " (defmacro halibut ((&whole head mouth eye1 eye2)"
      "                    ((fin1 length1) (fin2 length2))"
      "                    tail)" " ...)" "\\endcode"
      "Now consider the same valid macro call as before:" " " "\\code"
      " (halibut (m (car eyes) (cdr eyes))"
      "          ((f1 (count-scales f1)) (f2 (count-scales f2)))"
      "          my-favorite-tail) \\EV NIL" "\\endcode"
      "This would cause the expansion function to receive the same"
      "values for its parameters and also a value for the parameter \\f{head}"
      "as in \\thenextfigure." " " "\\boxfig" "\\tabskip \\dimen0 plus .5 fil"
      "\\halign to \\hsize {#\\hfil\\tabskip \\dimen0 plus 1fil&#\\hfil\\cr "
      "\\noalign{\\vskip -9pt}"
      "\\hfil{{\\sl Parameter\\/}} & {{\\sl Value\\/}} \\cr"
      "\\noalign{\\vskip 2pt\\hrule\\vskip 2pt}"
      "head & (m (car eyes) (cdr eyes)) \\cr" "\\noalign{\\vskip -9pt}" "}}"
      "\\caption{Lambda list keywords expansion function values example}"
      "\\endfig" " " "%% 8.1.0 19"
      "The following implements a conditional \\term{form} analogous to the"
      "\\fortran\\ arithmetic IF statement.  "
      "The \\term{form} should accept four argument forms: a \\f{test-value},"
      "a \\f{neg-form}, a \\f{zero-form}, and a \\f{pos-form}."
      "One of the last three forms is chosen to be executed according"
      "to whether the value of the \\f{test-form} is positive, negative,"
      "or zero."
      "Using \\macref{defmacro}, a definition for such a \\term{form}"
      "might look like this:" " " "\\code"
      " (defmacro arithmetic-if (test neg-form zero-form pos-form)"
      "   (let ((var (gensym)))" "     `(let ((,var ,test))"
      "        (cond ((< ,var 0) ,neg-form)"
      "            ((= ,var 0) ,zero-form)"
      "            (t ,pos-form))))) \\EV ARITHMETIC-IF" "\\endcode"
      "Note the use of the backquote facility in this definition,"
      "and also the use of \\funref{gensym} to generate a new variable name."
      "This is necessary to avoid conflict with any variables that might"
      "be referred to in \\f{neg-form}, \\f{zero-form}, or \\f{pos-form}." " "
      "%% 8.1.0 20"
      "If the form is executed by the interpreter, it will cause the"
      "function definition of the symbol \\f{arithmetic-if}"
      "to be a macro associated with which is"
      "a two-argument expansion function roughly equivalent to:" " " "\\code"
      " (lambda (calling-form environment)" "   (declare (ignore environment))"
      "   (let ((var (gensym)))" "     (list 'let"
      "           (list (list 'var (cadr calling-form)))"
      "           (list 'cond"
      "                 (list (list '< var '0) (caddr calling-form))"
      "                 (list (list '= var '0) (cadddr calling-form))"
      "                 (list 't (fifth calling-form))))))" "\\endcode")
     :PAR
     (:COMMENT NIL
      " Barmar had noted that if we were going to show the above lambda, we should show"
      " the defmacro that might have produced it.  But since we're not going to show it,"
      " I guess the issue is moot. -kmp 28-Dec-90" "%% 8.1.0 21"
      "The \\term{lambda expression} "
      "could have been produced by the \\macref{defmacro} macro."
      "The calls to \\funref{list} are the (hypothetical) result "
      "of the backquote (\\f{\\bq})"
      "macro character and its associated commas."
      "The precise macro expansion function might depend on the implementation."
      "For example, the implementation"
      "might provide some degree of explicit error checking on the number"
      "of argument forms in the macro call." " " "%% 8.1.0 22" " "
      "%If \\funref{eval} encounters" "% " "%\\code"
      " (arithmetic-if (- x 4.0)" "%                (- x)"
      "%                (error \"Strange zero\")" "%                x)"
      "%\\endcode" "this will be expanded into something like" " " "\\code"
      " (let ((g407 (- x 4.0)))" "   (cond ((< g407 0) (- x))"
      "         ((= g407 0) (error \"Strange zero\"))" "         (t x)))"
      "\\endcode" "and \\funref{eval} tries again on this new form." " "
      "%% 8.1.0 23" "To expand on this example" "the \\f{pos-form}"
      "and \\f{zero-form} could be omitted, allowing their values to default to \\nil,"
      "in the same way that the \\f{else} form of \\specref{if} "
      "may be omitted:" " " "\\code"
      " (defmacro arithmetic-if (test neg-form &optional zero-form pos-form)"
      "   (let ((var (gensym)))" "     \\bq(let ((,var ,test))"
      "        (cond ((< ,var 0) ,neg-form)"
      "              ((= ,var 0) ,zero-form)" "              (t ,pos-form)))))"
      "\\endcode" "Then " " " "\\code" " (arithmetic-if (- x 4.0) (print x))"
      "\\endcode" "would be expanded into something like" " " "\\code"
      " (let ((g408 (- x 4.0)))" "   (cond ((< g408 0) (print x))"
      "         ((= g408 0) nil)" "         (t nil)))" "\\endcode")
     :PAR (:COMMENT NIL "% 8.1.0 26") "The stipulation that an embedded "
     (:TERM NIL "destructuring lambda list") " is permitted only where "
     (:TERM NIL "ordinary lambda list")
     " syntax would permit a parameter name but not a " (:TERM NIL "list")
     " is made to prevent ambiguity. For example, the following is not valid: "
     :PAR
     (:CODE NIL " (defmacro loser (x &optional (a b &rest c) &rest z)
   ...)
")
     " because " (:TERM NIL "ordinary lambda list") " syntax does permit a "
     (:TERM NIL "list") " following " (:KEYWORD NIL " &optional") "; the list "
     (:TT NIL "(a b &rest c)")
     " would be interpreted as describing an optional parameter named "
     (:TT NIL "a") " whose default value is that of the form " (:TT NIL "b")
     ", with a supplied-p parameter named " (:KEYREF NIL "rest")
     " (not valid), and an extraneous symbol " (:TT NIL "c")
     " in the list (also not valid). An almost correct way to express this is "
     :PAR
     (:CODE NIL " (defmacro loser (x &optional ((a b &rest c)) &rest z)
   ...)
")
     " The extra set of parentheses removes the ambiguity. However, the definition is now incorrect because a macro call such as "
     (:TT NIL "(loser (car pool))")
     " would not provide any argument form for the lambda list "
     (:TT NIL "(a b &rest c)")
     ", and so the default value against which to match the "
     (:TERM NIL "lambda list") " would be " (:MISC NIL "nil")
     " because no explicit default value was specified. The consequences of this are unspecified since the empty list, "
     (:MISC NIL "nil") ", does not have " (:TERM NIL "forms")
     " to satisfy the parameters " (:TT NIL "a") " and " (:TT NIL "b")
     ". The fully correct definition would be either " :PAR
     (:CODE NIL
      " (defmacro loser (x &optional ((a b &rest c) '(nil nil)) &rest z)
   ...)
")
     " or " :PAR
     (:CODE NIL
      " (defmacro loser (x &optional ((&optional a b &rest c)) &rest z)
   ...)
")
     " These differ slightly: the first requires that if the macro call specifies "
     (:TT NIL "a") " explicitly then it must also specify " (:TT NIL "b")
     " explicitly, whereas the second does not have this requirement. For example, "
     :PAR
     (:CODE NIL " (loser (car pool) ((+ x 1)))
")
     " would be a valid call for the second definition but not for the first. "
     :PAR (:ISSUE NIL "DEFMACRO-LAMBDA-LIST:TIGHTEN-DESCRIPTION") " " :PAR
     (:CODE NIL " (defmacro dm1a (&whole x) `',x)
 (macroexpand '(dm1a))  → (QUOTE (DM1A))
 (macroexpand '(dm1a a)) is an error.
 
 (defmacro dm1b (&whole x a &optional b) `'(,x ,a ,b))
 (macroexpand '(dm1b))  is an error.
 (macroexpand '(dm1b q))  → (QUOTE ((DM1B Q) Q NIL))
 (macroexpand '(dm1b q r)) → (QUOTE ((DM1B Q R) Q R))
 (macroexpand '(dm1b q r s)) is an error.
")
     " " :PAR
     (:CODE NIL " (defmacro dm2a (&whole form a b) `'(form ,form a ,a b ,b))
 (macroexpand '(dm2a x y)) → (QUOTE (FORM (DM2A X Y) A X B Y))
 (dm2a x y) → (FORM (DM2A X Y) A X B Y)

 (defmacro dm2b (&whole form a (&whole b (c . d) &optional (e 5)) 
                 &body f &environment env)
   ``(,',form ,,a ,',b ,',(macroexpand c env) ,',d ,',e ,',f))
 ;Note that because backquote is involved, implementations may differ
 ;slightly in the nature (though not the functionality) of the expansion.
 (macroexpand '(dm2b x1 (((incf x2) x3 x4)) x5 x6))
 → (LIST* '(DM2B X1 (((INCF X2) X3 X4))
                   X5 X6)
            X1
            '((((INCF X2) X3 X4)) (SETQ X2 (+ X2 1)) (X3 X4) 5 (X5 X6))),
     T
 (let ((x1 5))
   (macrolet ((segundo (x) `(cadr ,x)))
     (dm2b x1 (((segundo x2) x3 x4)) x5 x6)))
 → ((DM2B X1 (((SEGUNDO X2) X3 X4)) X5 X6)
      5 (((SEGUNDO X2) X3 X4)) (CADR X2) (X3 X4) 5 (X5 X6))
")
     " " :PAR (:ENDISSUE NIL "DEFMACRO-LAMBDA-LIST:TIGHTEN-DESCRIPTION") " "
     :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " "
     (:COMMENT NIL
      " adequately covered in the packages chapter.  --sjl 5 Mar 92"
      " \\issue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}"
      " The consequences are undefined if \\param{name} "
      " is a \\term{symbol} in \\thepackage{common-lisp}."
      " \\endissue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}")
     :PAR
     (:COMMENT NIL " Barmar writes:"
      "     \"Macros must not modify any of the structure they are given.\""
      "     We outlawed displacing at some point."
      " but I couldn't find anything to back up this claim.  Issue MACRO-CACHING"
      " had this in mind, but didn't go far enough. So I've left this alone for now."
      " -kmp 2-Aug-91")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:ISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89") " "
     (:MACREF NIL "define-compiler-macro") ", "
     (:ENDISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89") " "
     (:MACREF NIL "destructuring-bind") ", " (:FUNREF NIL "documentation") ", "
     (:FUNREF NIL "macroexpand") ", " (:VARREF NIL "*macroexpand-hook*") ", "
     (:SPECREF NIL "macrolet") ", " (:FUNREF NIL "macro-function") ", "
     (:SECREF NIL :EVALUATION) ", " (:SECREF NIL :COMPILATION) ", "
     (:SECREF NIL :DOC-VS-DECLS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MACRO-FUNCTION")
   (:COM (:NAME "macro-function" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "macro-function")
      (:ARGLIST NIL "symbol " (:KEYWORD NIL " &optional") " environment")
      (:VALUES NIL "function"))
     " " (:ISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " "
     (:COMMENT NIL
      " % If it's an error to supply the environment argument here, the syntax"
      " % shouldn't show it.  Compare w/COMPILER-MACRO-FUNCTION.  --sjl 5 Mar 92"
      " % \\Defsetf         macro-function {symbol {\\opt} environment} {new-function}"
      " \\Defsetf         macro-function {symbol} {new-function}"
      "% Reinstated per X3J13.")
     (:DEF (:KIND "setf") (:NAMES NIL "macro-function")
      (:ARGLIST NIL "symbol " (:KEYWORD NIL " &optional") " environment")
      (:NEW-VALUE NIL "new-function"))
     " " (:ENDISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " "
     :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbol") "—a "
     (:TERM NIL "symbol") ". " :PAR (:ISSUE NIL "MACRO-FUNCTION-ENVIRONMENT")
     " " (:PARAM NIL "environment") "—an " (:TERM NIL "environment") " "
     (:TERM NIL "object") ". " (:ENDISSUE NIL "MACRO-FUNCTION-ENVIRONMENT") " "
     :PAR (:PARAM NIL "function") "—a " (:TERM NIL "macro function") " or "
     (:MISC NIL "nil") ". " :PAR (:PARAM NIL "new-function") "—a "
     (:TERM NIL "macro function") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 8.1.0 2")
     "Determines whether " (:PARAM NIL "symbol")
     " has a function definition as a macro in the specified "
     (:PARAM NIL "environment") ". " :PAR
     "If so, the macro expansion function, a function of two arguments, is returned. If "
     (:PARAM NIL "symbol")
     " has no function definition in the lexical environment "
     (:PARAM NIL "environment") ", or its definition is not a "
     (:TERM NIL "macro") ", " (:FUNREF NIL "macro-function") " returns "
     (:MISC NIL "nil") ". " :PAR
     (:ISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " "
     (:ISSUE NIL "MACRO-FUNCTION-ENVIRONMENT") " "
     (:COMMENT NIL
      " The consequences are undefined if \\param{environment} is supplied "
      " in a use of \\funref{macro-function} as a \\macref{setf} location specifier.")
     (:ENDISSUE NIL "MACRO-FUNCTION-ENVIRONMENT") " "
     (:ENDISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " " :PAR
     (:COMMENT NIL "This doesn't belong here. -kmp 09-Apr-91"
      " \\issue{MACRO-ENVIRONMENT-EXTENT:DYNAMIC}"
      " The \\term{environment} \\term{object} has "
      " \\term{dynamic extent}; the consequences are undefined if "
      " the \\keyref{environment} argument is "
      " referred to outside the \\term{dynamic extent} "
      " of the macro expansion function."
      " \\endissue{MACRO-ENVIRONMENT-EXTENT:DYNAMIC}")
     :PAR (:ISSUE NIL "MACRO-FUNCTION-ENVIRONMENT") " "
     (:COMMENT NIL " The following will be deleted:" "  " " %% 8.1.0 4"
      " \\funref{macro-function} "
      " cannot be used to determine whether \\param{symbol} names"
      " a locally defined macro established by \\specref{macrolet};"
      " %% or \\specref{symbol-macrolet}" " \\funref{macro-function} can"
      " examine only global definitions.")
     (:ENDISSUE NIL "MACRO-FUNCTION-ENVIRONMENT") " " :PAR
     (:COMMENT NIL "% 8.1.0 3") "It is possible for both "
     (:FUNREF NIL "macro-function") " and "
     (:ISSUE NIL "SPECIAL-FORM-P-MISNOMER:RENAME") " "
     (:FUNREF NIL "special-operator-p") " "
     (:ENDISSUE NIL "SPECIAL-FORM-P-MISNOMER:RENAME") " to return "
     (:TERM NIL "true") " of " (:PARAM NIL "symbol") ". The "
     (:TERM NIL "macro")
     " definition must be available for use by programs that understand only the standard "
     (:RM NIL " Common Lisp") " " (:TERM NIL "special forms") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (defmacro macfun (x) '(macro-function 'macfun)) → MACFUN 
 (not (macro-function 'macfun)) → "
      (:TERM NIL "false") " 
")
     " "
     (:COMMENT NIL
      ";;--- The next four lines are not valid Common Lisp, as equal"
      ";;--- is not defined for functions --Moon"
      " (and (setf (macro-function 'macfun) #'equal)"
      "         (equal (macro-function 'macfun) #'equal)) \\EV \\term{true}"
      " (macrolet ((macfun (x) \"local\"))"
      "    (equal (macro-function 'macfun) #'equal)) \\EV \\term{true}")
     (:ISSUE NIL "MACRO-FUNCTION-ENVIRONMENT") " "
     (:CODE NIL " (macrolet ((foo (&environment env)
               (if (macro-function 'bar env)
                  ''yes
                  ''no)))
    (list (foo)
          (macrolet ((bar () :beep))
             (foo))))
 
→ (NO YES)
")
     " " (:ENDISSUE NIL "MACRO-FUNCTION-ENVIRONMENT") " " :PAR)
    (:PART (:NAME "Affected By") " " (:TT NIL "(setf macro-function)") ", "
     (:MACREF NIL "defmacro") ", and " (:SPECREF NIL "macrolet") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92")
     " The consequences are undefined if " (:PARAM NIL "environment") " is "
     (:TERM NIL "non-nil") " in a use of " (:MACREF NIL "setf") " of "
     (:MISC NIL "macro-function") ". "
     (:ENDISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defmacro") ", "
     (:SECREF NIL :EVALUATION) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 8.1.0 5")
     (:MACREF NIL "setf") " can be used with " (:FUNREF NIL "macro-function")
     " to install a " (:TERM NIL "macro")
     " as a symbol's global function definition: " :PAR
     (:CODE NIL " (setf (macro-function symbol) fn)
")
     " The value installed must be a " (:TERM NIL "function")
     " that accepts two arguments, the entire macro call and an "
     (:TERM NIL "environment")
     ", and computes the expansion for that call. Performing this operation causes "
     (:PARAM NIL "symbol")
     " to have only that macro definition as its global function definition; any previous definition, whether as a "
     (:TERM NIL "macro") " or as a " (:TERM NIL "function") ", is lost. "
     :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== MACROEXPAND" "%% ========== MACROEXPAND-1")
   (:COM (:NAME "macroexpand, macroexpand-1" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "macroexpand")
      (:ARGLIST NIL "form " (:KEYWORD NIL " &optional") " env")
      (:VALUES NIL "expansion, expanded-p"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "macroexpand-1")
      (:ARGLIST NIL "form " (:KEYWORD NIL " &optional") " env")
      (:VALUES NIL "expansion, expanded-p"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "form") "—a "
     (:TERM NIL "form") ". " :PAR (:PARAM NIL "env") "—an "
     (:TERM NIL "environment") " " (:TERM NIL "object") ". The default is "
     (:MISC NIL "nil") ". " :PAR (:PARAM NIL "expansion") "—a "
     (:TERM NIL "form") ". " :PAR (:ISSUE NIL "MACROEXPAND-RETURN-VALUE:TRUE")
     " " (:PARAM NIL "expanded-p") "—a " (:TERM NIL "generalized boolean") ". "
     (:ENDISSUE NIL "MACROEXPAND-RETURN-VALUE:TRUE") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "macroexpand") " and "
     (:FUNREF NIL "macroexpand-1") " expand " (:TERM NIL "macros") ". " :PAR
     (:COMMENT NIL "% 8.2.0 2" "% 8.2.0 3") "If " (:PARAM NIL "form") " is a "
     (:TERM NIL "macro form") ", then " (:FUNREF NIL "macroexpand-1")
     " expands the " (:TERM NIL "macro form") " call once. " :PAR
     (:COMMENT NIL "% 8.2.0 7") (:FUNREF NIL "macroexpand")
     " repeatedly expands " (:PARAM NIL "form") " until it is no longer a "
     (:TERM NIL "macro form") ". In effect, " (:FUNREF NIL "macroexpand")
     " calls " (:FUNREF NIL "macroexpand-1") " repeatedly until the "
     (:TERM NIL "secondary value") " it returns is " (:MISC NIL "nil") ". "
     :PAR (:COMMENT NIL "% 8.2.0 2") "If " (:PARAM NIL "form") " is a "
     (:TERM NIL "macro form") ", then the " (:PARAM NIL "expansion") " is a "
     (:TERM NIL "macro expansion") " and " (:PARAM NIL "expanded-p") " is "
     (:TERM NIL "true") ". Otherwise, the " (:PARAM NIL "expansion")
     " is the given " (:PARAM NIL "form") " and " (:PARAM NIL "expanded-p")
     " is " (:TERM NIL "false") ". " :PAR (:COMMENT NIL "% 8.2.0 4")
     "Macro expansion is carried out as follows. Once "
     (:FUNREF NIL "macroexpand-1") " has determined that the "
     (:PARAM NIL "form") " is a " (:TERM NIL "macro form")
     ", it obtains an appropriate expansion " (:TERM NIL "function")
     " for the " (:TERM NIL "macro") " or " (:TERM NIL "symbol macro")
     ". The value of " (:VARREF NIL "*macroexpand-hook*") " is "
     (:ISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " coerced to a "
     (:TERM NIL "function") " and "
     (:ENDISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " then called as a "
     (:TERM NIL "function") " of three arguments: the expansion "
     (:TERM NIL "function") ", the " (:PARAM NIL "form") ", and the "
     (:PARAM NIL "env") ". The " (:TERM NIL "value")
     " returned from this call is taken to be the expansion of the "
     (:PARAM NIL "form") ". " :PAR
     (:COMMENT NIL
      "% Augmented this first sentence to mention global environment "
      "% and local symbol-macrolet definitions. -kmp 12-May-93")
     "In addition to " (:TERM NIL "macro")
     " definitions in the global environment, any local macro definitions established within "
     (:PARAM NIL "env") " by " (:SPECREF NIL "macrolet") " or "
     (:SPECREF NIL "symbol-macrolet") " are considered. If only "
     (:PARAM NIL "form")
     " is supplied as an argument, then the environment is effectively null, and only global macro definitions as established by "
     (:MACREF NIL "defmacro") " are considered. "
     (:COMMENT NIL "% Sandra addition") (:TERM NIL "Macro")
     " definitions are shadowed by local " (:TERM NIL "function")
     " definitions. " (:COMMENT NIL "% end Sandra addition") :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defmacro alpha (x y) `(beta ,x ,y)) → ALPHA
 (defmacro beta (x y) `(gamma ,x ,y)) → BETA
 (defmacro delta (x y) `(gamma ,x ,y)) → DELTA
 (defmacro expand (form &environment env)
   (multiple-value-bind (expansion expanded-p)
       (macroexpand form env)
     `(values ',expansion ',expanded-p))) → EXPAND
 (defmacro expand-1 (form &environment env)
   (multiple-value-bind (expansion expanded-p)
       (macroexpand-1 form env)
     `(values ',expansion ',expanded-p))) → EXPAND-1

;; Simple examples involving just the global environment
 (macroexpand-1 '(alpha a b)) → (BETA A B), "
      (:TERM NIL "true") "
 (expand-1 (alpha a b)) → (BETA A B), "
      (:TERM NIL "true") "
 (macroexpand '(alpha a b)) → (GAMMA A B), "
      (:TERM NIL "true") "
 (expand (alpha a b)) → (GAMMA A B), "
      (:TERM NIL "true") "
 (macroexpand-1 'not-a-macro) → NOT-A-MACRO, "
      (:TERM NIL "false") "
 (expand-1 not-a-macro) → NOT-A-MACRO, "
      (:TERM NIL "false") "
 (macroexpand '(not-a-macro a b)) → (NOT-A-MACRO A B), "
      (:TERM NIL "false") "
 (expand (not-a-macro a b)) → (NOT-A-MACRO A B), "
      (:TERM NIL "false") "

;; Examples involving lexical environments
 (macrolet ((alpha (x y) `(delta ,x ,y)))
   (macroexpand-1 '(alpha a b))) → (BETA A B), "
      (:TERM NIL "true") "
 (macrolet ((alpha (x y) `(delta ,x ,y)))
   (expand-1 (alpha a b))) → (DELTA A B), "
      (:TERM NIL "true") "
 (macrolet ((alpha (x y) `(delta ,x ,y)))
   (macroexpand '(alpha a b))) → (GAMMA A B), "
      (:TERM NIL "true") "
 (macrolet ((alpha (x y) `(delta ,x ,y)))
   (expand (alpha a b))) → (GAMMA A B), "
      (:TERM NIL "true") "
 (macrolet ((beta (x y) `(epsilon ,x ,y)))
   (expand (alpha a b))) → (EPSILON A B), "
      (:TERM NIL "true") "
 (let ((x (list 1 2 3)))
   (symbol-macrolet ((a (first x)))
     (expand a))) → (FIRST X), "
      (:TERM NIL "true") "
 (let ((x (list 1 2 3)))
   (symbol-macrolet ((a (first x)))
     (macroexpand 'a))) → A, "
      (:TERM NIL "false") "
 (symbol-macrolet ((b (alpha x y)))
   (expand-1 b)) → (ALPHA X Y), "
      (:TERM NIL "true") "
 (symbol-macrolet ((b (alpha x y)))
   (expand b)) → (GAMMA X Y), "
      (:TERM NIL "true") "
 (symbol-macrolet ((b (alpha x y))
                   (a b))
   (expand-1 a)) → B, "
      (:TERM NIL "true") "
 (symbol-macrolet ((b (alpha x y))
                   (a b))
   (expand a)) → (GAMMA X Y), "
      (:TERM NIL "true") "

;; Examples of shadowing behavior
 (flet ((beta (x y) (+ x y)))
   (expand (alpha a b))) → (BETA A B), "
      (:TERM NIL "true") "
 (macrolet ((alpha (x y) `(delta ,x ,y)))
   (flet ((alpha (x y) (+ x y)))
     (expand (alpha a b)))) → (ALPHA A B), "
      (:TERM NIL "false") "
 (let ((x (list 1 2 3)))
   (symbol-macrolet ((a (first x)))
     (let ((a x))
       (expand a)))) → A, "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:MACREF NIL "defmacro") ", "
     (:MACREF NIL "setf") " of " (:MACREF NIL "macro-function") ", "
     (:SPECREF NIL "macrolet") ", " (:SPECREF NIL "symbol-macrolet") " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:VARREF NIL "*macroexpand-hook*") ", "
     (:MACREF NIL "defmacro") ", " (:MACREF NIL "setf") " of "
     (:MACREF NIL "macro-function") ", " (:SPECREF NIL "macrolet") ", "
     (:SPECREF NIL "symbol-macrolet") ", " (:SECREF NIL :EVALUATION) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "Neither " (:FUNREF NIL "macroexpand")
     " nor " (:FUNREF NIL "macroexpand-1")
     " makes any explicit attempt to expand " (:TERM NIL "macro forms")
     " that are either " (:TERM NIL "subforms") " of the " (:PARAM NIL "form")
     " or " (:TERM NIL "subforms") " of the " (:PARAM NIL "expansion")
     ". Such expansion might occur implicitly, however, due to the semantics or implementation of the "
     (:TERM NIL "macro function") ". " :PAR))
   " " :PAR (:ISSUE NIL "ISO-COMPATIBILITY:ADD-SUBSTRATE") " "
   (:COMMENT NIL "%% ========== DEFINE-SYMBOL-MACRO")
   (:COM (:NAME "define-symbol-macro" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "define-symbol-macro")
      (:ARGLIST NIL "symbol expansion") (:VALUES NIL "symbol"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbol") "—a "
     (:TERM NIL "symbol") ". " :PAR (:PARAM NIL "expansion") "—a "
     (:TERM NIL "form") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "Provides a mechanism for globally affecting the "
     (:TERM NIL "macro expansion") " of the indicated " (:PARAM NIL "symbol")
     ". " :PAR "Globally establishes an expansion function for the "
     (:TERM NIL "symbol macro") " named by " (:PARAM NIL "symbol") ". "
     (:COMMENT NIL
      "% Patterned after wording from SYMBOL-MACROLET (per issue SYMBOL-MACROLET-SEMANTICS).")
     "The only guaranteed property of an expansion " (:TERM NIL "function")
     " for a " (:TERM NIL "symbol macro") " is that when it is applied to the "
     (:TERM NIL "form") " and the " (:TERM NIL "environment")
     " it returns the correct expansion. (In particular, it is "
     (:TERM NIL "implementation-dependent")
     " whether the expansion is conceptually stored in the expansion function, the "
     (:TERM NIL "environment") ", or both.) " :PAR "Each global reference to "
     (:PARAM NIL "symbol") " (" (:I NIL "i.e.") ",  not "
     (:TERM NIL "shadowed") (:SUB NIL "2") " by a " (:TERM NIL "binding")
     " for a " (:TERM NIL "variable") " or " (:TERM NIL "symbol macro")
     " named by the same " (:TERM NIL "symbol")
     ") is expanded by the normal macro expansion process; see "
     (:SECREF NIL :SYMBOLS-AS-FORMS) ". The expansion of a "
     (:TERM NIL "symbol macro") " is subject to further "
     (:TERM NIL "macro expansion") " in the same "
     (:TERM NIL "lexical environment") " as the " (:TERM NIL "symbol macro")
     " reference, exactly analogous to normal " (:TERM NIL "macros") ". " :PAR
     (:COMMENT NIL
      "% Patterned after wording from SYMBOL-MACROLET (per issue SYMBOL-MACROLET-DECLARE).")
     "The consequences are unspecified if a " (:DECLREF NIL "special")
     " declaration is made for " (:PARAM NIL "symbol")
     " while in the scope of this definition (" (:I NIL "i.e.")
     ",  when it is not " (:TERM NIL "shadowed") (:SUB NIL "2") " by a "
     (:TERM NIL "binding") " for a " (:TERM NIL "variable") " or "
     (:TERM NIL "symbol macro") " named by the same " (:TERM NIL "symbol")
     "). " :PAR "Any use of " (:SPECREF NIL "setq") " to set the value of "
     (:COMMENT NIL "% Per X3J13. -kmp 5-Oct-93" "one of") "the "
     (:PARAM NIL "symbol")
     " while in the scope of this definition is treated as if it were a "
     (:MACREF NIL "setf") ". " (:MACREF NIL "psetq") " of "
     (:PARAM NIL "symbol") " is treated as if it were a " (:MACREF NIL "psetf")
     ", and " (:MACREF NIL "multiple-value-setq")
     " is treated as if it were a " (:SPECREF NIL "setf") " of "
     (:FUNREF NIL "values") ". " :PAR "A " (:TERM NIL "binding") " for a "
     (:TERM NIL "symbol macro") " can be " (:TERM NIL "shadowed")
     (:SUB NIL "2") " by " (:SPECREF NIL "let") " or "
     (:SPECREF NIL "symbol-macrolet") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL "(defvar *things* (list 'alpha 'beta 'gamma)) → *THINGS*

(define-symbol-macro thing1 (first *things*)) → THING1
(define-symbol-macro thing2 (second *things*)) → THING2
(define-symbol-macro thing3 (third *things*)) → THING3

thing1 → ALPHA
(setq thing1 'ONE) → ONE
*things* → (ONE BETA GAMMA)
(multiple-value-setq (thing2 thing3) (values 'two 'three)) → TWO
thing3 → THREE
*things* → (ONE TWO THREE)

(list thing2 (let ((thing2 2)) thing2)) → (TWO 2)
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL
      "% See issues LISP-SYMBOL-REDEFINITION and SYMBOL-MACROS-AND-PROCLAIMED-SPECIALS.")
     "If " (:PARAM NIL "symbol") " is already defined as a "
     (:TERM NIL "global variable") ", an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "program-error") " is signaled. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "symbol-macrolet") ", "
     (:FUNREF NIL "macroexpand") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   (:ENDISSUE NIL "ISO-COMPATIBILITY:ADD-SUBSTRATE") " " :PAR
   (:COMMENT NIL "%% ========== SYMBOL-MACROLET")
   (:COM (:NAME "symbol-macrolet" :FTYPE "Special Operator")
    (:ISSUE NIL "DECLS-AND-DOC") " "
    (:ISSUE NIL "SYMBOL-MACROLET-SEMANTICS:SPECIAL-FORM") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "symbol-macrolet")
      (:ARGLIST NIL
       (:PAREN NIL (:STAR NIL (:CURLY NIL (:PAREN NIL "symbol expansion"))))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbol") "—a "
     (:TERM NIL "symbol") ". " :PAR (:PARAM NIL "expansion") "—a "
     (:TERM NIL "form") ". " :PAR (:ISSUE NIL "SYMBOL-MACROLET-DECLARE:ALLOW")
     " " (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. "
     (:ENDISSUE NIL "SYMBOL-MACROLET-DECLARE:ALLOW") " " :PAR
     (:PARAM NIL "forms") "—an " (:TERM NIL "implicit progn") ". " :PAR
     (:PARAM NIL "results") "—the " (:TERM NIL "values") " returned by the "
     (:PARAM NIL "forms") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL
      "A number of changes in here due to Moore #1 (first public review).")
     :PAR (:SPECREF NIL "symbol-macrolet")
     " provides a mechanism for affecting the " (:TERM NIL "macro expansion")
     " environment for " (:TERM NIL "symbols") ". " :PAR
     (:SPECREF NIL "symbol-macrolet")
     " lexically establishes expansion functions for each of the "
     (:TERM NIL "symbol macros") " named by " (:PARAM NIL "symbols") ". "
     (:ISSUE NIL "SYMBOL-MACROLET-SEMANTICS:SPECIAL-FORM")
     " The only guaranteed property of an expansion " (:TERM NIL "function")
     " for a " (:TERM NIL "symbol macro") " is that when it is applied to the "
     (:TERM NIL "form") " and the " (:TERM NIL "environment")
     " it returns the correct expansion. (In particular, it is "
     (:TERM NIL "implementation-dependent")
     " whether the expansion is conceptually stored in the expansion function, the "
     (:TERM NIL "environment") ", or both.) "
     (:ENDISSUE NIL "SYMBOL-MACROLET-SEMANTICS:SPECIAL-FORM") " " :PAR
     "Each reference to " (:PARAM NIL "symbol")
     " as a variable within the lexical " (:TERM NIL "scope") " of "
     (:SPECREF NIL "symbol-macrolet")
     " is expanded by the normal macro expansion process; see "
     (:SECREF NIL :SYMBOLS-AS-FORMS)
     ". The expansion of a symbol macro is subject to further macro expansion in the same lexical environment as the symbol macro invocation, exactly analogous to normal "
     (:TERM NIL "macros") ". " :PAR
     (:ISSUE NIL "SYMBOL-MACROLET-DECLARE:ALLOW") " Exactly the same "
     (:PARAM NIL "declarations") " are allowed as for " (:SPECREF NIL "let")
     " with one exception: " (:SPECREF NIL "symbol-macrolet")
     " signals an error if a " (:DECLREF NIL "special")
     " declaration names one of the " (:TERM NIL "symbols")
     " being defined by " (:SPECREF NIL "symbol-macrolet") ". "
     (:COMMENT NIL
      " Discussion of declarations moved to TYPE dictionary entry. --sjl 5 Mar 92")
     (:ENDISSUE NIL "SYMBOL-MACROLET-DECLARE:ALLOW") " " :PAR "When the "
     (:PARAM NIL "forms") " of the " (:SPECREF NIL "symbol-macrolet")
     " form are expanded, any use of " (:SPECREF NIL "setq")
     " to set the value of one of the specified variables is treated as if it were a "
     (:MACREF NIL "setf") ". " (:MACREF NIL "psetq") " of a "
     (:TERM NIL "symbol")
     " defined as a symbol macro is treated as if it were a "
     (:MACREF NIL "psetf") ", and " (:MACREF NIL "multiple-value-setq")
     " is treated as if it were a " (:SPECREF NIL "setf") " of "
     (:FUNREF NIL "values") ". " :PAR "The use of "
     (:SPECREF NIL "symbol-macrolet") " can be shadowed by "
     (:SPECREF NIL "let") ". In other words, " (:SPECREF NIL "symbol-macrolet")
     " only substitutes for occurrences of " (:PARAM NIL "symbol")
     " that would be in the " (:TERM NIL "scope") " of a lexical binding of "
     (:PARAM NIL "symbol") " surrounding the " (:PARAM NIL "forms") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL ";;; The following is equivalent to
;;;   (list 'foo (let ((x 'bar)) x)),
;;; not
;;;   (list 'foo (let (('foo 'bar)) 'foo))
 (symbol-macrolet ((x 'foo))
   (list x (let ((x 'bar)) x))) 
→ (foo bar)
NOT→ (foo foo) 
 
 (symbol-macrolet ((x '(foo x)))
   (list x))
→ ((FOO X))
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " "
     (:ISSUE NIL "SYMBOL-MACROS-AND-PROCLAIMED-SPECIALS:SIGNALS-AN-ERROR") " "
     (:ISSUE NIL "LISP-SYMBOL-REDEFINITION:MAR89-X3J13")
     " If an attempt is made to bind a " (:TERM NIL "symbol")
     " that is defined as a " (:TERM NIL "global variable") ", an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "program-error") " is signaled. "
     (:ENDISSUE NIL "LISP-SYMBOL-REDEFINITION:MAR89-X3J13") " "
     (:ENDISSUE NIL "SYMBOL-MACROS-AND-PROCLAIMED-SPECIALS:SIGNALS-AN-ERROR")
     " " :PAR "If " (:PARAM NIL "declaration") " contains a "
     (:DECLREF NIL "special") " declaration that names one of the "
     (:TERM NIL "symbols") " being bound by " (:SPECREF NIL "symbol-macrolet")
     ", an error of " (:TERM NIL "type") " " (:TYPEREF NIL "program-error")
     " is signaled. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "with-slots") ", "
     (:FUNREF NIL "macroexpand") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The special form "
     (:SPECREF NIL "symbol-macrolet")
     " is the basic mechanism that is used to implement "
     (:MACREF NIL "with-slots") ". " :PAR "If a "
     (:SPECREF NIL "symbol-macrolet") " " (:TERM NIL "form") " is a "
     (:TERM NIL "top level form") ", the " (:PARAM NIL "forms")
     " are also processed as " (:TERM NIL "top level forms") ". See "
     (:SECREF NIL :FILE-COMPILATION) ". " :PAR
     (:ENDISSUE NIL "SYMBOL-MACROLET-SEMANTICS:SPECIAL-FORM") " "
     (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *MACROEXPAND-HOOK*")
   (:COM (:NAME "*macroexpand-hook*" :FTYPE "Variable")
    (:ISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "designator")
     " for a " (:TERM NIL "function") " of three " (:TERM NIL "arguments")
     ": a " (:TERM NIL "macro function") ", a " (:TERM NIL "macro form")
     ", and an " (:TERM NIL "environment") " " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR
     (:ISSUE NIL "MACROEXPAND-HOOK-DEFAULT:EXPLICITLY-VAGUE") " "
     (:ISSUE NIL "MACROEXPAND-HOOK-INITIAL-VALUE:IMPLEMENTATION-DEPENDENT")
     " a " (:TERM NIL "designator")
     " for a function that is equivalent to the " (:TERM NIL "function") " "
     (:FUNREF NIL "funcall") ", but that might have additional "
     (:TERM NIL "implementation-dependent") " side-effects. "
     (:ENDISSUE NIL "MACROEXPAND-HOOK-INITIAL-VALUE:IMPLEMENTATION-DEPENDENT")
     " " (:ENDISSUE NIL "MACROEXPAND-HOOK-DEFAULT:EXPLICITLY-VAGUE") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 8.2.0 7")
     "Used as the expansion interface hook by " (:FUNREF NIL "macroexpand-1")
     " to control the " (:TERM NIL "macro expansion") " process. When a "
     (:TERM NIL "macro form") " is to be expanded, this "
     (:TERM NIL "function") " is called with three arguments: the "
     (:TERM NIL "macro function") ", the " (:TERM NIL "macro form")
     ", and the " (:TERM NIL "environment") " in which the "
     (:TERM NIL "macro form") " is to be expanded. "
     (:ISSUE NIL "MACRO-ENVIRONMENT-EXTENT:DYNAMIC") " The "
     (:TERM NIL "environment") " " (:TERM NIL "object") " has "
     (:TERM NIL "dynamic extent") "; the consequences are undefined if the "
     (:TERM NIL "environment") " " (:TERM NIL "object")
     " is referred to outside the " (:TERM NIL "dynamic extent")
     " of the macro expansion function. "
     (:ENDISSUE NIL "MACRO-ENVIRONMENT-EXTENT:DYNAMIC") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun hook (expander form env)
    (format t \"Now expanding: ~S~%\" form)
    (funcall expander form env)) → HOOK 
 (defmacro machook (x y) `(/ (+ ,x ,y) 2)) → MACHOOK 
 (macroexpand '(machook 1 2)) → (/ (+ 1 2) 2), "
      (:TERM NIL "true") " 
 (let ((*macroexpand-hook* #'hook)) (macroexpand '(machook 1 2)))
⊳ Now expanding (MACHOOK 1 2) 
→ (/ (+ 1 2) 2), "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "macroexpand") ", "
     (:FUNREF NIL "macroexpand-1") ", " (:FUNREF NIL "funcall") ", "
     (:SECREF NIL :EVALUATION) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "The net effect of the chosen initial value is to just invoke the "
     (:TERM NIL "macro function") ", giving it the " (:TERM NIL "macro form")
     " and " (:TERM NIL "environment") " as its two arguments. " :PAR
     "Users or user programs can " (:TERM NIL "assign") " this "
     (:TERM NIL "variable") " to customize or trace the "
     (:TERM NIL "macro expansion") " mechanism. Note, however, that this "
     (:TERM NIL "variable")
     " is a global resource, potentially shared by multiple "
     (:TERM NIL "programs") "; as such, if any two " (:TERM NIL "programs")
     " depend for their correctness on the setting of this "
     (:TERM NIL "variable") ", those " (:TERM NIL "programs")
     " may not be able to run in the same " (:TERM NIL "Lisp image")
     ". For this reason, it is frequently best to confine its uses to debugging situations. "
     :PAR
     (:ISSUE NIL "MACROEXPAND-HOOK-INITIAL-VALUE:IMPLEMENTATION-DEPENDENT")
     " Users who put their own function into "
     (:VARREF NIL "*macroexpand-hook*")
     " should consider saving the previous value of the hook, and calling that value from their own. "
     (:ENDISSUE NIL "MACROEXPAND-HOOK-INITIAL-VALUE:IMPLEMENTATION-DEPENDENT")
     " " :PAR (:ENDISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Declarations --------------------") :PAR
   (:COMMENT NIL "%% ========== PROCLAIM")
   (:COM (:NAME "proclaim" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "proclaim")
      (:ARGLIST NIL "declaration-specifier")
      (:VALUES NIL (:TERM NIL "implementation-dependent")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "declaration-specifier") "—a "
     (:TERM NIL "declaration specifier") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 9.1.0 11")
     (:TERM NIL "Establishes") " the " (:TERM NIL "declaration")
     " specified by " (:PARAM NIL "declaration-specifier") " in the "
     (:TERM NIL "global environment") ". " :PAR (:COMMENT NIL "% 9.1.0 13")
     "Such a " (:TERM NIL "declaration") ", sometimes called a "
     (:TERM NIL "global declaration") " or a " (:TERM NIL "proclamation")
     ", is always in force unless locally " (:TERM NIL "shadowed") ". " :PAR
     (:COMMENT NIL "% 9.1.0 12") (:TERM NIL "Names") " of "
     (:TERM NIL "variables") " and " (:TERM NIL "functions") " within "
     (:PARAM NIL "declaration-specifier") " refer to "
     (:TERM NIL "dynamic variables") " and global " (:TERM NIL "function")
     " definitions, respectively. " :PAR (:NEXTFIGURE (:CAPS T))
     " shows a list of " (:PARAM NIL "declaration identifiers")
     " that can be used with " (:FUNREF NIL "proclaim") ". " :PAR
     (:COMMENT NIL
      " IGNORE, IGNORABLE, and DYNAMIC-EXTENT removed as consequence of vote"
      " taken at 5-Oct-93 X3J13 meeting.")
     (:ISSUE NIL "DYNAMIC-EXTENT:NEW-DECLARATION") " "
     (:ISSUE NIL "DECLARE-FUNCTION-AMBIGUITY:DELETE-FTYPE-ABBREVIATION") " "
     (:TABLE (:NAME ("Global Declaration Specifiers"))
      (:ROW NIL (:CELL NIL (:DECLREF NIL " declaration"))
       (:CELL NIL (:DECLREF NIL "inline"))
       (:CELL NIL (:DECLREF NIL "optimize")) (:CELL NIL (:DECLREF NIL "type")))
      (:ROW NIL (:CELL NIL (:DECLREF NIL " ftype"))
       (:CELL NIL (:DECLREF NIL "notinline"))
       (:CELL NIL (:DECLREF NIL "special")) (:CELL NIL)))
     " " (:COMMENT NIL "function removed.")
     (:ENDISSUE NIL "DECLARE-FUNCTION-AMBIGUITY:DELETE-FTYPE-ABBREVIATION") " "
     (:ENDISSUE NIL "DYNAMIC-EXTENT:NEW-DECLARATION") " " :PAR
     (:COMMENT NIL "% 9.2.0 20") "An implementation is free to support other ("
     (:TERM NIL "implementation-defined") ") "
     (:TERM NIL "declaration identifiers") " as well. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun declare-variable-types-globally (type vars)
   (proclaim `(type ,type ,@vars))
   type)

 ;; Once this form is executed, the dynamic variable *TOLERANCE*
 ;; must always contain a float.
 (declare-variable-types-globally 'float '(*tolerance*))
→ FLOAT
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "declaim") ", "
     (:MISC NIL "declare") ", " (:SECREF NIL :COMPILATION) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "Although the " (:TERM NIL "execution")
     " of a " (:FUNREF NIL "proclaim") " " (:TERM NIL "form")
     " has effects that might affect compilation, the compiler does not make any attempt to recognize and specially process "
     (:FUNREF NIL "proclaim") " " (:TERM NIL "forms") ". A "
     (:TERM NIL "proclamation") " such as the following, even if a "
     (:TERM NIL "top level form")
     ", does not have any effect until it is executed: " :PAR
     (:CODE NIL "(proclaim '(special *x*))
")
     " " :PAR "If compile time side effects are desired, "
     (:SPECREF NIL "eval-when") " may be useful. For example: " :PAR
     (:CODE NIL " (eval-when (:execute :compile-toplevel :load-toplevel)
   (proclaim '(special *x*)))
")
     " " :PAR "In most such cases, however, it is preferrable to use "
     (:MACREF NIL "declaim") " for this purpose. " :PAR
     (:ISSUE NIL "DECLARE-MACROS:FLUSH") " Since " (:FUNREF NIL "proclaim") " "
     (:TERM NIL "forms") " are ordinary " (:TERM NIL "function forms") ", "
     (:TERM NIL "macro forms") " can expand into them. "
     (:COMMENT NIL "Barrett: So what?" "Sandra: DUMB!"
      "KMP: Tough. I think this is a commonly asked question, and perfectly "
      "     appropriate for a Note even though it's not a revelation.  Technically,"
      "     anything in the Notes should be describable as \"so what?\" or \"dumb\""
      "     or we should ask why it's in the Notes and not the Description.")
     (:ENDISSUE NIL "DECLARE-MACROS:FLUSH") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DECLAIM")
   (:COM (:NAME "declaim" :FTYPE "Macro")
    (:ISSUE NIL "PROCLAIM-ETC-IN-COMPILE-FILE:NEW-MACRO") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "declaim")
      (:ARGLIST NIL
       (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration-specifier"))))
      (:VALUES NIL (:TERM NIL "implementation-dependent")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "declaration-specifier") "—a "
     (:TERM NIL "declaration specifier") "; not evaluated. " :PAR)
    (:PART (:NAME "Description") " " :PAR "Establishes the "
     (:TERM NIL "declarations") " specified by the "
     (:PARAM NIL "declaration-specifiers") ". " :PAR
     "If a use of this macro appears as a " (:TERM NIL "top level form")
     " in a " (:TERM NIL "file") " being processed by the "
     (:TERM NIL "file compiler")
     ", the proclamations are also made at compile-time. As with other defining macros, it is unspecified whether or not the compile-time side-effects of a "
     (:MACREF NIL "declaim") " persist after the " (:TERM NIL "file")
     " has been " (:TERM NIL "compiled") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MISC NIL "declare") ", "
     (:FUNREF NIL "proclaim") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL "!!! How does proclaim relate to declaim."
      "    Not quite as simple as"
      "    (declaim <x>) == (eval-when (:compile-toplevel :load-toplevel :execute) (proclaim '<x>))"
      "    but close...")
     :PAR
     (:COMMENT NIL
      " Clarify that calls to PROCLAIM should be treated the same as any"
      "   other function call.  Users should wrap an explicit EVAL-WHEN around"
      "   top-level calls to PROCLAIM if they want them to affect compilation,"
      "   or use the macro DECLAIM.")
     :PAR (:ENDISSUE NIL "PROCLAIM-ETC-IN-COMPILE-FILE:NEW-MACRO") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DECLARE")
   (:COM (:NAME "declare" :FTYPE "Symbol")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "declare")
      (:ARGLIST NIL
       (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration-specifier")))))
     " " :PAR)
    (:PART (:NAME "Arguments") " " :PAR (:COMMENT NIL "% 9.1.0 6")
     (:PARAM NIL "declaration-specifier") "—a "
     (:TERM NIL "declaration specifier") "; not evaluated. " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 9.1.0 2") "A "
     (:MISC NIL "declare") " " (:TERM NIL "expression") ", sometimes called a "
     (:TERM NIL "declaration")
     ", can occur only at the beginning of the bodies of certain "
     (:TERM NIL "forms") "; that is, it may be preceded only by other "
     (:MISC NIL "declare") " " (:TERM NIL "expressions") ", or by a "
     (:TERM NIL "documentation string") " if the context permits. " :PAR "A "
     (:MISC NIL "declare") " " (:TERM NIL "expression") " can occur in a "
     (:TERM NIL "lambda expression") " or in any of the " (:TERM NIL "forms")
     " listed in " (:NEXTFIGURE NIL) ". " :PAR (:ISSUE NIL "DECLS-AND-DOC") " "
     (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
     (:ISSUE NIL "SYMBOL-MACROLET-DECLARE:ALLOW") " "
     (:ISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
     (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
     (:TABLE (:NAME ("Standardized Forms In Which Declarations Can Occur"))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " defgeneric"))
       (:CELL NIL (:FUNREF NIL "do-external-symbols"))
       (:CELL NIL (:FUNREF NIL "prog")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " define-compiler-macro"))
       (:CELL NIL (:FUNREF NIL "do-symbols"))
       (:CELL NIL (:FUNREF NIL "prog*")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " define-method-combination"))
       (:CELL NIL (:FUNREF NIL "dolist"))
       (:CELL NIL (:FUNREF NIL "restart-case")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " define-setf-expander"))
       (:CELL NIL (:FUNREF NIL "dotimes"))
       (:CELL NIL (:FUNREF NIL "symbol-macrolet")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " defmacro"))
       (:CELL NIL (:FUNREF NIL "flet"))
       (:CELL NIL (:FUNREF NIL "with-accessors")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " defmethod"))
       (:CELL NIL (:FUNREF NIL "handler-case"))
       (:CELL NIL (:FUNREF NIL "with-hash-table-iterator")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " defsetf"))
       (:CELL NIL (:FUNREF NIL "labels"))
       (:CELL NIL (:FUNREF NIL "with-input-from-string")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " deftype"))
       (:CELL NIL (:FUNREF NIL "let"))
       (:CELL NIL (:FUNREF NIL "with-open-file")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " defun"))
       (:CELL NIL (:FUNREF NIL "let*"))
       (:CELL NIL (:FUNREF NIL "with-open-stream")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " destructuring-bind"))
       (:CELL NIL (:FUNREF NIL "locally"))
       (:CELL NIL (:FUNREF NIL "with-output-to-string")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " do"))
       (:CELL NIL (:FUNREF NIL "macrolet"))
       (:CELL NIL (:FUNREF NIL "with-package-iterator")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " do*"))
       (:CELL NIL (:FUNREF NIL "multiple-value-bind"))
       (:CELL NIL (:FUNREF NIL "with-slots")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " do-all-symbols"))
       (:CELL NIL (:FUNREF NIL "pprint-logical-block")) (:CELL NIL)))
     " "
     (:COMMENT NIL
      "Deleted GENERIC-FLET, GENERIC-LABELS, GENERIC-FUNCTION -kmp 7-Feb-92"
      "Deleted WITH-ADDED-METHODS. -kmp 7-Jan-91"
      "Added DEFINE-COMPILER-MACRO, DESTRUCTURING-BIND, HANDLER-CASE,"
      " PPRINT-LOGICAL-BLOCK, RESTART-CASE, WITH-HASH-TABLE-ITERATOR,"
      " and WITH-PACKAGE-ITERATOR. -kmp 15-Feb-92")
     (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
     (:ENDISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
     (:ENDISSUE NIL "SYMBOL-MACROLET-DECLARE:ALLOW") " "
     (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
     (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR "A " (:MISC NIL "declare") " "
     (:TERM NIL "expression")
     " can only occur where specified by the syntax of these "
     (:TERM NIL "forms") ". " (:COMMENT NIL "% 9.1.0 3")
     "The consequences of attempting to evaluate a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") " are undefined. In situations where such "
     (:TERM NIL "expressions")
     " can appear, explicit checks are made for their presence and they are never actually evaluated; it is for this reason that they are called “"
     (:MISC NIL "declare") " " (:TERM NIL "expressions") "” rather than “"
     (:MISC NIL "declare") " " (:TERM NIL "forms") ".” " :PAR
     (:COMMENT NIL
      " This doesn't belong here.  I think it is adequately covered by the"
      " discussion of lambda lists and scoping of lambda variables.  --sjl 5 mar 92"
      " When evaluating a \\term{lambda form},"
      " none of the \\term{bound declarations} made by \\misc{declare} \\term{expressions} "
      " appearing at the beginning of the body"
      " of the \\term{lambda expression} apply to the \\term{argument} \\term{evaluations}."
      " However, such \\term{declarations} apply to the \\term{initialization form} code (if any) "
      " for \\keyref{optional}, \\keyref{key}, and \\keyref{aux} \\term{bindings}"
      " % Added to please KMP (and hopefully Moon, too)."
      " subsequent to the \\term{name} to which the \\term{bound declaration} refers;"
      " \\seesection\\DeclScope.")
     :PAR (:ISSUE NIL "DECLARE-MACROS:FLUSH") " "
     (:COMMENT NIL "\\term{macro} "
      "calls may expand into declarations as long as this syntax is observed.")
     (:TERM NIL "Macro forms") " cannot expand into declarations; "
     (:MISC NIL "declare") " " (:TERM NIL "expressions")
     " must appear as actual " (:TERM NIL "subexpressions") " of the "
     (:TERM NIL "form") " to which they refer. "
     (:COMMENT NIL
      " the only valid declarations are \\term{lists} whose \\term{car} is the symbol \\misc{declare}."
      "% Removed because this is already said in PROCLAIM."
      " \\term{Macro forms} can expand into \\funref{proclaim} forms, however.")
     (:ENDISSUE NIL "DECLARE-MACROS:FLUSH") " " :PAR (:NEXTFIGURE (:CAPS T))
     " shows a list of " (:TERM NIL "declaration identifiers")
     " that can be used with " (:MISC NIL "declare") ". " :PAR
     (:ISSUE NIL "DYNAMIC-EXTENT:NEW-DECLARATION") " "
     (:ISSUE NIL "DECLARE-FUNCTION-AMBIGUITY:DELETE-FTYPE-ABBREVIATION") " "
     (:TABLE (:NAME ("Local Declaration Specifiers"))
      (:ROW NIL (:CELL NIL (:DECLREF NIL " dynamic-extent"))
       (:CELL NIL (:DECLREF NIL "ignore"))
       (:CELL NIL (:DECLREF NIL "optimize")))
      (:ROW NIL (:CELL NIL (:DECLREF NIL " ftype"))
       (:CELL NIL (:DECLREF NIL "inline"))
       (:CELL NIL (:DECLREF NIL "special")))
      (:ROW NIL (:CELL NIL (:DECLREF NIL " ignorable"))
       (:CELL NIL (:DECLREF NIL "notinline"))
       (:CELL NIL (:DECLREF NIL "type"))))
     " " (:COMMENT NIL "function removed.")
     (:ENDISSUE NIL "DECLARE-FUNCTION-AMBIGUITY:DELETE-FTYPE-ABBREVIATION") " "
     (:ENDISSUE NIL "DYNAMIC-EXTENT:NEW-DECLARATION") " " :PAR
     (:COMMENT NIL "% 9.2.0 20") "An implementation is free to support other ("
     (:TERM NIL "implementation-defined") ") "
     (:TERM NIL "declaration identifiers") " as well. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun nonsense (k x z)
   (foo z x)                     ;First call to foo
   (let ((j (foo k x))           ;Second call to foo
         (x (* k k)))
     (declare (inline foo) (special x z))
     (foo x j z)))               ;Third call to foo
")
     " " :PAR "In this example, the " (:DECLREF NIL "inline")
     " declaration applies only to the third call to " (:TT NIL "foo")
     ", but not to the first or second ones. The " (:DECLREF NIL "special")
     " declaration of " (:TT NIL "x") " causes " (:SPECREF NIL "let")
     " to make a dynamic " (:TERM NIL "binding") " for " (:TT NIL "x")
     ", and causes the reference to " (:TT NIL "x") " in the body of "
     (:SPECREF NIL "let") " to be a dynamic reference. The reference to "
     (:TT NIL "x") " in the second call to " (:TT NIL "foo")
     " is a local reference to the second parameter of " (:TT NIL " nonsense")
     ". The reference to " (:TT NIL "x") " in the first call to "
     (:TT NIL "foo") " is a local reference, not a " (:DECLREF NIL "special")
     " one. The " (:DECLREF NIL "special") " declaration of " (:TT NIL "z")
     " causes the reference to " (:TT NIL "z") " in the "
     (:COMMENT NIL "Added for Moon:") "third call to " (:TT NIL "foo")
     " to be a dynamic reference; it does not refer to the parameter to "
     (:TT NIL "nonsense") " named " (:TT NIL "z") ", because that parameter "
     (:TERM NIL "binding") " has not been declared to be "
     (:DECLREF NIL "special") ". (The " (:DECLREF NIL "special")
     " declaration of " (:TT NIL "z") " does not appear in the body of "
     (:MACREF NIL "defun") ", but in an inner " (:TERM NIL "form")
     ", and therefore does not affect the " (:TERM NIL "binding") " of the "
     (:TERM NIL "parameter") ".) " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "The consequences of trying to use a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") " as a " (:TERM NIL "form") " to be "
     (:TERM NIL "evaluated") " are undefined. " :PAR
     (:EDITORNOTE NIL
      "KMP: Probably we need to say something here about ill-formed declare expressions.")
     " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "proclaim") ", "
     (:SECREF NIL :TYPE-SPECIFIERS) ", " (:DECLREF NIL "declaration") ", "
     (:DECLREF NIL "dynamic-extent") ", " (:DECLREF NIL "ftype") ", "
     (:DECLREF NIL "ignorable") ", " (:DECLREF NIL "ignore") ", "
     (:DECLREF NIL "inline") ", " (:DECLREF NIL "notinline") ", "
     (:DECLREF NIL "optimize") ", " (:DECLREF NIL "type") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL
      "In all cases such additional code is within the scope of any \\term{pervasive}"
      "declarations appearing before the body of the \\term{form}."
      "Declarations that affect \\term{bindings} "
      "have no effect on such code, except (of course)"
      "in those situations where the code is defined to be within the scope"
      "of the variables affected by such non-\\term{pervasive} declarations.")
     :PAR
     (:COMMENT NIL "%% 9.1.0 3"
      "Those \\term{forms} that permit declarations to appear                      "
      "perform explicit checks for their presence.")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== IGNORE" "%% ========== IGNORABLE")
   :PAR
   (:COM (:NAME "ignore, ignorable" :FTYPE "Declaration")
    (:ISSUE NIL "DOTIMES-IGNORE:X3J13-MAR91") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:TT NIL
      (:PAREN NIL "ignore "
       (:STAR NIL
        (:CURLY NIL (:PARAM NIL "var") " | "
         (:PAREN NIL (:MISC NIL "function") " " (:PARAM NIL "fn"))))))
     " " :PAR
     (:TT NIL
      (:PAREN NIL "ignorable "
       (:STAR NIL
        (:CURLY NIL (:PARAM NIL "var") " | "
         (:PAREN NIL (:MISC NIL "function") " " (:PARAM NIL "fn"))))))
     " " :PAR)
    (:PART (:NAME "Arguments") " " :PAR (:PARAM NIL "var") "—a "
     (:TERM NIL "variable") " " (:TERM NIL "name") ". " :PAR (:PARAM NIL "fn")
     "—a " (:TERM NIL "function") " " (:TERM NIL "name") ". " :PAR)
    (:PART (:NAME "Valid Context") " " :PAR (:TERM NIL "declaration") " "
     (:COMMENT NIL "% Removed per X3J13 -kmp 4-Oct-93 "
      "or \\term{proclamation}")
     :PAR)
    (:PART (:NAME "Binding Types Affected") " " :PAR (:TERM NIL "variable")
     ", " (:TERM NIL "function") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:ISSUE NIL "IGNORE-USE-TERMINOLOGY:VALUE-ONLY") " The "
     (:DECLREF NIL "ignore") " and " (:DECLREF NIL "ignorable")
     " declarations refer to " (:TERM NIL "for-value") " "
     (:TERM NIL "references") " to " (:TERM NIL "variable") " "
     (:TERM NIL "bindings") " for the " (:PARAM NIL "vars") " and to "
     (:TERM NIL "function") " " (:TERM NIL "bindings") " for the "
     (:PARAM NIL "fns") ". " :PAR "An " (:DECLREF NIL "ignore") " "
     (:TERM NIL "declaration") " specifies that " (:TERM NIL "for-value") " "
     (:TERM NIL "references") " to the indicated " (:TERM NIL "bindings")
     " will not occur within the scope of the " (:TERM NIL "declaration")
     ". Within the " (:TERM NIL "scope") " of such a "
     (:TERM NIL "declaration")
     ", it is desirable for a compiler to issue a warning about the presence of either a "
     (:TERM NIL "for-value") " " (:TERM NIL "reference") " to any "
     (:PARAM NIL "var") " or " (:PARAM NIL "fn") ", or a "
     (:DECLREF NIL "special") " " (:TERM NIL "declaration") " for any "
     (:PARAM NIL "var") ". " :PAR "An " (:DECLREF NIL "ignorable") " "
     (:TERM NIL "declaration") " specifies that " (:TERM NIL "for-value") " "
     (:TERM NIL "references") " to the indicated " (:TERM NIL "bindings")
     " might or might not occur within the scope of the "
     (:TERM NIL "declaration") ". Within the " (:TERM NIL "scope")
     " of such a " (:TERM NIL "declaration")
     ", it is not desirable for a compiler to issue a warning about the presence or absence of either a "
     (:TERM NIL "for-value") " " (:TERM NIL "reference") " to any "
     (:PARAM NIL "var") " or " (:PARAM NIL "fn") ", or a "
     (:DECLREF NIL "special") " " (:TERM NIL "declaration") " for any "
     (:PARAM NIL "var") ". " :PAR "When not within the " (:TERM NIL "scope")
     " of a " (:DECLREF NIL "ignore") " or " (:DECLREF NIL "ignorable") " "
     (:TERM NIL "declaration")
     ", it is desirable for a compiler to issue a warning about any "
     (:PARAM NIL "var") " for which there is neither a "
     (:TERM NIL "for-value") " " (:TERM NIL "reference") " nor a "
     (:DECLREF NIL "special") " " (:TERM NIL "declaration") ", or about any "
     (:PARAM NIL "fn") " for which there is no " (:TERM NIL "for-value") " "
     (:TERM NIL "reference") ". " :PAR
     "Any warning about a “used” or “unused” " (:TERM NIL "binding")
     " must be of " (:TERM NIL "type") " " (:TYPEREF NIL "style-warning")
     ", and may not affect program semantics. " :PAR
     (:ENDISSUE NIL "IGNORE-USE-TERMINOLOGY:VALUE-ONLY") " " :PAR
     (:COMMENT NIL "!!! Maybe separate out to a concept section?"
      "!!! Once these functions are described as using stream vars, "
      "    we can maybe remove this enumeration."
      "    Alternatively, we could make a table and put it in the chapter of \"general rules\".")
     "The " (:TERM NIL "stream variables") " established by "
     (:MACREF NIL "with-open-file") ", " (:MACREF NIL "with-open-stream") ", "
     (:MACREF NIL "with-input-from-string") ", and "
     (:MACREF NIL "with-output-to-string") ", and all "
     (:TERM NIL "iteration variables")
     " are, by definition, always “used”. Using "
     (:TT NIL "(declare (ignore " (:PARAM NIL "v") "))") ", for such a "
     (:TERM NIL "variable") " " (:PARAM NIL "v")
     " has unspecified consequences. " :PAR
     (:ENDISSUE NIL "DOTIMES-IGNORE:X3J13-MAR91") " " :PAR
     (:ISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " "
     (:COMMENT NIL
      " % added.  I interpolated the bit about ignorable, since this was"
      " % not covered in the original proposal.  --sjl 4 Mar 92"
      " \\issue{MACRO-DECLARATIONS:MAKE-EXPLICIT}"
      " \\declref{ignore} and \\declref{ignorable} declarations may apply to"
      " \\term{symbol macros}.  Such a declaration specifies that the named"
      " \\term{symbol macro} must not (in the case of \\declref{ignore}) or"
      " may not (in the case of \\declref{ignorable}) be referenced within"
      " the scope of the declaration."
      " \\endissue{MACRO-DECLARATIONS:MAKE-EXPLICIT}")
     (:ENDISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MISC NIL "declare") " "
     (:COMMENT NIL "% Removed per X3J13.  -kmp 4-Oct-93"
      " , \\macref{declaim}," " \\funref{proclaim}")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DYNAMIC-EXTENT") :PAR
   (:COM (:NAME "dynamic-extent" :FTYPE "Declaration")
    (:PART (:NAME "Syntax") " " :PAR
     (:TT NIL "(dynamic-extent "
      (:INTERLEAVE NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "var"))) " | "
       (:STAR NIL (:PAREN NIL (:MISC NIL "function") " " (:PARAM NIL "fn"))))
      ")")
     " " :PAR)
    (:PART (:NAME "Arguments") " " :PAR (:PARAM NIL "var") "—a "
     (:TERM NIL "variable") " " (:TERM NIL "name") ". " :PAR (:PARAM NIL "fn")
     "—a " (:TERM NIL "function") " " (:TERM NIL "name") ". " :PAR)
    (:PART (:NAME "Valid Context") " " :PAR (:TERM NIL "declaration") " "
     (:COMMENT NIL "% Removed per X3J13 -kmp 4-Oct-93 "
      "or \\term{proclamation}")
     :PAR)
    (:PART (:NAME "Binding Types Affected") " " :PAR (:TERM NIL "variable")
     ", " (:TERM NIL "function") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:ISSUE NIL "DYNAMIC-EXTENT:NEW-DECLARATION") " " :PAR
     (:COMMENT NIL "!!! This needs work. -kmp 23-Aug-91"
      "   Suppose that form <f> contains a DYNAMIC-EXTENT declaration for"
      "   variable <v> (which need not be bound by <f>).  Consider the values"
      "   <w1>, ..., <wN> taken on by <v> during the course of some execution of"
      "   <f>.  The declaration asserts that if object <x> is an OIP of <wI>"
      "   when <wI> ever becomes the value of <v>, then just after execution of"
      "   <f> terminates <x> will be either inaccessible or still an OIP of <v>.")
     "In some containing " (:TERM NIL "form") ", " (:PARAM NIL "F")
     ", this declaration asserts for each "
     (:PARAM NIL "var" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "i"))))
     " (which need not be bound by " (:PARAM NIL "F") "), and for each "
     (:TERM NIL "value") " "
     (:PARAM NIL "v" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "ij"))))
     " that "
     (:PARAM NIL "var" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "i"))))
     " takes on, and for each " (:TERM NIL "object") " "
     (:PARAM NIL "x" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "ijk"))))
     " that " (:COMMENT NIL "% Removed per Moon" "\\param{v$\\sub{ij}$}")
     "is an " (:TERM NIL "otherwise inaccessible part") " of "
     (:PARAM NIL "v" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "ij"))))
     " at any time when " (:COMMENT NIL "% \"it\" => V[ij] per Moon" "it")
     (:PARAM NIL "v" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "ij"))))
     " becomes the value of "
     (:PARAM NIL "var" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "i"))))
     ", that just after the execution of " (:PARAM NIL "F") " terminates, "
     (:PARAM NIL "x" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "ijk"))))
     " is either " (:TERM NIL "inaccessible") " (if " (:PARAM NIL "F")
     " established a " (:TERM NIL "binding") " for "
     (:PARAM NIL "var" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "i"))))
     ") or still an " (:TERM NIL "otherwise inaccessible part")
     " of the current value of "
     (:PARAM NIL "var" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "i"))))
     " (if " (:PARAM NIL "F") " did not establish a " (:TERM NIL "binding")
     " for "
     (:PARAM NIL "var" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "i")))) "). "
     (:ISSUE NIL "DYNAMIC-EXTENT-FUNCTION:EXTEND") " "
     (:COMMENT NIL
      " The \\param{var} may either be a symbol naming a variable, "
      " or a list of the form {\\tt (function \\i{name})} which names a function.")
     "The same relation holds for each "
     (:PARAM NIL "fn" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "i"))))
     ", except that the " (:TERM NIL "bindings") " are in the "
     (:TERM NIL "function") " " (:TERM NIL "namespace") ". "
     (:ENDISSUE NIL "DYNAMIC-EXTENT-FUNCTION:EXTEND") " " :PAR
     "The compiler is permitted to use "
     (:COMMENT NIL "make whatever optimizations are appropriate given "
      "% For RPG:")
     "this information in any way that is appropriate to the "
     (:TERM NIL "implementation")
     " and that does not conflict with the semantics of "
     (:RM NIL " Common Lisp") ". " :PAR (:DECLREF NIL "dynamic-extent")
     " declarations can be " (:TERM NIL "free declarations") " or "
     (:TERM NIL "bound declarations") ". " :PAR
     (:COMMENT NIL " added.  --sjl 4 Mar 92")
     (:ISSUE NIL "MACRO-DECLARATIONS:MAKE-EXPLICIT") " The "
     (:PARAM NIL "vars") " and " (:PARAM NIL "fns") " named in a "
     (:DECLREF NIL "dynamic-extent") " declaration must not refer to "
     (:TERM NIL "symbol macro") " or " (:TERM NIL "macro") " bindings. "
     (:ENDISSUE NIL "MACRO-DECLARATIONS:MAKE-EXPLICIT") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     "Since stack allocation of the initial value entails knowing at the "
     (:TERM NIL "object") "'s creation time that the " (:TERM NIL "object")
     " can be " (:TERM NIL "stack-allocated")
     ", it is not generally useful to make a " (:DECLREF NIL "dynamic-extent")
     " " (:TERM NIL "declaration") " for " (:TERM NIL "variables")
     " which have no lexically apparent initial value. For example, it is probably useful to write: "
     :PAR
     (:CODE NIL " (defun f ()
   (let ((x (list 1 2 3)))
     (declare (dynamic-extent x))
         ...))
")
     " " :PAR "This would permit those compilers that wish to do so to "
     (:TERM NIL "stack allocate") " the list held by the local variable "
     (:TT NIL " x")
     ". It is permissible, but in practice probably not as useful, to write: "
     :PAR
     (:CODE NIL " (defun g (x) (declare (dynamic-extent x)) ...)
 (defun f () (g (list 1 2 3)))
")
     " " :PAR "Most compilers would probably not " (:TERM NIL "stack allocate")
     " the " (:TERM NIL "argument") " to " (:TT NIL " g") " in " (:TT NIL " f")
     " because it would be a modularity violation for the compiler to assume facts about "
     (:TT NIL " g") " from within " (:TT NIL " f")
     ". Only an implementation that was willing to be responsible for recompiling "
     (:TT NIL " f") " if the definition of " (:TT NIL " g")
     " changed incompatibly could legitimately " (:TERM NIL "stack allocate")
     " the " (:TERM NIL "list") " argument to " (:TT NIL " g") " in "
     (:TT NIL " f") ". " :PAR "Here is another example: " :PAR
     (:CODE NIL " (declaim (inline g))
 (defun g (x) (declare (dynamic-extent x)) ...)
 (defun f () (g (list 1 2 3)))
 
 (defun f ()
   (flet ((g (x) (declare (dynamic-extent x)) ...))
     (g (list 1 2 3))))
 
")
     " In the previous example, some compilers might determine that optimization was possible and others might not. "
     :PAR
     "A variant of this is the so-called “stack allocated rest list” that can be achieved (in implementations supporting the optimization) by: "
     :PAR
     (:CODE NIL " (defun f (&rest x)
   (declare (dynamic-extent x))
   ...)
")
     " " :PAR "Note that although the initial value of " (:TT NIL " x")
     " is not explicit, the " (:TT NIL " f")
     " function is responsible for assembling the list " (:TT NIL " x")
     " from the passed arguments, so the " (:TT NIL " f")
     " function can be optimized by the compiler to construct a "
     (:TERM NIL "stack-allocated")
     " list instead of a heap-allocated list in implementations that support such. "
     :PAR "In the following example, " :PAR
     (:CODE NIL " (let ((x (list 'a1 'b1 'c1))
       (y (cons 'a2 (cons 'b2 (cons 'c2 nil)))))
   (declare (dynamic-extent x y))
   ...)
")
     " The " (:TERM NIL "otherwise inaccessible parts") " of " (:TT NIL " x")
     " are three " (:TERM NIL "conses") ", and the "
     (:TERM NIL "otherwise inaccessible parts") " of " (:TT NIL " y")
     " are three other " (:TERM NIL "conses") ". None of the symbols "
     (:TT NIL " a1") ", " (:TT NIL " b1") ", " (:TT NIL " c1") ", "
     (:TT NIL " a2") ", " (:TT NIL " b2") ", " (:TT NIL " c2") ", or "
     (:MISC NIL "nil") " is an " (:TERM NIL "otherwise inaccessible part")
     " of " (:TT NIL " x") " or " (:TT NIL " y") " because each is "
     (:TERM NIL "interned") " and hence " (:TERM NIL "accessible") " by the "
     (:TERM NIL "package") " (or " (:TERM NIL "packages") ") in which it is "
     (:TERM NIL "interned") ". However, if a freshly allocated "
     (:TERM NIL "uninterned") " " (:TERM NIL "symbol")
     " had been used, it would have been an "
     (:TERM NIL "otherwise inaccessible part") " of the " (:TERM NIL "list")
     " which contained it. " :PAR
     (:CODE NIL ";; In this example, the implementation is permitted to "
      (:TERM NIL "stack allocate") "
;; the list that is bound to X.
 (let ((x (list 1 2 3)))
   (declare (dynamic-extent x))
   (print x)
   :done)
⊳ (1 2 3)
→ :DONE
 
;; In this example, the list to be bound to L can be "
      (:TERM NIL "stack-allocated") ".
 (defun zap (x y z)
   (do ((l (list x y z) (cdr l)))
       ((null l))
     (declare (dynamic-extent l))
     (prin1 (car l)))) → ZAP
 (zap 1 2 3)
⊳ 123
→ NIL

;; Some implementations might open-code LIST-ALL-PACKAGES in a way
;; that permits using "
      (:TERM NIL "stack allocation") " of the list to be bound to L.
 (do ((l (list-all-packages) (cdr l)))
     ((null l))
   (declare (dynamic-extent l))
   (let ((name (package-name (car l))))
     (when (string-search \"COMMON-LISP\" name) (print name))))
⊳ \"COMMON-LISP\"
⊳ \"COMMON-LISP-USER\"
→ NIL

;; Some implementations might have the ability to "
      (:TERM NIL "stack allocate") " 
;; rest lists.  A declaration such as the following should be a cue
;; to such implementations that stack-allocation of the rest list
;; would be desirable.
 (defun add (&rest x)
   (declare (dynamic-extent x))
   (apply #'+ x)) → ADD
 (add 1 2 3) → 6

 (defun zap (n m)
   ;; Computes (RANDOM (+ M 1)) at relative speed of roughly O(N).
   ;; It may be slow, but with a good compiler at least it
   ;; doesn't waste much heap storage.  :-}
   (let ((a (make-array n)))
     (declare (dynamic-extent a))
     (dotimes (i n) 
       (declare (dynamic-extent i))
       (setf (aref a i) (random (+ i 1))))
     (aref a m))) → ZAP
 (< (zap 5 3) 3) → "
      (:TERM NIL "true") "
")
     " " :PAR "The following are in error, since the value of " (:TT NIL " x")
     " is used outside of its " (:TERM NIL "extent") ": " :PAR
     (:CODE NIL " (length (list (let ((x (list 1 2 3)))  ; Invalid
                (declare (dynamic-extent x))
                x)))

 (progn (let ((x (list 1 2 3)))  ; Invalid
          (declare (dynamic-extent x))
          x)
        nil)
")
     " " (:ENDISSUE NIL "DYNAMIC-EXTENT:NEW-DECLARATION") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MISC NIL "declare") " "
     (:COMMENT NIL "% Removed per X3J13.  -kmp 4-Oct-93"
      " , \\macref{declaim}," " \\funref{proclaim}")
     :PAR)
    (:PART (:NAME "Notes") " " :PAR "The most common optimization is to "
     (:TERM NIL "stack allocate") " the initial value of the "
     (:TERM NIL "objects") " named by the " (:PARAM NIL "vars") ". " :PAR
     "It is permissible for an implementation to simply ignore this declaration. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== TYPE") :PAR
   (:COM (:NAME "type" :FTYPE "Declaration")
    (:PART (:NAME "Syntax") " " :PAR
     (:TT NIL "(type " (:PARAM NIL "typespec") " "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "var"))) ")")
     " " :PAR
     (:TT NIL "(" (:PARAM NIL "typespec") " "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "var"))) ")")
     " " :PAR)
    (:PART (:NAME "Arguments") " " :PAR (:PARAM NIL "typespec") "—a "
     (:TERM NIL "type specifier") ". " :PAR (:PARAM NIL "var") "—a "
     (:TERM NIL "variable") " " (:TERM NIL "name") ". " :PAR)
    (:PART (:NAME "Valid Context") " " :PAR (:TERM NIL "declaration") " or "
     (:TERM NIL "proclamation") " " :PAR)
    (:PART (:NAME "Binding Types Affected") " " :PAR (:TERM NIL "variable") " "
     :PAR)
    (:PART (:NAME "Description") " " :PAR "Affects only variable "
     (:TERM NIL "bindings") " and specifies that the " (:PARAM NIL "vars")
     " take on values only of the specified " (:PARAM NIL "typespec")
     ". In particular, values assigned to the variables by "
     (:SPECREF NIL "setq") ", as well as the initial values of the "
     (:PARAM NIL "vars") " must be of the specified " (:PARAM NIL "typespec")
     ". " (:DECLREF NIL "type") " declarations never apply to function "
     (:TERM NIL "bindings") " (see " (:DECLREF NIL "ftype") "). " :PAR
     (:COMMENT NIL
      "% This is already said in the stuff on COMMON-LISP package."
      "% !!! Maybe add a cross-reference? -kmp 9-Feb-92"
      " \\issue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}"
      " Except where explicitly allowed, the consequences are undefined if a"
      " \\term{symbol} in \\thepackage{common-lisp} is used as a"
      " \\param{var} argument." " If such a \\term{symbol} is not globally"
      " defined " " %\"by this standard\" added per barmar: -kmp 28-Dec-90"
      " by this standard"
      " as a variable or a constant, it is allowed to lexically bind it"
      " and to declare the {\\tt type} of that \\term{binding}.  For example,"
      " the lexical variable names {\\tt list} and {\\tt car} are permitted."
      " \\editornote{KMP: This is unintelligible to me and needs to be rewritten to clarify "
      "     that binding CL special variables is ok, but that their type decls are lexical.}"
      " \\endissue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}")
     :PAR (:ISSUE NIL "SYMBOL-MACROLET-DECLARE:ALLOW")
     " A type declaration of a " (:TERM NIL "symbol") " defined by "
     (:SPECREF NIL "symbol-macrolet") " is equivalent to wrapping a "
     (:SPECREF NIL "the") " expression around the expansion of that "
     (:TERM NIL "symbol") ", " (:ENDISSUE NIL "SYMBOL-MACROLET-DECLARE:ALLOW")
     " "
     (:COMMENT NIL
      " moved here from symbol-macrolet dictionary entry  --sjl 5 mar 92")
     (:ISSUE NIL "SYMBOL-MACROLET-TYPE-DECLARATION:NO") " although the "
     (:TERM NIL "symbol") "'s " (:TERM NIL "macro expansion")
     " is not actually affected. "
     (:ENDISSUE NIL "SYMBOL-MACROLET-TYPE-DECLARATION:NO") " " :PAR
     (:ISSUE NIL "DECLARE-TYPE-FREE:LEXICAL") " " :PAR
     "The meaning of a type declaration is equivalent to changing each reference to a variable ("
     (:PARAM NIL "var") ") within the scope of the declaration to "
     (:TT NIL " (the " (:PARAM NIL "typespec") " " (:PARAM NIL "var") ")")
     ", changing each expression assigned to the variable ("
     (:PARAM NIL "new-value") ") within the scope of the declaration to "
     (:TT NIL " (the " (:PARAM NIL "typespec") " " (:PARAM NIL "new-value")
      ")")
     ", and executing "
     (:TT NIL " (the " (:PARAM NIL "typespec") " " (:PARAM NIL "var") ")")
     " at the moment the scope of the declaration is entered. " :PAR "A "
     (:TERM NIL "type")
     " declaration is valid in all declarations. The interpretation of a type declaration is as follows: "
     (:LIST NIL
      (:ITEM NIL
       "1. During the execution of any reference to the declared variable within the scope of the declaration, the consequences are "
       (:COMMENT NIL
        "\"unspecified\" -> \"undefined\" per barmar. i concur. -kmp"
        "unspecified")
       "undefined if the value of the declared variable is not of the declared "
       (:TERM NIL "type") ". " :PAR)
      (:ITEM NIL "2. During the execution of any " (:SPECREF NIL "setq")
       " of the declared variable within the scope of the declaration, the consequences are "
       (:COMMENT NIL
        "\"unspecified\" -> \"undefined\" per barmar. i concur. -kmp"
        "unspecified")
       "undefined if the newly assigned value of the declared variable is not of the declared "
       (:TERM NIL "type") ". " :PAR)
      (:ITEM NIL
       "3. At the moment the scope of the declaration is entered, the consequences are "
       (:COMMENT NIL
        "\"unspecified\" -> \"undefined\" per barmar. i concur. -kmp"
        "unspecified")
       "undefined if the value of the declared variable is not of the declared "
       (:TERM NIL "type") ". "))
     " " :PAR "A " (:TERM NIL "type")
     " declaration affects only variable references within its scope. "
     (:COMMENT NIL
      " and the meaning of free and \"variable-binding-associated\" type"
      "  declarations can be described identically.")
     :PAR "If nested " (:TERM NIL "type")
     " declarations refer to the same variable, then the value of the variable must be a member of the intersection of the declared "
     (:TERM NIL "types") ". " (:ENDISSUE NIL "DECLARE-TYPE-FREE:LEXICAL") " "
     :PAR (:ISSUE NIL "SPECIAL-TYPE-SHADOWING:CLARIFY") " If there is a local "
     (:TT NIL " type")
     " declaration for a dynamic variable, and there is also a global "
     (:TT NIL " type")
     " proclamation for that same variable, then the value of the variable within the scope of the local declaration must be a member of the intersection of the two declared "
     (:TERM NIL "types") ". " (:ENDISSUE NIL "SPECIAL-TYPE-SHADOWING:CLARIFY")
     " " :PAR (:DECLREF NIL "type") " declarations can be "
     (:TERM NIL "free declarations") " or " (:TERM NIL "bound declarations")
     ". " :PAR (:ISSUE NIL "TYPE-DECLARATION-ABBREVIATION:ALLOW-ALL") " "
     (:COMMENT NIL
      "!!! This paragraph might be better off elsewhere, but can live here for now.")
     "A " (:TERM NIL "symbol") " cannot be both the name of a "
     (:TERM NIL "type") " and the name of a declaration. Defining a "
     (:TERM NIL "symbol") " as the " (:TERM NIL "name") " of a "
     (:TERM NIL "class") ", " (:TERM NIL "structure") ", "
     (:TERM NIL "condition") ", or " (:TERM NIL "type") ", when the "
     (:TERM NIL "symbol") " has been " (:TERM NIL "declared")
     " as a declaration name, or vice versa, signals an error. "
     (:ENDISSUE NIL "TYPE-DECLARATION-ABBREVIATION:ALLOW-ALL") " " :PAR
     (:COMMENT NIL "% The following was inserted after GLS checked this out.")
     :PAR (:ISSUE NIL "DECLARE-ARRAY-TYPE-ELEMENT-REFERENCES:RESTRICTIVE")
     " Within the " (:TERM NIL "lexical scope") " of an "
     (:TYPEREF NIL "array") " type declaration, all references to "
     (:TERM NIL "array") " " (:TERM NIL "elements")
     " are assumed to satisfy the " (:TERM NIL "expressed array element type")
     " (as opposed to the " (:TERM NIL "upgraded array element type") "). "
     (:COMMENT NIL "The consequences are undefined if this is ever violated. ")
     "A compiler can treat the code within the scope of the "
     (:TYPEREF NIL "array") " type declaration as if each "
     (:TERM NIL "access") " of an " (:TERM NIL "array") " "
     (:TERM NIL "element") " were surrounded by an appropriate "
     (:SPECREF NIL "the") " form. "
     (:ENDISSUE NIL "DECLARE-ARRAY-TYPE-ELEMENT-REFERENCES:RESTRICTIVE") " "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun f (x y)
   (declare (type fixnum x y))
   (let ((z (+ x y)))
     (declare (type fixnum z))
     z)) → F
 (f 1 2) → 3
 ;; The previous definition of F is equivalent to
 (defun f (x y)
   ;; This declaration is a shorthand form of the TYPE declaration
   (declare (fixnum x y))
   ;; To declare the type of a return value, it's not necessary to
   ;; create a named variable.  A THE special form can be used instead.
   (the fixnum (+ x y))) → F
 (f 1 2) → 3
")
     " " :PAR (:ISSUE NIL "DECLARE-ARRAY-TYPE-ELEMENT-REFERENCES:RESTRICTIVE")
     " " :PAR
     (:COMMENT NIL
      " There were some comments on this code (from the Cleanup issue, probably)"
      " that no one liked, so I removed them.  This example might do better with"
      " some explanation, but better no explanation than a broken one. -kmp 14-Feb-92")
     :PAR
     (:CODE NIL
      " (defvar *one-array* (make-array 10 :element-type '(signed-byte 5)))
 (defvar *another-array* (make-array 10 :element-type '(signed-byte 8)))
  
 (defun frob (an-array)
   (declare (type (array (signed-byte 5) 1) an-array))
   (setf (aref an-array 1) 31)
   (setf (aref an-array 2) 127)
   (setf (aref an-array 3) (* 2 (aref an-array 3)))
   (let ((foo 0))
     (declare (type (signed-byte 5) foo))
     (setf foo (aref an-array 0))))
  
 (frob *one-array*)
 (frob *another-array*)
")
     " " :PAR " " :PAR "The above definition of " (:TT NIL "frob")
     " is equivalent to: " :PAR
     (:CODE NIL " (defun frob (an-array)
   (setf (the (signed-byte 5) (aref an-array 1)) 31)
   (setf (the (signed-byte 5) (aref an-array 2)) 127)
   (setf (the (signed-byte 5) (aref an-array 3))
         (* 2 (the (signed-byte 5) (aref an-array 3))))
   (let ((foo 0))
     (declare (type (signed-byte 5) foo))
     (setf foo (the (signed-byte 5) (aref an-array 0)))))
")
     " " :PAR (:COMMENT NIL "!!! Barmar: What does upgrading matter?")
     "Given an implementation in which " (:TERM NIL "fixnums")
     " are 29 bits but " (:TYPEREF NIL "fixnum") " " (:TERM NIL "arrays")
     " are upgraded to signed 32-bit " (:TERM NIL "arrays") ", the following "
     (:COMMENT NIL "% \"should->could\" per barmar. i concur. -kmp 27-Dec-90"
      "should")
     "could be compiled with all " (:TERM NIL "fixnum") " arithmetic: " :PAR
     (:CODE NIL " (defun bump-counters (counters)
   (declare (type (array fixnum *) bump-counters))
   (dotimes (i (length counters))
     (incf (aref counters i))))
")
     " " (:ENDISSUE NIL "DECLARE-ARRAY-TYPE-ELEMENT-REFERENCES:RESTRICTIVE")
     " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MISC NIL "declare") ", "
     (:MACREF NIL "declaim") ", " (:FUNREF NIL "proclaim") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:TT NIL "(" (:PARAM NIL "typespec") " "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "var"))) ")")
     " is an abbreviation for "
     (:TT NIL "(type " (:PARAM NIL "typespec") " "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "var"))) ")")
     ". " (:ISSUE NIL "TYPE-DECLARATION-ABBREVIATION:ALLOW-ALL") " "
     (:COMMENT NIL
      "provided that \\param{typespec} is one of the standard \\term{type specifier} "
      "\\term{symbols} in \\figref\\StandardizedAtomicTypeSpecs.")
     (:ENDISSUE NIL "TYPE-DECLARATION-ABBREVIATION:ALLOW-ALL") " " :PAR "A "
     (:DECLREF NIL "type")
     " declaration for the arguments to a function does not necessarily imply anything about the type of the result. The following function is not permitted to be compiled using "
     (:TERM NIL "implementation-dependent") " " (:TERM NIL "fixnum")
     "-only arithmetic: " :PAR
     (:CODE NIL " (defun f (x y) (declare (fixnum x y)) (+ x y))
")
     " " :PAR "To see why, consider " (:TT NIL "(f most-positive-fixnum 1)")
     ". Common Lisp defines that " (:TT NIL "F") " must return a "
     (:TYPEREF NIL "bignum")
     " here, rather than signal an error or produce a mathematically incorrect result. If you have special knowledge such “"
     (:TERM NIL "fixnum")
     " overflow” cases will not come up, you can declare the result value to be in the "
     (:TERM NIL "fixnum")
     " range, enabling some compilers to use more efficient arithmetic: " :PAR
     (:CODE NIL " (defun f (x y)
   (declare (fixnum x y))
   (the fixnum (+ x y)))
")
     " " :PAR
     "Note, however, that in the three-argument case, because of the possibility of an implicit intermediate value growing too large, the following will not cause "
     (:TERM NIL "implementation-dependent") " " (:TERM NIL "fixnum")
     "-only arithmetic to be used: " :PAR
     (:CODE NIL " (defun f (x y)
   (declare (fixnum x y z))
   (the fixnum (+ x y z)))
")
     " " :PAR "To see why, consider "
     (:TT NIL "(f most-positive-fixnum 1 -1).")
     " Although the arguments and the result are all " (:TERM NIL "fixnums")
     ", an intermediate value is not a " (:TERM NIL "fixnum")
     ". If it is important that " (:TERM NIL "implementation-dependent") " "
     (:TERM NIL "fixnum") "-only arithmetic be selected in "
     (:TERM NIL "implementations")
     " that provide it, consider writing something like this instead: " :PAR
     (:CODE NIL " (defun f (x y)
   (declare (fixnum x y z))
   (the fixnum (+ (the fixnum (+ x y)) z)))
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== INLINE" "%% ========== NOTINLINE")
   :PAR
   (:COM (:NAME "inline, notinline" :FTYPE "Declaration")
    (:PART (:NAME "Syntax") " " :PAR
     (:TT NIL " (inline " (:STAR NIL (:CURLY NIL (:PARAM NIL "function-name")))
      ")")
     " " :PAR
     (:TT NIL " (notinline "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "function-name"))) ")")
     " " :PAR)
    (:PART (:NAME "Arguments") " " :PAR (:PARAM NIL "function-name") "—a "
     (:TERM NIL "function name") ". " :PAR)
    (:PART (:NAME "Valid Context") " " :PAR (:TERM NIL "declaration") " or "
     (:TERM NIL "proclamation") " " :PAR)
    (:PART (:NAME "Binding Types Affected") " " :PAR (:TERM NIL "function") " "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:ISSUE NIL "FUNCTION-NAME:LARGE")
     " " (:DECLREF NIL "inline")
     " specifies that it is desirable for the compiler to produce inline calls to the "
     (:TERM NIL "functions") " named by " (:PARAM NIL "function-names")
     "; that is, the code for a specified " (:PARAM NIL "function-name") " "
     (:ENDISSUE NIL "FUNCTION-NAME:LARGE")
     " should be integrated into the calling routine, appearing “in line” in place of a procedure call. "
     (:COMMENT NIL "This declaration is \\term{pervasive}.")
     "A compiler is free to ignore this declaration. " (:DECLREF NIL "inline")
     " declarations never apply to variable " (:TERM NIL "bindings") ". " :PAR
     (:COMMENT NIL "% 9.2.0 14") "If one of the " (:TERM NIL "functions")
     " mentioned has a lexically apparent local definition (as made by "
     (:SPECREF NIL "flet") " or " (:SPECREF NIL "labels")
     "), then the declaration applies to that local definition and not to the global function definition. "
     :PAR (:ISSUE NIL "ALLOW-LOCAL-INLINE:INLINE-NOTINLINE") " While no "
     (:TERM NIL "conforming implementation")
     " is required to perform inline expansion of user-defined functions, those "
     (:TERM NIL "implementations")
     " that do attempt to recognize the following paradigm: " :PAR
     "To define a " (:TERM NIL "function") " " (:TT NIL "f") " that is not "
     (:DECLREF NIL "inline") " by default but for which "
     (:TT NIL "(declare (inline f))") " will make " (:PARAM NIL "f")
     " be locally inlined, the proper definition sequence is: " :PAR
     (:CODE NIL " (declaim (inline f))
 (defun f ...)
 (declaim (notinline f))
")
     " " :PAR "The " (:DECLREF NIL "inline") " proclamation preceding the "
     (:MACREF NIL "defun") " " (:TERM NIL "form") " ensures that the "
     (:TERM NIL "compiler")
     " has the opportunity save the information necessary for inline expansion, and the "
     (:DECLREF NIL "notinline") " proclamation following the "
     (:MACREF NIL "defun") " " (:TERM NIL "form") " prevents " (:TT NIL "f")
     " from being expanded inline everywhere. "
     (:ENDISSUE NIL "ALLOW-LOCAL-INLINE:INLINE-NOTINLINE") " " :PAR
     (:ISSUE NIL "FUNCTION-NAME:LARGE") " " (:DECLREF NIL "notinline")
     " specifies that it is " (:ENDISSUE NIL "FUNCTION-NAME:LARGE")
     " undesirable to compile the " (:TERM NIL "functions") " named by "
     (:PARAM NIL "function-names") " in-line. "
     (:COMMENT NIL "This declaration is \\term{pervasive}.")
     "A compiler is not free to ignore this declaration; "
     (:COMMENT NIL "clarifying clause added per barmar. -kmp 28-Dec-90")
     "calls to the specified functions must be implemented as out-of-line subroutine calls. "
     :PAR (:COMMENT NIL "% 9.2.0 16") "If one of the " (:TERM NIL "functions")
     " mentioned has a lexically apparent local definition (as made by "
     (:SPECREF NIL "flet") " or " (:SPECREF NIL "labels")
     "), then the declaration applies to that local definition and not to the global function definition. "
     :PAR (:COMMENT NIL " added.  --sjl 4 Mar 92")
     (:ISSUE NIL "MACRO-DECLARATIONS:MAKE-EXPLICIT") " In the presence of a "
     (:TERM NIL "compiler macro") " definition for "
     (:PARAM NIL "function-name") ", a " (:DECLREF NIL "notinline")
     " declaration prevents that "
     (:ISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " "
     (:TERM NIL "compiler macro") " from being used. "
     (:COMMENT NIL " in preference to the normal definition "
      " of \\param{function-name} as a \\term{function} or \\term{macro}.")
     (:ENDISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " An "
     (:DECLREF NIL "inline") " declaration may be used to encourage use of "
     (:TERM NIL "compiler macro") " definitions. " (:DECLREF NIL "inline")
     " and " (:DECLREF NIL "notinline")
     " declarations otherwise have no effect when the lexically visible definition of "
     (:PARAM NIL "function-name") " is a " (:TERM NIL "macro") " definition. "
     (:ENDISSUE NIL "MACRO-DECLARATIONS:MAKE-EXPLICIT") " " :PAR
     (:DECLREF NIL "inline") " and " (:DECLREF NIL "notinline")
     " declarations can be " (:TERM NIL "free declarations") " or "
     (:TERM NIL "bound declarations") ". " (:DECLREF NIL "inline") " and "
     (:DECLREF NIL "notinline")
     " declarations of functions that appear before the body of a "
     (:SPECREF NIL "flet") " or " (:SPECREF NIL "labels") " "
     (:ISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
     (:COMMENT NIL " \\specref{with-added-methods},")
     (:ENDISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
     (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
     (:COMMENT NIL "   \\specref{generic-flet}, " " and"
      "   \\specref{generic-labels} ")
     (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
     (:TERM NIL "form") " that defines that function are "
     (:TERM NIL "bound declarations")
     ". Such declarations in other contexts are "
     (:TERM NIL "free declarations") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " ;; The globally defined function DISPATCH should be open-coded,
 ;; if the implementation supports inlining, unless a NOTINLINE 
 ;; declaration overrides this effect.
 (declaim (inline dispatch))
 (defun dispatch (x) (funcall (get (car x) 'dispatch) x))
 ;; Here is an example where inlining would be encouraged.
 (defun top-level-1 () (dispatch (read-command)))
 ;; Here is an example where inlining would be prohibited.
 (defun top-level-2 ()
   (declare (notinline dispatch))
   (dispatch (read-command)))
 ;; Here is an example where inlining would be prohibited.
 (declaim (notinline dispatch))
 (defun top-level-3 () (dispatch (read-command)))
 ;; Here is an example where inlining would be encouraged.
 (defun top-level-4 () 
   (declare (inline dispatch))
   (dispatch (read-command)))
")
     " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MISC NIL "declare") ", "
     (:MACREF NIL "declaim") ", " (:FUNREF NIL "proclaim") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FTYPE") :PAR
   (:COM (:NAME "ftype" :FTYPE "Declaration")
    (:PART (:NAME "Syntax") " " :PAR (:ISSUE NIL "FUNCTION-NAME:LARGE") " "
     (:TT NIL "(ftype " (:PARAM NIL "type") " "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "function-name"))) ")")
     " " (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " " :PAR)
    (:PART (:NAME "Arguments") " " :PAR (:PARAM NIL "function-name") "—a "
     (:TERM NIL "function name") ". " :PAR
     (:COMMENT NIL " added --sjl 7 Mar 92") (:PARAM NIL "type") "—a "
     (:TERM NIL "type specifier") ". " :PAR)
    (:PART (:NAME "Valid Context") " " :PAR (:TERM NIL "declaration") " or "
     (:TERM NIL "proclamation") " " :PAR)
    (:PART (:NAME "Binding Types Affected") " " :PAR (:TERM NIL "function") " "
     :PAR)
    (:PART (:NAME "Description") " " :PAR "Specifies that the "
     (:TERM NIL "functions") " named by " (:PARAM NIL "function-names")
     " are of the functional type " (:PARAM NIL "type") ". For example: " :PAR
     (:CODE NIL " (declare (ftype (function (integer list) t) ith)
          (ftype (function (number) float) sine cosine))
")
     " If one of the " (:TERM NIL "functions")
     " mentioned has a lexically apparent local definition (as made by "
     (:SPECREF NIL "flet") " or " (:SPECREF NIL "labels")
     "), then the declaration applies to that local definition and not to the global function definition. "
     (:DECLREF NIL "ftype") " declarations never apply to variable "
     (:TERM NIL "bindings") " (see " (:TT NIL " type") "). " :PAR
     (:COMMENT NIL " added.  --sjl 4 Mar 92")
     (:ISSUE NIL "MACRO-DECLARATIONS:MAKE-EXPLICIT")
     " The lexically apparent bindings of " (:PARAM NIL "function-names")
     " must not be " (:TERM NIL "macro") " definitions. (This is because "
     (:DECLREF NIL "ftype") " declares the functional definition of each "
     (:TERM NIL "function name") " to be of a particular subtype of "
     (:TYPEREF NIL "function") ", and " (:TERM NIL "macros") " do not denote "
     (:TERM NIL "functions") ".) "
     (:ENDISSUE NIL "MACRO-DECLARATIONS:MAKE-EXPLICIT") " " :PAR
     (:COMMENT NIL
      " This is adequately covered in the packages chapter.  --sjl 5 Mar 92"
      " \\issue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}"
      " Except where explicitly allowed, the consequences are undefined if"
      " a \\term{symbol} in \\thepackage{common-lisp}"
      " is used as a \\param{function-name} argument."
      " If such a \\term{symbol} is not defined"
      " %\"by this standard\" added per barmar: -kmp 28-Dec-90"
      " by this standard"
      " as a \\term{function},  \\term{macro},  or \\term{special form},"
      " it is allowed to declare the"
      " \\declref{ftype} of that \\term{binding}.  "
      " \\endissue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}")
     :PAR (:DECLREF NIL "ftype") " "
     (:ISSUE NIL "DECLARE-FUNCTION-AMBIGUITY:DELETE-FTYPE-ABBREVIATION") " "
     (:COMMENT NIL "and \\declref{function} ")
     (:ENDISSUE NIL "DECLARE-FUNCTION-AMBIGUITY:DELETE-FTYPE-ABBREVIATION")
     " declarations can be " (:TERM NIL "free declarations") " or "
     (:TERM NIL "bound declarations") ". " (:DECLREF NIL "ftype")
     " declarations of functions that appear before the body of a "
     (:SPECREF NIL "flet") " or " (:SPECREF NIL "labels") " "
     (:ISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
     (:COMMENT NIL " \\specref{with-added-methods},")
     (:ENDISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
     (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
     (:COMMENT NIL "   \\specref{generic-flet}, " " and"
      "   \\specref{generic-labels} ")
     (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
     (:TERM NIL "form") " that defines that function are "
     (:TERM NIL "bound declarations")
     ". Such declarations in other contexts are "
     (:TERM NIL "free declarations") ". " :PAR
     (:ISSUE NIL "DECLARE-FUNCTION-AMBIGUITY:DELETE-FTYPE-ABBREVIATION") " "
     (:COMMENT NIL " " " {\\tt (function \\param{var1} \\param{var2}...)}"
      " is equivalent to"
      " {\\tt  (type function \\param{var1} \\param{var2}...)}" " "
      "%% 9.2.0 12" "If one of the \\term{functions}"
      "mentioned has a lexically apparent local definition"
      "(as made by \\specref{flet} or \\specref{labels}), then the declaration"
      "applies to that local definition and not to the global function definition."
      " " " " " See \\declref{type} and \\declref{ftype}." " ")
     (:ENDISSUE NIL "DECLARE-FUNCTION-AMBIGUITY:DELETE-FTYPE-ABBREVIATION") " "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MISC NIL "declare") ", "
     (:MACREF NIL "declaim") ", " (:FUNREF NIL "proclaim") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DECLARATION")
   (:COM (:NAME "declaration" :FTYPE "Declaration")
    (:PART (:NAME "Syntax") " " :PAR
     (:TT NIL "(declaration " (:STAR NIL (:CURLY NIL (:PARAM NIL "name"))) ")")
     " " :PAR)
    (:PART (:NAME "Arguments") " " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "Binding Types Affected" :NONE T) " " :PAR)
    (:PART (:NAME "Valid Context") " " :PAR (:TERM NIL "proclamation") " only "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 9.2.0 19")
     "Advises the compiler that each " (:PARAM NIL "name")
     " is a valid but potentially non-standard declaration name. The purpose of this is to tell one compiler not to issue warnings for declarations meant for another compiler or other program processor. "
     (:COMMENT NIL " Already said in the packages chapter.  --sjl 5 Mar 92"
      " \\issue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}"
      " The consequences are undefined if a \\term{symbol} in \\thepackage{common-lisp}"
      " is used as a \\i{name} argument."
      " \\endissue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}")
     :PAR
     (:COMMENT NIL
      "!!! Couldn't figure this out.  It's obviously better to omit it than include it but..."
      " \\reviewer{Barmar: What does this mean??}%!!!"
      " \\f{(\\i{declaration} x)} never applies to a \\term{binding} of {\\tt y}.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (declaim (declaration author target-language target-machine))
 (declaim (target-language ada))
 (declaim (target-machine IBM-650))
 (defun strangep (x)
   (declare (author \"Harry Tweeker\"))
   (member x '(strange weird odd peculiar)))
")
     " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "declaim") ", "
     (:FUNREF NIL "proclaim") " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== OPTIMIZE" "%% ========== COMPILATION-SPEED"
    "%% ========== DEBUG" "%% ========== SAFETY" "%% ========== SPACE"
    "%% ========== SPEED")
   :PAR
   (:COM (:NAME "optimize" :FTYPE "Declaration")
    (:PART (:NAME "Syntax") " " :PAR
     (:TT NIL "(optimize "
      (:STAR NIL
       (:CURLY NIL (:PARAM NIL "quality") " | (" (:PARAM NIL "quality") " "
        (:PARAM NIL "value") ")"))
      ")")
     " " (:IDXREF NIL "compilation-speed") (:IDXREF NIL "debug")
     (:IDXREF NIL "safety") (:IDXREF NIL "space") (:IDXREF NIL "speed") " "
     :PAR)
    (:PART (:NAME "Arguments") " " :PAR (:PARAM NIL "quality") "—an "
     (:TERM NIL "optimize quality") ". " :PAR (:PARAM NIL "value")
     "—one of the " (:TERM NIL "integers") " " (:TT NIL "0") ", " (:TT NIL "1")
     ", " (:TT NIL "2") ", or " (:TT NIL "3") ". " :PAR)
    (:PART (:NAME "Valid Context") " " :PAR (:TERM NIL "declaration") " or "
     (:TERM NIL "proclamation") " " :PAR)
    (:PART (:NAME "Binding Types Affected" :NONE T) " " :PAR)
    (:PART (:NAME "Description") " " :PAR "Advises the compiler that each "
     (:PARAM NIL "quality")
     " should be given attention according to the specified corresponding "
     (:PARAM NIL "value") ". Each " (:PARAM NIL "quality") " must be a "
     (:TERM NIL "symbol") " naming an " (:TERM NIL "optimize quality")
     "; the names and meanings of the standard "
     (:PARAM NIL "optimize qualities") " are shown in " (:NEXTFIGURE NIL) ". "
     :PAR (:ISSUE NIL "OPTIMIZE-DEBUG-INFO:NEW-QUALITY") " "
     (:TABLE (:NAME ("Optimize qualities"))
      (:ROW NIL (:CELL NIL "Name") (:CELL NIL "Meaning"))
      (:ROW NIL (:CELL NIL (:DECLREF NIL "compilation-speed"))
       (:CELL NIL " speed of the compilation process "))
      (:ROW NIL (:CELL NIL (:DECLREF NIL "debug"))
       (:CELL NIL " ease of debugging "))
      (:ROW NIL (:CELL NIL (:DECLREF NIL "safety"))
       (:CELL NIL " run-time error checking "))
      (:ROW NIL (:CELL NIL (:DECLREF NIL "space"))
       (:CELL NIL " both code size and run-time space "))
      (:ROW NIL (:CELL NIL (:DECLREF NIL "speed"))
       (:CELL NIL " speed of the object code ")))
     " " (:ENDISSUE NIL "OPTIMIZE-DEBUG-INFO:NEW-QUALITY") " " :PAR
     "There may be other, " (:TERM NIL "implementation-defined") " "
     (:TERM NIL "optimize qualities") ". " :PAR "A " (:PARAM NIL "value") " "
     (:TT NIL "0") " means that the corresponding " (:PARAM NIL "quality")
     " is totally unimportant, and " (:TT NIL "3") " that the "
     (:PARAM NIL "quality") " is extremely important; " (:TT NIL "1") " and "
     (:TT NIL "2") " are intermediate values, with " (:TT NIL "1") " the "
     (:COMMENT NIL
      "% \"average\" -> \"neutral\" since KAB balked and I think this will be less weird. -kmp 3-Oct-91"
      "average")
     "neutral value. " (:TT NIL "(" (:PARAM NIL "quality") " 3)")
     " can be abbreviated to " (:PARAM NIL "quality") ". "
     (:COMMENT NIL "This declaration is \\term{pervasive}.") :PAR "Note that "
     (:TERM NIL "code") " which has the optimization " (:TT NIL "(safety 3)")
     ", or just " (:TYPEREF NIL "safety") ", is called " (:TERM NIL "safe") " "
     (:TERM NIL "code") ". " :PAR
     (:COMMENT NIL " Added per Sandra in response to Barrett query ...")
     "The consequences are unspecified if a " (:PARAM NIL "quality")
     " appears more than once with " (:TERM NIL "different") " "
     (:PARAM NIL "values") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun often-used-subroutine (x y)
   (declare (optimize (safety 2)))
   (error-check x y)
   (hairy-setup x)
   (do ((i 0 (+ i 1))
        (z x (cdr z)))
       ((null z))
     ;; This inner loop really needs to burn.
     (declare (optimize speed))
     (declare (fixnum i))
     ))
")
     " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MISC NIL "declare") ", "
     (:MACREF NIL "declaim") ", " (:FUNREF NIL "proclaim") ", "
     (:SECREF NIL :DECL-SCOPE) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "An " (:DECLREF NIL "optimize")
     " declaration never applies to either a " (:TERM NIL "variable") " or a "
     (:TERM NIL "function") " " (:TERM NIL "binding") ". An "
     (:DECLREF NIL "optimize") " declaration can only be a "
     (:TERM NIL "free declaration") ". For more information, see "
     (:SECREF NIL :DECL-SCOPE) ". " :PAR))
   " " :PAR
   (:COMMENT NIL
    " I moved the dictionary entry for the special declaration here."
    " It used to be in chapter 5, but it seemed more logical to put it with"
    " all the other declaration specifiers.   -- sjl 5 Mar 92")
   :PAR (:COMMENT NIL "%% ========== SPECIAL") :PAR
   (:COM (:NAME "special" :FTYPE "Declaration")
    (:PART (:NAME "Syntax") " " :PAR
     (:TT NIL "(special " (:STAR NIL (:CURLY NIL (:PARAM NIL "var"))) ")") " "
     :PAR)
    (:PART (:NAME "Arguments") " " :PAR (:PARAM NIL "var") "—a "
     (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "Valid Context") " " :PAR (:TERM NIL "declaration") " or "
     (:TERM NIL "proclamation") " " :PAR)
    (:PART (:NAME "Binding Types Affected") " " :PAR (:TERM NIL "variable") " "
     :PAR)
    (:PART (:NAME "Description") " " :PAR "Specifies that all of the "
     (:PARAM NIL "vars") " named are dynamic. This specifier affects variable "
     (:TERM NIL "bindings") " and affects references. All variable "
     (:TERM NIL "bindings") " affected are made to be dynamic "
     (:TERM NIL "bindings")
     ", and affected variable references refer to the current dynamic "
     (:TERM NIL "binding") ". "
     (:COMMENT NIL "rather than the current lexical \\term{binding}.")
     "For example: " :PAR
     (:CODE NIL " (defun hack (thing *mod*)    ;The binding of the parameter
   (declare (special *mod*))  ; *mod* is visible to hack1,
   (hack1 (car thing)))       ; but not that of thing.
 (defun hack1 (arg)
   (declare (special *mod*))  ;Declare references to *mod*
                              ;within hack1 to be special.
   (if (atom arg) *mod*
       (cons (hack1 (car arg)) (hack1 (cdr arg)))))
")
     " " :PAR (:COMMENT NIL "% 9.2.0 4") "A " (:DECLREF NIL "special")
     " declaration does not affect inner " (:TERM NIL "bindings") " of a "
     (:PARAM NIL "var") "; the inner " (:TERM NIL "bindings")
     " implicitly shadow a " (:DECLREF NIL "special")
     " declaration and must be explicitly re-declared to be "
     (:DECLREF NIL "special") ". " (:DECLREF NIL "special")
     " declarations never apply to function " (:TERM NIL "bindings") ". " :PAR
     (:COMMENT NIL
      " adequately covered in the packages chapter.  --sjl 5 Mar 92"
      " \\issue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}"
      " Except where explicitly allowed, the consequences are undefined if"
      " a \\term{symbol} in \\thepackage{common-lisp}"
      " is used as a \\param{var} argument."
      " \\endissue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}")
     :PAR (:DECLREF NIL "special") " declarations can be either "
     (:TERM NIL "bound declarations")
     ", affecting both a binding and references, or "
     (:TERM NIL "free declarations")
     ", affecting only references, depending on whether the declaration is attached to a variable binding. "
     :PAR (:COMMENT NIL "% 9.1.0 14") "When used in a "
     (:TERM NIL "proclamation") ", a " (:DECLREF NIL "special") " "
     (:TERM NIL "declaration specifier") " applies to all "
     (:TERM NIL "bindings")
     " as well as to all references of the mentioned variables. For example, after "
     :PAR
     (:CODE NIL " (declaim (special x))
")
     " " :PAR "then in a function definition such as " :PAR
     (:CODE NIL " (defun example (x) ...)
")
     " " :PAR "the parameter " (:TT NIL "x")
     " is bound as a dynamic variable rather than as a lexical variable. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL "(defun declare-eg (y)                 ;this y is special
 (declare (special y))
 (let ((y t))                         ;this y is lexical
      (list y
            (locally (declare (special y)) y)))) ;this y refers to the
                                                 ;special binding of y
→ DECLARE-EG 
 (declare-eg nil) → (T NIL) 
")
     " " :PAR
     (:CODE NIL "(setf (symbol-value 'x) 6)
(defun foo (x)                         ;a lexical binding of x
  (print x)
  (let ((x (1+ x)))                    ;a special binding of x
    (declare (special x))              ;and a lexical reference
    (bar))
  (1+ x))
(defun bar () 
  (print (locally (declare (special x))
           x)))
(foo 10) 
⊳ 10
⊳ 11
→ 11
")
     " " :PAR
     (:CODE NIL "(setf (symbol-value 'x) 6)
(defun bar (x y)            ;[1] 1st occurrence of x
  (let ((old-x x)           ;[2] 2nd occurrence of x -- same as 1st occurrence
        (x y))              ;[3] 3rd occurrence of x
    (declare (special x))
    (list old-x x)))
(bar 'first 'second) → (FIRST SECOND)
")
     " " :PAR
     (:CODE NIL " (defun few (x &optional (y *foo*))
   (declare (special *foo*))
   ...)
")
     " The reference to " (:TT NIL "*foo*")
     " in the first line of this example is not " (:DECLREF NIL "special")
     " even though there is a " (:DECLREF NIL "special")
     " declaration in the second line. " :PAR
     (:CODE NIL " (declaim (special prosp)) → "
      (:TERM NIL "implementation-dependent") "
 (setq prosp 1 reg 1) → 1
 (let ((prosp 2) (reg 2))         ;the binding of prosp is special
    (set 'prosp 3) (set 'reg 3)   ;due to the preceding proclamation,
    (list prosp reg))             ;whereas the variable reg is lexical
→ (3 2)
 (list prosp reg) → (1 3)

 (declaim (special x))          ;x is always special.
 (defun example (x y)                                 
   (declare (special y))
   (let ((y 3) (x (* x 2)))
     (print (+ y (locally (declare (special y)) y)))
     (let ((y 4)) (declare (special y)) (foo x)))) → EXAMPLE
")
     " In the contorted code above, the outermost and innermost "
     (:TERM NIL "bindings") " of " (:TT NIL "y")
     " are dynamic, but the middle binding is lexical. The two arguments to "
     (:TT NIL "+") " are different, one being the value, which is "
     (:TT NIL "3") ", of the lexical variable " (:TT NIL "y")
     ", and the other being the value of the dynamic variable named "
     (:TT NIL "y") " (a " (:TERM NIL "binding")
     " of which happens, coincidentally, to lexically surround it at an outer level). All the "
     (:TERM NIL "bindings") " of " (:TT NIL "x") " and references to "
     (:TT NIL "x") " are dynamic, however, because of the proclamation that "
     (:TT NIL "x") " is always " (:DECLREF NIL "special") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defparameter") ", "
     (:MACREF NIL "defvar") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LOCALLY")
   (:COM (:NAME "locally" :FTYPE "Special Operator")
    (:ISSUE NIL "DECLS-AND-DOC") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "LOCALLY-TOP-LEVEL:SPECIAL-FORM") " "
     (:DEF (:KIND "special-operator") (:NAMES NIL "locally")
      (:ARGLIST NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " (:ENDISSUE NIL "LOCALLY-TOP-LEVEL:SPECIAL-FORM") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "Declaration")
     "—a " (:MISC NIL "declare") " " (:TERM NIL "expression")
     "; not evaluated. " :PAR (:PARAM NIL "forms") "—an "
     (:TERM NIL "implicit progn") ". " :PAR
     (:ISSUE NIL "RETURN-VALUES-UNSPECIFIED:SPECIFY") " "
     (:PARAM NIL "results") "—the " (:TERM NIL "values") " of the "
     (:PARAM NIL "forms") ". "
     (:ENDISSUE NIL "RETURN-VALUES-UNSPECIFIED:SPECIFY") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 9.1.0 10")
     "Sequentially evaluates a body of " (:PARAM NIL "forms") " in a "
     (:TERM NIL "lexical environment") " where the given "
     (:PARAM NIL "declarations") " have effect. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun sample-function (y)  ;this y is regarded as special
   (declare (special y))                                
   (let ((y t))              ;this y is regarded as lexical
     (list y
           (locally (declare (special y))
             ;; this next y is regarded as special
             y))))
→ SAMPLE-FUNCTION
 (sample-function nil) → (T NIL) 
 (setq x '(1 2 3) y '(4 . 5)) → (4 . 5)

;;; The following declarations are not notably useful in specific.
;;; They just offer a sample of valid declaration syntax using LOCALLY.
 (locally (declare (inline floor) (notinline car cdr))
          (declare (optimize space))
    (floor (car x) (cdr y))) → 0, 1
")
     " " :PAR (:ISSUE NIL "LOCALLY-TOP-LEVEL:SPECIAL-FORM") " "
     (:COMMENT NIL "Barmar: Say what the example does."
      "KMP: I added some comments. OK?")
     (:CODE NIL
      ";;; This example shows a definition of a function that has a particular set
;;; of OPTIMIZE settings made locally to that definition.
 (locally (declare (optimize (safety 3) (space 3) (speed 0)))
   (defun frob (w x y &optional (z (foo x y)))
     (mumble x y z w)))
→ FROB

;;; This is like the previous example, except that the optimize settings
;;; remain in effect for subsequent definitions in the same compilation unit.
 (declaim (optimize (safety 3) (space 3) (speed 0)))
 (defun frob (w x y &optional (z (foo x y)))
   (mumble x y z w))
→ FROB
")
     " " (:ENDISSUE NIL "LOCALLY-TOP-LEVEL:SPECIAL-FORM") " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MISC NIL "declare") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The " (:DECLREF NIL "special")
     " declaration may be used with " (:SPECREF NIL "locally")
     " to affect references to, rather than " (:TERM NIL "bindings") " of, "
     (:TERM NIL "variables") ". " (:COMMENT NIL "Barrett: So what?") :PAR
     (:ISSUE NIL "LOCALLY-TOP-LEVEL:SPECIAL-FORM") " If a "
     (:SPECREF NIL "locally") " " (:TERM NIL "form") " is a "
     (:TERM NIL "top level form") ", the body " (:PARAM NIL "forms")
     " are also processed as " (:TERM NIL "top level forms") ". See "
     (:SECREF NIL :FILE-COMPILATION) ". "
     (:ENDISSUE NIL "LOCALLY-TOP-LEVEL:SPECIAL-FORM") " " :PAR
     (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== THE")
   (:COM (:NAME "the" :FTYPE "Special Operator")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "the")
      (:ARGLIST NIL "value-type form")
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "value-type")
     "—a " (:TERM NIL "type specifier") "; not evaluated. " :PAR
     (:PARAM NIL "form") "—a " (:TERM NIL "form") "; evaluated. " :PAR
     (:ISSUE NIL "THE-VALUES:RETURN-NUMBER-RECEIVED") " "
     (:COMMENT NIL "% 7.9.2 19                      ") (:PARAM NIL "results")
     "—the " (:TERM NIL "values") " resulting from the "
     (:TERM NIL "evaluation") " of " (:PARAM NIL "form") ". These "
     (:TERM NIL "values") " must conform to the " (:TERM NIL "type")
     " supplied by " (:PARAM NIL "value-type") "; see below. "
     (:ENDISSUE NIL "THE-VALUES:RETURN-NUMBER-RECEIVED") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 9.3.0 2")
     (:SPECREF NIL "the") " specifies that the " (:TERM NIL "values")
     (:SUB NIL "1a") " returned by " (:PARAM NIL "form") " are of the "
     (:TERM NIL "types") " specified by " (:PARAM NIL "value-type")
     ". The consequences are undefined if any " (:PARAM NIL "result")
     " is not of the declared type. " :PAR
     (:ISSUE NIL "THE-AMBIGUITY:FOR-DECLARATION") " "
     (:COMMENT NIL
      "% This text has been removed per Moon #19 (first public review). -kmp 8-May-93"
      " %!!! Barmar: If this is true, the THE form is equivalent to the form argument."
      " \\param{Value-type} can be any valid \\term{type specifier}."
      " In the case that \\param{form} returns one"
      "   value and \\param{value-type} is not a "
      " \\declref{values} \\term{type specifier}, " " " " \\code"
      "  (the type exp) " " \\EQ " "  (let ((#:g0001 exp))"
      "    (declare (type type #:g0001))" "    #:g0001)" " \\endcode")
     (:ENDISSUE NIL "THE-AMBIGUITY:FOR-DECLARATION") " " :PAR
     (:ISSUE NIL "JUN90-TRIVIAL-ISSUES:27") " "
     (:ISSUE NIL "THE-VALUES:RETURN-NUMBER-RECEIVED") " It is permissible for "
     (:PARAM NIL "form") " to " (:TERM NIL "yield") " a different number of "
     (:TERM NIL "values") " than are specified by " (:PARAM NIL "value-type")
     ", provided that the values for which " (:PARAM NIL "types")
     " are declared are indeed of those " (:TERM NIL "types")
     ". Missing values are treated as " (:MISC NIL "nil")
     " for the purposes of checking their " (:TERM NIL "types") ". " :PAR
     "Regardless of number of " (:TERM NIL "values") " declared by "
     (:PARAM NIL "value-type") ", the number of " (:TERM NIL "values")
     " returned by the " (:SPECREF NIL "the") " " (:TERM NIL "special form")
     " is the same as the number of " (:TERM NIL "values") " returned by "
     (:PARAM NIL "form") ". "
     (:ENDISSUE NIL "THE-VALUES:RETURN-NUMBER-RECEIVED") " "
     (:ENDISSUE NIL "JUN90-TRIVIAL-ISSUES:27") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:ISSUE NIL "THE-VALUES:RETURN-NUMBER-RECEIVED") " "
     (:CODE NIL " (the symbol (car (list (gensym)))) → #:G9876
 (the fixnum (+ 5 7)) → 12
 (the (values) (truncate 3.2 2)) → 1, 1.2
 (the integer (truncate 3.2 2)) → 1, 1.2
 (the (values integer) (truncate 3.2 2)) → 1, 1.2
 (the (values integer float) (truncate 3.2 2))   → 1, 1.2
 (the (values integer float symbol) (truncate 3.2 2)) → 1, 1.2
 (the (values integer float symbol t null list) 
      (truncate 3.2 2)) → 1, 1.2
 (let ((i 100))
    (declare (fixnum i))
    (the fixnum (1+ i))) → 101
 (let* ((x (list 'a 'b 'c))
        (y 5))
    (setf (the fixnum (car x)) y)
    x) → (5 B C)
")
     " " (:ENDISSUE NIL "THE-VALUES:RETURN-NUMBER-RECEIVED") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "The consequences are undefined if the " (:TERM NIL "values") " "
     (:TERM NIL "yielded") " by the " (:PARAM NIL "form") " are not of the "
     (:TERM NIL "type") " specified by " (:PARAM NIL "value-type") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:DECLREF NIL "values") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The " (:DECLREF NIL "values") " "
     (:TERM NIL "type specifier") " can be used to indicate the types of "
     (:TERM NIL "multiple values") ": " :PAR
     (:CODE NIL " (the (values integer integer) (floor x y))
 (the (values string t)
      (gethash the-key the-string-table))
")
     " " :PAR (:MACREF NIL "setf") " can be used with " (:SPECREF NIL "the")
     " type declarations. In this case the declaration is transferred to the form that specifies the new value. The resulting "
     (:MACREF NIL "setf") " " (:TERM NIL "form") " is then analyzed. " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Introspection --------------------")
   :PAR (:COMMENT NIL "%% ========== SPECIAL-OPERATOR-P")
   (:COM (:NAME "special-operator-p" :FTYPE "Function")
    (:ISSUE NIL "SPECIAL-FORM-P-MISNOMER:RENAME") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "special-operator-p")
      (:ARGLIST NIL "symbol") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbol") "—a "
     (:TERM NIL "symbol") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.1.1 22")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "symbol") " is a "
     (:TERM NIL "special operator") "; otherwise, returns " (:TERM NIL "false")
     ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (special-operator-p 'if) → " (:TERM NIL "true") "
 (special-operator-p 'car) → "
      (:TERM NIL "false") "
 (special-operator-p 'one) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "Should signal "
     (:TYPEREF NIL "type-error") " if its argument is not a "
     (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "Historically, this function was called "
     (:TT NIL "special-form-p")
     ". The name was finally declared a misnomer and changed, since it returned true for "
     (:TERM NIL "special operators") ", not " (:TERM NIL "special forms") ". "
     :PAR
     (:COMMENT NIL "This is beyond the scope of the language. -kmp 26-Dec-90"
      " A returned \\term{non-nil} value is typically a \\term{function}"
      " of \\term{implementation-dependent} nature that can be used to"
      " interpret (evaluate) the \\term{special form}.")
     :PAR (:ENDISSUE NIL "SPECIAL-FORM-P-MISNOMER:RENAME") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== CONSTANTP")
   (:COM (:NAME "constantp" :FTYPE "Function")
    (:ISSUE NIL "CONSTANTP-DEFINITION:INTENTIONAL") " "
    (:ISSUE NIL "CONSTANTP-ENVIRONMENT:ADD-ARG") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "constantp")
      (:ARGLIST NIL "form " (:KEYWORD NIL " &optional") " environment")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "form") "—a "
     (:TERM NIL "form") ". " :PAR (:PARAM NIL "environment") "—an "
     (:TERM NIL "environment") " " (:TERM NIL "object") ". The default is "
     (:MISC NIL "nil") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 20.1.0 14" "% 20.1.0 15") "Returns " (:TERM NIL "true")
     " if " (:PARAM NIL "form") " can be determined by the "
     (:TERM NIL "implementation") " to be a " (:TERM NIL "constant form")
     " in the indicated " (:PARAM NIL "environment") "; otherwise, it returns "
     (:TERM NIL "false") " indicating either that the " (:TERM NIL "form")
     " is not a " (:TERM NIL "constant form")
     " or that it cannot be determined whether or not " (:TERM NIL "form")
     " is a " (:TERM NIL "constant form") ". " :PAR "The following kinds of "
     (:TERM NIL "forms") " are considered " (:TERM NIL "constant forms") ": "
     (:LIST NIL
      (:ITEM NIL " "
       (:COMMENT NIL " This is the wrong term.  --sjl 5 Mar 92"
        "  \\term{Constant objects}")
       (:TERM NIL "Self-evaluating objects") " (such as " (:TERM NIL "numbers")
       ", " (:TERM NIL "characters") ", and the various kinds of "
       (:TERM NIL "arrays") ") are always considered "
       (:TERM NIL "constant forms") " and must be recognized as such by "
       (:FUNREF NIL "constantp") ". " :PAR)
      (:ITEM NIL " " (:TERM NIL "Constant variables") ", such as "
       (:TERM NIL "keywords") ", symbols defined by " (:RM NIL " Common Lisp")
       " as constant (such as " (:MISC NIL "nil") ", " (:MISC NIL "t") ", and "
       (:CONREF NIL "pi")
       "), and symbols declared as constant by the user in the indicated "
       (:PARAM NIL "environment") " using " (:MACREF NIL "defconstant")
       " are always considered " (:TERM NIL "constant forms")
       " and must be recognized as such by " (:FUNREF NIL "constantp") ". "
       :PAR)
      (:ITEM NIL " " (:SPECREF NIL "quote") " " (:TERM NIL "forms")
       " are always considered " (:TERM NIL "constant forms")
       " and must be recognized as such by " (:FUNREF NIL "constantp") ". "
       :PAR)
      (:ITEM NIL " An " (:TERM NIL "implementation")
       " is permitted, but not required, to detect additional "
       (:TERM NIL "constant forms")
       ". If it does, it is also permitted, but not required, to make use of information in the "
       (:PARAM NIL "environment") ". Examples of " (:TERM NIL "constant forms")
       " for which " (:FUNREF NIL "constantp") " might or might not return "
       (:TERM NIL "true") " are: " (:TT NIL "(sqrt pi)") ", "
       (:TT NIL "(+ 3 2)") ", " (:TT NIL "(length '(a b c))") ", and "
       (:TT NIL "(let ((x 7)) (zerop x))") ". "))
     " " :PAR "If an " (:TERM NIL "implementation")
     " chooses to make use of the " (:PARAM NIL "environment")
     " information, such actions as expanding " (:TERM NIL "macros")
     " or performing function inlining are permitted to be used, but not required; however, expanding "
     (:TERM NIL "compiler macros") " is not permitted. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (constantp 1) → " (:TERM NIL "true") "
 (constantp 'temp) → "
      (:TERM NIL "false") "
 (constantp ''temp)) → "
      (:TERM NIL "true") "
 (defconstant this-is-a-constant 'never-changing) → THIS-IS-A-CONSTANT 
 (constantp 'this-is-a-constant) → "
      (:TERM NIL "true") "
 (constantp \"temp\") → "
      (:TERM NIL "true") "
 (setq a 6) → 6 
 (constantp a) → "
      (:TERM NIL "true") "
 (constantp '(sin pi)) → "
      (:TERM NIL "implementation-dependent") "
 (constantp '(car '(x))) → "
      (:TERM NIL "implementation-dependent") "
 (constantp '(eql x x)) → "
      (:TERM NIL "implementation-dependent") "
 (constantp '(typep x 'nil)) → "
      (:TERM NIL "implementation-dependent") "
 (constantp '(typep x 't)) → "
      (:TERM NIL "implementation-dependent") "
 (constantp '(values this-is-a-constant)) → "
      (:TERM NIL "implementation-dependent") "
 (constantp '(values 'x 'y)) → "
      (:TERM NIL "implementation-dependent") "
 (constantp '(let ((a '(a b c))) (+ (length a) 6))) → "
      (:TERM NIL "implementation-dependent") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "The state of the global environment (" (:I NIL "e.g.") ",  which "
     (:TERM NIL "symbols") " have been declared to be the " (:TERM NIL "names")
     " of " (:TERM NIL "constant variables") "). " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defconstant") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "CONSTANTP-ENVIRONMENT:ADD-ARG") " "
     (:ENDISSUE NIL "CONSTANTP-DEFINITION:INTENTIONAL") " " :PAR))
   " " :PAR (:ISSUE NIL "SYNTACTIC-ENVIRONMENT-ACCESS:RETRACTED-MAR91") " "
   (:COMMENT NIL
    " The following functions were removed due to the retraction of"
    " issue SYNTACTIC-ENVIRONMENT-ACCESS by X3J13 at the Mar 91 meeting."
    "  AUGMENT-ENVIRONMENT" "  DECLARATION-INFORMATION" "  DEFINE-DECLARATION"
    "  ENCLOSE" "  FUNCTION-INFORMATION" "  PARSE-MACRO"
    "  VARIABLE-INFORMATION")
   (:ENDISSUE NIL "SYNTACTIC-ENVIRONMENT-ACCESS:RETRACTED-MAR91") " ")
  " " :PAR)
 (:CHAPTER
  (:NUM "4" :TITLE ("Types and Classes") :NUMTAG :CHAP-FOUR :NAMETAG
   :TYPES-AND-CLASSES)
  (:SECTION (:TITLE ("Introduction"))
   (:COMMENT NIL "% Introduction to Objects and Types") :PAR
   (:COMMENT NIL "% 2.0.0 4" "% 6.2.1 1") "A " (:TERM NIL "type")
   " is a (possibly infinite) set of " (:TERM NIL "objects") ". An "
   (:TERM NIL "object") " can belong to more than one " (:TERM NIL "type") ". "
   (:TERM NIL "Types") " are never explicitly represented as "
   (:TERM NIL "objects") " by " (:RM NIL " Common Lisp")
   ". Instead, they are referred to indirectly by the use of "
   (:TERM NIL "type specifiers") ", which are " (:TERM NIL "objects")
   " that denote " (:TERM NIL "types") ". " :PAR "New " (:TERM NIL "types")
   " can be defined using " (:MACREF NIL "deftype") ", "
   (:MACREF NIL "defstruct") ", " (:MACREF NIL "defclass") ", and "
   (:MACREF NIL "define-condition") ". " :PAR "The " (:TERM NIL "function") " "
   (:FUNREF NIL "typep")
   ", a set membership test, is used to determine whether a given "
   (:TERM NIL "object") " is of a given " (:TERM NIL "type") ". The function "
   (:FUNREF NIL "subtypep")
   ", a subset test, is used to determine whether a given " (:TERM NIL "type")
   " is a " (:TERM NIL "subtype") " of another given " (:TERM NIL "type")
   ". The function " (:FUNREF NIL "type-of") " returns a particular "
   (:TERM NIL "type") " to which a given " (:TERM NIL "object")
   " belongs, even though that " (:TERM NIL "object")
   " must belong to one or more other " (:TERM NIL "types")
   " as well. (For example, every " (:TERM NIL "object") " is of "
   (:TERM NIL "type") " " (:TYPEREF NIL "t") ", but " (:FUNREF NIL "type-of")
   " always returns a " (:TERM NIL "type specifier") " for a "
   (:TERM NIL "type") " more specific than " (:TYPEREF NIL "t") ".) " :PAR
   (:COMMENT NIL "% 2.0.0 1") (:TERM NIL "Objects") ", not "
   (:TERM NIL "variables") ", have " (:TERM NIL "types") ". Normally, any "
   (:TERM NIL "variable") " can have any " (:TERM NIL "object") " as its "
   (:TERM NIL "value") ". It is possible to declare that a "
   (:TERM NIL "variable") " takes on only values of a given "
   (:TERM NIL "type") " by making an explicit " (:TERM NIL "type declaration")
   ". " (:COMMENT NIL "% 2.0.0 5") (:TERM NIL "Types")
   " are arranged in a directed acyclic graph, except for the presence of equivalences. "
   :PAR (:TERM NIL "Declarations") " can be made about " (:TERM NIL "types")
   " using " (:MISC NIL "declare") ", " (:FUNREF NIL "proclaim") ", "
   (:MACREF NIL "declaim") ", or " (:SPECREF NIL "the")
   ". For more information about " (:TERM NIL "declarations") ", see "
   (:SECREF NIL :DECLARATIONS) ". " :PAR "Among the fundamental "
   (:TERM NIL "objects") " of the object system are " (:TERM NIL "classes")
   ". A " (:TERM NIL "class")
   " determines the structure and behavior of a set of other "
   (:TERM NIL "objects") ", which are called its " (:TERM NIL "instances")
   ". Every " (:TERM NIL "object") " is a " (:TERM NIL "direct instance")
   " of a " (:TERM NIL "class") ". The " (:TERM NIL "class") " of an "
   (:TERM NIL "object")
   " determines the set of operations that can be performed on the "
   (:TERM NIL "object") ". For more information, see " (:SECREF NIL :CLASSES)
   ". " :PAR "It is possible to write " (:TERM NIL "functions")
   " that have behavior " (:TERM NIL "specialized") " to the class of the "
   (:TERM NIL "objects") " which are their " (:TERM NIL "arguments")
   ". For more information, see " (:SECREF NIL :GFS-AND-METHODS) ". " :PAR
   "The " (:TERM NIL "class") " of the " (:TERM NIL "class") " of an "
   (:TERM NIL "object") " is called its " (:NEWTERM NIL "metaclass")
   ". For more information about " (:TERM NIL "metaclasses") ", see "
   (:SECREF NIL :META-OBJECTS) ". ")
  :PAR
  (:SECTION (:TITLE ("Types") :TAGS (:TYPES)) " " :PAR
   (:COMMENT NIL
    " At Barmar's suggestion, and by consensus of Quinquevirate, the type hierarchy"
    " diagrams, which were quite hard to maintain and anyway unnecessary, were removed."
    " The removed text is in"
    "   Stony-Brook.SCRC.Symbolics.COM:>ANSI-CL>spec>archive>source>type-hierarchy-diagrams.tex"
    " -kmp 10-Jun-91")
   :PAR
   (:SUBSECTION (:TITLE ("Data Type Definition")) "Information about "
    (:TERM NIL "type") " usage is located in the sections specified in "
    (:FIGREF NIL :TYPE-INFO-XREFS) ". " (:FIGREF NIL :OBJECT-SYSTEM-CLASSES)
    " lists some " (:TERM NIL "classes")
    " that are particularly relevant to the object system. "
    (:FIGREF NIL :STANDARDIZED-CONDITION-TYPES) " lists the defined "
    (:TERM NIL "condition") " " (:TERM NIL "types") ". " :PAR " "
    (:TABLE
     (:NAME ("Cross-References to Data Type Information") :TAGS
      (:TYPE-INFO-XREFS))
     (:ROW NIL (:CELL NIL (:B NIL "Section")) (:CELL NIL " Data Type "))
     (:ROW (:RULE T :GAP 4) (:CELL NIL (:SECREF NIL :CLASSES))
      (:CELL NIL " Object System types "))
     (:ROW NIL (:CELL NIL (:SECREF NIL :SLOTS))
      (:CELL NIL " Object System types "))
     (:ROW NIL (:CELL NIL (:SECREF NIL :OBJECTS))
      (:CELL NIL " Object System types "))
     (:ROW NIL (:CELL NIL (:SECREF NIL :GFS-AND-METHODS))
      (:CELL NIL " Object System types "))
     (:ROW NIL (:CELL NIL (:SECREF NIL :CONDITION-SYSTEM-CONCEPTS))
      (:CELL NIL " Condition System types "))
     (:ROW NIL (:CELL NIL (:CHAPREF NIL :TYPES-AND-CLASSES))
      (:CELL NIL " Miscellaneous types "))
     (:ROW NIL (:CELL NIL (:CHAPREF NIL :SYNTAX))
      (:CELL NIL " All types—read and print syntax "))
     (:ROW NIL
      (:CELL NIL
       (:COMMENT NIL "Nothing really useful here. -kmp 17-Oct-91"
        "\\secref\\ReaderConcepts         & All types---read syntax            \\cr")
       (:SECREF NIL :THE-LISP-PRINTER))
      (:CELL NIL " All types—print syntax "))
     (:ROW NIL (:CELL NIL (:SECREF NIL :COMPILATION))
      (:CELL NIL " All types—compilation issues ")))
    " " :PAR
    (:COMMENT NIL "!!! Insert table of Type Specifiers like AND, OR, NOT... "
     "    from top of DICT-TYPES ? -kmp 17-Oct-91")
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Type Relationships") :TAGS (:TYPE-RELATIONSHIPS)) " "
    :PAR
    (:LIST NIL
     (:ITEM NIL " The " (:TERM NIL "types") " " (:TYPEREF NIL "cons") ", "
      (:TYPEREF NIL "symbol") ", " (:TYPEREF NIL "array") ", "
      (:TYPEREF NIL "number") ", " (:TYPEREF NIL "character") ", "
      (:TYPEREF NIL "hash-table") ", "
      (:ISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " (:TYPEREF NIL "function")
      ", " (:ENDISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " "
      (:TYPEREF NIL "readtable") ", " (:TYPEREF NIL "package") ", "
      (:TYPEREF NIL "pathname") ", " (:TYPEREF NIL "stream") ", "
      (:TYPEREF NIL "random-state") ", " (:TYPEREF NIL "condition") ", "
      (:TYPEREF NIL "restart") ", and any single other " (:TERM NIL "type")
      " created by " (:MACREF NIL "defstruct") ", "
      (:COMMENT NIL "Added per suggestion of Barrett:")
      (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
      (:ISSUE NIL "CLOS-CONDITIONS:INTEGRATE") " "
      (:MACREF NIL "define-condition") ", "
      (:ENDISSUE NIL "CLOS-CONDITIONS:INTEGRATE") " "
      (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " or "
      (:MACREF NIL "defclass") " are " (:TERM NIL "pairwise") " "
      (:TERM NIL "disjoint")
      ", except for type relations explicitly established by specifying "
      (:TERM NIL "superclasses") " in " (:MACREF NIL "defclass") " "
      (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
      (:ISSUE NIL "CLOS-CONDITIONS:INTEGRATE") " or "
      (:MACREF NIL "define-condition") " "
      (:ENDISSUE NIL "CLOS-CONDITIONS:INTEGRATE") " "
      (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND")
      " or the " (:KWD NIL "include") " option of " (:MACREF NIL "defstruct")
      ". " :PAR
      (:COMMENT NIL "The following will be left out of the standard."
       "% 2.15.0 6" "\\itemitem{\\bull} \\typeref{Cons}, \\typeref{symbol},"
       "\\typeref{array}, \\typeref{number}, and \\typeref{character}"
       "are \\term{pairwise} \\term{disjoint}.")
      (:ENDISSUE NIL "DATA-TYPES-HIERARCHY-UNDERSPECIFIED") " " :PAR
      (:ISSUE NIL "DATA-TYPES-HIERARCHY-UNDERSPECIFIED") " "
      (:COMMENT NIL "The following will be left out of the standard."
       "% 2.15.0 27"
       "\\itemitem{\\bull}  \\typeref{hash-table}, \\typeref{readtable}, "
       "\\typeref{package}, \\typeref{pathname},"
       "\\typeref{stream}, and \\typeref{random-state} are "
       "\\term{pairwise} \\term{disjoint}.")
      (:ENDISSUE NIL "DATA-TYPES-HIERARCHY-UNDERSPECIFIED") " " :PAR
      (:COMMENT NIL "% 2.15.0 28"))
     (:ITEM NIL " Any two " (:TERM NIL "types") " created by "
      (:MACREF NIL "defstruct") " are " (:TERM NIL "disjoint")
      " unless one is a " (:TERM NIL "supertype")
      " of the other by virtue of the " (:MACREF NIL "defstruct") " "
      (:KWD NIL "include") " option. " :PAR
      (:EDITORNOTE NIL
       "KMP: The comments in the source say gray suggested some change from “common superclass” to “common subclass” in the following, but the result looks suspicious to me.")
      " "
      (:COMMENT NIL
       "!!! Barrett says: It fits the glossary definition of disjoint, i.e., no common"
       " elements.  However, I think that is broken."
       " In places where we have specified disjointness requirements, all we really seem to"
       " be intendeing is that two types C1 and C2 are disjoint if neither is a subtype of"
       " the other.")
      :PAR)
     (:ITEM NIL " Any two " (:TERM NIL "distinct") " " (:TERM NIL "classes")
      " created by " (:MACREF NIL "defclass") " "
      (:COMMENT NIL " added --sjl 7 Mar 92") "or "
      (:MACREF NIL "define-condition") " are " (:TERM NIL "disjoint")
      " unless they have a common " (:TERM NIL "subclass") " or one "
      (:TERM NIL "class") " is a " (:TERM NIL "subclass") " of the other. "
      (:COMMENT NIL "% The preceding text by Moon replaces the following..."
       " %% \"common superclass\" changed to \"common subclass\" as suggested by Gray"
       " \\itemitem{\\bull} Any two \\term{classes} created by \\macref{defclass} "
       " are \\term{disjoint} unless they have a common \\term{subclass} or"
       " one \\term{class} is a \\term{superclass} of the other."
       " %Any two \\term{classes}"
       " %created by \\macref{defclass} are \\term{disjoint}"
       " %unless they have a common \\term{superclass}.\"  {That assumes that"
       " %our definition of superclass says every class is a superclass of"
       " %itself, which I think is the case, but did not check.}" " %"
       " %RPG suggestion follows:"
       " %\\itemitem{\\bull} Any type created by defstruct or defclass is guaranteed"
       " %to be disjoint from all other types unless subclass or :include is used.")
      :PAR (:ISSUE NIL "COMMON-TYPE:REMOVE") " "
      (:COMMENT NIL "The following will be deleted from the standard:"
       "% 2.15.0 29" "\\itemitem{\\bull} An \\term{exhaustive union} for "
       "\\thetype{common} is formed by \\typeref{cons}, \\typeref{symbol},"
       "\\f{(array x)} where \\f{x} is either \\typeref{t} or a \\term{subtype} of \\typeref{common},"
       "\\typeref{string}, \\typeref{fixnum}, \\typeref{bignum}, \\typeref{ratio},"
       "\\typeref{short-float}, \\typeref{single-float}, \\typeref{double-float}, \\typeref{long-float},"
       "\\f{(complex x)} where \\f{x} is a \\term{subtype} of \\typeref{common},"
       "\\typeref{standard-char}, \\typeref{hash-table}, \\typeref{readtable}, "
       "\\typeref{package}, \\typeref{pathname},"
       "\\typeref{stream}, \\typeref{random-state},"
       "and all \\term{types} created by the user via \\macref{defstruct}."
       "An implementation cannot add \\term{subtypes} to \\typeref{common}.")
      (:ENDISSUE NIL "COMMON-TYPE:REMOVE") " " :PAR
      (:COMMENT NIL
       "% Following is suggested by Moon, rewording of a clause in 88-002R."))
     (:ITEM NIL " An implementation may be extended to add other "
      (:TERM NIL "subtype") " relationships between the specified "
      (:TERM NIL "types")
      ", as long as they do not violate the type relationships and disjointness requirements specified here. An implementation may define additional "
      (:TERM NIL "types") " that are " (:TERM NIL "subtypes") " or "
      (:TERM NIL "supertypes") " of any specified " (:TERM NIL "types")
      ", as long as each additional " (:TERM NIL "type") " is a "
      (:TERM NIL "subtype") " of " (:TERM NIL "type") " " (:TYPEREF NIL "t")
      " and a " (:TERM NIL "supertype") " of " (:TERM NIL "type") " "
      (:TYPEREF NIL "nil")
      " and the disjointness requirements are not violated. " :PAR
      (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND")
      " At the discretion of the implementation, either "
      (:TYPEREF NIL "standard-object") " or " (:TYPEREF NIL "structure-object")
      " might appear in any class precedence list for a "
      (:TERM NIL "system class") " that does not already specify either "
      (:TYPEREF NIL "standard-object") " or " (:TYPEREF NIL "structure-object")
      ". If it does, it must precede the " (:TERM NIL "class") " "
      (:TYPEREF NIL "t") " and follow all other " (:TERM NIL "standardized")
      " " (:TERM NIL "classes") ". "
      (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
      :PAR))
    " " :PAR)
   :PAR (:COMMENT NIL "% Type Specifiers")
   (:SUBSECTION (:TITLE ("Type Specifiers") :TAGS (:TYPE-SPECIFIERS)) " " :PAR
    (:ISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
    (:COMMENT NIL
     "Discussion of difference between \"type specifiers for declaration\""
     "and \"type specifiers for discrimination\" removed.")
    (:ENDISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
    :PAR (:COMMENT NIL "% 4.1.0 1") (:TERM NIL "Type specifiers") " can be "
    (:TERM NIL "symbols") ", " (:TERM NIL "classes") ", or "
    (:TERM NIL "lists") ". " (:FIGREF NIL :STANDARDIZED-ATOMIC-TYPE-SPECS)
    " lists " (:TERM NIL "symbols") " that are " (:TERM NIL "standardized") " "
    (:TERM NIL "atomic type specifiers") ", and "
    (:FIGREF NIL :STANDARDIZED-COMPOUND-TYPE-SPEC-NAMES) " lists "
    (:TERM NIL "standardized") " " (:TERM NIL "compound type specifier") " "
    (:TERM NIL "names")
    ". For syntax information, see the dictionary entry for the corresponding "
    (:TERM NIL "type specifier") ". It is possible to define new "
    (:TERM NIL "type specifiers") " using " (:MACREF NIL "defclass") ", "
    (:MACREF NIL "define-condition") ", " (:MACREF NIL "defstruct") ", or "
    (:MACREF NIL "deftype") ". " :PAR
    (:ISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " "
    (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR " "
    (:COMMENT NIL "% 4.3.0 4")
    (:TABLE
     (:NAME ("Standardized Atomic Type Specifiers") :TAGS
      (:STANDARDIZED-ATOMIC-TYPE-SPECS))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " arithmetic-error"))
      (:CELL NIL (:TYPEREF NIL "function"))
      (:CELL NIL (:TYPEREF NIL "simple-condition")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " array"))
      (:CELL NIL (:TYPEREF NIL "generic-function"))
      (:CELL NIL (:TYPEREF NIL "simple-error")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " atom"))
      (:CELL NIL (:TYPEREF NIL "hash-table"))
      (:CELL NIL (:TYPEREF NIL "simple-string")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " base-char"))
      (:CELL NIL (:TYPEREF NIL "integer"))
      (:CELL NIL (:TYPEREF NIL "simple-type-error")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " base-string"))
      (:CELL NIL (:TYPEREF NIL "keyword"))
      (:CELL NIL (:TYPEREF NIL "simple-vector")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " bignum"))
      (:CELL NIL (:TYPEREF NIL "list"))
      (:CELL NIL (:TYPEREF NIL "simple-warning")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " bit"))
      (:CELL NIL (:TYPEREF NIL "logical-pathname"))
      (:CELL NIL (:TYPEREF NIL "single-float")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " bit-vector"))
      (:CELL NIL (:TYPEREF NIL "long-float"))
      (:CELL NIL (:TYPEREF NIL "standard-char")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " broadcast-stream"))
      (:CELL NIL (:TYPEREF NIL "method"))
      (:CELL NIL (:TYPEREF NIL "standard-class")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " built-in-class"))
      (:CELL NIL (:TYPEREF NIL "method-combination"))
      (:CELL NIL (:TYPEREF NIL "standard-generic-function")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " cell-error"))
      (:CELL NIL (:TYPEREF NIL "nil"))
      (:CELL NIL (:TYPEREF NIL "standard-method")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " character"))
      (:CELL NIL (:TYPEREF NIL "null"))
      (:CELL NIL (:TYPEREF NIL "standard-object")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " class"))
      (:CELL NIL (:TYPEREF NIL "number"))
      (:CELL NIL (:TYPEREF NIL "storage-condition")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " compiled-function"))
      (:CELL NIL (:TYPEREF NIL "package")) (:CELL NIL (:TYPEREF NIL "stream")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " complex"))
      (:CELL NIL (:TYPEREF NIL "package-error"))
      (:CELL NIL (:TYPEREF NIL "stream-error")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " concatenated-stream"))
      (:CELL NIL (:TYPEREF NIL "parse-error"))
      (:CELL NIL (:TYPEREF NIL "string")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " condition"))
      (:CELL NIL (:TYPEREF NIL "pathname"))
      (:CELL NIL (:TYPEREF NIL "string-stream")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " cons"))
      (:CELL NIL (:TYPEREF NIL "print-not-readable"))
      (:CELL NIL (:TYPEREF NIL "structure-class")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " control-error"))
      (:CELL NIL (:TYPEREF NIL "program-error"))
      (:CELL NIL (:TYPEREF NIL "structure-object")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " division-by-zero"))
      (:CELL NIL (:TYPEREF NIL "random-state"))
      (:CELL NIL (:TYPEREF NIL "style-warning")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " double-float"))
      (:CELL NIL (:TYPEREF NIL "ratio")) (:CELL NIL (:TYPEREF NIL "symbol")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " echo-stream"))
      (:CELL NIL (:TYPEREF NIL "rational"))
      (:CELL NIL (:TYPEREF NIL "synonym-stream")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " end-of-file"))
      (:CELL NIL (:TYPEREF NIL "reader-error")) (:CELL NIL (:TYPEREF NIL "t")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " error"))
      (:CELL NIL (:TYPEREF NIL "readtable"))
      (:CELL NIL (:TYPEREF NIL "two-way-stream")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " extended-char"))
      (:CELL NIL (:TYPEREF NIL "real"))
      (:CELL NIL (:TYPEREF NIL "type-error")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " file-error"))
      (:CELL NIL (:TYPEREF NIL "restart"))
      (:CELL NIL (:TYPEREF NIL "unbound-slot")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " file-stream"))
      (:CELL NIL (:TYPEREF NIL "sequence"))
      (:CELL NIL (:TYPEREF NIL "unbound-variable")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " fixnum"))
      (:CELL NIL (:TYPEREF NIL "serious-condition"))
      (:CELL NIL (:TYPEREF NIL "undefined-function")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " float"))
      (:CELL NIL (:TYPEREF NIL "short-float"))
      (:CELL NIL (:TYPEREF NIL "unsigned-byte")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " floating-point-inexact"))
      (:CELL NIL (:TYPEREF NIL "signed-byte"))
      (:CELL NIL (:TYPEREF NIL "vector")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " floating-point-invalid-operation"))
      (:CELL NIL (:TYPEREF NIL "simple-array"))
      (:CELL NIL (:TYPEREF NIL "warning")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " floating-point-overflow"))
      (:CELL NIL (:TYPEREF NIL "simple-base-string")) (:CELL NIL))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " floating-point-underflow"))
      (:CELL NIL (:TYPEREF NIL "simple-bit-vector")) (:CELL NIL)))
    " " :PAR (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " "
    (:ENDISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " " :PAR " "
    (:COMMENT NIL "% 4.2.0 1         ") "If a " (:TERM NIL "type specifier")
    " is a " (:TERM NIL "list") ", the " (:TERM NIL "car") " of the "
    (:TERM NIL "list") " is a " (:TERM NIL "symbol") ", and the rest of the "
    (:TERM NIL "list") " is subsidiary " (:TERM NIL "type")
    " information. Such a " (:TERM NIL "type specifier") " is called a "
    (:NEWTERM NIL "compound type specifier")
    ". Except as explicitly stated otherwise, the subsidiary items can be unspecified. The unspecified subsidiary items are indicated by writing "
    (:TT NIL "*") ". For example, to completely specify a "
    (:TERM NIL "vector") ", the " (:TERM NIL "type")
    " of the elements and the length of the " (:TERM NIL "vector")
    " must be present. " :PAR
    (:CODE NIL " (vector double-float 100)
")
    " The following leaves the length unspecified: " :PAR
    (:CODE NIL " (vector double-float *)
")
    " The following leaves the element type unspecified: " :PAR
    (:CODE NIL " (vector * 100)                                      
")
    " Suppose that two " (:TERM NIL "type specifiers")
    " are the same except that the first has a " (:TT NIL "*")
    " where the second has a more explicit specification. Then the second denotes a "
    (:TERM NIL "subtype") " of the " (:TERM NIL "type")
    " denoted by the first. " :PAR (:COMMENT NIL "% 4.2.0 2") "If a "
    (:TERM NIL "list")
    " has one or more unspecified items at the end, those items can be dropped. If dropping all occurrences of "
    (:TT NIL "*") " results in a " (:TERM NIL "singleton") " "
    (:TERM NIL "list")
    ", then the parentheses can be dropped as well (the list can be replaced by the "
    (:TERM NIL "symbol") " in its " (:TERM NIL "car") "). For example, "
    (:TT NIL " (vector double-float *)") " can be abbreviated to "
    (:TT NIL " (vector double-float)") ", and " (:TT NIL " (vector * *)")
    " can be abbreviated to " (:TT NIL " (vector)") " and then to "
    (:TT NIL " vector") ". " :PAR (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89")
    " "
    (:COMMENT NIL
     "Syntax info removed to make the document smaller and more modular. -kmp 20-Oct-91"
     "Added CONS per Dalton #10 (first public review). -kmp 10-May-93")
    " "
    (:TABLE
     (:NAME ("Standardized Compound Type Specifier Names") :TAGS
      (:STANDARDIZED-COMPOUND-TYPE-SPEC-NAMES))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " and"))
      (:CELL NIL (:TYPEREF NIL "long-float"))
      (:CELL NIL (:TYPEREF NIL "simple-base-string")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " array"))
      (:CELL NIL (:TYPEREF NIL "member"))
      (:CELL NIL (:TYPEREF NIL "simple-bit-vector")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " base-string"))
      (:CELL NIL (:TYPEREF NIL "mod"))
      (:CELL NIL (:TYPEREF NIL "simple-string")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " bit-vector"))
      (:CELL NIL (:TYPEREF NIL "not"))
      (:CELL NIL (:TYPEREF NIL "simple-vector")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " complex"))
      (:CELL NIL (:TYPEREF NIL "or"))
      (:CELL NIL (:TYPEREF NIL "single-float")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " cons"))
      (:CELL NIL (:TYPEREF NIL "rational"))
      (:CELL NIL (:TYPEREF NIL "string")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " double-float"))
      (:CELL NIL (:TYPEREF NIL "real"))
      (:CELL NIL (:TYPEREF NIL "unsigned-byte")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " eql"))
      (:CELL NIL (:TYPEREF NIL "satisfies"))
      (:CELL NIL (:TYPEREF NIL "values")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " float"))
      (:CELL NIL (:TYPEREF NIL "short-float"))
      (:CELL NIL (:TYPEREF NIL "vector")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " function"))
      (:CELL NIL (:TYPEREF NIL "signed-byte")) (:CELL NIL))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " integer"))
      (:CELL NIL (:TYPEREF NIL "simple-array")) (:CELL NIL)))
    " " (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " :PAR
    (:NEXTFIGURE (:CAPS T)) " show the " (:TERM NIL "defined names")
    " that can be used as " (:TERM NIL "compound type specifier") " "
    (:TERM NIL "names") " but that cannot be used as "
    (:TERM NIL "atomic type specifiers") ". " :PAR
    (:TABLE (:NAME ("Standardized Compound-Only Type Specifier Names"))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " and"))
      (:CELL NIL (:TYPEREF NIL "mod")) (:CELL NIL (:TYPEREF NIL "satisfies")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " eql"))
      (:CELL NIL (:TYPEREF NIL "not")) (:CELL NIL (:TYPEREF NIL "values")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " member"))
      (:CELL NIL (:TYPEREF NIL "or")) (:CELL NIL)))
    " " :PAR (:COMMENT NIL "% 4.7.0 1") "New " (:TERM NIL "type specifiers")
    " can come into existence in two ways. "
    (:LIST NIL
     (:ITEM NIL " Defining a structure by using " (:MACREF NIL "defstruct")
      " without using the " (:KWD NIL "type") " specifier or defining a "
      (:TERM NIL "class") " by using " (:MACREF NIL "defclass") " "
      (:COMMENT NIL " added --sjl 7 Mar 92") "or "
      (:MACREF NIL "define-condition")
      " automatically causes the name of the structure or class to be a new "
      (:TERM NIL "type specifier") " " (:TERM NIL "symbol") ". ")
     (:ITEM NIL " " (:MACREF NIL "deftype") " can be used to define "
      (:NEWTERM (:IDX "derived type specifier") "derived type specifiers")
      ", which act as `abbreviations' for other " (:TERM NIL "type specifiers")
      ". "))
    " " :PAR "A " (:TERM NIL "class") " " (:TERM NIL "object")
    " can be used as a " (:TERM NIL "type specifier")
    ". When used this way, it denotes the set of all members of that "
    (:TERM NIL "class") ". " :PAR (:NEXTFIGURE (:CAPS T)) " shows some "
    (:TERM NIL "defined names") " relating to " (:TERM NIL "types") " and "
    (:TERM NIL "declarations") ". " :PAR
    (:COMMENT NIL
     " I added SUBTYPEP, TYPEP, DEFINE-CONDITION.  --sjl 7 Mar 92")
    " "
    (:TABLE
     (:NAME ("Defined names relating to types and declarations.") :TAGS
      (:TYPES-AND-DECLS-NAMES))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " coerce"))
      (:CELL NIL (:FUNREF NIL "defstruct"))
      (:CELL NIL (:FUNREF NIL "subtypep")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " declaim"))
      (:CELL NIL (:FUNREF NIL "deftype")) (:CELL NIL (:FUNREF NIL "the")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " declare"))
      (:CELL NIL (:FUNREF NIL "ftype")) (:CELL NIL (:FUNREF NIL "type")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " defclass"))
      (:CELL NIL (:FUNREF NIL "locally")) (:CELL NIL (:FUNREF NIL "type-of")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " define-condition"))
      (:CELL NIL (:FUNREF NIL "proclaim")) (:CELL NIL (:FUNREF NIL "typep"))))
    " " :PAR (:NEXTFIGURE (:CAPS T)) " shows all " (:TERM NIL "defined names")
    " that are " (:TERM NIL "type specifier") " " (:TERM NIL "names")
    ", whether for " (:TERM NIL "atomic type specifiers") " or "
    (:TERM NIL "compound type specifiers")
    "; this list is the union of the lists in "
    (:FIGREF NIL :STANDARDIZED-ATOMIC-TYPE-SPECS) " and "
    (:FIGREF NIL :STANDARDIZED-COMPOUND-TYPE-SPEC-NAMES) ". " :PAR " "
    (:TABLE
     (:NAME ("Standardized Type Specifier Names") :TAGS
      (:STANDARDIZED-TYPE-SPECIFIER-NAMES))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " and"))
      (:CELL NIL (:TYPEREF NIL "function"))
      (:CELL NIL (:TYPEREF NIL "simple-array")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " arithmetic-error"))
      (:CELL NIL (:TYPEREF NIL "generic-function"))
      (:CELL NIL (:TYPEREF NIL "simple-base-string")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " array"))
      (:CELL NIL (:TYPEREF NIL "hash-table"))
      (:CELL NIL (:TYPEREF NIL "simple-bit-vector")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " atom"))
      (:CELL NIL (:TYPEREF NIL "integer"))
      (:CELL NIL (:TYPEREF NIL "simple-condition")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " base-char"))
      (:CELL NIL (:TYPEREF NIL "keyword"))
      (:CELL NIL (:TYPEREF NIL "simple-error")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " base-string"))
      (:CELL NIL (:TYPEREF NIL "list"))
      (:CELL NIL (:TYPEREF NIL "simple-string")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " bignum"))
      (:CELL NIL (:TYPEREF NIL "logical-pathname"))
      (:CELL NIL (:TYPEREF NIL "simple-type-error")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " bit"))
      (:CELL NIL (:TYPEREF NIL "long-float"))
      (:CELL NIL (:TYPEREF NIL "simple-vector")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " bit-vector"))
      (:CELL NIL (:TYPEREF NIL "member"))
      (:CELL NIL (:TYPEREF NIL "simple-warning")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " broadcast-stream"))
      (:CELL NIL (:TYPEREF NIL "method"))
      (:CELL NIL (:TYPEREF NIL "single-float")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " built-in-class"))
      (:CELL NIL (:TYPEREF NIL "method-combination"))
      (:CELL NIL (:TYPEREF NIL "standard-char")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " cell-error"))
      (:CELL NIL (:TYPEREF NIL "mod"))
      (:CELL NIL (:TYPEREF NIL "standard-class")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " character"))
      (:CELL NIL (:TYPEREF NIL "nil"))
      (:CELL NIL (:TYPEREF NIL "standard-generic-function")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " class"))
      (:CELL NIL (:TYPEREF NIL "not"))
      (:CELL NIL (:TYPEREF NIL "standard-method")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " compiled-function"))
      (:CELL NIL (:TYPEREF NIL "null"))
      (:CELL NIL (:TYPEREF NIL "standard-object")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " complex"))
      (:CELL NIL (:TYPEREF NIL "number"))
      (:CELL NIL (:TYPEREF NIL "storage-condition")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " concatenated-stream"))
      (:CELL NIL (:TYPEREF NIL "or")) (:CELL NIL (:TYPEREF NIL "stream")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " condition"))
      (:CELL NIL (:TYPEREF NIL "package"))
      (:CELL NIL (:TYPEREF NIL "stream-error")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " cons"))
      (:CELL NIL (:TYPEREF NIL "package-error"))
      (:CELL NIL (:TYPEREF NIL "string")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " control-error"))
      (:CELL NIL (:TYPEREF NIL "parse-error"))
      (:CELL NIL (:TYPEREF NIL "string-stream")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " division-by-zero"))
      (:CELL NIL (:TYPEREF NIL "pathname"))
      (:CELL NIL (:TYPEREF NIL "structure-class")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " double-float"))
      (:CELL NIL (:TYPEREF NIL "print-not-readable"))
      (:CELL NIL (:TYPEREF NIL "structure-object")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " echo-stream"))
      (:CELL NIL (:TYPEREF NIL "program-error"))
      (:CELL NIL (:TYPEREF NIL "style-warning")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " end-of-file"))
      (:CELL NIL (:TYPEREF NIL "random-state"))
      (:CELL NIL (:TYPEREF NIL "symbol")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " eql"))
      (:CELL NIL (:TYPEREF NIL "ratio"))
      (:CELL NIL (:TYPEREF NIL "synonym-stream")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " error"))
      (:CELL NIL (:TYPEREF NIL "rational")) (:CELL NIL (:TYPEREF NIL "t")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " extended-char"))
      (:CELL NIL (:TYPEREF NIL "reader-error"))
      (:CELL NIL (:TYPEREF NIL "two-way-stream")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " file-error"))
      (:CELL NIL (:TYPEREF NIL "readtable"))
      (:CELL NIL (:TYPEREF NIL "type-error")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " file-stream"))
      (:CELL NIL (:TYPEREF NIL "real"))
      (:CELL NIL (:TYPEREF NIL "unbound-slot")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " fixnum"))
      (:CELL NIL (:TYPEREF NIL "restart"))
      (:CELL NIL (:TYPEREF NIL "unbound-variable")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " float"))
      (:CELL NIL (:TYPEREF NIL "satisfies"))
      (:CELL NIL (:TYPEREF NIL "undefined-function")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " floating-point-inexact"))
      (:CELL NIL (:TYPEREF NIL "sequence"))
      (:CELL NIL (:TYPEREF NIL "unsigned-byte")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " floating-point-invalid-operation"))
      (:CELL NIL (:TYPEREF NIL "serious-condition"))
      (:CELL NIL (:TYPEREF NIL "values")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " floating-point-overflow"))
      (:CELL NIL (:TYPEREF NIL "short-float"))
      (:CELL NIL (:TYPEREF NIL "vector")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " floating-point-underflow"))
      (:CELL NIL (:TYPEREF NIL "signed-byte"))
      (:CELL NIL (:TYPEREF NIL "warning"))))
    " " :PAR)
   :PAR)
  :PAR
  (:SECTION (:TITLE ("Classes") :TAGS (:CLASSES)) " "
   (:COMMENT NIL "% Classes") :PAR
   "While the object system is general enough to describe all "
   (:TERM NIL "standardized") " " (:TERM NIL "classes")
   " (including, for example, " (:TYPEREF NIL "number") ", "
   (:TYPEREF NIL "hash-table") ", and " (:TYPEREF NIL "symbol") "), "
   (:NEXTFIGURE NIL) " contains a list of " (:TERM NIL "classes")
   " that are especially relevant to understanding the object system. " :PAR
   " "
   (:TABLE (:NAME ("Object System Classes") :TAGS (:OBJECT-SYSTEM-CLASSES))
    (:ROW NIL (:CELL NIL (:TYPEREF NIL " built-in-class"))
     (:CELL NIL (:TYPEREF NIL "method-combination"))
     (:CELL NIL (:TYPEREF NIL "standard-object")))
    (:ROW NIL (:CELL NIL (:TYPEREF NIL " class"))
     (:CELL NIL (:TYPEREF NIL "standard-class"))
     (:CELL NIL (:TYPEREF NIL "structure-class")))
    (:ROW NIL (:CELL NIL (:TYPEREF NIL " generic-function"))
     (:CELL NIL (:TYPEREF NIL "standard-generic-function"))
     (:CELL NIL (:TYPEREF NIL "structure-object")))
    (:ROW NIL (:CELL NIL (:TYPEREF NIL " method"))
     (:CELL NIL (:TYPEREF NIL "standard-method")) (:CELL NIL)))
   " " :PAR
   (:SUBSECTION (:TITLE ("Introduction to Classes")) "A "
    (:NEWTERM NIL "class") " is an " (:TERM NIL "object")
    " that determines the structure and behavior of a set of other "
    (:TERM NIL "objects") ", which are called its "
    (:NEWTERM (:IDX "instance") "instances") ". " :PAR "A " (:TERM NIL "class")
    " can inherit structure and behavior from other " (:TERM NIL "classes")
    ". A " (:TERM NIL "class") " whose definition refers to other "
    (:TERM NIL "classes")
    " for the purpose of inheriting from them is said to be a "
    (:TERM NIL "subclass") " of each of those " (:TERM NIL "classes") ". The "
    (:TERM NIL "classes")
    " that are designated for purposes of inheritance are said to be "
    (:TERM NIL "superclasses") " of the inheriting " (:TERM NIL "class") ". "
    :PAR "A " (:TERM NIL "class") " can have a " (:TERM NIL "name") ". The "
    (:TERM NIL "function") " " (:FUNREF NIL "class-name") " takes a "
    (:TERM NIL "class") " " (:TERM NIL "object") " and returns its "
    (:TERM NIL "name") ". The " (:TERM NIL "name") " of an anonymous "
    (:TERM NIL "class") " is " (:MISC NIL "nil") ". A " (:TERM NIL "symbol")
    " can " (:TERM NIL "name") " a " (:TERM NIL "class") ". The "
    (:TERM NIL "function") " " (:FUNREF NIL "find-class") " takes a "
    (:TERM NIL "symbol") " and returns the " (:TERM NIL "class") " that the "
    (:TERM NIL "symbol") " names. A " (:TERM NIL "class") " has a "
    (:TERM NIL "proper name") " if the " (:TERM NIL "name") " is a "
    (:TERM NIL "symbol") " and if the " (:TERM NIL "name") " of the "
    (:TERM NIL "class") " names that " (:TERM NIL "class") ". That is, a "
    (:TERM NIL "class") " " (:MATH NIL (:MI NIL "C")) " has the "
    (:TERM NIL "proper name") " " (:MATH NIL (:MI NIL "S")) " if "
    (:MATH NIL (:MI NIL "S") (:MO NIL "=")) " "
    (:TT NIL "(class-name " (:MATH NIL (:MI NIL "C")) ")") " and "
    (:MATH NIL (:MI NIL "C") (:MO NIL "=")) " "
    (:TT NIL "(find-class " (:MATH NIL (:MI NIL "S")) ")")
    ". Notice that it is possible for "
    (:TT NIL "(find-class " (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MN NIL "1")))
     ")")
    " " (:MATH NIL (:MO NIL "=")) " "
    (:TT NIL "(find-class " (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MN NIL "2")))
     ")")
    " and "
    (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MN NIL "1")) (:MO NIL "≠")
     (:MSUB NIL (:MI NIL "S") (:MN NIL "2")))
    ". If " (:MATH NIL (:MI NIL "C") (:MO NIL "=")) " "
    (:TT NIL "(find-class " (:MATH NIL (:MI NIL "S")) ")") ", we say that "
    (:MATH NIL (:MI NIL "C")) " is the " (:TERM NIL "class") " "
    (:TERM NIL "named") " " (:MATH NIL (:MI NIL "S")) ". " :PAR "A "
    (:TERM NIL "class") " " (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1")))
    " is a " (:NEWTERM NIL "direct superclass") " of a " (:TERM NIL "class")
    " " (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) " if "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2")))
    " explicitly designates "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) " as a "
    (:TERM NIL "superclass") " in its definition. In this case "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) " is a "
    (:NEWTERM NIL "direct subclass") " of "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) ". A "
    (:TERM NIL "class") " " (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "n")))
    " is a " (:NEWTERM NIL "superclass") " of a " (:TERM NIL "class") " "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1")))
    " if there exists a series of " (:TERM NIL "classes") " "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2")) (:MO NIL ",")
     (:MO NIL "…") (:MO NIL ",")
     (:MSUB NIL (:MI NIL "C")
      (:MROW NIL (:MI NIL "n") (:MO NIL "-") (:MN NIL "1"))))
    " such that "
    (:MATH NIL
     (:MSUB NIL (:MI NIL "C")
      (:MROW NIL (:MI NIL "i") (:MO NIL "+") (:MN NIL "1"))))
    " is a " (:TERM NIL "direct superclass") " of "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "i"))) " for "
    (:MATH NIL (:MN NIL "1") (:MO NIL "≤") (:MI NIL "i") (:MO NIL "<")
     (:MI NIL "n"))
    ". In this case, " (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1")))
    " is a " (:NEWTERM NIL "subclass") " of "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "n"))) ". A "
    (:TERM NIL "class") " is considered neither a " (:TERM NIL "superclass")
    " nor a " (:TERM NIL "subclass") " of itself. That is, if "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) " is a "
    (:TERM NIL "superclass") " of "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) ", then "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1")) (:MO NIL "≠")
     (:MSUB NIL (:MI NIL "C") (:MN NIL "2")))
    ". The set of " (:TERM NIL "classes") " consisting of some given "
    (:TERM NIL "class") " " (:MATH NIL (:MI NIL "C")) " along with all of its "
    (:TERM NIL "superclasses") " is called “" (:MATH NIL (:MI NIL "C"))
    " and its superclasses.” " :PAR "Each " (:TERM NIL "class") " has a "
    (:NEWTERM NIL "class precedence list")
    ", which is a total ordering on the set of the given " (:TERM NIL "class")
    " and its " (:TERM NIL "superclasses")
    ". The total ordering is expressed as a list ordered from most specific to least specific. The "
    (:TERM NIL "class precedence list")
    " is used in several ways. In general, more specific "
    (:TERM NIL "classes") " can " (:NEWTERM NIL "shadow") (:SUB NIL "1")
    " features that would otherwise be inherited from less specific "
    (:TERM NIL "classes") ". The " (:TERM NIL "method")
    " selection and combination process uses the "
    (:TERM NIL "class precedence list") " to order " (:TERM NIL "methods")
    " from most specific to least specific. " :PAR "When a "
    (:TERM NIL "class") " is defined, the order in which its direct "
    (:TERM NIL "superclasses")
    " are mentioned in the defining form is important. Each "
    (:TERM NIL "class") " has a " (:NEWTERM NIL "local precedence order")
    ", which is a " (:TERM NIL "list") " consisting of the "
    (:TERM NIL "class") " followed by its " (:TERM NIL "direct superclasses")
    " in the order mentioned in the defining " (:TERM NIL "form") ". " :PAR
    "A " (:TERM NIL "class precedence list") " is always consistent with the "
    (:TERM NIL "local precedence order") " of each " (:TERM NIL "class")
    " in the list. The " (:TERM NIL "classes") " in each "
    (:TERM NIL "local precedence order") " appear within the "
    (:TERM NIL "class precedence list") " in the same order. If the "
    (:TERM NIL "local precedence orders")
    " are inconsistent with each other, no "
    (:TERM NIL "class precedence list")
    " can be constructed, and an error is signaled. The "
    (:TERM NIL "class precedence list") " and its computation is discussed in "
    (:SECREF NIL :DETERMINING-THE-CPL) ". " :PAR (:TERM NIL "classes")
    " are organized into a directed acyclic graph. There are two distinguished "
    (:TERM NIL "classes") ", named " (:TYPEREF NIL "t") " and "
    (:TYPEREF NIL "standard-object") ". The " (:TERM NIL "class") " named "
    (:TYPEREF NIL "t") " has no " (:TERM NIL "superclasses") ". It is a "
    (:TERM NIL "superclass") " of every " (:TERM NIL "class")
    " except itself. The " (:TERM NIL "class") " named "
    (:TYPEREF NIL "standard-object") " is an " (:TERM NIL "instance")
    " of the " (:TERM NIL "class") " " (:TYPEREF NIL "standard-class")
    " and is a " (:TERM NIL "superclass") " of every " (:TERM NIL "class")
    " that is an " (:TERM NIL "instance") " of the " (:TERM NIL "class") " "
    (:TYPEREF NIL "standard-class") " except itself. " :PAR
    (:REVIEWER NIL
     "Barmar: This or something like it needs to be said in the introduction.")
    (:COMMENT NIL "!!!") "There is a mapping from the object system "
    (:TERM NIL "class") " space into the " (:TERM NIL "type")
    " space. Many of the standard " (:TERM NIL "types")
    " specified in this document have a corresponding " (:TERM NIL "class")
    " that has the same " (:TERM NIL "name") " as the " (:TERM NIL "type")
    ". Some " (:TERM NIL "types") " do not have a corresponding "
    (:TERM NIL "class") ". The integration of the " (:TERM NIL "type") " and "
    (:TERM NIL "class") " systems is discussed in "
    (:SECREF NIL :INTEGRATING-TYPES-AND-CLASSES) ". " :PAR
    (:TERM NIL "Classes") " are represented by " (:TERM NIL "objects")
    " that are themselves " (:TERM NIL "instances") " of "
    (:TERM NIL "classes") ". The " (:TERM NIL "class") " of the "
    (:TERM NIL "class") " of an " (:TERM NIL "object") " is termed the "
    (:NEWTERM NIL "metaclass") " of that " (:TERM NIL "object")
    ". When no misinterpretation is possible, the term "
    (:TERM NIL "metaclass") " is used to refer to a " (:TERM NIL "class")
    " that has " (:TERM NIL "instances") " that are themselves "
    (:TERM NIL "classes") ". The " (:TERM NIL "metaclass")
    " determines the form of inheritance used by the " (:TERM NIL "classes")
    " that are its " (:TERM NIL "instances") " and the representation of the "
    (:TERM NIL "instances") " of those " (:TERM NIL "classes")
    ". The object system provides a default " (:TERM NIL "metaclass") ", "
    (:TYPEREF NIL "standard-class") ", that is appropriate for most programs. "
    (:COMMENT NIL "The meta-object protocol provides"
     "mechanisms for defining and using new metaclasses.")
    :PAR "Except where otherwise specified, all " (:TERM NIL "classes")
    " mentioned in this standard are " (:TERM NIL "instances") " of the "
    (:TERM NIL "class") " " (:TYPEREF NIL "standard-class") ", all "
    (:TERM NIL "generic functions") " are " (:TERM NIL "instances") " of the "
    (:TERM NIL "class") " " (:TYPEREF NIL "standard-generic-function")
    ", and all " (:TERM NIL "methods") " are " (:TERM NIL "instances")
    " of the " (:TERM NIL "class") " " (:TYPEREF NIL "standard-method") ". "
    :PAR)
   (:COMMENT NIL "\\beginsubsubsection{Metaclasses}"
    "??? Is the following paragraph necessary in this specification???"
    "The \\newterm{metaclass} of an object is the class of its class.  The"
    "metaclass determines the representation of instances of its instances and"
    "the forms of inheritance used by its instances for slot descriptions and"
    "method inheritance.  The metaclass mechanism can be used to provide"
    "particular forms of optimization or to tailor the \\CLOS\\ for particular"
    "uses.  "
    "The protocol for defining metaclasses is discussed in the chapter"
    "``The \\CLOS\\ Meta-Object Protocol.''")
   :PAR (:COMMENT NIL "\\endsubsubsection%{Metaclasses}") :PAR
   (:SUBSUBSECTION (:TITLE ("Standard Metaclasses"))
    "The object system provides a number of predefined "
    (:TERM NIL "metaclasses") ". These include the " (:TERM NIL "classes") " "
    (:TYPEREF NIL "standard-class") ", " (:TYPEREF NIL "built-in-class")
    ", and " (:TYPEREF NIL "structure-class") ": " :PAR
    (:LIST NIL
     (:ITEM NIL " The " (:TERM NIL "class") " " (:TYPEREF NIL "standard-class")
      " is the default " (:TERM NIL "class") " of " (:TERM NIL "classes")
      " defined by " (:MACREF NIL "defclass") ". " :PAR)
     (:ITEM NIL " The " (:TERM NIL "class") " " (:TYPEREF NIL "built-in-class")
      " is the " (:TERM NIL "class") " whose " (:TERM NIL "instances") " are "
      (:TERM NIL "classes")
      " that have special implementations with restricted capabilities. Any "
      (:TERM NIL "class") " that corresponds to a standard " (:TERM NIL "type")
      " might be an " (:TERM NIL "instance") " of "
      (:TYPEREF NIL "built-in-class") ". The predefined " (:TERM NIL "type")
      " specifiers that are required to have corresponding "
      (:TERM NIL "classes") " are listed in "
      (:FIGREF NIL :CLASS-TYPE-CORRESPONDENCE) ". It is "
      (:TERM NIL "implementation-dependent") " whether each of these "
      (:TERM NIL "classes") " is implemented as a "
      (:TERM NIL "built-in class") ". " :PAR)
     (:ITEM NIL " All " (:TERM NIL "classes") " defined by means of "
      (:MACREF NIL "defstruct") " are " (:TERM NIL "instances") " of the "
      (:TERM NIL "class") " " (:TYPEREF NIL "structure-class") ". "))
    " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Defining Classes")) "The macro "
    (:MACREF NIL "defclass") " is used to define a new named "
    (:TERM NIL "class") ". "
    (:COMMENT NIL "The syntax for \\macref{defclass} is given in Figure ??")
    :PAR "The definition of a " (:TERM NIL "class") " includes: " :PAR
    (:LIST NIL
     (:ITEM NIL " The " (:TERM NIL "name") " of the new " (:TERM NIL "class")
      ". For newly-defined " (:TERM NIL "classes") " this " (:TERM NIL "name")
      " is a " (:TERM NIL "proper name") ". " :PAR)
     (:ITEM NIL " The list of the direct " (:TERM NIL "superclasses")
      " of the new " (:TERM NIL "class") ". " :PAR)
     (:ITEM NIL " A set of "
      (:NEWTERM (:IDX "slot specifier") "slot specifiers") ". Each "
      (:TERM NIL "slot specifier") " includes the " (:TERM NIL "name")
      " of the " (:TERM NIL "slot") " and zero or more " (:TERM NIL "slot")
      " options. A " (:TERM NIL "slot") " option pertains only to a single "
      (:TERM NIL "slot") ". If a " (:TERM NIL "class")
      " definition contains two " (:TERM NIL "slot specifiers")
      " with the same " (:TERM NIL "name") ", an error is signaled. " :PAR)
     (:ITEM NIL " A set of " (:TERM NIL "class") " options. Each "
      (:TERM NIL "class") " option pertains to the " (:TERM NIL "class")
      " as a whole. " :PAR))
    " " :PAR "The " (:TERM NIL "slot") " options and " (:TERM NIL "class")
    " options of the " (:MACREF NIL "defclass")
    " form provide mechanisms for the following: " :PAR
    (:LIST NIL
     (:ITEM NIL " Supplying a default initial value " (:TERM NIL "form")
      " for a given " (:TERM NIL "slot") ". " :PAR)
     (:ITEM NIL " Requesting that " (:TERM NIL "methods") " for "
      (:TERM NIL "generic functions")
      " be automatically generated for reading or writing " (:TERM NIL "slots")
      ". " :PAR)
     (:ITEM NIL " Controlling whether a given " (:TERM NIL "slot")
      " is shared by all " (:TERM NIL "instances") " of the "
      (:TERM NIL "class") " or whether each " (:TERM NIL "instance") " of the "
      (:TERM NIL "class") " has its own " (:TERM NIL "slot") ". " :PAR)
     (:ITEM NIL
      " Supplying a set of initialization arguments and initialization argument defaults to be used in "
      (:TERM NIL "instance") " creation. " :PAR
      (:COMMENT NIL
       "\\itemitem{\\bull} Requesting that a constructor function be automatically"
       "generated for making instances of the new class.")
      :PAR)
     (:ITEM NIL " Indicating that the " (:TERM NIL "metaclass")
      " is to be other than the default. The " (:KWD NIL "metaclass")
      " option is reserved for future use; an implementation can be extended to make use of the "
      (:KWD NIL "metaclass") " option. " :PAR)
     (:ITEM NIL " Indicating the expected " (:TERM NIL "type")
      " for the value stored in the " (:TERM NIL "slot") ". " :PAR)
     (:ITEM NIL " Indicating the " (:TERM NIL "documentation string")
      " for the " (:TERM NIL "slot") ". " :PAR))
    " " :PAR)
   :PAR " " :PAR
   (:SUBSECTION (:TITLE ("Creating Instances of Classes"))
    "The generic function " (:FUNREF NIL "make-instance")
    " creates and returns a new " (:TERM NIL "instance") " of a "
    (:TERM NIL "class")
    ". The object system provides several mechanisms for specifying how a new "
    (:TERM NIL "instance")
    " is to be initialized. For example, it is possible to specify the initial values for "
    (:TERM NIL "slots") " in newly created " (:TERM NIL "instances")
    " either by giving arguments to " (:FUNREF NIL "make-instance")
    " or by providing default initial values. Further initialization activities can be performed by "
    (:TERM NIL "methods") " written for " (:TERM NIL "generic functions")
    " that are part of the initialization protocol. The complete initialization protocol is described in "
    (:SECREF NIL :OBJECT-CREATION-AND-INIT) ". " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Inheritance") :TAGS (:INHERITANCE)) " " :PAR "A "
    (:TERM NIL "class") " can inherit " (:TERM NIL "methods") ", "
    (:TERM NIL "slots") ", and some " (:MACREF NIL "defclass")
    " options from its " (:TERM NIL "superclasses")
    ". Other sections describe the inheritance of " (:TERM NIL "methods")
    ", the inheritance of " (:TERM NIL "slots") " and " (:TERM NIL "slot")
    " options, and the inheritance of " (:TERM NIL "class") " options. " :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of Inheritance"))
     (:CODE NIL " (defclass C1 () 
     ((S1 :initform 5.4 :type number) 
      (S2 :allocation :class)))
 
 (defclass C2 (C1) 
     ((S1 :initform 5 :type integer)
      (S2 :allocation :instance)
      (S3 :accessor C2-S3)))
")
     " " :PAR (:TERM NIL "Instances") " of the class " (:TT NIL "C1")
     " have a " (:TERM NIL "local slot") " named " (:TT NIL "S1")
     ", whose default initial value is 5.4 and whose " (:TERM NIL "value")
     " should always be a " (:TERM NIL "number") ". The class " (:TT NIL "C1")
     " also has a " (:TERM NIL "shared slot") " named " (:TT NIL "S2") ". "
     :PAR "There is a " (:TERM NIL "local slot") " named " (:TT NIL "S1")
     " in " (:TERM NIL "instances") " of " (:TT NIL "C2")
     ". The default initial value of " (:TT NIL "S1") " is 5. The value of "
     (:TT NIL "S1") " should always be of type "
     (:TT NIL "(and integer number)") ". There are also "
     (:TERM NIL "local slots") " named " (:TT NIL "S2") " and " (:TT NIL "S3")
     " in " (:TERM NIL "instances") " of " (:TT NIL "C2") ". The class "
     (:TT NIL "C2") " has a " (:TERM NIL "method") " for " (:TT NIL "C2-S3")
     " for reading the value of slot " (:TT NIL "S3") "; there is also a "
     (:TERM NIL "method") " for " (:TT NIL "(setf C2-S3)")
     " that writes the value of " (:TT NIL "S3") ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Inheritance of Class Options")) "The "
     (:KWD NIL "default-initargs")
     " class option is inherited. The set of defaulted initialization arguments for a "
     (:TERM NIL "class")
     " is the union of the sets of initialization arguments supplied in the "
     (:KWD NIL "default-initargs") " class options of the " (:TERM NIL "class")
     " and its " (:TERM NIL "superclasses")
     ". When more than one default initial value " (:TERM NIL "form")
     " is supplied for a given initialization argument, the default initial value "
     (:TERM NIL "form") " that is used is the one supplied by the "
     (:TERM NIL "class") " that is most specific according to the "
     (:TERM NIL "class precedence list") ". " :PAR "If a given "
     (:KWD NIL "default-initargs")
     " class option specifies an initialization argument of the same "
     (:TERM NIL "name") " more than once, an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "program-error") " is signaled. " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Determining the Class Precedence List") :TAGS
     (:DETERMINING-THE-CPL))
    " " :PAR "The " (:MACREF NIL "defclass") " form for a " (:TERM NIL "class")
    " provides a total ordering on that " (:TERM NIL "class")
    " and its direct " (:TERM NIL "superclasses")
    ". This ordering is called the " (:NEWTERM NIL "local precedence order")
    ". It is an ordered list of the " (:TERM NIL "class") " and its direct "
    (:TERM NIL "superclasses") ". The " (:NEWTERM NIL "class precedence list")
    " for a class " (:MATH NIL (:MI NIL "C")) " is a total ordering on "
    (:MATH NIL (:MI NIL "C")) " and its " (:TERM NIL "superclasses")
    " that is consistent with the " (:TERM NIL "local precedence orders")
    " for each of " (:MATH NIL (:MI NIL "C")) " and its "
    (:TERM NIL "superclasses") ". " :PAR "A " (:TERM NIL "class")
    " precedes its direct " (:TERM NIL "superclasses") ", and a direct "
    (:TERM NIL "superclass") " precedes all other direct "
    (:TERM NIL "superclasses") " specified to its right in the "
    (:TERM NIL "superclasses") " list of the " (:MACREF NIL "defclass")
    " form. For every class " (:MATH NIL (:MI NIL "C")) ", define "
    (:DISPLAYMATH NIL (:MSUB NIL (:MI NIL "R") (:MI NIL "C")) (:MO NIL "=")
     (:MO NIL "{") (:MO NIL "(") (:MI NIL "C") (:MO NIL ",")
     (:MSUB NIL (:MI NIL "C") (:MN NIL "1")) (:MO NIL ")") (:MO NIL ",")
     (:MO NIL "(") (:MSUB NIL (:MI NIL "C") (:MN NIL "1")) (:MO NIL ",")
     (:MSUB NIL (:MI NIL "C") (:MN NIL "2")) (:MO NIL ")") (:MO NIL ",")
     (:MO NIL "…") (:MO NIL ",") (:MO NIL "(")
     (:MSUB NIL (:MI NIL "C")
      (:MROW NIL (:MI NIL "n") (:MO NIL "-") (:MN NIL "1")))
     (:MO NIL ",") (:MSUB NIL (:MI NIL "C") (:MI NIL "n")) (:MO NIL ")")
     (:MO NIL "}"))
    " where "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1")) (:MO NIL ",")
     (:MO NIL "…") (:MO NIL ",") (:MSUB NIL (:MI NIL "C") (:MI NIL "n")))
    " are the direct " (:TERM NIL "superclasses") " of "
    (:MATH NIL (:MI NIL "C"))
    " in the order in which they are mentioned in the "
    (:MACREF NIL "defclass")
    " form. These ordered pairs generate the total ordering on the class "
    (:MATH NIL (:MI NIL "C")) " and its direct " (:TERM NIL "superclasses")
    ". " :PAR "Let " (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MI NIL "C")))
    " be the set of " (:MATH NIL (:MI NIL "C")) " and its "
    (:TERM NIL "superclasses") ". Let " (:MATH NIL (:MI NIL "R")) " be "
    (:DISPLAYMATH NIL (:MI NIL "R") (:MO NIL "=")
     (:MSUB NIL (:MO NIL "∪")
      (:MROW NIL (:MI NIL "c") (:MO NIL "∈")
       (:MSUB NIL (:MI NIL "S") (:MI NIL "C"))))
     (:MSUB NIL (:MI NIL "R") (:MI NIL "c")))
    ". " :PAR
    (:REVIEWER NIL
     "Barmar: “Consistent” needs to be defined, or maybe we should say “logically consistent”?")
    (:COMMENT NIL "!!!") :PAR "The set " (:MATH NIL (:MI NIL "R"))
    " might or might not generate a partial ordering, depending on whether the "
    (:MATH NIL (:MSUB NIL (:MI NIL "R") (:MI NIL "c"))) ", "
    (:MATH NIL (:MI NIL "c") (:MO NIL "∈")
     (:MSUB NIL (:MI NIL "S") (:MI NIL "C")))
    ", are consistent; it is assumed that they are consistent and that "
    (:MATH NIL (:MI NIL "R")) " generates a partial ordering. When the "
    (:MATH NIL (:MSUB NIL (:MI NIL "R") (:MI NIL "c")))
    " are not consistent, it is said that " (:MATH NIL (:MI NIL "R"))
    " is inconsistent. " :PAR
    (:COMMENT NIL
     "This partial ordering is generated by taking the the transitive"
     "closure of the set $R\\cup \\{(c,c) \\vert c\\in {S\\sub C}\\}$.  When"
     "$(C\\sub 1,C\\sub 2)\\in R$\\negthinspace, it is said that $C\\sub 1$ "
     "or equals $C\\sub 2$ when $C\\sub 1=C\\sub 2$ or $C\\sub 2$ is a"
     "superclass of $C\\sub 1$.  "
     "Recall that a partial ordering of the set $S$ is a relation between "
     "objects of $S$ that is transitive, reflexive, and antisymmetric. The "
     "set $\\{(c,c) \\vert c\\in {S\\subC}\\}$ was added to the transitive "
     "closure of the set $R$ in order to make the relation reflexive.  In "
     "the remainder of this section the set of precedence relations $R$ and "
     "not the partial ordering will be used.")
    :PAR "To compute the " (:TERM NIL "class precedence list") " for "
    (:MATH NIL (:MI NIL "C")) ", topologically sort the elements of "
    (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MI NIL "C")))
    " with respect to the partial ordering generated by "
    (:MATH NIL (:MI NIL "R")) ". When the topological sort must select a "
    (:TERM NIL "class") " from a set of two or more " (:TERM NIL "classes")
    ", none of which are preceded by other " (:TERM NIL "classes")
    " with respect to " (:MATH NIL (:MI NIL "R")) ", the " (:TERM NIL "class")
    " selected is chosen deterministically, as described below. " :PAR "If "
    (:MATH NIL (:MI NIL "R")) " is inconsistent, an error is signaled. " :PAR
    " " :PAR
    (:SUBSUBSECTION (:TITLE ("Topological Sorting"))
     "Topological sorting proceeds by finding a class "
     (:MATH NIL (:MI NIL "C")) " in "
     (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MI NIL "C"))) " such that no other "
     (:TERM NIL "class") " precedes that element according to the elements in "
     (:MATH NIL (:MI NIL "R")) ". The class " (:MATH NIL (:MI NIL "C"))
     " is placed first in the result. Remove " (:MATH NIL (:MI NIL "C"))
     " from " (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MI NIL "C")))
     ", and remove all pairs of the form "
     (:MATH NIL (:MO NIL "(") (:MI NIL "C") (:MO NIL ",") (:MI NIL "D")
      (:MO NIL ")"))
     ", "
     (:MATH NIL (:MI NIL "D") (:MO NIL "∈")
      (:MSUB NIL (:MI NIL "S") (:MI NIL "C")))
     ", from " (:MATH NIL (:MI NIL "R")) ". Repeat the process, adding "
     (:TERM NIL "classes")
     " with no predecessors to the end of the result. Stop when no element can be found that has no predecessor. "
     :PAR "If " (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MI NIL "C")))
     " is not empty and the process has stopped, the set "
     (:MATH NIL (:MI NIL "R")) " is inconsistent. If every "
     (:TERM NIL "class") " in the finite set of " (:TERM NIL "classes")
     " is preceded by another, then " (:MATH NIL (:MI NIL "R"))
     " contains a loop. That is, there is a chain of classes "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1")) (:MO NIL ",")
      (:MO NIL "…") (:MO NIL ",") (:MSUB NIL (:MI NIL "C") (:MI NIL "n")))
     " such that " (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "i")))
     " precedes "
     (:MATH NIL
      (:MSUB NIL (:MI NIL "C")
       (:MROW NIL (:MI NIL "i") (:MO NIL "+") (:MN NIL "1"))))
     ", "
     (:MATH NIL (:MN NIL "1") (:MO NIL "≤") (:MI NIL "i") (:MO NIL "<")
      (:MI NIL "n"))
     ", and " (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "n"))) " precedes "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) ". " :PAR
     "Sometimes there are several " (:TERM NIL "classes") " from "
     (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MI NIL "C")))
     " with no predecessors. In this case select the one that has a direct "
     (:TERM NIL "subclass") " rightmost in the "
     (:TERM NIL "class precedence list") " computed so far. "
     (:COMMENT NIL
      "Because a direct superclass precedes all other direct superclasses to"
      "its right, there can be only one such candidate class. "
      "%Barmar thinks the next sentence is redundant with previous paragraph,"
      "but I think it's useful for emphasis. I put it in parens to deemphasize it. -kmp 11-Oct-90")
     "(If there is no such candidate " (:TERM NIL "class") ", "
     (:MATH NIL (:MI NIL "R")) " does not generate a partial ordering—the "
     (:MATH NIL (:MSUB NIL (:MI NIL "R") (:MI NIL "c"))) ", "
     (:MATH NIL (:MI NIL "c") (:MO NIL "∈")
      (:MSUB NIL (:MI NIL "S") (:MI NIL "C")))
     ", are inconsistent.) " :PAR "In more precise terms, let "
     (:MATH NIL (:MO NIL "{") (:MSUB NIL (:MI NIL "N") (:MN NIL "1"))
      (:MO NIL ",") (:MO NIL "…") (:MO NIL ",")
      (:MSUB NIL (:MI NIL "N") (:MI NIL "m")) (:MO NIL "}"))
     ", " (:MATH NIL (:MI NIL "m") (:MO NIL "≥") (:MN NIL "2")) ", be the "
     (:TERM NIL "classes") " from "
     (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MI NIL "C")))
     " with no predecessors. Let "
     (:MATH NIL (:MO NIL "(") (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))
      (:MO NIL "…") (:MSUB NIL (:MI NIL "C") (:MI NIL "n")) (:MO NIL ")"))
     ", " (:MATH NIL (:MI NIL "n") (:MO NIL "≥") (:MN NIL "1")) ", be the "
     (:TERM NIL "class precedence list") " constructed so far. "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1")))
     " is the most specific " (:TERM NIL "class") ", and "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "n")))
     " is the least specific. Let "
     (:MATH NIL (:MN NIL "1") (:MO NIL "≤") (:MI NIL "j") (:MO NIL "≤")
      (:MI NIL "n"))
     " be the largest number such that there exists an "
     (:MATH NIL (:MI NIL "i")) " where "
     (:MATH NIL (:MN NIL "1") (:MO NIL "≤") (:MI NIL "i") (:MO NIL "≤")
      (:MI NIL "m"))
     " and " (:MATH NIL (:MSUB NIL (:MI NIL "N") (:MI NIL "i")))
     " is a direct " (:TERM NIL "superclass") " of "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "j"))) "; "
     (:MATH NIL (:MSUB NIL (:MI NIL "N") (:MI NIL "i"))) " is placed next. "
     :PAR
     (:COMMENT NIL
      " The effect of this rule for selecting from a set of \\term{classes} with no"
      " predecessors is that the \\term{classes} in a simple \\term{superclass} chain are"
      " adjacent in the \\term{class precedence list} and that \\term{classes} in each"
      " relatively separated subgraph are adjacent in the \\term{class precedence list}."
      " For example, let $T\\sub 1$ and $T\\sub 2$ be subgraphs"
      " whose only element in common is the class $J$\\negthinspace. Suppose"
      " that no \\term{superclass} of $J$ appears in either $T\\sub 1$ or $T\\sub 2$."
      " Let $C\\sub 1$ be the bottom of $T\\sub 1$; and let $C\\sub 2$ be the"
      " bottom of $T\\sub 2$.  Suppose $C$ is a \\term{class} whose direct \\term{superclasses}"
      " are $C\\sub 1$ and $C\\sub 2$ in that order, then the "
      " \\term{class precedence list}"
      " for $C$ will start with $C$ and will be followed by all \\term{classes}"
      " in $T\\sub 1$ except $J$. All the \\term{classes} of $T\\sub 2$ will be next."
      " The class $J$ and its \\term{superclasses} will appear last."
      "% Replaced as follows per RPG. -kmp 13-Jan-92")
     :PAR "The effect of this rule for selecting from a set of "
     (:TERM NIL "classes") " with no predecessors is that the "
     (:TERM NIL "classes") " in a simple " (:TERM NIL "superclass")
     " chain are adjacent in the " (:TERM NIL "class precedence list")
     " and that " (:TERM NIL "classes")
     " in each relatively separated subgraph are adjacent in the "
     (:TERM NIL "class precedence list") ". For example, let "
     (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "1"))) " and "
     (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "2")))
     " be subgraphs whose only element in common is the class "
     (:MATH NIL (:MI NIL "J")) ". "
     (:COMMENT NIL " Suppose that no \\term{superclass} of $J$ appears in "
      " either $T\\sub 1$ or $T\\sub 2$ and that $J$ "
      " is an indirect superclass of every class in both $T\\sub 1$ and $T\\sub 2$."
      "% Rewritten by RPG to avoid use of \"indirect superclass\". -kmp 13-Jan-92")
     "Suppose that no superclass of " (:MATH NIL (:MI NIL "J"))
     " appears in either " (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "1")))
     " or " (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "2"))) ", and that "
     (:MATH NIL (:MI NIL "J"))
     " is in the superclass chain of every class in both "
     (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "1"))) " and "
     (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "2"))) ". Let "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) " be the bottom of "
     (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "1"))) "; and let "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) " be the bottom of "
     (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "2"))) ". Suppose "
     (:MATH NIL (:MI NIL "C")) " is a " (:TERM NIL "class") " whose direct "
     (:TERM NIL "superclasses") " are "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) " and "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2")))
     " in that order, then the " (:TERM NIL "class precedence list") " for "
     (:MATH NIL (:MI NIL "C")) " starts with " (:MATH NIL (:MI NIL "C"))
     " and is followed by all " (:TERM NIL "classes") " in "
     (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "1"))) " except "
     (:MATH NIL (:MI NIL "J")) ". All the " (:TERM NIL "classes") " of "
     (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "2"))) " are next. The "
     (:TERM NIL "class") " " (:MATH NIL (:MI NIL "J")) " and its "
     (:TERM NIL "superclasses") " appear last. " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Examples of Class Precedence List Determination"))
     "This example determines a " (:TERM NIL "class precedence list")
     " for the class " (:TT NIL "pie") ". The following " (:TERM NIL "classes")
     " are defined: " :PAR
     (:CODE NIL " (defclass pie (apple cinnamon) ())
 
 (defclass apple (fruit) ())
 
 (defclass cinnamon (spice) ())
 
 (defclass fruit (food) ())

 (defclass spice (food) ())

 (defclass food () ())
")
     " " :PAR (:COMMENT NIL " $S$ => \"$S\\sub{pie}$ per Barmar and Laubsch.")
     "The set " (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MI NIL "pie"))) " "
     (:MATH NIL (:MO NIL "=")) " " (:MATH NIL (:MO NIL "{"))
     (:TT NIL " pie, apple, cinnamon, fruit, spice, food, standard-object, t")
     (:MATH NIL (:MO NIL "}")) ". The set " (:MATH NIL (:MI NIL "R")) " "
     (:MATH NIL (:MO NIL "=")) " " (:MATH NIL (:MO NIL "{"))
     (:TT NIL
      " (pie, apple), (apple, cinnamon), (apple, fruit), (cinnamon, spice),  (fruit, food), (spice, food), (food, standard-object), (standard-object, t)")
     (:MATH NIL (:MO NIL "}")) ". " :PAR "The class " (:TT NIL "pie")
     " is not preceded by anything, so it comes first; the result so far is "
     (:TT NIL " (pie)") ". Remove " (:TT NIL "pie") " from "
     (:MATH NIL (:MI NIL "S")) " and pairs mentioning " (:TT NIL "pie")
     " from " (:MATH NIL (:MI NIL "R")) " to get " (:MATH NIL (:MI NIL "S"))
     " " (:MATH NIL (:MO NIL "=")) " " (:MATH NIL (:MO NIL "{"))
     (:TT NIL " apple, cinnamon, fruit, spice, food, standard-object, t")
     (:MATH NIL (:MO NIL "}")) " and " (:MATH NIL (:MI NIL "R")) " "
     (:MATH NIL (:MO NIL "=")) " " (:MATH NIL (:MO NIL "{"))
     (:TT NIL
      " (apple, cinnamon), (apple, fruit), (cinnamon, spice), (fruit, food), (spice, food), (food, standard-object), (standard-object, t)")
     (:MATH NIL (:MO NIL "}")) ". " :PAR "The class " (:TT NIL "apple")
     " is not preceded by anything, so it is next; the result is "
     (:TT NIL " (pie apple)") ". Removing " (:TT NIL "apple")
     " and the relevant pairs results in " (:MATH NIL (:MI NIL "S")) " "
     (:MATH NIL (:MO NIL "=")) " " (:MATH NIL (:MO NIL "{"))
     (:TT NIL " cinnamon, fruit, spice, food, standard-object, t")
     (:MATH NIL (:MO NIL "}")) " and " (:MATH NIL (:MI NIL "R")) " "
     (:MATH NIL (:MO NIL "=")) " " (:MATH NIL (:MO NIL "{"))
     (:TT NIL
      " (cinnamon, spice), (fruit, food), (spice, food), (food, standard-object), (standard-object, t)")
     (:MATH NIL (:MO NIL "}")) ". " :PAR "The classes " (:TT NIL "cinnamon")
     " and " (:TT NIL " fruit")
     " are not preceded by anything, so the one with a direct "
     (:TERM NIL "subclass") " rightmost in the "
     (:TERM NIL "class precedence list")
     " computed so far goes next. The class " (:TT NIL "apple") " is a direct "
     (:TERM NIL "subclass") " of " (:TT NIL " fruit") ", and the class "
     (:TT NIL "pie") " is a direct " (:TERM NIL "subclass") " of "
     (:TT NIL "cinnamon") ". Because " (:TT NIL "apple")
     " appears to the right of " (:TT NIL "pie") " in the "
     (:TERM NIL "class precedence list") ", " (:TT NIL " fruit")
     " goes next, and the result so far is " (:TT NIL " (pie apple fruit)")
     ". " (:MATH NIL (:MI NIL "S")) " " (:MATH NIL (:MO NIL "=")) " "
     (:MATH NIL (:MO NIL "{"))
     (:TT NIL " cinnamon, spice, food, standard-object, t")
     (:MATH NIL (:MO NIL "}")) "; " (:MATH NIL (:MI NIL "R")) " "
     (:MATH NIL (:MO NIL "=")) " " (:MATH NIL (:MO NIL "{"))
     (:TT NIL
      " (cinnamon, spice), (spice, food), (food, standard-object), (standard-object, t)")
     (:MATH NIL (:MO NIL "}")) ". " :PAR "The class " (:TT NIL "cinnamon")
     " is next, giving the result so far as "
     (:TT NIL " (pie apple fruit cinnamon)") ". At this point "
     (:MATH NIL (:MI NIL "S")) " " (:MATH NIL (:MO NIL "=")) " "
     (:MATH NIL (:MO NIL "{")) (:TT NIL " spice, food, standard-object, t")
     (:MATH NIL (:MO NIL "}")) "; " (:MATH NIL (:MI NIL "R")) " "
     (:MATH NIL (:MO NIL "=")) " " (:MATH NIL (:MO NIL "{"))
     (:TT NIL " (spice, food), (food, standard-object), (standard-object, t)")
     (:MATH NIL (:MO NIL "}")) ". " :PAR "The classes " (:TT NIL "spice") ", "
     (:TT NIL "food") ", " (:TYPEREF NIL "standard-object") ", and "
     (:TYPEREF NIL "t") " are added in that order, and the "
     (:TERM NIL "class precedence list") " is "
     (:TT NIL "(pie apple fruit cinnamon spice food standard-object t)") ". "
     :PAR "It is possible to write a set of " (:TERM NIL "class")
     " definitions that cannot be ordered. For example: " :PAR
     (:CODE NIL " (defclass new-class (fruit apple) ())
 
 (defclass apple (fruit) ())
")
     " " :PAR "The class " (:TT NIL "fruit") " must precede " (:TT NIL "apple")
     " because the local ordering of " (:TERM NIL "superclasses")
     " must be preserved. The class " (:TT NIL "apple") " must precede "
     (:TT NIL "fruit") " because a " (:TERM NIL "class")
     " always precedes its own " (:TERM NIL "superclasses")
     ". When this situation occurs, an error is signaled, as happens here when the system tries to compute the "
     (:TERM NIL "class precedence list") " "
     (:COMMENT NIL "Barmar suggested we add:") "of " (:TT NIL "new-class") ". "
     :PAR "The following might appear to be a conflicting set of definitions: "
     :PAR
     (:CODE NIL " (defclass pie (apple cinnamon) ())
 
 (defclass pastry (cinnamon apple) ())
 
 (defclass apple () ())
 
 (defclass cinnamon () ())
")
     " " :PAR "The " (:TERM NIL "class precedence list") " for "
     (:TT NIL "pie") " is " (:TT NIL "(pie apple cinnamon standard-object t)")
     ". " :PAR "The " (:TERM NIL "class precedence list") " for "
     (:TT NIL "pastry") " is "
     (:TT NIL "(pastry cinnamon apple standard-object t)") ". " :PAR
     "It is not a problem for " (:TT NIL "apple") " to precede "
     (:TT NIL "cinnamon") " in the ordering of the " (:TERM NIL "superclasses")
     " of " (:TT NIL "pie") " but not in the ordering for " (:TT NIL "pastry")
     ". However, it is not possible to build a new " (:TERM NIL "class")
     " that has both " (:TT NIL "pie") " and " (:TT NIL "pastry") " as "
     (:TERM NIL "superclasses") ". " :PAR)
    :PAR)
   (:SUBSECTION (:TITLE ("Redefining Classes") :TAGS (:CLASS-RE-DEF)) " " :PAR
    (:COMMENT NIL
     "\"instance\" => \"direct instance\" per Barrett,Barmar,Moon.")
    "A " (:TERM NIL "class") " that is a " (:TERM NIL "direct instance") " of "
    (:TYPEREF NIL "standard-class") " can be redefined if the new "
    (:TERM NIL "class") " is also "
    (:COMMENT NIL
     "\"instance\" => \"direct instance\" per Barrett,Barmar,Moon.")
    "a " (:TERM NIL "direct instance") " of " (:TYPEREF NIL "standard-class")
    ". Redefining a " (:TERM NIL "class") " modifies the existing "
    (:TERM NIL "class") " " (:TERM NIL "object") " to reflect the new "
    (:TERM NIL "class") " definition; it does not create a new "
    (:TERM NIL "class") " " (:TERM NIL "object") " for the "
    (:TERM NIL "class") ". Any " (:TERM NIL "method") " " (:TERM NIL "object")
    " created by a " (:KWD NIL "reader") ", " (:KWD NIL "writer") ", or "
    (:KWD NIL "accessor") " option specified by the old "
    (:MACREF NIL "defclass") " form is removed from the corresponding "
    (:TERM NIL "generic function") ". " (:TERM NIL "Methods")
    " specified by the new " (:MACREF NIL "defclass") " form are added. " :PAR
    (:COMMENT NIL
     " any function specified by the \\kwd{constructor} option of the"
     " old \\macref{defclass} form is removed from the corresponding symbol function cell.")
    :PAR "When the class " (:MATH NIL (:MI NIL "C"))
    " is redefined, changes are propagated to its " (:TERM NIL "instances")
    " and to " (:TERM NIL "instances") " of any of its "
    (:TERM NIL "subclasses") ". Updating such an " (:TERM NIL "instance")
    " occurs at an " (:TERM NIL "implementation-dependent")
    " time, but no later than the next time a " (:TERM NIL "slot") " of that "
    (:TERM NIL "instance") " is read or written. Updating an "
    (:TERM NIL "instance") " does not change its identity as defined by the "
    (:TERM NIL "function") " " (:FUNREF NIL "eq")
    ". The updating process may change the " (:TERM NIL "slots")
    " of that particular " (:TERM NIL "instance")
    ", but it does not create a new " (:TERM NIL "instance")
    ". Whether updating an " (:TERM NIL "instance") " consumes storage is "
    (:TERM NIL "implementation-dependent") ". " :PAR "Note that redefining a "
    (:TERM NIL "class") " may cause " (:TERM NIL "slots")
    " to be added or deleted. If a " (:TERM NIL "class")
    " is redefined in a way that changes the set of " (:TERM NIL "local slots")
    " " (:TERM NIL "accessible") " in " (:TERM NIL "instances") ", the "
    (:TERM NIL "instances") " are updated. It is "
    (:TERM NIL "implementation-dependent") " whether " (:TERM NIL "instances")
    " are updated if a " (:TERM NIL "class")
    " is redefined in a way that does not change the set of "
    (:TERM NIL "local slots") " " (:TERM NIL "accessible") " in "
    (:TERM NIL "instances") ". " :PAR "The value of a " (:TERM NIL "slot")
    " that is specified as shared both in the old " (:TERM NIL "class")
    " and in the new " (:TERM NIL "class") " is retained. If such a "
    (:TERM NIL "shared slot") " was unbound in the old " (:TERM NIL "class")
    ", it is unbound in the new " (:TERM NIL "class") ". " (:TERM NIL "Slots")
    " that were local in the old " (:TERM NIL "class")
    " and that are shared in the new " (:TERM NIL "class")
    " are initialized. Newly added " (:TERM NIL "shared slots")
    " are initialized. " :PAR "Each newly added " (:TERM NIL "shared slot")
    " is set to the result of evaluating the "
    (:COMMENT NIL "captured \\kwd{initform} form")
    (:TERM NIL "captured initialization form") " for the " (:TERM NIL "slot")
    " that was specified in the " (:MACREF NIL "defclass") " "
    (:TERM NIL "form") " for the new " (:TERM NIL "class") ". "
    (:COMMENT NIL "If there is no \\kwd{initform} form,") "If there was no "
    (:TERM NIL "initialization form") ", the " (:TERM NIL "slot")
    " is unbound. " :PAR "If a " (:TERM NIL "class")
    " is redefined in such a way that the set of " (:TERM NIL "local slots")
    " " (:TERM NIL "accessible") " in an " (:TERM NIL "instance") " of the "
    (:TERM NIL "class") " is changed, a two-step process of updating the "
    (:TERM NIL "instances") " of the " (:TERM NIL "class")
    " takes place. The process may be explicitly started by invoking the generic function "
    (:FUNREF NIL "make-instances-obsolete")
    ". This two-step process can happen in other circumstances in some implementations. For example, in some implementations this two-step process is triggered if the order of "
    (:TERM NIL "slots") " in storage is changed. " :PAR
    "The first step modifies the structure of the " (:TERM NIL "instance")
    " by adding new " (:TERM NIL "local slots") " and discarding "
    (:TERM NIL "local slots")
    " that are not defined in the new version of the " (:TERM NIL "class")
    ". The second step initializes the newly-added " (:TERM NIL "local slots")
    " and performs any other user-defined actions. These two steps are further specified in the next two sections. "
    :PAR
    (:SUBSUBSECTION (:TITLE ("Modifying the Structure of Instances"))
     (:REVIEWER NIL "Barmar: What about shared slots that are deleted?")
     (:COMMENT NIL "!!!") :PAR "The first step modifies the structure of "
     (:TERM NIL "instances") " of the redefined " (:TERM NIL "class")
     " to conform to its new " (:TERM NIL "class") " definition. "
     (:TERM NIL "Local slots") " specified by the new " (:TERM NIL "class")
     " definition that are not specified as either local or shared by the old "
     (:TERM NIL "class") " are added, and " (:TERM NIL "slots")
     " not specified as either local or shared by the new " (:TERM NIL "class")
     " definition that are specified as local by the old " (:TERM NIL "class")
     " are discarded. The " (:TERM NIL "names")
     " of these added and discarded " (:TERM NIL "slots")
     " are passed as arguments to "
     (:FUNREF NIL "update-instance-for-redefined-class")
     " as described in the next section. " :PAR "The values of "
     (:TERM NIL "local slots") " specified by both the new and old "
     (:TERM NIL "classes") " are retained. If such a " (:TERM NIL "local slot")
     " was unbound, it remains unbound. " :PAR "The value of a "
     (:TERM NIL "slot") " that is specified as shared in the old "
     (:TERM NIL "class") " and as local in the new " (:TERM NIL "class")
     " is retained. If such a " (:TERM NIL "shared slot") " was unbound, the "
     (:TERM NIL "local slot") " is unbound. " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Initializing Newly Added Local Slots"))
     "The second step initializes the newly added " (:TERM NIL "local slots")
     " and performs any other user-defined actions. This step is implemented by the generic function "
     (:FUNREF NIL "update-instance-for-redefined-class")
     ", which is called after completion of the first step of modifying the structure of the "
     (:TERM NIL "instance") ". " :PAR "The generic function "
     (:FUNREF NIL "update-instance-for-redefined-class")
     " takes four required arguments: the " (:TERM NIL "instance")
     " being updated after it has undergone the first step, a list of the names of "
     (:TERM NIL "local slots") " that were added, a list of the names of "
     (:TERM NIL "local slots")
     " that were discarded, and a property list containing the "
     (:TERM NIL "slot") " names and values of " (:TERM NIL "slots")
     " that were discarded and had values. Included among the discarded "
     (:TERM NIL "slots") " are " (:TERM NIL "slots")
     " that were local in the old " (:TERM NIL "class")
     " and that are shared in the new " (:TERM NIL "class") ". " :PAR
     "The generic function "
     (:FUNREF NIL "update-instance-for-redefined-class")
     " also takes any number of initialization arguments. When it is called by the system to update an "
     (:TERM NIL "instance") " whose " (:TERM NIL "class")
     " has been redefined, no initialization arguments are provided. " :PAR
     "There is a system-supplied primary " (:TERM NIL "method") " for "
     (:FUNREF NIL "update-instance-for-redefined-class") " whose "
     (:TERM NIL "parameter specializer") " for its " (:TERM NIL "instance")
     " argument is the " (:TERM NIL "class") " "
     (:TYPEREF NIL "standard-object") ". First this " (:TERM NIL "method")
     " checks the validity of initialization arguments and signals an error if an initialization argument is supplied that is not declared as valid. (For more information, see "
     (:SECREF NIL :DECLARING-INITARG-VALIDITY)
     ".) Then it calls the generic function " (:FUNREF NIL "shared-initialize")
     " with the following arguments: the " (:TERM NIL "instance")
     ", the list of " (:TERM NIL "names") " of the newly added "
     (:TERM NIL "slots") ", and the initialization arguments it received. "
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Customizing Class Redefinition"))
     (:REVIEWER NIL "Barmar: This description is hard to follow.")
     (:COMMENT NIL "!!!") :PAR (:TERM NIL "Methods") " for "
     (:FUNREF NIL "update-instance-for-redefined-class")
     " may be defined to specify actions to be taken when an "
     (:TERM NIL "instance") " is updated. If only " (:TERM NIL "after methods")
     " for " (:FUNREF NIL "update-instance-for-redefined-class")
     " are defined, they will be run after the system-supplied primary "
     (:TERM NIL "method")
     " for initialization and therefore will not interfere with the default behavior of "
     (:FUNREF NIL "update-instance-for-redefined-class")
     ". Because no initialization arguments are passed to "
     (:FUNREF NIL "update-instance-for-redefined-class")
     " when it is called by the system, the "
     (:COMMENT NIL "\\kwd{initform} forms ") (:TERM NIL "initialization forms")
     " for " (:TERM NIL "slots") " that are filled by "
     (:TERM NIL "before methods") " for "
     (:FUNREF NIL "update-instance-for-redefined-class")
     " will not be evaluated by " (:FUNREF NIL "shared-initialize") ". " :PAR
     (:TERM NIL "Methods") " for " (:FUNREF NIL "shared-initialize")
     " may be defined to customize " (:TERM NIL "class")
     " redefinition. For more information, see "
     (:SECREF NIL :SHARED-INITIALIZE) ". " :PAR)
    :PAR
    (:COMMENT NIL
     "% The following was removed by request of Symbolics, who point out that other "
     "% extensions may well be permitted too, and there's no reason to give special"
     "% advertising to these. -kmp 9-Oct-90"
     " \\beginsubsubsection{Extensions}" " "
     " There are two allowed extensions to \\term{class} redefinition: " " "
     " \\beginlist" " "
     " \\itemitem{\\bull} The \\OS\\ may be extended to permit the new \\term{class}"
     " to be an \\term{instance} of a \\term{metaclass} "
     " other than the \\term{metaclass} of the" " old \\term{class}." " "
     " \\itemitem{\\bull} The \\OS\\ may be extended to support an updating process"
     " when either the old or the new \\term{class} is an \\term{instance} of a"
     " \\term{class} "
     " other than \\typeref{standard-class} that is not a \\term{built-in class}."
     " " " \\endlist" " " " \\endsubsubsection%{Extensions}")
    :PAR)
   (:SUBSECTION
    (:TITLE ("Integrating Types and Classes") :TAGS
     (:INTEGRATING-TYPES-AND-CLASSES))
    " " :PAR "The object system maps the space of " (:TERM NIL "classes")
    " into the space of " (:TERM NIL "types") ". Every " (:TERM NIL "class")
    " that has a proper name has a corresponding " (:TERM NIL "type")
    " with the same " (:TERM NIL "name") ". " :PAR "The proper name of every "
    (:TERM NIL "class") " is a valid " (:TERM NIL "type specifier")
    ". In addition, every " (:TERM NIL "class") " " (:TERM NIL "object")
    " is a valid " (:TERM NIL "type specifier") ". Thus the expression "
    (:TT NIL "(typep " (:PARAM NIL "object") " " (:PARAM NIL "class") ")")
    " evaluates to " (:TERM NIL "true") " if the " (:TERM NIL "class") " of "
    (:PARAM NIL "object") " is " (:PARAM NIL "class") " itself or a "
    (:TERM NIL "subclass") " of " (:TERM NIL "class")
    ". The evaluation of the expression " (:TT NIL "(subtypep class1 class2)")
    " returns the values "
    (:COMMENT NIL
     "was {\\tt t~t} but came out as \"t~t\" in formatted form. -kmp 10-Oct-90"
     "\\t~\\t\\ if \\f{class1} is a subclass of \\f{class2} or if they are the")
    (:TERM NIL "true") " and " (:TERM NIL "true") " if " (:TT NIL "class1")
    " is a subclass of " (:TT NIL "class2") " or if they are the same "
    (:TERM NIL "class") "; otherwise it returns the values "
    (:COMMENT NIL "was {\\tt nil~t}" "\\nil~\\t.") (:TERM NIL "false") " and "
    (:TERM NIL "true") ". "
    (:COMMENT NIL " If $I$ is an \\term{instance} of some \\term{class}"
     " $C$ named $S$ and $C$ is an \\term{instance} of \\typeref{standard-class}, "
     " the evaluation of the expression \\f{(type-of $I$\\/)} will return $S$ if"
     " $S$ is the proper name of $C$\\negthinspace; if $S$ is not the proper"
     " name of $C$\\negthinspace, the expression \\f{(type-of $I$\\/)} will"
     " return $C$\\negthinspace."
     "% Barmar thought the above was too complicated."
     "% This is a partial simplification, not quite what he wanted, but hopefully"
     "% an improvement.")
    "If " (:MATH NIL (:MI NIL "I")) " is an " (:TERM NIL "instance")
    " of some " (:TERM NIL "class") " " (:MATH NIL (:MI NIL "C")) " named "
    (:MATH NIL (:MI NIL "S")) " and " (:MATH NIL (:MI NIL "C")) " is an "
    (:TERM NIL "instance") " of " (:TYPEREF NIL "standard-class")
    ", the evaluation of the expression "
    (:TT NIL "(type-of " (:MATH NIL (:MI NIL "I")) ")") " returns "
    (:MATH NIL (:MI NIL "S")) " if " (:MATH NIL (:MI NIL "S")) " is the "
    (:TERM NIL "proper name") " of " (:MATH NIL (:MI NIL "C"))
    "; otherwise, it returns " (:MATH NIL (:MI NIL "C")) ". " :PAR
    "Because the names of " (:TERM NIL "classes") " and " (:TERM NIL "class")
    " " (:TERM NIL "objects") " are " (:TERM NIL "type specifiers")
    ", they may be used in the special form " (:SPECREF NIL "the")
    " and in type declarations. " :PAR "Many but not all of the predefined "
    (:TERM NIL "type specifiers") " have a corresponding " (:TERM NIL "class")
    " with the same proper name as the " (:TERM NIL "type")
    ". These type specifiers are listed in "
    (:FIGREF NIL :CLASS-TYPE-CORRESPONDENCE) ". For example, the "
    (:TERM NIL "type") " " (:TYPEREF NIL "array") " has a corresponding "
    (:TERM NIL "class") " named " (:TYPEREF NIL "array") ". No "
    (:TERM NIL "type specifier") " that is a list, such as "
    (:TT NIL " (vector double-float 100)") ", has a corresponding "
    (:TERM NIL "class") ". The " (:TERM NIL "operator") " "
    (:MACREF NIL "deftype") " does not create any " (:TERM NIL "classes") ". "
    :PAR "Each " (:TERM NIL "class") " that corresponds to a predefined "
    (:TERM NIL "type specifier")
    " can be implemented in one of three ways, at the discretion of each implementation. It can be a "
    (:TERM NIL "standard class") ", "
    (:COMMENT NIL "% Not necessary. -kmp 12-Feb-92"
     " (of the kind defined by \\macref{defclass}), ")
    "a " (:TERM NIL "structure class") ", "
    (:COMMENT NIL "% Not necessary. -kmp 12-Feb-92"
     " (defined by \\macref{defstruct}), ")
    (:ISSUE NIL "METACLASS-OF-SYSTEM-CLASS:UNSPECIFIED") " "
    (:COMMENT NIL "or a \\term{built-in class}.") "or a "
    (:TERM NIL "system class") ". "
    (:ENDISSUE NIL "METACLASS-OF-SYSTEM-CLASS:UNSPECIFIED") " "
    (:COMMENT NIL "% Not necessary. -kmp 12-Feb-92"
     " (implemented in a special, non-extensible way).")
    :PAR
    (:COMMENT NIL
     "\"instances\" => \"generalized instances\" per Barmar,Moon.")
    "A " (:TERM NIL "built-in class") " is one whose "
    (:TERM NIL "generalized instances")
    " have restricted capabilities or special representations. Attempting to use "
    (:MACREF NIL "defclass") " to define " (:TERM NIL "subclasses") " of a "
    (:TYPEREF NIL "built-in-class") " signals an error. "
    (:COMMENT NIL "\"instance\" => \"generalized instance\" per Barmar,Moon.")
    "Calling " (:FUNREF NIL "make-instance") " to create a "
    (:TERM NIL "generalized instance") " of a " (:TERM NIL "built-in class")
    " signals an error. Calling " (:FUNREF NIL "slot-value") " on a "
    (:COMMENT NIL "\"instance\" => \"generalized instance\" per Barmar,Moon.")
    (:TERM NIL "generalized instance") " of a " (:TERM NIL "built-in class")
    " signals an error. Redefining a " (:TERM NIL "built-in class")
    " or using " (:FUNREF NIL "change-class") " to change "
    (:COMMENT NIL "\"instance\" => \"object\" per Barmar,Moon.") "the "
    (:TERM NIL "class") " of an " (:TERM NIL "object") " to or from a "
    (:TERM NIL "built-in class") " signals an error. However, "
    (:TERM NIL "built-in classes") " can be used as "
    (:TERM NIL "parameter specializers") " in " (:TERM NIL "methods") ". " :PAR
    (:COMMENT NIL
     "The \\OS\\ specifies that all predefined \\term{type specifiers}"
     "listed in \\figref\\ClassTypeCorrespondence\\ are built-in classes, but a particular"
     "implementation is allowed to extend the \\OS\\ to define some of them as"
     "standard classes or as structure classes.")
    :PAR "It is possible to determine whether a " (:TERM NIL "class") " is a "
    (:TERM NIL "built-in class") " by checking the " (:TERM NIL "metaclass")
    ". A " (:TERM NIL "standard class") " is an " (:TERM NIL "instance")
    " of the " (:TERM NIL "class") " " (:TYPEREF NIL "standard-class") ", a "
    (:TERM NIL "built-in class") " is an " (:TERM NIL "instance") " of the "
    (:TERM NIL "class") " " (:TYPEREF NIL "built-in-class") ", and a "
    (:TERM NIL "structure class") " is an " (:TERM NIL "instance") " of the "
    (:TERM NIL "class") " " (:TYPEREF NIL "structure-class") ". " :PAR "Each "
    (:TERM NIL "structure") " " (:TERM NIL "type") " created by "
    (:MACREF NIL "defstruct") " without using the " (:KWD NIL "type")
    " option has a corresponding " (:TERM NIL "class") ". "
    (:COMMENT NIL "\"instance\" => \"generalized instance\" per Barmar,Moon.")
    "This " (:TERM NIL "class") " is a " (:TERM NIL "generalized instance")
    " of the " (:TERM NIL "class") " " (:TYPEREF NIL "structure-class") ". "
    (:COMMENT NIL "A portable program must assume that"
     "\\typeref{structure-class} is a subclass of \\typeref{built-in-class} and has the"
     "same restrictions as built-in classes.  Whether \\theclass{structure-class}"
     "in fact is a subclass of \\typeref{built-in-class} is"
     "\\term{implementation-dependent}. ")
    "The " (:KWD NIL "include") " option of " (:MACREF NIL "defstruct")
    " creates a direct " (:TERM NIL "subclass") " of the " (:TERM NIL "class")
    " that corresponds to the included " (:TERM NIL "structure") " "
    (:COMMENT NIL "Added \"type\" -kmp") (:TERM NIL "type") ". " :PAR
    (:COMMENT NIL
     " I moved the following two paragraphs here from the dictionary entry"
     " for CLASS.  --sjl 7 Mar 92")
    (:ISSUE NIL "CONDITION-SLOTS:HIDDEN") " It is "
    (:TERM NIL "implementation-dependent") " whether " (:TERM NIL "slots")
    " are involved in the operation of " (:TERM NIL "functions")
    " defined in this specification on " (:TERM NIL "instances") " of "
    (:TERM NIL "classes") " defined in this specification, except when "
    (:TERM NIL "slots") " are explicitly defined by this specification. " :PAR
    "If in a particular " (:TERM NIL "implementation") " a "
    (:TERM NIL "class") " defined in this specification has "
    (:TERM NIL "slots")
    " that are not defined by this specfication, the names of these "
    (:TERM NIL "slots") " must not be " (:TERM NIL "external symbols") " of "
    (:TERM NIL "packages") " defined in this specification nor otherwise "
    (:TERM NIL "accessible") " in the " (:PACKREF NIL "cl-user") " "
    (:TERM NIL "package") ". " (:ENDISSUE NIL "CONDITION-SLOTS:HIDDEN") " "
    :PAR "The purpose of specifying that many of the standard "
    (:TERM NIL "type specifiers") " have a corresponding " (:TERM NIL "class")
    " is to enable users to write " (:TERM NIL "methods")
    " that discriminate on these " (:TERM NIL "types") ". "
    (:TERM NIL "Method") " selection requires that a "
    (:TERM NIL "class precedence list") " can be determined for each "
    (:TERM NIL "class") ". " :PAR "The hierarchical relationships among the "
    (:TERM NIL "type specifiers") " are mirrored by relationships among the "
    (:TERM NIL "classes") " corresponding to those " (:TERM NIL "types") ". "
    (:COMMENT NIL "The existing type hierarchy is used for determining the"
     "\\term{class precedence list} "
     "for each \\term{class} that corresponds to a predefined"
     "\\term{type}.  In some cases, "
     "a \\term{local precedence order} is not specifiied for two \\term{supertypes} "
     "of a"
     "given \\term{type specifier}.  For example, \\typeref{null} is a \\term{subtype} "
     "of both \\typeref{symbol} and \\typeref{list}, but it is not specified"
     "whether \\typeref{symbol} is more specific or less"
     "specific than \\typeref{list}.  The \\CLOS\\ defines those"
     "relationships for all such \\term{classes}.")
    :PAR (:FIGREF NIL :CLASS-TYPE-CORRESPONDENCE) " lists the set of "
    (:TERM NIL "classes") " that correspond to predefined "
    (:TERM NIL "type specifiers") ". " :PAR
    (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") "  "
    (:TABLE
     (:NAME ("Classes that correspond to pre-defined type specifiers") :TAGS
      (:CLASS-TYPE-CORRESPONDENCE))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " arithmetic-error"))
      (:CELL NIL (:TYPEREF NIL "generic-function"))
      (:CELL NIL (:TYPEREF NIL "simple-error")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " array"))
      (:CELL NIL (:TYPEREF NIL "hash-table"))
      (:CELL NIL (:TYPEREF NIL "simple-type-error")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " bit-vector"))
      (:CELL NIL (:TYPEREF NIL "integer"))
      (:CELL NIL (:TYPEREF NIL "simple-warning")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " broadcast-stream"))
      (:CELL NIL (:TYPEREF NIL "list"))
      (:CELL NIL (:TYPEREF NIL "standard-class")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " built-in-class"))
      (:CELL NIL (:TYPEREF NIL "logical-pathname"))
      (:CELL NIL (:TYPEREF NIL "standard-generic-function")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " cell-error"))
      (:CELL NIL (:TYPEREF NIL "method"))
      (:CELL NIL (:TYPEREF NIL "standard-method")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " character"))
      (:CELL NIL (:TYPEREF NIL "method-combination"))
      (:CELL NIL (:TYPEREF NIL "standard-object")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " class"))
      (:CELL NIL (:TYPEREF NIL "null"))
      (:CELL NIL (:TYPEREF NIL "storage-condition")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " complex"))
      (:CELL NIL (:TYPEREF NIL "number")) (:CELL NIL (:TYPEREF NIL "stream")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " concatenated-stream"))
      (:CELL NIL (:TYPEREF NIL "package"))
      (:CELL NIL (:TYPEREF NIL "stream-error")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " condition"))
      (:CELL NIL (:TYPEREF NIL "package-error"))
      (:CELL NIL (:TYPEREF NIL "string")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " cons"))
      (:CELL NIL (:TYPEREF NIL "parse-error"))
      (:CELL NIL (:TYPEREF NIL "string-stream")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " control-error"))
      (:CELL NIL (:TYPEREF NIL "pathname"))
      (:CELL NIL (:TYPEREF NIL "structure-class")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " division-by-zero"))
      (:CELL NIL (:TYPEREF NIL "print-not-readable"))
      (:CELL NIL (:TYPEREF NIL "structure-object")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " echo-stream"))
      (:CELL NIL (:TYPEREF NIL "program-error"))
      (:CELL NIL (:TYPEREF NIL "style-warning")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " end-of-file"))
      (:CELL NIL (:TYPEREF NIL "random-state"))
      (:CELL NIL (:TYPEREF NIL "symbol")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " error"))
      (:CELL NIL (:TYPEREF NIL "ratio"))
      (:CELL NIL (:TYPEREF NIL "synonym-stream")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " file-error"))
      (:CELL NIL (:TYPEREF NIL "rational")) (:CELL NIL (:TYPEREF NIL "t")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " file-stream"))
      (:CELL NIL (:TYPEREF NIL "reader-error"))
      (:CELL NIL (:TYPEREF NIL "two-way-stream")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " float"))
      (:CELL NIL (:TYPEREF NIL "readtable"))
      (:CELL NIL (:TYPEREF NIL "type-error")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " floating-point-inexact"))
      (:CELL NIL (:TYPEREF NIL "real"))
      (:CELL NIL (:TYPEREF NIL "unbound-slot")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " floating-point-invalid-operation"))
      (:CELL NIL (:TYPEREF NIL "restart"))
      (:CELL NIL (:TYPEREF NIL "unbound-variable")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " floating-point-overflow"))
      (:CELL NIL (:TYPEREF NIL "sequence"))
      (:CELL NIL (:TYPEREF NIL "undefined-function")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " floating-point-underflow"))
      (:CELL NIL (:TYPEREF NIL "serious-condition"))
      (:CELL NIL (:TYPEREF NIL "vector")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " function"))
      (:CELL NIL (:TYPEREF NIL "simple-condition"))
      (:CELL NIL (:TYPEREF NIL "warning"))))
    " " (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " :PAR "The "
    (:TERM NIL "class precedence list")
    " information specified in the entries for each of these "
    (:TERM NIL "classes") " are those that are required by the object system. "
    :PAR
    "Individual implementations may be extended to define other type specifiers to have a corresponding "
    (:TERM NIL "class")
    ". Individual implementations may be extended to add other "
    (:TERM NIL "subclass") " relationships and to add other "
    (:TERM NIL "elements") " to the " (:TERM NIL "class precedence lists")
    " as long as they do not violate the type relationships and disjointness requirements specified by this standard. A standard "
    (:TERM NIL "class") " defined with no direct " (:TERM NIL "superclasses")
    " is guaranteed to be disjoint from all of the " (:TERM NIL "classes")
    " in the table, except for the class named " (:TYPEREF NIL "t") ". " :PAR))
  :PAR
  (:DICTIONARY NIL :PAR (:COMMENT NIL "%% ========== NIL")
   (:COM (:NAME "nil" :FTYPE "Type")
    (:PART (:NAME "Supertypes") " all " (:TERM NIL "types") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "nil") " contains no " (:TERM NIL "objects")
     " and so is also called the " (:TERM NIL "empty type") ". "
     (:COMMENT NIL "% 2.15.0 5") "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "nil") " is a " (:TERM NIL "subtype") " of every "
     (:TERM NIL "type") ". No " (:TERM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "nil") ". " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The " (:TERM NIL "type")
     " containing the " (:TERM NIL "object") " " (:MISC NIL "nil") " is the "
     (:TERM NIL "type") " " (:TYPEREF NIL "null") ", not the "
     (:TERM NIL "type") " " (:TYPEREF NIL "nil") ". " :PAR))
   :PAR (:COMMENT NIL "%% ========== BOOLEAN")
   (:COM (:NAME "boolean" :FTYPE "Type")
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "boolean") ", "
     (:TYPEREF NIL "symbol") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "boolean") " contains the " (:TERM NIL "symbols") " "
     (:MISC NIL "t") " and " (:MISC NIL "nil")
     ", which represent true and false, respectively. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MISC NIL "t") " ("
     (:TERM NIL "constant variable") "), " (:MISC NIL "nil") " ("
     (:TERM NIL "constant variable") "), " (:SPECREF NIL "if") ", "
     (:FUNREF NIL "not") ", " (:FUNREF NIL "complement") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "Conditional operations, such as "
     (:SPECREF NIL "if") ", permit the use of "
     (:TERM NIL "generalized booleans") ", not just " (:TERM NIL "booleans")
     "; any " (:TERM NIL "non-nil") " value, not just " (:MISC NIL "t")
     ", counts as true for a " (:TERM NIL "generalized boolean")
     ". However, as a matter of convention, the " (:TERM NIL "symbol") " "
     (:MISC NIL "t") " is considered the canonical value to use even for a "
     (:TERM NIL "generalized boolean")
     " when no better choice presents itself. " :PAR))
   :PAR
   (:COMMENT NIL "Number and its subtypes moved to dict-numbers."
    "Character and its subtypes moved to dict-characters."
    "System Class SYMBOL moved to dict-symbols."
    "Type KEYWORD moved to dict-symbols."
    "Type SEQUENCE moved to dict-sequence."
    "Type LIST, NULL, CONS, ATOM, ... moved to dict-conses."
    "Types ARRAY, STRING, etc. to dict-strings.")
   :PAR (:COMMENT NIL "% new definition here?" "%% ========== FUNCTION")
   (:COM (:NAME "function" :FTYPE "System Class")
    (:ISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "function") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "function") " is an "
     (:TERM NIL "object")
     " that represents code to be executed when an appropriate number of arguments is supplied. "
     (:COMMENT NIL "Removed per symbolics comments:"
      " A \\term{function} can be supplied as an"
      "argument without error to \\funref{funcall} or \\funref{apply}.")
     "A " (:TERM NIL "function") " is produced by the "
     (:SPECREF NIL "function") " " (:TERM NIL "special form") ", the "
     (:TERM NIL "function") " " (:FUNREF NIL "coerce") ", "
     (:ISSUE NIL "SYNTACTIC-ENVIRONMENT-ACCESS:RETRACTED-MAR91") " "
     (:COMMENT NIL "the \\thefunction{enclose},")
     (:ENDISSUE NIL "SYNTACTIC-ENVIRONMENT-ACCESS:RETRACTED-MAR91") " or the "
     (:TERM NIL "function") " " (:FUNREF NIL "compile") ". A "
     (:TERM NIL "function")
     " can be directly invoked by using it as the first argument to "
     (:FUNREF NIL "funcall") ", " (:FUNREF NIL "apply") ", or "
     (:SPECREF NIL "multiple-value-call") ". " :PAR
     (:COMMENT NIL "!!! Barrett says this syntax is confused."
      " Issues: &allow-other-keys, &key in value-typespec, &key mis-formatted where it already is."))
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Specializing. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:COMMENT NIL "% 4.5.0 12")
     (:DEF (:KIND "type") (:NAMES NIL "function")
      (:ARGLIST NIL (:BRAC NIL "arg-typespec " (:BRAC NIL "value-typespec"))))
     " " :PAR
     (:BNF (:NAME "arg-typespec") "("
      (:STAR NIL (:CURLY NIL (:PARAM NIL "typespec"))) " " (:BR NIL) "  "
      (:BRAC NIL (:KEYWORD NIL " &optional") " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "typespec"))))
      " " (:BR NIL) "  "
      (:BRAC NIL (:KEYWORD NIL " &rest") " " (:PARAM NIL "typespec")) " "
      (:BR NIL) "  "
      (:BRAC NIL (:KEYWORD NIL " &key") " "
       (:STAR NIL (:CURLY NIL (:PAREN NIL "keyword typespec"))))
      ")")
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "typespec") "—a " (:TERM NIL "type specifier") ". " :PAR
     (:PARAM NIL "value-typespec") "—a " (:TERM NIL "type specifier") ". "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     (:EDITORNOTE NIL
      "KMP: Isn't there some context info about ftype declarations to be merged here?")
     " " :PAR (:EDITORNOTE NIL "KMP: This could still use some cleaning up.")
     (:COMMENT NIL "!!!") :PAR
     (:EDITORNOTE NIL
      "Sandra: Still need clarification about what happens if the number of arguments doesn't match the FUNCTION type declaration.")
     " " :PAR "The list form of the " (:TYPEREF NIL "function") " "
     (:TERM NIL "type specifier")
     " can be used only for declaration and not for discrimination. Every element of this "
     (:TERM NIL "type") " is "
     (:COMMENT NIL " I think the ``at least'' is confusing.  --sjl 7 Mar 92"
      " a \\term{function} that accepts arguments at least of the")
     "a " (:TERM NIL "function")
     " that accepts arguments of the types specified by the "
     (:PARAM NIL "argj-types") " and returns values that are members of the "
     (:TERM NIL "types") " specified by " (:PARAM NIL "value-type") ". The "
     (:KEYREF NIL "optional") ", " (:KEYREF NIL "rest") ", "
     (:KEYREF NIL "key") ", "
     (:ISSUE NIL "FUNCTION-TYPE-KEY-NAME:SPECIFY-KEYWORD") " and "
     (:KEYREF NIL "allow-other-keys") " "
     (:ENDISSUE NIL "FUNCTION-TYPE-KEY-NAME:SPECIFY-KEYWORD")
     " markers can appear in the list of argument types. "
     (:ISSUE NIL "FUNCTION-TYPE-REST-LIST-ELEMENT:USE-ACTUAL-ARGUMENT-TYPE")
     " The " (:TERM NIL "type specifier") " provided with "
     (:KEYREF NIL "rest") " is the " (:TERM NIL "type")
     " of each actual argument, not the " (:TERM NIL "type")
     " of the corresponding variable. "
     (:ENDISSUE NIL "FUNCTION-TYPE-REST-LIST-ELEMENT:USE-ACTUAL-ARGUMENT-TYPE")
     " " :PAR (:ISSUE NIL "FUNCTION-TYPE-KEY-NAME:SPECIFY-KEYWORD") " The "
     (:KEYREF NIL "key") " parameters should be supplied as lists of the form "
     (:TT NIL " (" (:PARAM NIL "keyword") " " (:PARAM NIL "type") ")") ". The "
     (:PARAM NIL "keyword")
     " must be a valid keyword-name symbol as must be supplied in the actual arguments of a call. "
     (:ISSUE NIL "KEYWORD-ARGUMENT-NAME-PACKAGE:ANY") " This is usually a "
     (:TERM NIL "symbol") " in the " (:PACKREF NIL "keyword") " "
     (:TERM NIL "package") " but can be any " (:TERM NIL "symbol") ". "
     (:ENDISSUE NIL "KEYWORD-ARGUMENT-NAME-PACKAGE:ANY") " "
     (:COMMENT NIL " tweaked to be less wordy  --sjl 7 Mar 92"
      "The \\keyref{allow-other-keys} declarations are interpreted as follows:"
      "when \\keyref{key} is given in a"
      "\\declref{function} \\term{type specifier} \\term{lambda list}, "
      "it is safe to assume that the \\term{keyword parameters} given")
     "When " (:KEYREF NIL "key") " is given in a " (:TYPEREF NIL "function")
     " " (:TERM NIL "type specifier") " " (:TERM NIL "lambda list") ", the "
     (:TERM NIL "keyword parameters") " given are exhaustive unless "
     (:KEYREF NIL "allow-other-keys") " is also present. "
     (:KEYREF NIL "allow-other-keys")
     " is an indication that other keyword arguments might actually be supplied and, if supplied, can be used. For example, the "
     (:TERM NIL "type") " of the " (:TERM NIL "function") " "
     (:FUNREF NIL "make-list") " could be declared as follows: " :PAR
     (:CODE NIL " (function ((integer 0) &key (:initial-element t)) list)
")
     " " (:ENDISSUE NIL "FUNCTION-TYPE-KEY-NAME:SPECIFY-KEYWORD") " " :PAR
     "The " (:PARAM NIL "value-type") " can be a " (:TYPEREF NIL "values") " "
     (:TERM NIL "type specifier") " in order to indicate the "
     (:TERM NIL "types") " of " (:TERM NIL "multiple values") ". " :PAR
     (:ISSUE NIL "FUNCTION-TYPE-ARGUMENT-TYPE-SEMANTICS:RESTRICTIVE") " "
     (:COMMENT NIL "%% 4.5.0 13"
      "For example, \\thefunction{cons} is of type \\f{(function (t t) cons)},"
      "because it can accept any two arguments and always returns a \\term{cons}."
      "%%see FUNCTION-TYPE-ARGUMENT-TYPE-SEMANTICS; cons isn't of the following type."
      "\\funref{cons} is also of type {\\tt (function (float string) list)}, "
      "because it can" "accept a \\term{float}"
      "and a \\term{string} (among other things), and its"
      "result is always \\oftype{list}            "
      "(in fact a \\term{cons} is never \\term{null},"
      "but that does not matter for this type declaration)."
      "\\funref{truncate} is of type " "as well as of type")
     :PAR "Consider a declaration of the following form: " :PAR
     (:CODE NIL " (ftype (function (arg0-type arg1-type ...) val-type) f))
")
     " " :PAR "Any " (:TERM NIL "form") " " (:TT NIL " (f arg0 arg1 ...)")
     " within the scope of that declaration is equivalent to the following: "
     :PAR
     (:CODE NIL
      " (the val-type (f (the arg0-type arg0) (the arg1-type arg1) ...))
")
     " " :PAR
     "That is, the consequences are undefined if any of the arguments are not of the specified "
     (:TERM NIL "types") " or the result is not of the specified "
     (:TERM NIL "type")
     ". In particular, if any argument is not of the correct "
     (:TERM NIL "type")
     ", the result is not guaranteed to be of the specified "
     (:TERM NIL "type") ". " :PAR "Thus, an " (:DECLREF NIL "ftype")
     " declaration for a " (:TERM NIL "function") " describes "
     (:TERM NIL "calls") " to the " (:TERM NIL "function")
     ", not the actual definition of the " (:TERM NIL "function") ". " :PAR
     "Consider a declaration of the following form: " :PAR
     (:CODE NIL
      " (type (function (arg0-type arg1-type ...) val-type) fn-valued-variable)
")
     " " :PAR
     "This declaration has the interpretation that, within the scope of the declaration, the consequences are unspecified if the value of "
     (:TT NIL " fn-valued-variable")
     " is called with arguments not of the specified " (:TERM NIL "types")
     "; the value resulting from a valid call will be of type "
     (:TT NIL " val-type") ". " :PAR
     "As with variable type declarations, nested declarations imply intersections of "
     (:TERM NIL "types") ", as follows: "
     (:LIST NIL
      (:ITEM NIL " Consider the following two declarations of "
       (:DECLREF NIL "ftype") ": " :PAR
       (:CODE NIL " (ftype (function (arg0-type1 arg1-type1 ...) val-type1) f))
")
       " and " :PAR
       (:CODE NIL " (ftype (function (arg0-type2 arg1-type2 ...) val-type2) f))
")
       " " :PAR
       "If both these declarations are in effect, then within the shared scope of the declarations, calls to "
       (:TT NIL " f") " can be treated as if " (:TT NIL " f")
       " were declared as follows: " :PAR
       (:CODE NIL
        " (ftype (function ((and arg0-type1 arg0-type2) (and arg1-type1 arg1-type2 ...) ...)
                  (and val-type1 val-type2)) 
        f))
")
       " " :PAR
       (:COMMENT NIL "!!! Barmar: what does this mean?"
        "    KMP: This is ill-worded and out of place. ")
       "It is permitted to ignore one or all of the " (:DECLREF NIL "ftype")
       " declarations in force. " :PAR)
      (:ITEM NIL
       " If two (or more) type declarations are in effect for a variable, and they are both "
       (:TT NIL " function")
       " declarations, the declarations combine similarly. "))
     " " :PAR
     (:ENDISSUE NIL "FUNCTION-TYPE-ARGUMENT-TYPE-SEMANTICS:RESTRICTIVE") " "
     :PAR (:ENDISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== COMPILED-FUNCTION")
   (:COM (:NAME "compiled-function" :FTYPE "Type")
    (:ISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "compiled-function")
     ", " (:TYPEREF NIL "function") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:ISSUE NIL "COMPILED-FUNCTION-REQUIREMENTS:TIGHTEN") " Any "
     (:TERM NIL "function") " may be considered by an "
     (:TERM NIL "implementation") " to be a a " (:TERM NIL "compiled function")
     " if it contains no references to " (:TERM NIL "macros")
     " that must be expanded at run time, and it contains no unresolved references to "
     (:TERM NIL "load time values") ". See "
     (:SECREF NIL :COMPILATION-SEMANTICS) ". "
     (:ENDISSUE NIL "COMPILED-FUNCTION-REQUIREMENTS:TIGHTEN") " " :PAR
     (:COMMENT NIL "% 2.13.0 2") (:TERM NIL "Functions")
     " whose definitions appear lexically within a " (:TERM NIL "file")
     " that has been " (:TERM NIL "compiled") " with "
     (:FUNREF NIL "compile-file") " and then " (:TERM NIL "loaded") " with "
     (:FUNREF NIL "load") " are of " (:TERM NIL "type") " "
     (:TYPEREF NIL "compiled-function") ". "
     (:ISSUE NIL "COMPILED-FUNCTION-REQUIREMENTS:TIGHTEN") " "
     (:TERM NIL "Functions") " produced by the " (:FUNREF NIL "compile")
     " function are of " (:TERM NIL "type") " "
     (:TYPEREF NIL "compiled-function") ". "
     (:ENDISSUE NIL "COMPILED-FUNCTION-REQUIREMENTS:TIGHTEN") " Other "
     (:TERM NIL "functions") " might also be of " (:TERM NIL "type") " "
     (:TYPEREF NIL "compiled-function") ". "
     (:COMMENT NIL
      "but \\funref{compile} does not necessarily produce a \\term{compiled function}.")
     :PAR (:ENDISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== GENERIC-FUNCTION")
   (:COM (:NAME "generic-function" :FTYPE "System Class")
    (:ISSUE NIL "JUN90-TRIVIAL-ISSUES:9") " "
    (:PART (:NAME "Class Precedence List") " " :PAR
     (:TYPEREF NIL "generic-function") ", " (:TYPEREF NIL "function") ", "
     (:TYPEREF NIL "t") " " (:ENDISSUE NIL "JUN90-TRIVIAL-ISSUES:9") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A "
     (:NEWTERM NIL "generic function") " is a " (:TERM NIL "function")
     " whose behavior depends on the " (:TERM NIL "classes")
     " or identities of the " (:TERM NIL "arguments")
     " supplied to it. A generic function object contains a set of "
     (:TERM NIL "methods") ", a " (:TERM NIL "lambda list") ", a "
     (:TERM NIL "method combination") " " (:TERM NIL "type")
     ", and other information. The " (:TERM NIL "methods")
     " define the class-specific behavior and operations of the "
     (:TERM NIL "generic function") "; a " (:TERM NIL "method") " is said to "
     (:TERM NIL "specialize") " a " (:TERM NIL "generic function")
     ". When invoked, a " (:TERM NIL "generic function")
     " executes a subset of its " (:TERM NIL "methods") " based on the "
     (:TERM NIL "classes") " or identities of its " (:TERM NIL "arguments")
     ". " :PAR "A " (:TERM NIL "generic function")
     " can be used in the same ways that an ordinary " (:TERM NIL "function")
     " can be used; specifically, a " (:TERM NIL "generic function")
     " can be used as an argument to " (:FUNREF NIL "funcall") " and "
     (:FUNREF NIL "apply") ", and can be given a global or a local name. "
     :PAR))
   :PAR (:COMMENT NIL "%% ========== STANDARD-GENERIC-FUNCTION")
   (:COM (:NAME "standard-generic-function" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " "
     (:TYPEREF NIL "standard-generic-function") ", "
     (:TYPEREF NIL "generic-function") ", " (:TYPEREF NIL "function") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "class") " "
     (:TYPEREF NIL "standard-generic-function") " is the default "
     (:TERM NIL "class") " of " (:TERM NIL "generic functions") " "
     (:TERM NIL "established") " by " (:MACREF NIL "defmethod") ", "
     (:FUNREF NIL "ensure-generic-function") ", " (:MACREF NIL "defgeneric")
     ", " (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
     (:COMMENT NIL " \\macref{generic-function}," " \\specref{generic-flet},"
      " \\specref{generic-labels},")
     (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
     (:ISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
     (:COMMENT NIL "\\specref{with-added-methods},")
     (:ENDISSUE NIL "WITH-ADDED-METHODS:DELETE") "and "
     (:MACREF NIL "defclass") " " (:TERM NIL "forms") ". " :PAR))
   :PAR (:COMMENT NIL "random-state moved to dict-numbers ") :PAR
   (:COMMENT NIL
    "conditions moved to dict-conditions, some perhaps to move again")
   :PAR (:COMMENT NIL "%% ========== CLASS")
   (:COM (:NAME "class" :FTYPE "System Class")
    (:ISSUE NIL "JUN90-TRIVIAL-ISSUES:9") " "
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "class") ", "
     (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     (:TYPEREF NIL "standard-object") ", "
     (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     (:TYPEREF NIL "t") " " (:ENDISSUE NIL "JUN90-TRIVIAL-ISSUES:9") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "!!! Barrett: Since none of this can be accessed portably,"
      "    why specifically mention any of it?")
     "The " (:TERM NIL "type") " " (:TYPEREF NIL "class") " represents "
     (:TERM NIL "objects")
     " that determine the structure and behavior of their "
     (:TERM NIL "instances") ". Associated with an " (:TERM NIL "object")
     " of " (:TERM NIL "type") " " (:TYPEREF NIL "class")
     " is information describing its place in the directed acyclic graph of "
     (:TERM NIL "classes") ", its " (:TERM NIL "slots") ", and its options. "
     (:COMMENT NIL "% Barrett: No! This is a gross AMOPism."
      "and information about the \\term{methods} that mention this \\term{class} as a specializer.")
     :PAR
     (:COMMENT NIL
      " I had a terrible time figuring out what these paragraphs were trying"
      " to say until I realized what cleanup issue they were from.  I've moved"
      " this text to the discussion of built-in types in the classes concepts"
      " section, where there is more context for it.  --sjl 7 Mar 92"
      "\\issue{CONDITION-SLOTS:HIDDEN}"
      "It is \\term{implementation-dependent} whether \\term{slots} are involved in the"
      "operation of \\term{functions} defined in this specification"
      "on \\term{instances} of \\term{classes} defined in this specification,"
      "except when \\term{slots} are explicitly defined by this specification."
      "If in a particular \\term{implementation} a \\term{class} defined in this specification"
      "has \\term{slots} that are not defined by this specfication, the names of these \\term{slots}"
      "must not be \\term{external symbols} of \\term{packages} defined in this specification nor"
      "otherwise \\term{accessible} in \\thepackage{cl-user}."
      "\\endissue{CONDITION-SLOTS:HIDDEN}")
     :PAR))
   :PAR (:COMMENT NIL "%% ========== BUILT-IN-CLASS")
   (:COM (:NAME "built-in-class" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "built-in-class")
     ", " (:TYPEREF NIL "class") ", "
     (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     (:TYPEREF NIL "standard-object") ", "
     (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "built-in class")
     " is a " (:TERM NIL "class") " whose " (:TERM NIL "instances")
     " have restricted capabilities or special representations. "
     (:COMMENT NIL
      "!!! Barrett: The rest of this looks like a duplication of text a few pages back.")
     "Attempting to use " (:MACREF NIL "defclass") " to define "
     (:TERM NIL "subclasses") " of a " (:TERM NIL "built-in class")
     " signals an error of " (:TERM NIL "type") " " (:TYPEREF NIL "error")
     ". Calling " (:FUNREF NIL "make-instance") " to create an "
     (:TERM NIL "instance") " of a " (:TERM NIL "built-in class")
     " signals an error of " (:TERM NIL "type") " " (:TYPEREF NIL "error")
     ". Calling " (:FUNREF NIL "slot-value") " on an " (:TERM NIL "instance")
     " of a " (:TERM NIL "built-in class") " signals an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error") ". Redefining a "
     (:TERM NIL "built-in class") " or using " (:FUNREF NIL "change-class")
     " to change the " (:TERM NIL "class") " of an " (:TERM NIL "instance")
     " to or from a " (:TERM NIL "built-in class") " signals an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error") ". However, "
     (:TERM NIL "built-in classes") " can be used as "
     (:TERM NIL "parameter specializers") " in " (:TERM NIL "methods") ". "
     (:COMMENT NIL "!!! Barrett: Other ops also signal errors."
      "    See SLOT-VALUE-METACLASSES"
      "Any \\term{class} that corresponds to a standard"
      "\\clisp\\ type specified in \\CLtL\\ "
      "might be an instance of \\typeref{built-in-class}."
      "The predefined Common Lisp \\term{type specifiers} that are required to have"
      "corresponding classes are listed in \\figref\\ClassTypeCorrespondence.  It is implementation"
      "dependent whether each of these classes is implemented as a built-in class.")
     :PAR))
   :PAR (:COMMENT NIL "%% ========== STRUCTURE-CLASS")
   (:COM (:NAME "structure-class" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " :PAR
     (:TYPEREF NIL "structure-class") ", " (:TYPEREF NIL "class") ", "
     (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     (:TYPEREF NIL "standard-object") ", "
     (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "All " (:TERM NIL "classes")
     " defined by means of " (:MACREF NIL "defstruct") " are "
     (:TERM NIL "instances") " of the " (:TERM NIL "class") " "
     (:TYPEREF NIL "structure-class") ". " :PAR))
   :PAR (:COMMENT NIL "%% ========== STANDARD-CLASS")
   (:COM (:NAME "standard-class" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "standard-class")
     ", " (:TYPEREF NIL "class") ", "
     (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     (:TYPEREF NIL "standard-object") ", "
     (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "class") " "
     (:TYPEREF NIL "standard-class") " is the default " (:TERM NIL "class")
     " of " (:TERM NIL "classes") " defined by " (:MACREF NIL "defclass") ". "
     :PAR))
   :PAR (:COMMENT NIL "%% ========== METHOD")
   (:COM (:NAME "method" :FTYPE "System Class")
    (:ISSUE NIL "JUN90-TRIVIAL-ISSUES:9") " "
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "method") ", "
     (:TYPEREF NIL "t") " " (:ENDISSUE NIL "JUN90-TRIVIAL-ISSUES:9") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "method") " is an "
     (:TERM NIL "object")
     " that represents a modular part of the behavior of a "
     (:TERM NIL "generic function") ". " :PAR "A " (:TERM NIL "method")
     " contains " (:TERM NIL "code") " to implement the " (:TERM NIL "method")
     "'s behavior, a sequence of " (:TERM NIL "parameter specializers")
     " that specify when the given " (:TERM NIL "method")
     " is applicable, and a sequence of " (:TERM NIL "qualifiers")
     " that is used by the method combination facility to distinguish among "
     (:TERM NIL "methods") ". Each required parameter of each "
     (:TERM NIL "method") " has an associated "
     (:TERM NIL "parameter specializer") ", and the " (:TERM NIL "method")
     " will be invoked only on arguments that satisfy its "
     (:TERM NIL "parameter specializers") ". " :PAR
     "The method combination facility controls the selection of "
     (:TERM NIL "methods")
     ", the order in which they are run, and the values that are returned by the generic function. The object system offers a default method combination type and provides a facility for declaring new types of method combination. "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :GFS-AND-METHODS) " "
     :PAR))
   :PAR (:COMMENT NIL "%% ========== STANDARD-METHOD")
   (:COM (:NAME "standard-method" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "standard-method")
     ", " (:TYPEREF NIL "method") ", "
     (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     (:TYPEREF NIL "standard-object") ", "
     (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "class") " "
     (:TYPEREF NIL "standard-method") " is the default " (:TERM NIL "class")
     " of " (:TERM NIL "methods") " defined by the " (:MACREF NIL "defmethod")
     " and " (:MACREF NIL "defgeneric") " " (:TERM NIL "forms") ". "
     (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
     (:COMMENT NIL " \\macref{generic-function},")
     (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
     (:ISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
     (:COMMENT NIL "\\specref{with-added-methods},")
     (:ENDISSUE NIL "WITH-ADDED-METHODS:DELETE")
     (:COMMENT NIL "  \\specref{generic-flet}," " and"
      "  \\specref{generic-labels} \\term{forms}.")
     :PAR))
   :PAR (:COMMENT NIL "%% ========== STRUCTURE-OBJECT")
   (:COM (:NAME "structure-object" :FTYPE "Class")
    (:ISSUE NIL "JUN90-TRIVIAL-ISSUES:9") " "
    (:PART (:NAME "Class Precedence List") " " :PAR
     (:TYPEREF NIL "structure-object") ", " (:TYPEREF NIL "t") " "
     (:ENDISSUE NIL "JUN90-TRIVIAL-ISSUES:9") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL " \\Theclass{structure-object} is a \\term{superclass} of"
      " every \\term{class} that is defined by \\macref{defstruct}.")
     "The " (:TERM NIL "class") " " (:TYPEREF NIL "structure-object") " is an "
     (:TERM NIL "instance") " of " (:TYPEREF NIL "structure-class")
     " and is a " (:TERM NIL "superclass") " of every " (:TERM NIL "class")
     " that is an " (:TERM NIL "instance") " of "
     (:TYPEREF NIL "structure-class") " except itself, and is a "
     (:TERM NIL "superclass") " of every " (:TERM NIL "class")
     " that is defined by " (:MACREF NIL "defstruct") ". " :PAR
     (:ISSUE NIL "DATA-TYPES-HIERARCHY-UNDERSPECIFIED")
     (:COMMENT NIL
      "% Barrett: This is bogus.  I think there is enough other text in the draft"
      "%    (the first bullet in ``Type Relationships'' plus the definition of"
      "%    \\term{system class}) to cover the requirements specified by "
      "%    DATA-TYPES-HIERARCHY-UNDERSPECIFIED that this could simply be removed."
      " The following \\term{type specifier} \\term{symbols} do not name"
      " \\term{structure} \\term{types} in any \\term{implementation}:"
      " \\typeref{cons}, \\typeref{symbol}, \\typeref{array}, "
      " \\typeref{number}," " \\typeref{character}, \\typeref{hash-table}, "
      " \\typeref{readtable}, \\typeref{package}, \\typeref{pathname}, "
      " \\typeref{stream}, or" " \\typeref{random-state}."
      " It is \\term{implementation-dependent}"
      " whether other \\term{standardized} \\term{type specifiers} name structure types. ")
     (:ENDISSUE NIL "DATA-TYPES-HIERARCHY-UNDERSPECIFIED") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defstruct") ", "
     (:SECREF NIL :SHARPSIGN-S) ", " (:SECREF NIL :PRINTING-STRUCTURES) " "
     :PAR))
   :PAR (:COMMENT NIL "%% ========== STANDARD-OBJECT")
   (:COM (:NAME "standard-object" :FTYPE "Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "standard-object")
     ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "class") " "
     (:TYPEREF NIL "standard-object") " is an " (:TERM NIL "instance") " of "
     (:TYPEREF NIL "standard-class") " and is a " (:TERM NIL "superclass")
     " of every " (:TERM NIL "class") " that is an " (:TERM NIL "instance")
     " of " (:TYPEREF NIL "standard-class") " except itself. "
     (:COMMENT NIL " and" "\\typeref{structure-class}.") :PAR))
   :PAR (:COMMENT NIL "%% ========== METHOD-COMBINATION")
   (:COM (:NAME "method-combination" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " "
     (:TYPEREF NIL "method-combination") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "Every "
     (:TERM NIL "method combination") " " (:TERM NIL "object") " is an "
     (:TERM NIL "indirect instance") " of the " (:TERM NIL "class") " "
     (:TYPEREF NIL "method-combination") ". A "
     (:TERM NIL "method combination") " " (:TERM NIL "object")
     " represents the information about the " (:TERM NIL "method combination")
     " being used by a " (:TERM NIL "generic function") ". A "
     (:TERM NIL "method combination") " " (:TERM NIL "object")
     " contains information about both the type of "
     (:TERM NIL "method combination")
     " and the arguments being used with that " (:TERM NIL "type") ". " :PAR))
   :PAR (:COMMENT NIL "%% ========== T" "% 2.0.0 6")
   (:COM (:NAME "t" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " The set of all " (:TERM NIL "objects") ". "
     (:COMMENT NIL "% 2.15.0 4") "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "t") " is a " (:TERM NIL "supertype") " of every "
     (:TERM NIL "type") ", including itself. Every " (:TERM NIL "object")
     " is of " (:TERM NIL "type") " " (:TYPEREF NIL "t") ". " :PAR
     (:ISSUE NIL "COMMON-TYPE:REMOVE") " "
     (:COMMENT NIL
      " Reference to type COMMON removed, and moved to Appendix A.")
     (:ENDISSUE NIL "COMMON-TYPE:REMOVE") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== SATISFIES")
   (:COM (:NAME "satisfies" :FTYPE "Type Specifier")
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Predicating. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:DEF (:KIND "type") (:NAMES NIL "satisfies")
      (:ARGLIST NIL "predicate-name"))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "predicate-name") "—a " (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " "
     (:COMMENT NIL "% 4.3.0 1" "\\itemitem") :PAR
     "This denotes the set of all " (:TERM NIL "objects") " that satisfy the "
     (:TERM NIL "predicate") " " (:PARAM NIL "predicate-name")
     ", which must be a " (:TERM NIL "symbol") " whose global "
     (:TERM NIL "function")
     " definition is a one-argument predicate. A name is required for "
     (:PARAM NIL "predicate-name") "; " (:TERM NIL "lambda expressions")
     " are not allowed. For example, the " (:TERM NIL "type specifier") " "
     (:TT NIL " (and integer (satisfies evenp))")
     " denotes the set of all even integers. The form "
     (:TT NIL " (typep " (:PARAM NIL "x") " '(satisfies " (:PARAM NIL "p")
      "))")
     " is equivalent to "
     (:TT NIL " (if (" (:PARAM NIL "p") " " (:PARAM NIL "x") ") t nil)") ". "
     (:COMMENT NIL
      " The call {\\tt (typep x '(satisfies p))} results in applying"
      " \\f{p} to \\f{x} and returning \\f{t} if the result is \\term{true} and \\nil\\ if the"
      " result is \\term{false}."
      "% 4.3.0 2                                   "
      "% I don't like the following example because it presupposes that standard-char-p is not"
      "  defined in terms of typep. -kmp 24-Oct-90"
      " For example, \\thetype{standard-char} could be defined as follows:" " "
      " \\code"
      "  (deftype standard-char () '(and character (satisfies standard-char-p)))"
      " \\endcode")
     :PAR (:ISSUE NIL "TYPE-SPECIFIER-ABBREVIATION:X3J13-JUN90-GUESS")
     " The argument is required. The " (:TERM NIL "symbol") " " (:MISC NIL "*")
     " can be the argument, but it denotes itself (the " (:TERM NIL "symbol")
     " " (:MISC NIL "*") "), and does not represent an unspecified value. "
     :PAR "The symbol " (:TYPEREF NIL "satisfies") " is not valid as a "
     (:TERM NIL "type specifier") ". "
     (:ENDISSUE NIL "TYPE-SPECIFIER-ABBREVIATION:X3J13-JUN90-GUESS") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== MEMBER")
   (:COM (:NAME "member" :FTYPE "Type Specifier")
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Combining. " :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:DEF (:KIND "type") (:NAMES NIL "member")
      (:ARGLIST NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "object")))))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "object") "—an " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " "
     (:COMMENT NIL "% 4.4.0 3" "\\itemitem") :PAR
     "This denotes the set containing the named " (:PARAM NIL "objects")
     ". An " (:TERM NIL "object") " is of this " (:TERM NIL "type")
     " if and only if it is " (:FUNREF NIL "eql") " to one of the specified "
     (:PARAM NIL "objects") ". " :PAR
     (:ISSUE NIL "TYPE-SPECIFIER-ABBREVIATION:X3J13-JUN90-GUESS") " The "
     (:TERM NIL "type specifiers") " " (:TT NIL "(member)") " and "
     (:MISC NIL "nil") " are equivalent. " (:MISC NIL "*") " can be among the "
     (:PARAM NIL "objects") ", but if so it denotes itself (the symbol "
     (:MISC NIL "*")
     ") and does not represent an unspecified value. The symbol "
     (:MISC NIL "member") " is not valid as a " (:TERM NIL "type specifier")
     "; and, specifically, it is not an abbreviation for either "
     (:TT NIL "(member)") " or " (:TT NIL "(member *)") ". "
     (:ENDISSUE NIL "TYPE-SPECIFIER-ABBREVIATION:X3J13-JUN90-GUESS") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR "the " (:TERM NIL "type") " "
     (:TYPEREF NIL "eql") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== NOT")
   (:COM (:NAME "not" :FTYPE "Type Specifier")
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Combining. " :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:COMMENT NIL "% 4.4.0 4")
     (:DEF (:KIND "type") (:NAMES NIL "not") (:ARGLIST NIL "typespec")) " "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "typespec") "—a " (:TERM NIL "type specifier") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     "This denotes the set of all " (:TERM NIL "objects")
     " that are not of the " (:TERM NIL "type") " " (:PARAM NIL "typespec")
     ". " :PAR (:ISSUE NIL "TYPE-SPECIFIER-ABBREVIATION:X3J13-JUN90-GUESS")
     " The argument is required, and cannot be " (:MISC NIL "*") ". " :PAR
     "The symbol " (:TYPEREF NIL "not") " is not valid as a "
     (:TERM NIL "type specifier") ". "
     (:ENDISSUE NIL "TYPE-SPECIFIER-ABBREVIATION:X3J13-JUN90-GUESS") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== AND")
   (:COM (:NAME "and" :FTYPE "Type Specifier")
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Combining. " :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:COMMENT NIL "% 4.4.0 5")
     (:DEF (:KIND "type") (:NAMES NIL "and")
      (:ARGLIST NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "typespec")))))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "typespec") "—a " (:TERM NIL "type specifier") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     "This denotes the set of all " (:TERM NIL "objects") " of the "
     (:TERM NIL "type") " determined by the intersection of the "
     (:PARAM NIL "typespecs") ". " :PAR
     (:ISSUE NIL "TYPE-SPECIFIER-ABBREVIATION:X3J13-JUN90-GUESS") " "
     (:MISC NIL "*") " is not permitted as an argument. " :PAR "The "
     (:TERM NIL "type specifiers") " " (:TT NIL "(and)") " and "
     (:MISC NIL "t") " are equivalent. The symbol " (:MISC NIL "and")
     " is not valid as a " (:TERM NIL "type specifier")
     ", and, specifically, it is not an abbreviation for " (:TT NIL "(and)")
     ". " (:ENDISSUE NIL "TYPE-SPECIFIER-ABBREVIATION:X3J13-JUN90-GUESS") " "
     :PAR))
   :PAR (:COMMENT NIL "%% ========== OR")
   (:COM (:NAME "or" :FTYPE "Type Specifier")
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Combining. " :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:COMMENT NIL "% 4.4.0 7 ")
     (:DEF (:KIND "type") (:NAMES NIL "or")
      (:ARGLIST NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "typespec")))))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "typespec") "—a " (:TERM NIL "type specifier") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     "This denotes the set of all " (:TERM NIL "objects") " of the "
     (:TERM NIL "type") " determined by the union of the "
     (:PARAM NIL "typespecs") ". For example, the " (:TERM NIL "type") " "
     (:TYPEREF NIL "list") " by definition is the same as "
     (:TT NIL "(or null cons)") ". Also, the value returned by "
     (:FUNREF NIL "position") " is an " (:TERM NIL "object") " of "
     (:TERM NIL "type") " " (:TT NIL "(or null (integer 0 *))") "; "
     (:I NIL "i.e.") ",  either " (:MISC NIL "nil") " or a non-negative "
     (:TERM NIL "integer") ". " :PAR
     (:ISSUE NIL "TYPE-SPECIFIER-ABBREVIATION:X3J13-JUN90-GUESS") " "
     (:MISC NIL "*") " is not permitted as an argument. " :PAR "The "
     (:TERM NIL "type specifiers") " " (:TT NIL "(or)") " and "
     (:MISC NIL "nil") " are equivalent. The symbol " (:TYPEREF NIL "or")
     " is not valid as a " (:TERM NIL "type specifier")
     "; and, specifically, it is not an abbreviation for " (:TT NIL "(or)")
     ". " (:ENDISSUE NIL "TYPE-SPECIFIER-ABBREVIATION:X3J13-JUN90-GUESS") " "
     :PAR))
   :PAR (:COMMENT NIL "%% ========== VALUES")
   (:COM (:NAME "values" :FTYPE "Type Specifier")
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Specializing. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:DEF (:KIND "type") (:NAMES NIL "values")
      (:ARGLIST NIL (:DOWN NIL "value-typespec")))
     " " :PAR (:REVIEWER NIL "Barmar: Missing " (:KEYREF NIL "key"))
     (:COMMENT NIL "!!!") :PAR
     (:BNF (:NAME "value-typespec")
      (:STAR NIL (:CURLY NIL (:PARAM NIL "typespec"))) " "
      (:BRAC NIL (:KEYWORD NIL " &optional") " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "typespec"))))
      " " (:BRAC NIL (:KEYWORD NIL " &rest") " typespec") " "
      (:BRAC NIL (:KEYREF NIL "allow-other-keys")))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "typespec") "—a " (:TERM NIL "type specifier") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     (:COMMENT NIL
      "% 4.5.0 14                                                    "
      "\\itemitem{\\tt (values \\starparam{value-type})}"
      "\\itemitem{\\tt (values \\param{value1-type} \\param{value2-type} ...)}")
     :PAR "This " (:TERM NIL "type specifier") " can be used only as the "
     (:PARAM NIL "value-type") " in a " (:TYPEREF NIL "function") " "
     (:TERM NIL "type specifier") " or a " (:SPECREF NIL "the") " "
     (:TERM NIL "special form") ". It is used to specify individual "
     (:TERM NIL "types") " when " (:TERM NIL "multiple values")
     " are involved. The " (:KEYREF NIL "optional") " and "
     (:KEYREF NIL "rest") " markers can appear in the "
     (:PARAM NIL "value-type") " list; they indicate the parameter list of a "
     (:TERM NIL "function") " that, when given to "
     (:SPECREF NIL "multiple-value-call") " along with the values, "
     (:COMMENT NIL "would be suitable for receiving those values.")
     "would correctly receive those values. " :PAR
     (:ISSUE NIL "TYPE-SPECIFIER-ABBREVIATION:X3J13-JUN90-GUESS")
     " The symbol " (:MISC NIL "*") " may not be among the "
     (:PARAM NIL "value-types") ". " :PAR "The symbol " (:MISC NIL "values")
     " is not valid as a " (:TERM NIL "type specifier")
     "; and, specifically, it is not an abbreviation for " (:TT NIL "(values)")
     ". " (:ENDISSUE NIL "TYPE-SPECIFIER-ABBREVIATION:X3J13-JUN90-GUESS") " "
     :PAR))
   :PAR (:COMMENT NIL "%% ========== EQL")
   (:COM (:NAME "eql" :FTYPE "Type Specifier")
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Combining. " :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:DEF (:KIND "type") (:NAMES NIL "eql") (:ARGLIST NIL "object")) " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "object") "—an " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     "Represents the " (:TERM NIL "type") " "
     (:COMMENT NIL
      "% Replaced per Boyer/Kaufmann/Moore #6 (by X3J13 vote at May 4-5, 1994 meeting)."
      "whose only \\term{element} is \\param{object}.")
     "of all " (:PARAM NIL "x") " for which "
     (:TT NIL "(eql " (:PARAM NIL "object") " " (:PARAM NIL "x") ")")
     " is true. " :PAR
     (:ISSUE NIL "TYPE-SPECIFIER-ABBREVIATION:X3J13-JUN90-GUESS")
     " The argument " (:PARAM NIL "object") " is required. The "
     (:PARAM NIL "object") " can be " (:MISC NIL "*")
     ", but if so it denotes itself (the symbol " (:MISC NIL "*")
     ") and does not represent an unspecified value. The " (:TERM NIL "symbol")
     " " (:MISC NIL "eql") " is not valid as an "
     (:TERM NIL "atomic type specifier") ". "
     (:COMMENT NIL
      "% Laubsch thinks this second part is gratuitous (and I agree). -kmp 20-Jan-92"
      "and, specifically, it is not an abbreviation for \\f{(eql *)}.")
     (:ENDISSUE NIL "TYPE-SPECIFIER-ABBREVIATION:X3J13-JUN90-GUESS") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== COERCE")
   (:COM (:NAME "coerce" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "coerce")
      (:ARGLIST NIL "object result-type") (:VALUES NIL "result"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "result-type") "—a "
     (:TERM NIL "type specifier") ". " :PAR (:PARAM NIL "result") "—an "
     (:TERM NIL "object") ", of " (:TERM NIL "type") " "
     (:PARAM NIL "result-type") " except in situations described in "
     (:SECREF NIL :RULE-OF-CANON-REP-FOR-COMPLEX-RATIONALS) ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 4.8.0 3")
     (:TERM NIL "Coerces") " the " (:PARAM NIL "object") " to "
     (:TERM NIL "type") " " (:PARAM NIL "result-type") ". " :PAR "If "
     (:PARAM NIL "object") " is already of " (:TERM NIL "type") " "
     (:PARAM NIL "result-type") ", the " (:PARAM NIL "object")
     " itself is returned, regardless of whether it would have been possible in general to coerce an "
     (:TERM NIL "object") " of some other " (:TERM NIL "type") " to "
     (:PARAM NIL "result-type") ". " :PAR (:COMMENT NIL "% 4.8.0 4")
     "Otherwise, the " (:PARAM NIL "object") " is " (:TERM NIL "coerced")
     " to " (:TERM NIL "type") " " (:PARAM NIL "result-type")
     " according to the following rules: " :PAR
     (:LIST NIL
      (:ITEM NIL (:TYPEREF NIL "sequence") " " :PAR
       (:ISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " "
       (:COMMENT NIL
        " If the \\param{result-type} is a \\term{subtype} of \\typeref{list},"
        " the result will be a \\term{list}." " "
        " If the \\param{result-type} is a \\term{subtype} of \\typeref{vector},"
        " then if the implementation can determine the element type specified"
        " for the \\param{result-type}, the element type of the resulting array "
        " is the result of \\term{upgrading} that element type; or, if the"
        " implementation can determine that the element type is unspecified (or \\f{*}),"
        " the element type of the resulting array is \\typeref{t};"
        " otherwise, an error is signaled.")
       :PAR "If the " (:PARAM NIL "result-type") " is a "
       (:TERM NIL "recognizable subtype") " of " (:TYPEREF NIL "list")
       ", and the " (:TERM NIL "object") " is a " (:TERM NIL "sequence")
       ", then the " (:PARAM NIL "result") " is a " (:TERM NIL "list")
       " that has the " (:TERM NIL "same") " " (:TERM NIL "elements") " as "
       (:PARAM NIL "object") ". " :PAR "If the " (:PARAM NIL "result-type")
       " is a " (:TERM NIL "recognizable subtype") " of "
       (:TYPEREF NIL "vector") ", and the " (:TERM NIL "object") " is a "
       (:TERM NIL "sequence") ", then the " (:PARAM NIL "result") " is a "
       (:TERM NIL "vector") " that has the " (:TERM NIL "same") " "
       (:TERM NIL "elements") " as " (:PARAM NIL "object") ". If "
       (:PARAM NIL "result-type") " is a specialized " (:TERM NIL "type")
       ", the " (:PARAM NIL "result") " has an "
       (:TERM NIL "actual array element type") " that is the result of "
       (:TERM NIL "upgrading") " the element type part of that "
       (:TERM NIL "specialized") " " (:TERM NIL "type")
       ". If no element type is specified, the element type defaults to "
       (:TYPEREF NIL "t") ". If the " (:TERM NIL "implementation")
       " cannot determine the element type, an error is signaled. " :PAR
       (:COMMENT NIL
        " I don't understand this and I can't figure out where it came from."
        " It's stated below that an error is signaled if the appropriate result"
        " cannot be constructed.  --sjl 7 Mar 92"
        "The consequences are undefined if the \\param{result} is not of \\term{type} "
        "\\param{result-type}.")
       (:ENDISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " " :PAR)
      (:ITEM NIL (:TYPEREF NIL "character") " " :PAR "If the "
       (:PARAM NIL "result-type") " is " (:TYPEREF NIL "character") " and the "
       (:TERM NIL "object") " is a " (:TERM NIL "character designator")
       ", the " (:PARAM NIL "result") " is the " (:TERM NIL "character")
       " it denotes. " :PAR (:ISSUE NIL "CHARACTER-LOOSE-ENDS:FIX") " "
       (:COMMENT NIL "Reference to INT-CHAR removed.")
       (:ENDISSUE NIL "CHARACTER-LOOSE-ENDS:FIX") " " :PAR)
      (:ITEM NIL (:TYPEREF NIL "complex") " " :PAR (:COMMENT NIL "% 4.8.0 7")
       "If the " (:PARAM NIL "result-type") " is " (:TYPEREF NIL "complex") " "
       (:COMMENT NIL
        "% \"number\" => \"real\" per Boyer/Kaufmann/Moore #7 (by X3J13 vote at May 4-5, 1994 meeting)"
        "% -kmp 9-May-94")
       "and the " (:TERM NIL "object") " is a " (:TERM NIL "real")
       ", then the " (:PARAM NIL "result") " is obtained by constructing a "
       (:TERM NIL "complex") " whose real part is the " (:TERM NIL "object")
       " and whose imaginary part is the result of " (:TERM NIL "coercing")
       " an " (:TERM NIL "integer") " zero to the " (:TERM NIL "type")
       " of the " (:TERM NIL "object") " (using " (:FUNREF NIL "coerce")
       "). (If the real part is a " (:TERM NIL "rational")
       ", however, then the result must be represented as a "
       (:TERM NIL "rational") " rather than a " (:TERM NIL "complex") "; see "
       (:SECREF NIL :RULE-OF-CANON-REP-FOR-COMPLEX-RATIONALS)
       ". So, for example, " (:TT NIL "(coerce 3 'complex)")
       " is permissible, but will return " (:TT NIL "3") ", which is not a "
       (:TERM NIL "complex") ".) " :PAR)
      (:ITEM NIL (:TYPEREF NIL "float") " " :PAR (:COMMENT NIL "% 4.8.0 6")
       "If the " (:PARAM NIL "result-type") " is any of "
       (:TYPEREF NIL "float") ", " (:TYPEREF NIL "short-float") ", "
       (:TYPEREF NIL "single-float") ", " (:TYPEREF NIL "double-float") ", "
       (:TYPEREF NIL "long-float") ", and the " (:TERM NIL "object") " is a "
       (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TERM NIL "real") ", "
       (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " then the "
       (:PARAM NIL "result") " is a " (:TERM NIL "float") " of "
       (:TERM NIL "type") " " (:PARAM NIL "result-type")
       " which is equal in sign and magnitude to the " (:TERM NIL "object")
       " to whatever degree of representational precision is permitted by that "
       (:TERM NIL "float") " representation. (If the "
       (:PARAM NIL "result-type") " is " (:TYPEREF NIL "float") " and "
       (:PARAM NIL "object") " is not already a " (:TERM NIL "float")
       ", then the " (:PARAM NIL "result") " is a " (:TERM NIL "single float")
       ".) " :PAR (:ISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " ")
      (:ITEM NIL (:TYPEREF NIL "function") " " :PAR "If the "
       (:PARAM NIL "result-type") " is " (:TYPEREF NIL "function") ", and "
       (:PARAM NIL "object") " is any "
       (:ISSUE NIL "COERCING-SETF-NAME-TO-FUNCTION:ALL-FUNCTION-NAMES") " "
       (:COMMENT NIL
        "% Barmar asked what about (COERCE '(SETF symbol) 'FUNCTION)"
        "% Mail sent to Quinquevirate. -kmp 3-Jun-91"
        "% This change was the result of that discussion. kmp 14-May-93"
        "\\term{symbol}")
       (:TERM NIL "function name") " "
       (:ENDISSUE NIL "COERCING-SETF-NAME-TO-FUNCTION:ALL-FUNCTION-NAMES")
       " that is " (:TERM NIL "fbound")
       " but that is globally defined neither as a " (:TERM NIL "macro name")
       " nor as a " (:TERM NIL "special operator") ", then the "
       (:PARAM NIL "result") " is the " (:TERM NIL "functional value") " of "
       (:PARAM NIL "object") ". " :PAR "If the " (:PARAM NIL "result-type")
       " is " (:TYPEREF NIL "function") ", and " (:PARAM NIL "object") " is a "
       (:TERM NIL "lambda expression") ", then the " (:PARAM NIL "result")
       " is a " (:TERM NIL "closure") " of " (:PARAM NIL "object") " in the "
       (:TERM NIL "null lexical environment") ". "
       (:ENDISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR)
      (:ITEM NIL (:TYPEREF NIL "t") " " :PAR (:COMMENT NIL "% 4.8.0 8") "Any "
       (:PARAM NIL "object") " can be " (:TERM NIL "coerced") " to an "
       (:TERM NIL "object") " of " (:TERM NIL "type") " " (:TYPEREF NIL "t")
       ". In this case, the " (:PARAM NIL "object") " is simply returned. "
       :PAR))
     " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (coerce '(a b c) 'vector) → #(A B C)
 (coerce 'a 'character) → #\\A
 (coerce 4.56 'complex) → #C(4.56 0.0)
 (coerce 4.5s0 'complex) → #C(4.5s0 0.0s0)
 (coerce 7/2 'complex) → 7/2
 (coerce 0 'short-float) → 0.0s0
 (coerce 3.5L0 'float) → 3.5L0
 (coerce 7/2 'float) → 3.5
 (coerce (cons 1 2) t) → (1 . 2)
")
     " " :PAR (:ISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH")
     " All the following " (:TERM NIL "forms") " should signal an error: " :PAR
     (:CODE NIL " (coerce '(a b c) '(vector * 4))
 (coerce #(a b c) '(vector * 4))
 (coerce '(a b c) '(vector * 2))
 (coerce #(a b c) '(vector * 2))
 (coerce \"foo\" '(string 2))
 (coerce #(#\\a #\\b #\\c) '(string 2))
 (coerce '(0 1) '(simple-bit-vector 3))
")
     " " (:ENDISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "If a coercion is not possible, an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " is signaled. " :PAR
     (:TT NIL "(coerce x 'nil)") " always signals an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error") ". " :PAR "An error "
     (:COMMENT NIL
      "KMP: I'm not sure UNDEFINED-FUNCTION is the right error type to signal here."
      "Barrett: Yeah. This isn't really right for `fbound but not function'. Make it ERROR."
      "KMP: Done")
     "of " (:TERM NIL "type") " " (:TYPEREF NIL "error") " is signaled if the "
     (:PARAM NIL "result-type") " is " (:TYPEREF NIL "function") " but "
     (:PARAM NIL "object") " is a " (:TERM NIL "symbol") " that is not "
     (:TERM NIL "fbound") " or if the " (:TERM NIL "symbol") " names a "
     (:TERM NIL "macro") " or a " (:TERM NIL "special operator") ". " :PAR
     (:ISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error")
     " should be signaled if " (:PARAM NIL "result-type")
     " specifies the number of elements and " (:PARAM NIL "object")
     " is of a different length. "
     (:ENDISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "rational") ", "
     (:FUNREF NIL "floor") ", " (:FUNREF NIL "char-code") ", "
     (:FUNREF NIL "char-int") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 4.8.0 9")
     "Coercions from " (:TERM NIL "floats") " to " (:TERM NIL "rationals")
     " and from " (:TERM NIL "ratios") " to " (:TERM NIL "integers")
     " are not provided because of rounding problems. " :PAR
     (:CODE NIL " (coerce x 't) ≡ (identity x) ≡ x
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DEFTYPE")
   (:COM (:NAME "deftype" :FTYPE "Macro") (:ISSUE NIL "DECLS-AND-DOC") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "deftype")
      (:ARGLIST NIL "name lambda-list "
       (:INTERLEAVE NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration")))
        " | " (:PARAM NIL "documentation"))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL "name"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "symbol") ". " :PAR (:PARAM NIL "lambda-list") "—a "
     (:TERM NIL "deftype lambda list") ". " :PAR (:PARAM NIL "declaration")
     "—a " (:MISC NIL "declare") " " (:TERM NIL "expression")
     "; not evaluated. " :PAR (:COMMENT NIL "% 4.7.0 4")
     (:PARAM NIL "documentation") "—a " (:TERM NIL "string")
     "; not evaluated. " :PAR (:PARAM NIL "form") "—a " (:TERM NIL "form") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 4.7.0 2")
     (:MACREF NIL "deftype") " defines a " (:TERM NIL "derived type specifier")
     " named " (:PARAM NIL "name") ". " :PAR "The meaning of the new "
     (:TERM NIL "type specifier") " is given in terms of "
     (:COMMENT NIL "tweaked  --sjl 7 Mar 92"
      "a body of code which expands the \\term{type specifier} into another")
     "a function which expands the " (:TERM NIL "type specifier")
     " into another " (:TERM NIL "type specifier")
     ", which itself will be expanded if it contains references to another "
     (:TERM NIL "derived type specifier") ". " :PAR "The newly defined "
     (:TERM NIL "type specifier") " may be referenced as a list of the form "
     (:TT NIL " (" (:PARAM NIL "name") " "
      (:PARAM NIL "arg" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MN NIL "1")))) " "
      (:PARAM NIL "arg" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MN NIL "2"))))
      " ...)")
     ". The number of arguments must be appropriate to the "
     (:PARAM NIL "lambda-list") ". If the new " (:TERM NIL "type specifier")
     " takes no arguments, or if all of its arguments are optional, the "
     (:TERM NIL "type specifier") " may be used as an "
     (:TERM NIL "atomic type specifier") ". " :PAR "The "
     (:TERM NIL "argument") " " (:TERM NIL "expressions") " to the "
     (:TERM NIL "type specifier") ", "
     (:PARAM NIL "arg" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MN NIL "1")))) " "
     (:MATH NIL (:MO NIL "…")) " "
     (:PARAM NIL "arg" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "n"))))
     ", are not " (:TERM NIL "evaluated") ". Instead, these "
     (:TERM NIL "literal objects") " become the " (:TERM NIL "objects")
     " to which corresponding " (:TERM NIL "parameters") " become "
     (:TERM NIL "bound") ". " :PAR "The body of the " (:MACREF NIL "deftype")
     " " (:TERM NIL "form") " "
     (:ISSUE NIL "DEFMACRO-BLOCK-SCOPE:EXCLUDES-BINDINGS") " (but not the "
     (:PARAM NIL "lambda-list") ") "
     (:ENDISSUE NIL "DEFMACRO-BLOCK-SCOPE:EXCLUDES-BINDINGS") " is "
     (:ISSUE NIL "FLET-IMPLICIT-BLOCK:YES") " implicitly enclosed in a "
     (:TERM NIL "block") " named " (:PARAM NIL "name") ", "
     (:ENDISSUE NIL "FLET-IMPLICIT-BLOCK:YES") " and is evaluated as an "
     (:TERM NIL "implicit progn") ", returning a new "
     (:TERM NIL "type specifier") ". " :PAR
     (:ISSUE NIL "DEFINING-MACROS-NON-TOP-LEVEL:ALLOW") " The "
     (:TERM NIL "lexical environment")
     " of the body is the one which was current at the time the "
     (:MACREF NIL "deftype") " form was evaluated, augmented by the "
     (:TERM NIL "variables") " in the " (:PARAM NIL "lambda-list") ". "
     (:ENDISSUE NIL "DEFINING-MACROS-NON-TOP-LEVEL:ALLOW") " " :PAR
     (:ISSUE NIL "RECURSIVE-DEFTYPE:EXPLICITLY-VAGUE")
     " Recursive expansion of the " (:TERM NIL "type specifier")
     " returned as the expansion must terminate, including the expansion of "
     (:TERM NIL "type specifiers") " which are nested within the expansion. "
     :PAR "The consequences are undefined if the result of fully expanding a "
     (:TERM NIL "type specifier")
     " contains any circular structure, except within the "
     (:TERM NIL "objects") " referred to by " (:TYPEREF NIL "member") " and "
     (:TYPEREF NIL "eql") " " (:TERM NIL "type specifiers") ". "
     (:ENDISSUE NIL "RECURSIVE-DEFTYPE:EXPLICITLY-VAGUE") " " :PAR
     (:COMMENT NIL "% 4.7.0 4") (:PARAM NIL "Documentation") " is attached to "
     (:PARAM NIL "name") " as a " (:TERM NIL "documentation string")
     " of kind " (:MISC NIL "type") ". " :PAR
     (:ISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     (:COMMENT NIL " added qualification about top-level-ness  --sjl 5 Mar 92")
     "If a " (:MACREF NIL "deftype") " " (:TERM NIL "form") " appears as a "
     (:TERM NIL "top level form") ", the " (:TERM NIL "compiler")
     " must ensure that the " (:PARAM NIL "name")
     " is recognized in subsequent " (:TERM NIL "type") " declarations. The "
     (:TERM NIL "programmer") " must ensure that the body of a "
     (:MACREF NIL "deftype") " form can be " (:TERM NIL "evaluated")
     " at compile time if the " (:PARAM NIL "name")
     " is referenced in subsequent " (:TERM NIL "type")
     " declarations. If the expansion of a " (:TERM NIL "type specifier")
     " is not defined fully at compile time (perhaps because it expands into an unknown "
     (:TERM NIL "type specifier") " or a " (:TYPEREF NIL "satisfies")
     " of a named " (:TERM NIL "function")
     " that isn't defined in the compile-time environment), an "
     (:TERM NIL "implementation") " may ignore any references to this "
     (:TERM NIL "type") " in declarations and/or signal a warning. "
     (:ENDISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     :PAR)
    (:PART (:NAME "Examples") " " (:COMMENT NIL "% 4.7.0 5")
     (:CODE NIL " (defun equidimensional (a)
   (or (< (array-rank a) 2)
       (apply #'= (array-dimensions a)))) → EQUIDIMENSIONAL
 (deftype square-matrix (&optional type size)
   `(and (array ,type (,size ,size))
         (satisfies equidimensional))) → SQUARE-MATRIX
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR
     (:COMMENT NIL " addressed in the packages chapter.  --sjl 5 Mar 92"
      "\\issue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}"
      "The consequences are undefined if a \\term{symbol} in \\thepackage{common-lisp}"
      "is used as the \\param{name} argument."
      "\\endissue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MISC NIL "declare") ", "
     (:MACREF NIL "defmacro") ", " (:FUNREF NIL "documentation") ", "
     (:SECREF NIL :TYPE-SPECIFIERS) ", " (:SECREF NIL :DOC-VS-DECLS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SUBTYPEP")
   (:COM (:NAME "subtypep" :FTYPE "Function")
    (:ISSUE NIL "SUBTYPEP-ENVIRONMENT:ADD-ARG") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "subtypep")
      (:ARGLIST NIL "type-1 type-2 " (:KEYWORD NIL " &optional")
       " environment")
      (:VALUES NIL "subtype-p, valid-p"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "type-1") "—a "
     (:TERM NIL "type specifier") ". "
     (:COMMENT NIL " acceptable to \\funref{typep}") :PAR (:PARAM NIL "type-2")
     "—a " (:TERM NIL "type specifier") ". "
     (:COMMENT NIL " acceptable to \\funref{typep}.") :PAR
     (:COMMENT NIL
      "!!! as opposed to what? need a glossary term -kmp 15-Feb-91")
     :PAR (:PARAM NIL "environment") "—an " (:TERM NIL "environment") " "
     (:TERM NIL "object") ". The default is " (:MISC NIL "nil")
     ", denoting the " (:TERM NIL "null lexical environment")
     " and the current " (:TERM NIL "global environment") ". "
     (:COMMENT NIL "!!! Need to say what happens with the environment.") :PAR
     (:PARAM NIL "subtype-p") "—a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "valid-p") "—a " (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.1 3") "If "
     (:PARAM NIL "type-1") " is a " (:TERM NIL "recognizable subtype") " of "
     (:PARAM NIL "type-2") ", the first " (:TERM NIL "value") " is "
     (:TERM NIL "true") ". Otherwise, the first " (:TERM NIL "value") " is "
     (:TERM NIL "false") ", indicating that either " (:PARAM NIL "type-1")
     " is not a " (:TERM NIL "subtype") " of " (:PARAM NIL "type-2")
     ", or else " (:PARAM NIL "type-1") " is a " (:TERM NIL "subtype") " of "
     (:PARAM NIL "type-2") " but is not a " (:TERM NIL "recognizable subtype")
     ". " :PAR "A second " (:TERM NIL "value")
     " is also returned indicating the `certainty' of the first "
     (:TERM NIL "value") ". If this value is " (:TERM NIL "true")
     ", then the first value is an accurate indication of the "
     (:TERM NIL "subtype") " relationship. (The second " (:TERM NIL "value")
     " is always " (:TERM NIL "true") " when the first " (:TERM NIL "value")
     " is " (:TERM NIL "true") ".) " :PAR (:NEXTFIGURE (:CAPS T))
     " summarizes the possible combinations of " (:TERM NIL "values")
     " that might result. " :PAR
     (:TABLE (:NAME ("Result possibilities for subtypep"))
      (:ROW NIL (:CELL NIL "Value 1") (:CELL NIL "Value 2")
       (:CELL NIL "Meaning"))
      (:ROW NIL (:CELL NIL (:TERM NIL "true")) (:CELL NIL (:TERM NIL "true"))
       (:CELL NIL (:PARAM NIL "type-1") " is definitely a "
        (:TERM NIL "subtype") " of " (:PARAM NIL "type-2") "."))
      (:ROW NIL (:CELL NIL (:TERM NIL "false")) (:CELL NIL (:TERM NIL "true"))
       (:CELL NIL (:PARAM NIL "type-1") " is definitely not a "
        (:TERM NIL "subtype") " of " (:PARAM NIL "type-2") "."))
      (:ROW NIL (:CELL NIL (:TERM NIL "false")) (:CELL NIL (:TERM NIL "false"))
       (:CELL NIL (:FUNREF NIL "subtypep")
        " could not determine the relationship," (:BR NIL) " so "
        (:PARAM NIL "type-1") " might or might not be a " (:TERM NIL "subtype")
        " of " (:PARAM NIL "type-2") ".")))
     " " :PAR (:ISSUE NIL "SUBTYPEP-TOO-VAGUE:CLARIFY-MORE") " " :PAR
     (:FUNREF NIL "subtypep") " is permitted to return the "
     (:TERM NIL "values") " " (:TERM NIL "false") " and " (:TERM NIL "false")
     " only when at least one argument involves one of these "
     (:TERM NIL "type specifiers") ": " (:TYPEREF NIL "and") ", "
     (:COMMENT NIL " Added per Barrett:") (:TYPEREF NIL "eql")
     ", the list form of " (:TYPEREF NIL "function") ", "
     (:TYPEREF NIL "member") ", " (:TYPEREF NIL "not") ", " (:TYPEREF NIL "or")
     ", " (:TYPEREF NIL "satisfies") ", or " (:TYPEREF NIL "values") ". (A "
     (:TERM NIL "type specifier") " `involves' such a " (:TERM NIL "symbol")
     " if, after being " (:TERM NIL "type expanded") ", it contains that "
     (:TERM NIL "symbol")
     " in a position that would call for its meaning as a "
     (:TERM NIL "type specifier")
     " to be used.) One consequence of this is that if neither "
     (:PARAM NIL "type-1") " nor " (:PARAM NIL "type-2")
     " involves any of these " (:TERM NIL "type specifiers") ", then "
     (:FUNREF NIL "subtypep")
     " is obliged to determine the relationship accurately. In particular, "
     (:FUNREF NIL "subtypep") " returns the " (:TERM NIL "values") " "
     (:TERM NIL "true") " and " (:TERM NIL "true") " if the arguments are "
     (:FUNREF NIL "equal") " and do not involve any of these "
     (:TERM NIL "type specifiers") ". " :PAR (:FUNREF NIL "subtypep")
     " never returns a second value of " (:MISC NIL "nil") " when both "
     (:PARAM NIL "type-1") " and " (:PARAM NIL "type-2")
     " involve only the names in "
     (:FIGREF NIL :STANDARDIZED-ATOMIC-TYPE-SPECS) ", or names of "
     (:TERM NIL "types") " defined by " (:MACREF NIL "defstruct") ", "
     (:MACREF NIL "define-condition") ", or " (:MACREF NIL "defclass") ", or "
     (:TERM NIL "derived types") " that expand into only those names. While "
     (:TERM NIL "type specifiers") " listed in "
     (:FIGREF NIL :STANDARDIZED-ATOMIC-TYPE-SPECS) " and names of "
     (:MACREF NIL "defclass") " and " (:MACREF NIL "defstruct")
     " can in some cases be implemented as " (:TERM NIL "derived types") ", "
     (:FUNREF NIL "subtypep") " regards them as primitive. " :PAR
     "The relationships between " (:TERM NIL "types") " reflected by "
     (:FUNREF NIL "subtypep")
     " are those specific to the particular implementation. For example, if an implementation supports only a single type of floating-point numbers, in that implementation "
     (:TT NIL "(subtypep 'float 'long-float)") " returns the "
     (:TERM NIL "values") " " (:TERM NIL "true") " and " (:TERM NIL "true")
     " (since the two " (:TERM NIL "types") " are identical). "
     (:ENDISSUE NIL "SUBTYPEP-TOO-VAGUE:CLARIFY-MORE") " " :PAR
     (:ISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING")
     " For all " (:PARAM NIL "T1") " and " (:PARAM NIL "T2") " other than "
     (:TT NIL "*") ", " (:TT NIL "(array " (:PARAM NIL "T1") ")") " and "
     (:TT NIL "(array " (:PARAM NIL "T2") ")") " are two different "
     (:TERM NIL "type specifiers")
     " that always refer to the same sets of things if and only if they refer to "
     (:TERM NIL "arrays") " of exactly the same specialized representation, "
     (:I NIL "i.e.") ",  if "
     (:TT NIL "(upgraded-array-element-type '" (:PARAM NIL "T1") ")") " and "
     (:TT NIL "(upgraded-array-element-type '" (:PARAM NIL "T2") ")")
     " return two different " (:TERM NIL "type specifiers")
     " that always refer to the same sets of " (:TERM NIL "objects")
     ". This is another way of saying that "
     (:TT NIL "`(array " (:PARAM NIL "type-specifier") ")") " and "
     (:TT NIL "`(array ,(upgraded-array-element-type '"
      (:PARAM NIL "type-specifier") "))")
     " refer to the same set of specialized " (:TERM NIL "array")
     " representations. For all " (:PARAM NIL "T1") " and " (:PARAM NIL "T2")
     " other than " (:TT NIL "*") ", "
     (:COMMENT NIL "tweaked --sjl 7 Mar 92" "the specified intersection for "
      "    \\f{(array \\param{T1})}" "and \\f{(array \\param{T2})} is \\nil\\")
     "the intersection of " (:TT NIL "(array " (:PARAM NIL "T1") ")") " and "
     (:TT NIL "(array " (:PARAM NIL "T2") ")")
     " is the empty set if and only if they refer to " (:TERM NIL "arrays")
     " of different, distinct specialized representations. " :PAR "Therefore, "
     :PAR
     (:CODE NIL " (subtypep '(array T1) '(array T2)) → " (:TERM NIL "true") "
")
     " if and only if " :PAR
     (:CODE NIL " (upgraded-array-element-type 'T1)  and
 (upgraded-array-element-type 'T2)  
")
     " " :PAR "return two different " (:TERM NIL "type specifiers")
     " that always refer to the same sets of " (:TERM NIL "objects") ". " :PAR
     "For all type-specifiers " (:PARAM NIL "T1") " and " (:PARAM NIL "T2")
     " other than " (:TT NIL "*") ", " :PAR
     (:CODE NIL " (subtypep '(complex T1) '(complex T2)) → " (:TERM NIL "true")
      ", " (:TERM NIL "true") "
")
     " " :PAR "if: "
     (:LIST NIL
      (:ITEM NIL "1. " (:TT NIL "T1") " is a " (:TERM NIL "subtype") " of "
       (:TT NIL "T2") ", or ")
      (:ITEM NIL "2. "
       (:TT NIL "(upgraded-complex-part-type '" (:PARAM NIL "T1") ")") " and "
       (:TT NIL "(upgraded-complex-part-type '" (:PARAM NIL "T2") ")")
       " return two different " (:TERM NIL "type specifiers")
       " that always refer to the same sets of " (:TERM NIL "objects")
       "; in this case, " (:TT NIL "(complex " (:PARAM NIL "T1") ")") " and "
       (:TT NIL "(complex " (:PARAM NIL "T2") ")")
       " both refer to the same specialized representation. "))
     " The " (:TERM NIL "values") " are " (:TERM NIL "false") " and "
     (:TERM NIL "true") " otherwise. " :PAR "The form " :PAR
     (:CODE NIL " (subtypep '(complex single-float) '(complex float))
")
     " must return " (:TERM NIL "true") " in all implementations, but " :PAR
     (:CODE NIL " (subtypep '(array single-float) '(array float))
")
     " " :PAR "returns " (:TERM NIL "true")
     " only in implementations that do not have a specialized "
     (:TERM NIL "array") " representation for " (:TERM NIL "single floats")
     " distinct from that for other " (:TERM NIL "floats") ". " :PAR
     (:ENDISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     :PAR
     (:COMMENT NIL "% KAB: What??"
      " When a type description is restricted by range or enumeration, and the"
      " restricted type is empty.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (subtypep 'compiled-function 'function) → "
      (:TERM NIL "true") ", " (:TERM NIL "true") "
 (subtypep 'null 'list) → "
      (:TERM NIL "true") ", " (:TERM NIL "true") "
 (subtypep 'null 'symbol) → "
      (:TERM NIL "true") ", " (:TERM NIL "true") "
 (subtypep 'integer 'string) → "
      (:TERM NIL "false") ", " (:TERM NIL "true") "
 (subtypep '(satisfies dummy) nil) → "
      (:TERM NIL "false") ", " (:TERM NIL "implementation-dependent") "
 (subtypep '(integer 1 3) '(integer 1 4)) → "
      (:TERM NIL "true") ", " (:TERM NIL "true") "
 (subtypep '(integer (0) (0)) 'nil) → "
      (:TERM NIL "true") ", " (:TERM NIL "true") "
 (subtypep 'nil '(integer (0) (0))) → "
      (:TERM NIL "true") ", " (:TERM NIL "true") "
 (subtypep '(integer (0) (0)) '(member)) → "
      (:TERM NIL "true") ", " (:TERM NIL "true") " ;or " (:TERM NIL "false")
      ", " (:TERM NIL "false") "
 (subtypep '(member) 'nil) → "
      (:TERM NIL "true") ", " (:TERM NIL "true") " ;or " (:TERM NIL "false")
      ", " (:TERM NIL "false") "
 (subtypep 'nil '(member)) → "
      (:TERM NIL "true") ", " (:TERM NIL "true") " ;or " (:TERM NIL "false")
      ", " (:TERM NIL "false") "
")
     " " :PAR (:ISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING")
     " Let " (:TT NIL "<aet-x>") " and " (:TT NIL "<aet-y>")
     " be two distinct " (:TERM NIL "type specifiers")
     " that do not always refer to the same sets of " (:TERM NIL "objects")
     " in a given implementation, but for which " (:FUNREF NIL "make-array")
     ", will return an " (:TERM NIL "object") " of the same "
     (:TERM NIL "array") " " (:TERM NIL "type") ". " :PAR
     "Thus, in each case, " :PAR
     (:CODE NIL
      "  (subtypep (array-element-type (make-array 0 :element-type '<aet-x>))
            (array-element-type (make-array 0 :element-type '<aet-y>)))
→ "
      (:TERM NIL "true") ", " (:TERM NIL "true") "
 
  (subtypep (array-element-type (make-array 0 :element-type '<aet-y>))
            (array-element-type (make-array 0 :element-type '<aet-x>)))
→ "
      (:TERM NIL "true") ", " (:TERM NIL "true") "
")
     " " (:ENDISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING")
     " " :PAR "If " (:TT NIL "(array <aet-x>)") " and "
     (:TT NIL "(array <aet-y>)")
     " are different names for exactly the same set of " (:TERM NIL "objects")
     ", these names should always refer to the same sets of "
     (:TERM NIL "objects")
     ". That implies that the following set of tests are also true: " :PAR
     (:CODE NIL " (subtypep '(array <aet-x>) '(array <aet-y>)) → "
      (:TERM NIL "true") ", " (:TERM NIL "true") "
 (subtypep '(array <aet-y>) '(array <aet-x>)) → "
      (:TERM NIL "true") ", " (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :TYPES) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:ISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING")
     " The small differences between the " (:FUNREF NIL "subtypep")
     " specification for the " (:TYPEREF NIL "array") " and "
     (:TYPEREF NIL "complex")
     " types are necessary because there is no creation function for "
     (:TERM NIL "complexes")
     " which allows the specification of the resultant part type independently of the actual types of the parts. Thus in the case of the "
     (:TERM NIL "type") " " (:TYPEREF NIL "complex")
     ", the actual type of the parts is referred to, although a "
     (:TERM NIL "number") " can be a member of more than one "
     (:TERM NIL "type") ". For example, " (:TT NIL "17") " is of "
     (:TERM NIL "type") " " (:TT NIL "(mod 18)") " as well as "
     (:TERM NIL "type") " " (:TT NIL "(mod 256)") " and " (:TERM NIL "type")
     " " (:TYPEREF NIL "integer") "; and " (:TT NIL "2.3f5") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "single-float") " as well as "
     (:TERM NIL "type") " " (:TYPEREF NIL "float") ". "
     (:ENDISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     :PAR (:ENDISSUE NIL "SUBTYPEP-ENVIRONMENT:ADD-ARG") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== TYPE-OF")
   (:COM (:NAME "type-of" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "type-of") (:ARGLIST NIL "object")
      (:VALUES NIL "typespec"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "typespec") "—a "
     (:TERM NIL "type specifier") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:ISSUE NIL "TYPE-OF-UNDERCONSTRAINED:ADD-CONSTRAINTS") " " :PAR
     "Returns a " (:TERM NIL "type specifier") ", " (:PARAM NIL "typespec")
     ", for a " (:TERM NIL "type") " that has the " (:PARAM NIL "object")
     " as an " (:TERM NIL "element") ". The " (:PARAM NIL "typespec")
     " satisfies the following: " :PAR
     (:LIST NIL
      (:ITEM NIL "1. For any " (:PARAM NIL "object") " that is an "
       (:TERM NIL "element") " of some " (:TERM NIL "built-in type") ": " :PAR
       (:LIST NIL
        (:ITEM NIL "a. the " (:TERM NIL "type") " returned is a "
         (:TERM NIL "recognizable subtype") " of that "
         (:TERM NIL "built-in type") ". " :PAR)
        (:ITEM NIL "b. "
         (:COMMENT NIL
          "KMP: I added MEMBER and EQL because they seemed to be missing only by accident."
          "     The discussion of TYPE-OF-UNDERCONSTRAINED seems to imply that MEMBER"
          "     is missing due to editing error. And I think EQL was added later. -kmp 3-Jun-91")
         "the " (:TERM NIL "type") " returned does not involve "
         (:TT NIL "and") ", " (:TT NIL "eql") ", " (:TT NIL "member") ", "
         (:TT NIL "not") ", " (:TT NIL "or") ", " (:TT NIL "satisfies") ", or "
         (:TT NIL "values") ". "))
       " " :PAR)
      (:ITEM NIL "2. For all " (:PARAM NIL "objects") ", "
       (:TT NIL "(typep " (:PARAM NIL "object") " (type-of "
        (:PARAM NIL "object") "))")
       " returns " (:TERM NIL "true") ". " (:COMMENT NIL "Per Barmar:")
       "Implicit in this is that " (:TERM NIL "type specifiers")
       " which are not valid for use with " (:FUNREF NIL "typep")
       ", such as the " (:TERM NIL "list") " form of the "
       (:TYPEREF NIL "function") " " (:TERM NIL "type specifier")
       ", are never returned by " (:FUNREF NIL "type-of") ". " :PAR)
      (:ITEM NIL "3. The " (:TERM NIL "type") " returned by "
       (:FUNREF NIL "type-of") " is always a "
       (:TERM NIL "recognizable subtype") " of the " (:TERM NIL "class")
       " returned by " (:FUNREF NIL "class-of") ". That is, " :PAR
       (:CODE NIL " (subtypep (type-of " (:PARAM NIL "object") ") (class-of "
        (:PARAM NIL "object") ")) → " (:TERM NIL "true") ", "
        (:TERM NIL "true") "
")
       " " :PAR)
      (:ITEM NIL "4. For " (:PARAM NIL "objects") " of metaclass "
       (:TYPEREF NIL "structure-class") " or " (:TYPEREF NIL "standard-class")
       ", " (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND")
       " and for " (:TERM NIL "conditions") ", "
       (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
       (:FUNREF NIL "type-of") " returns the " (:TERM NIL "proper name")
       " of the " (:TERM NIL "class") " returned by " (:FUNREF NIL "class-of")
       " if it has a " (:TERM NIL "proper name") ", and otherwise returns the "
       (:TERM NIL "class") " itself. In particular, for "
       (:PARAM NIL "objects")
       " created by the constructor function of a structure defined with "
       (:MACREF NIL "defstruct") " without a " (:KWD NIL "type") " option, "
       (:FUNREF NIL "type-of") " returns the structure name; and for "
       (:PARAM NIL "objects") " created by " (:FUNREF NIL "make-condition")
       ", the " (:PARAM NIL "typespec") " is the " (:TERM NIL "name")
       " of the " (:TERM NIL "condition") " " (:TERM NIL "type") ". " :PAR
       (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:TYPE-OF-HANDLES-FLOATS")
       " ")
      (:ITEM NIL "5. For each of the " (:TERM NIL "types") " "
       (:TYPEREF NIL "short-float") ", " (:TYPEREF NIL "single-float") ", "
       (:TYPEREF NIL "double-float") ", or " (:TYPEREF NIL "long-float")
       " of which the " (:PARAM NIL "object") " is an " (:TERM NIL "element")
       ", the " (:PARAM NIL "typespec") " is a "
       (:TERM NIL "recognizable subtype") " of that " (:TERM NIL "type") ". "
       (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:TYPE-OF-HANDLES-FLOATS")
       " " :PAR))
     " " :PAR (:ENDISSUE NIL "TYPE-OF-UNDERCONSTRAINED:ADD-CONSTRAINTS") " "
     :PAR
     (:COMMENT NIL
      "(The CLOS specification has already specified that class objects are"
      "acceptable wherever \\term{type specifiers} are, and in particular, as input to"
      "SUBTYPEP and TYPEP.)" " "
      "This proposal is intended to be consistent with 88-002R, "
      "and not to conflict with any of the definitions in that document.")
     :PAR
     (:COMMENT NIL "If \\param{object} is not a user-defined named"
      "\\term{structure} " "created by \\macref{defstruct}, "
      "\\funref{type-of} returns a \\term{type} of which " "\\param{object} "
      "is a member." "%% 4.9.0 3"
      "The result in this case is \\term{implementation-dependent}."
      "For example:" "\\code" " (type-of \"abc\") \\EV SIMPLE-STRING"
      " (type-of \"abc\") \\EV STRING" " (type-of \"abc\") \\EV ARRAY"
      "\\endcode" "If \\param{object} is a user-defined named"
      "\\term{structure} "
      "created by \\macref{defstruct}, then \\funref{type-of} "
      "returns the type name" "of that \\term{structure}.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR (:CODE NIL) " " :PAR
     (:ISSUE NIL "TYPE-OF-UNDERCONSTRAINED:ADD-CONSTRAINTS") " "
     (:CODE NIL " (type-of 'a) → SYMBOL          
 (type-of '(1 . 2))
→ CONS
OR→ (CONS FIXNUM FIXNUM)
 (type-of #c(0 1))
→ COMPLEX
OR→ (COMPLEX INTEGER)
 (defstruct temp-struct x y z) → TEMP-STRUCT
 (type-of (make-temp-struct)) → TEMP-STRUCT
 (type-of \"abc\")
→ STRING
OR→ (STRING 3)
 (subtypep (type-of \"abc\") 'string) → "
      (:TERM NIL "true") ", " (:TERM NIL "true") "
 (type-of (expt 2 40))
→ BIGNUM
OR→ INTEGER
OR→ (INTEGER 1099511627776 1099511627776)
OR→ SYSTEM::TWO-WORD-BIGNUM
OR→ FIXNUM
 (subtypep (type-of 112312) 'integer) → "
      (:TERM NIL "true") ", " (:TERM NIL "true") "
 (defvar *foo* (make-array 5 :element-type t)) → *FOO*
 (class-name (class-of *foo*)) → VECTOR
 (type-of *foo*)
→ VECTOR
OR→ (VECTOR T 5)
")
     " " (:ENDISSUE NIL "TYPE-OF-UNDERCONSTRAINED:ADD-CONSTRAINTS") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "array-element-type") ", "
     (:FUNREF NIL "class-of") ", " (:MACREF NIL "defstruct") ", "
     (:MACREF NIL "typecase") ", " (:FUNREF NIL "typep") ", "
     (:SECREF NIL :TYPES) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "Implementors are encouraged to arrange for " (:FUNREF NIL "type-of")
     " to return " (:ISSUE NIL "TYPE-OF-UNDERCONSTRAINED:ADD-CONSTRAINTS") " "
     (:COMMENT NIL
      "the most specific \\term{type} that can be conveniently computed and"
      "is likely to be useful to the user.")
     "a portable value. "
     (:COMMENT NIL "Barmar: \"a type specifier defined in this standard\""
      "KMP: This is a little messy. The problem is that user-defined types are"
      "     not directly described here,...")
     (:ENDISSUE NIL "TYPE-OF-UNDERCONSTRAINED:ADD-CONSTRAINTS") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== TYPEP")
   (:COM (:NAME "typep" :FTYPE "Function")
    (:ISSUE NIL "SUBTYPEP-ENVIRONMENT:ADD-ARG") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "typep")
      (:ARGLIST NIL "object type-specifier " (:KEYWORD NIL " &optional")
       " environment")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "type-specifier") "—any "
     (:TERM NIL "type specifier") " except " (:ISSUE NIL "FUNCTION-TYPE")
     (:COMMENT NIL " The following will be deleted from the standard:" " "
      " \\declref{function},")
     (:ENDISSUE NIL "FUNCTION-TYPE") (:MISC NIL "values") ", or a "
     (:TERM NIL "type specifier") " list whose first element is either "
     (:MISC NIL "function") " or " (:MISC NIL "values") ". " :PAR
     (:PARAM NIL "environment") "—an " (:TERM NIL "environment") " "
     (:TERM NIL "object") ". The default is " (:MISC NIL "nil")
     ", denoting the " (:TERM NIL "null lexical environment")
     " and the and current " (:TERM NIL "global environment") ". "
     (:COMMENT NIL "!!! Need to say what happens with the environment.") :PAR
     (:PARAM NIL "generalized-boolean") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.1 2") "Returns "
     (:TERM NIL "true") " if " (:PARAM NIL "object") " is of the "
     (:TERM NIL "type") " specified by " (:PARAM NIL "type-specifier")
     "; otherwise, returns " (:TERM NIL "false") ". " :PAR
     (:COMMENT NIL
      " already stated elsewhere, not crucial here.  --sjl 7 Mar 92"
      "\\param{Object} can be of more than one \\term{type},"
      "since one \\term{type} can include another.  ")
     "A " (:PARAM NIL "type-specifier") " of the form "
     (:TT NIL "(satisfies fn)") " is handled by applying the function "
     (:TT NIL "fn") " to " (:PARAM NIL "object") ". " :PAR
     (:ISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     (:TT NIL "(typep " (:PARAM NIL "object") " '(array "
      (:PARAM NIL "type-specifier") "))")
     ", where " (:PARAM NIL "type-specifier") " is not " (:TT NIL "*")
     ", returns " (:TERM NIL "true") " if and only if " (:PARAM NIL "object")
     " is an " (:TERM NIL "array") " that could be the result of supplying "
     (:PARAM NIL "type-specifier") " as the " (:KWD NIL "element-type")
     " argument to " (:FUNREF NIL "make-array") ". " (:TT NIL "(array *)")
     " refers to all " (:TERM NIL "arrays")
     " regardless of element type, while "
     (:TT NIL "(array " (:PARAM NIL "type-specifier") ")")
     " refers only to those " (:TERM NIL "arrays")
     " that can result from giving " (:PARAM NIL "type-specifier") " as the "
     (:KWD NIL "element-type") " argument to " (:FUNREF NIL "make-array")
     ". A similar interpretation applies to "
     (:TT NIL "(simple-array " (:PARAM NIL "type-specifier") ")") " and "
     (:TT NIL "(vector " (:PARAM NIL "type-specifier") ")") ". See "
     (:SECREF NIL :ARRAY-UPGRADING) ". " :PAR
     (:TT NIL "(typep " (:PARAM NIL "object") " '(complex "
      (:PARAM NIL "type-specifier") "))")
     " returns " (:TERM NIL "true") " for all " (:TERM NIL "complex")
     " numbers that can result from giving " (:TERM NIL "numbers") " of type "
     (:PARAM NIL "type-specifier") " to the " (:TERM NIL "function") " "
     (:FUNREF NIL "complex") ", plus all other " (:TERM NIL "complex")
     " numbers of the same specialized representation. Both the real and the imaginary parts of any such "
     (:TERM NIL "complex") " number must satisfy: " :PAR
     (:CODE NIL " (typep realpart 'type-specifier)
 (typep imagpart 'type-specifier)
")
     " " :PAR "See the " (:TERM NIL "function") " "
     (:FUNREF NIL "upgraded-complex-part-type") ". " :PAR
     (:ENDISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (typep 12 'integer) → " (:TERM NIL "true") "
 (typep (1+ most-positive-fixnum) 'fixnum) → "
      (:TERM NIL "false") "
 (typep nil t) → "
      (:TERM NIL "true") "
 (typep nil nil) → "
      (:TERM NIL "false") "
 (typep 1 '(mod 2)) → "
      (:TERM NIL "true") "
 (typep #c(1 1) '(complex (eql 1))) → "
      (:TERM NIL "true") "
;; To understand this next example, you might need to refer to
;; "
      (:SECREF NIL :RULE-OF-CANON-REP-FOR-COMPLEX-RATIONALS) ".
 (typep #c(0 0) '(complex (eql 0))) → "
      (:TERM NIL "false") "
")
     " " :PAR (:ISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING")
     " Let " (:TT NIL "A" (:SUB NIL "x")) " and " (:TT NIL "A" (:SUB NIL "y"))
     " be two " (:TERM NIL "type specifiers") " that denote different "
     (:TERM NIL "types") ", but for which " :PAR
     (:CODE NIL " (upgraded-array-element-type 'A" (:SUB NIL "x") ")
")
     " and " :PAR
     (:CODE NIL " (upgraded-array-element-type 'A" (:SUB NIL "y") ")
")
     " denote the same " (:TERM NIL "type") ". Notice that " :PAR
     (:CODE NIL " (typep (make-array 0 :element-type 'A" (:SUB NIL "x")
      ") '(array A" (:SUB NIL "x") ")) → " (:TERM NIL "true") "
 (typep (make-array 0 :element-type 'A"
      (:SUB NIL "y") ") '(array A" (:SUB NIL "y") ")) → " (:TERM NIL "true") "
 (typep (make-array 0 :element-type 'A"
      (:SUB NIL "x") ") '(array A" (:SUB NIL "y") ")) → " (:TERM NIL "true") "
 (typep (make-array 0 :element-type 'A"
      (:SUB NIL "y") ") '(array A" (:SUB NIL "x") ")) → " (:TERM NIL "true") "
")
     " " :PAR
     (:ENDISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL "% 4.5.0.0 10") "An error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") " is signaled if " (:PARAM NIL "type-specifier")
     " is " (:TT NIL "values") ", or a " (:TERM NIL "type specifier")
     " list whose first element is either " (:MISC NIL "function") " or "
     (:MISC NIL "values") ". " :PAR "The consequences are undefined if the "
     (:PARAM NIL "type-specifier") " is not a " (:TERM NIL "type specifier")
     ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "type-of") ", "
     (:FUNREF NIL "upgraded-array-element-type") ", "
     (:FUNREF NIL "upgraded-complex-part-type") ", "
     (:SECREF NIL :TYPE-SPECIFIERS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:TERM NIL "Implementations")
     " are encouraged to recognize and optimize the case of "
     (:TT NIL "(typep " (:PARAM NIL "x") " (the class " (:PARAM NIL "y") "))")
     ", since it does not involve any need for expansion of "
     (:MACREF NIL "deftype") " information at runtime. " :PAR
     (:CODE NIL "
")
     " " :PAR (:ENDISSUE NIL "SUBTYPEP-ENVIRONMENT:ADD-ARG") " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Type Errors --------------------") :PAR
   (:COM (:NAME "type-error" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "type-error") ", "
     (:TYPEREF NIL "error") ", " (:TYPEREF NIL "serious-condition") ", "
     (:TYPEREF NIL "condition") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " represents a situation in which an "
     (:TERM NIL "object")
     " is not of the expected type. The “offending datum” and “expected type” are initialized by the initialization arguments named "
     (:KWD NIL "datum") " and " (:KWD NIL "expected-type") " to "
     (:FUNREF NIL "make-condition") ", and are " (:TERM NIL "accessed")
     " by the functions " (:FUNREF NIL "type-error-datum") " and "
     (:FUNREF NIL "type-error-expected-type") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "type-error-datum") ", "
     (:FUNREF NIL "type-error-expected-type") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== TYPE-ERROR-DATUM")
   (:COM (:NAME "type-error-datum, type-error-expected-type" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "type-error-datum")
      (:ARGLIST NIL "condition") (:VALUES NIL "datum"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "type-error-expected-type")
      (:ARGLIST NIL "condition") (:VALUES NIL "expected-type"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "condition")
     "—a " (:TERM NIL "condition") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") ". " :PAR (:PARAM NIL "datum") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "expected-type") "—a "
     (:TERM NIL "type specifier") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "type-error-datum")
     " returns the offending datum in the " (:TERM NIL "situation")
     " represented by the " (:PARAM NIL "condition") ". " :PAR
     (:FUNREF NIL "type-error-expected-type")
     " returns the expected type of the offending datum in the "
     (:TERM NIL "situation") " represented by the " (:PARAM NIL "condition")
     ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun fix-digits (condition)
   (check-type condition type-error)
   (let* ((digits '(zero one two three four
                   five six seven eight nine))
         (val (position (type-error-datum condition) digits)))
     (if (and val (subtypep 'fixnum (type-error-expected-type condition)))
         (store-value 7))))
 
 (defun foo (x)
   (handler-bind ((type-error #'fix-digits))
     (check-type x number)
     (+ x 3)))
 
 (foo 'seven)
→ 10
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:TYPEREF NIL "type-error") ", "
     (:SECREF NIL :CONDITIONS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL "% Shouldn't be needed. -kmp 1-Sep-91"
      "It is an error to use \\macref{setf} with \\funref{type-error-datum}."
      "It is an error to use \\macref{setf} with \\funref{type-error-expected-type}.")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SIMPLE-TYPE-ERROR") :PAR
   (:COM (:NAME "simple-type-error" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " " :PAR
     (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     (:TYPEREF NIL "simple-type-error") ", " (:TYPEREF NIL "simple-condition")
     ", " (:TYPEREF NIL "type-error") ", " (:TYPEREF NIL "error") ", "
     (:TYPEREF NIL "serious-condition") ", " (:TYPEREF NIL "condition") ", "
     (:TYPEREF NIL "t") " "
     (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:TERM NIL "Conditions") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "simple-type-error") " are like "
     (:TERM NIL "conditions") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error")
     ", except that they provide an alternate mechanism for specifying how the "
     (:TERM NIL "condition") " is to be " (:TERM NIL "reported") "; see the "
     (:TERM NIL "type") " " (:TYPEREF NIL "simple-condition") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:TYPEREF NIL "simple-condition") ", "
     (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
     (:FUNREF NIL "simple-condition-format-control") ", "
     (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
     (:FUNREF NIL "simple-condition-format-arguments") ", "
     (:FUNREF NIL "type-error-datum") ", "
     (:FUNREF NIL "type-error-expected-type") " " :PAR)))
  " " :PAR)
 (:CHAPTER
  (:NUM "5" :TITLE ("Data and Control Flow") :NUMTAG :CHAP-FIVE :NAMETAG
   :DATA-AND-CONTROL-FLOW)
  (:SECTION (:TITLE ("Generalized Reference") :TAGS (:GENERALIZED-REFERENCE))
   " " (:COMMENT NIL "% Generalized Reference") :PAR
   (:COMMENT NIL
    "% Moon thinks terms \"generalized reference\" and \"place\" need to be rationalized throughout."
    "% Done! -kmp 16-Jul-93")
   :PAR
   (:SUBSECTION (:TITLE ("Overview of Places and Generalized Reference")) "A "
    (:NEWTERM NIL "generalized reference") " is the use of a "
    (:TERM NIL "form") ", sometimes called a " (:NEWTERM NIL "place")
    ", as if it were a " (:TERM NIL "variable")
    " that could be read and written. The " (:TERM NIL "value") " of a "
    (:TERM NIL "place") " is the " (:TERM NIL "object") " to which the "
    (:TERM NIL "place") " " (:TERM NIL "form") " evaluates. The "
    (:TERM NIL "value") " of a " (:TERM NIL "place")
    " can be changed by using " (:MACREF NIL "setf")
    ". The concept of binding a " (:TERM NIL "place") " is not defined in "
    (:RM NIL " Common Lisp") ", but an " (:TERM NIL "implementation")
    " is permitted to extend the language by defining this concept. " :PAR
    (:NEXTFIGURE (:CAPS T)) " contains examples of the use of "
    (:MACREF NIL "setf") ". Note that the values returned by evaluating the "
    (:TERM NIL "forms")
    " in column two are not necessarily the same as those obtained by evaluating the "
    (:TERM NIL "forms") " in column three. " (:COMMENT NIL "% 7.2.0 18")
    "In general, the exact " (:TERM NIL "macro expansion") " of a "
    (:MACREF NIL "setf") " " (:TERM NIL "form")
    " is not guaranteed and can even be "
    (:TERM NIL "implementation-dependent")
    "; all that is guaranteed is that the expansion is an update form that works for that particular "
    (:TERM NIL "implementation") ", that the left-to-right evaluation of "
    (:TERM NIL "subforms") " is preserved, and " (:COMMENT NIL "% 7.2.0 19")
    "that the ultimate result of evaluating " (:MACREF NIL "setf")
    " is the value or values being stored. " :PAR
    (:TABLE (:NAME ("Examples of setf"))
     (:ROW NIL (:CELL NIL "Access function") (:CELL NIL "Update Function")
      (:CELL NIL "Update using " (:MACREF NIL "setf")))
     (:ROW NIL (:CELL NIL (:TT NIL "x")) (:CELL NIL (:TT NIL "(setq x datum)"))
      (:CELL NIL (:TT NIL "(setf x datum)")))
     (:ROW NIL (:CELL NIL (:TT NIL "(car x)"))
      (:CELL NIL (:TT NIL "(rplaca x datum)"))
      (:CELL NIL (:TT NIL "(setf (car x) datum)")))
     (:ROW NIL (:CELL NIL (:TT NIL "(symbol-value x)"))
      (:CELL NIL (:TT NIL "(set x datum)"))
      (:CELL NIL (:TT NIL "(setf (symbol-value x) datum)"))))
    " " :PAR (:NEXTFIGURE (:CAPS T)) " shows " (:TERM NIL "operators")
    " relating to " (:TERM NIL "places") " and "
    (:TERM NIL "generalized reference") ". " :PAR
    (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " " :PAR
    (:TABLE (:NAME ("Operators relating to places and generalized reference."))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " assert"))
      (:CELL NIL (:FUNREF NIL "defsetf")) (:CELL NIL (:FUNREF NIL "push")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " ccase"))
      (:CELL NIL (:FUNREF NIL "get-setf-expansion"))
      (:CELL NIL (:FUNREF NIL "remf")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " ctypecase"))
      (:CELL NIL (:FUNREF NIL "getf")) (:CELL NIL (:FUNREF NIL "rotatef")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " decf"))
      (:CELL NIL (:FUNREF NIL "incf")) (:CELL NIL (:FUNREF NIL "setf")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " define-modify-macro"))
      (:CELL NIL (:FUNREF NIL "pop")) (:CELL NIL (:FUNREF NIL "shiftf")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " define-setf-expander"))
      (:CELL NIL (:FUNREF NIL "psetf")) (:CELL NIL)))
    " "
    (:COMMENT NIL
     "!!! Should defmethod be here for the sake of SETF methods?? -kmp 8-May-91")
    :PAR (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " " :PAR
    (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " Some of the "
    (:TERM NIL "operators") " above manipulate " (:TERM NIL "places")
    " and some manipulate " (:TERM NIL "setf expanders") ". "
    (:COMMENT NIL "% 7.2.0 57") "A " (:TERM NIL "setf expansion")
    " can be derived from any " (:TERM NIL "place") ". "
    (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
    (:COMMENT NIL "% 7.2.0 20") "New " (:TERM NIL "setf expanders")
    " can be defined by using " (:MACREF NIL "defsetf") " and "
    (:MACREF NIL "define-setf-expander") ". " :PAR
    (:COMMENT NIL
     "% Moon thinks this follows from rule 2 below, and asked that it be commented out."
     " %% 7.2.0 29" " %% 7.2.0 30                 "
     " These operators evaluate the \\term{subforms} of "
     " \\term{places} exactly as many times as they appear in the source program,"
     " and exactly in the same order (left-to-right) as they appear in the source."
     " \\issue{PUSH-EVALUATION-ORDER:ITEM-FIRST}"
     " %The left-to-right rule does not"
     " %remove the obligation on writers of \\term{macros} and " " %users of "
     " %\\issue{SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS}"
     " %\\macref{define-setf-expander}  "
     " %\\endissue{SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS}"
     " %to ensure left-to-right order, however. "
     " \\endissue{PUSH-EVALUATION-ORDER:ITEM-FIRST}" " " " %% 7.2.0 31"
     " For example, in " " " " {\\tt (setf \\param{reference} \\param{value})}"
     " " " \\param{value}"
     " will be evaluated after all the \\term{subforms} of \\param{reference} because"
     " \\param{value} appears to the right of them.")
    :PAR
    (:COMMENT NIL "% 7.2.0 32"
     "The expansion of these operators must consist of code that follows these"
     "rules or has the same effect as such code.  This is accomplished by"
     "introducing temporary variables bound to the "
     "\\issue{PUSH-EVALUATION-ORDER:ITEM-FIRST}"
     "\\term{subforms} of the macro call."
     "\\endissue{PUSH-EVALUATION-ORDER:ITEM-FIRST}"
     "As an optimization in the implementation,"
     "temporary variables can be eliminated whenever"
     "removing them has no effect on the semantics of the program."
     "For example, a constant need never be saved in a temporary variable."
     "A variable or any \\term{form} that does not have side effects need not be"
     "saved in a temporary variable if it can be proven that its value will"
     "not change within the scope of the \\term{place}.")
    :PAR (:ISSUE NIL "PUSH-EVALUATION-ORDER:ITEM-FIRST") " "
    (:SUBSUBSECTION
     (:TITLE ("Evaluation of Subforms to Places") :TAGS
      (:GEN-REF-SUB-FORM-EVAL))
     " " :PAR "The following rules apply to the " (:TERM NIL "evaluation")
     " of " (:TERM NIL "subforms") " in a " (:TERM NIL "place") ": " :PAR
     (:LIST NIL
      (:ITEM NIL "1. The evaluation ordering of " (:TERM NIL "subforms")
       " within a " (:TERM NIL "place")
       " is determined by the order specified by the second value returned by "
       (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
       (:FUNREF NIL "get-setf-expansion") ". "
       (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS")
       " For all " (:TERM NIL "places") " defined by this specification "
       (:COMMENT NIL "!!! Table??") "(" (:I NIL "e.g.") ",  "
       (:FUNREF NIL "getf") ", " (:FUNREF NIL "ldb") ", "
       (:MATH NIL (:MO NIL "…"))
       "), this order of evaluation is left-to-right. "
       (:IDXTEXT NIL "order of evaluation") (:IDXTEXT NIL "evaluation order")
       (:COMMENT NIL
        "!!! Barmar: Does the next sentence say the same thing as the one which follows it"
        "            (i.e., the first sentence in the next paragraph)??")
       "When a " (:TERM NIL "place")
       " is derived from a macro expansion, this rule is applied after the macro is expanded to find the appropriate "
       (:TERM NIL "place") ". " :PAR (:TERM NIL "Places") " defined by using "
       (:MACREF NIL "defmacro") " or "
       (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
       (:MACREF NIL "define-setf-expander") " "
       (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS")
       " use the evaluation order defined by those definitions. For example, consider the following: "
       :PAR
       (:CODE NIL " (defmacro wrong-order (x y) `(getf ,y ,x))
")
       " " :PAR "This following " (:TERM NIL "form") " evaluates "
       (:TT NIL "place2") " first and then " (:TT NIL "place1")
       " because that is the order they are evaluated in the macro expansion: "
       :PAR
       (:CODE NIL " (push value (wrong-order place1 place2))
")
       " " :PAR)
      (:ITEM NIL "2. " (:ISSUE NIL "JUN90-TRIVIAL-ISSUES:4") " For the "
       (:TERM NIL "macros") " that manipulate " (:TERM NIL "places") " ("
       (:MACREF NIL "push") ", " (:MACREF NIL "pushnew") ", "
       (:MACREF NIL "remf") ", " (:MACREF NIL "incf") ", " (:MACREF NIL "decf")
       ", " (:MACREF NIL "shiftf") ", " (:MACREF NIL "rotatef") ", "
       (:MACREF NIL "psetf") ", " (:MACREF NIL "setf") ", " (:MACREF NIL "pop")
       ", and those defined by " (:MACREF NIL "define-modify-macro") ") the "
       (:TERM NIL "subforms")
       " of the macro call are evaluated exactly once in left-to-right order, with the "
       (:TERM NIL "subforms") " of the " (:TERM NIL "places")
       " evaluated in the order specified in (1). "
       (:ENDISSUE NIL "JUN90-TRIVIAL-ISSUES:4") " " :PAR (:MACREF NIL "push")
       ", " (:MACREF NIL "pushnew") ", " (:MACREF NIL "remf") ", "
       (:MACREF NIL "incf") ", " (:MACREF NIL "decf") ", "
       (:MACREF NIL "shiftf") ", " (:MACREF NIL "rotatef") ", "
       (:MACREF NIL "psetf") ", " (:MACREF NIL "pop") " evaluate all "
       (:TERM NIL "subforms") " before modifying any of the "
       (:TERM NIL "place") " locations. " (:MACREF NIL "setf")
       " (in the case when " (:MACREF NIL "setf")
       " has more than two arguments) performs its operation on each pair in sequence. For example, in "
       :PAR
       (:CODE NIL " (setf place1 value1 place2 value2 ...)
")
       " the " (:TERM NIL "subforms") " of " (:TT NIL "place1") " and "
       (:TT NIL "value1") " are evaluated, the location specified by "
       (:TT NIL "place1") " is modified to contain the value returned by "
       (:TT NIL "value1") ", and then the rest of the " (:MACREF NIL "setf")
       " form is processed in a like manner. " :PAR)
      (:ITEM NIL "3. For " (:MACREF NIL "check-type") ", "
       (:MACREF NIL "ctypecase") ", and " (:MACREF NIL "ccase") ", "
       (:TERM NIL "subforms") " of the " (:TERM NIL "place")
       " are evaluated once as in (1), but might be evaluated again if the type check fails in the case of "
       (:MACREF NIL "check-type") " or none of the cases hold in "
       (:MACREF NIL "ctypecase") " and " (:MACREF NIL "ccase") ". " :PAR)
      (:ITEM NIL "4. For " (:MACREF NIL "assert")
       ", the order of evaluation of the generalized references is not specified."
       (:IDXTEXT NIL "order of evaluation") (:IDXTEXT NIL "evaluation order")
       " "
       (:COMMENT NIL " Barmar: There's only one place in \\macref{assert}."
        " Moon: Not true!")
       :PAR))
     " Rules 2, 3 and 4 cover all " (:TERM NIL "standardized") " "
     (:TERM NIL "macros") " that manipulate " (:TERM NIL "places") ". " :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Examples of Evaluation of Subforms to Places"))
      (:CODE NIL " (let ((ref2 (list '())))
   (push (progn (princ \"1\") 'ref-1)
         (car (progn (princ \"2\") ref2)))) 
⊳ 12
→ (REF1)

 (let (x)
    (push (setq x (list 'a))
          (car (setq x (list 'b))))
     x)
→ (((A) . B))
")
      " " :PAR (:MACREF NIL "push") " first evaluates "
      (:TT NIL " (setq x (list 'a)) → (a)") ", then evaluates "
      (:TT NIL " (setq x (list 'b)) → (b)") ", then modifies the "
      (:TERM NIL "car") " of this latest value to be " (:TT NIL " ((a) . b)")
      ". " :PAR)
     :PAR)
    (:ENDISSUE NIL "PUSH-EVALUATION-ORDER:ITEM-FIRST") " " :PAR
    (:COMMENT NIL
     "!!! Uses of \"access\", \"accessing\", etc. here are suspect. -kmp 18-Apr-91")
    :PAR
    (:SUBSUBSECTION (:TITLE ("Setf Expansions") :TAGS (:SETF-EXPANSIONS)) " "
     :PAR (:COMMENT NIL "% 7.2.0 59")
     "Sometimes it is possible to avoid evaluating " (:TERM NIL "subforms")
     " of a " (:TERM NIL "place") " multiple times or in the wrong order. A "
     (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
     (:TERM NIL "setf expansion") " "
     (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS")
     " for a given access form can be expressed as an ordered collection of five "
     (:TERM NIL "objects") ": " :PAR
     (:COMMENT NIL
      "!!! Andy Latto is concerned about whether \"temporaries\" mustn't or might"
      "    be proclaimed special.  And if they must not, must an implementation check?"
      "    Would some elaboration of what a \"temporary\" is here be of help? -kmp 5-Dec-91")
     :PAR (:COMMENT NIL "% 7.2.0 60")
     (:LIST NIL
      (:ITEM NIL (:B NIL "List of temporary variables") " " :PAR
       "a list of symbols naming temporary variables to be bound sequentially, as if by "
       (:SPECREF NIL "let*") ", to " (:TERM NIL "values")
       " resulting from value forms. " :PAR)
      (:ITEM NIL (:B NIL "List of value forms") " " :PAR
       "a list of forms (typically, " (:TERM NIL "subforms") " of the "
       (:TERM NIL "place")
       ") which when evaluated yield the values to which the corresponding temporary variables should be bound. "
       :PAR (:COMMENT NIL "% 7.2.0 61" "% 7.2.0 65"))
      (:ITEM NIL (:B NIL "List of store variables") " " :PAR
       "a list of symbols naming temporary store variables which are to hold the new values that will be assigned to the "
       (:TERM NIL "place") ". " :PAR (:COMMENT NIL "% 7.2.0 62"))
      (:ITEM NIL (:B NIL "Storing form") " " :PAR
       "a form which can reference both the temporary and the store variables, and which changes the "
       (:TERM NIL "value") " of the " (:TERM NIL "place")
       " and guarantees to return as its values the values of the store variables, which are the correct values for "
       (:MACREF NIL "setf") " to return. " :PAR (:COMMENT NIL "% 7.2.0 63"))
      (:ITEM NIL (:B NIL "Accessing form") " " :PAR "a " (:TERM NIL "form")
       " which can reference the temporary variables, and which returns the "
       (:TERM NIL "value") " of the " (:TERM NIL "place") ". "))
     " " :PAR (:COMMENT NIL "% 7.2.0 66")
     "The value returned by the accessing form is affected by execution of the storing form, but either of these forms might be evaluated any number of times. "
     :PAR
     (:COMMENT NIL "% 7.2.0 67" "% Redundant with next paragraph."
      " The temporary variables and the store variables must be generated"
      " names (see \\funref{gensym} or \\funref{gentemp}).")
     :PAR "It is possible to do more than one " (:MACREF NIL "setf")
     " in parallel via " (:MACREF NIL "psetf") ", " (:MACREF NIL "shiftf")
     ", and " (:MACREF NIL "rotatef") ". Because of this, the "
     (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
     (:TERM NIL "setf expander") " "
     (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS")
     " must produce new temporary and store variable names every time. For examples of how to do this, see "
     (:FUNREF NIL "gensym") ". " (:COMMENT NIL " and \\funref{gentemp}.") :PAR
     (:ISSUE NIL "SETF-FUNCTIONS-AGAIN:MINIMAL-CHANGES") " For each "
     (:TERM NIL "standardized") " accessor function " (:PARAM NIL "F")
     ", unless it is explicitly documented otherwise, it is "
     (:TERM NIL "implementation-dependent") " whether the ability to use an "
     (:PARAM NIL "F") " " (:TERM NIL "form") " as a " (:MACREF NIL "setf") " "
     (:TERM NIL "place") " is implemented by a " (:TERM NIL "setf expander")
     " or a " (:TERM NIL "setf function")
     ". Also, it follows from this that it is "
     (:TERM NIL "implementation-dependent") " whether the name "
     (:TT NIL "(setf " (:PARAM NIL "F") ")") " is " (:TERM NIL "fbound") ". "
     (:ENDISSUE NIL "SETF-FUNCTIONS-AGAIN:MINIMAL-CHANGES") " " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Examples of Setf Expansions"))
      (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS")
      " Examples of the contents of the constituents of "
      (:TERM NIL "setf expansions") " follow. " :PAR
      (:COMMENT NIL "% 7.2.0 69") "For a variable " (:PARAM NIL "x") ": " :PAR
      (:TABLE (:NAME ("Sample Setf Expansion of a Variable"))
       (:ROW NIL (:CELL NIL (:TT NIL "()"))
        (:CELL NIL " ;list of temporary variables "))
       (:ROW NIL (:CELL NIL (:TT NIL "()"))
        (:CELL NIL " ;list of value forms "))
       (:ROW NIL (:CELL NIL (:TT NIL "(g0001)"))
        (:CELL NIL " ;list of store variables "))
       (:ROW NIL (:CELL NIL (:TT NIL "(setq " (:PARAM NIL "x") " g0001)"))
        (:CELL NIL " ;storing form "))
       (:ROW NIL (:CELL NIL (:PARAM NIL "x")) (:CELL NIL " ;accessing form ")))
      " " :PAR (:COMMENT NIL "% 7.2.0 70") "For "
      (:TT NIL " (car " (:PARAM NIL "exp") ")") ": " :PAR
      (:TABLE (:NAME ("Sample Setf Expansion of a CAR Form"))
       (:ROW NIL (:CELL NIL (:TT NIL "(g0002)"))
        (:CELL NIL " ;list of temporary variables "))
       (:ROW NIL (:CELL NIL (:TT NIL "(" (:PARAM NIL "exp") ")"))
        (:CELL NIL " ;list of value forms "))
       (:ROW NIL (:CELL NIL (:TT NIL "(g0003)"))
        (:CELL NIL " ;list of store variables "))
       (:ROW NIL (:CELL NIL (:TT NIL "(progn (rplaca g0002 g0003) g0003)"))
        (:CELL NIL " ;storing form "))
       (:ROW NIL (:CELL NIL (:TT NIL "(car g0002)"))
        (:CELL NIL " ;accessing form ")))
      " " :PAR (:COMMENT NIL "% 7.2.0 71") "For "
      (:TT NIL "(subseq " (:PARAM NIL "seq") " " (:PARAM NIL "s") " "
       (:PARAM NIL "e") ")")
      ": " :PAR
      (:TABLE (:NAME ("Sample Setf Expansion of a SUBSEQ Form"))
       (:ROW NIL (:CELL NIL (:TT NIL "(g0004 g0005 g0006)"))
        (:CELL NIL " ;list of temporary variables "))
       (:ROW NIL
        (:CELL NIL
         (:TT NIL "(" (:PARAM NIL "seq") " " (:PARAM NIL "s") " "
          (:PARAM NIL "e") ")"))
        (:CELL NIL " ;list of value forms "))
       (:ROW NIL (:CELL NIL (:TT NIL "(g0007)"))
        (:CELL NIL " ;list of store variables "))
       (:ROW NIL
        (:CELL (:SPAN 2)
         (:TT NIL
          "(progn (replace g0004 g0007 :start1 g0005 :end1 g0006) g0007)")))
       (:ROW NIL (:CELL NIL) (:CELL NIL " ;storing form "))
       (:ROW NIL (:CELL NIL (:TT NIL "(subseq g0004 g0005 g0006)"))
        (:CELL NIL " ; accessing form ")))
      " " :PAR "In some cases, if a " (:TERM NIL "subform") " of a "
      (:TERM NIL "place") " is itself a " (:TERM NIL "place")
      ", it is necessary to expand the " (:TERM NIL "subform")
      " in order to compute some of the values in the expansion of the outer "
      (:TERM NIL "place") ". For "
      (:TT NIL "(ldb " (:PARAM NIL "bs") " (car " (:PARAM NIL "exp") "))") ": "
      :PAR
      (:TABLE (:NAME ("Sample Setf Expansion of a LDB Form"))
       (:ROW NIL (:CELL NIL (:TT NIL "(g0001 g0002)"))
        (:CELL NIL " ;list of temporary variables "))
       (:ROW NIL
        (:CELL NIL (:TT NIL "(" (:PARAM NIL "bs") " " (:PARAM NIL "exp") ")"))
        (:CELL NIL " ;list of value forms "))
       (:ROW NIL (:CELL NIL (:TT NIL "(g0003)"))
        (:CELL NIL " ;list of store variables "))
       (:ROW NIL
        (:CELL (:SPAN 2)
         (:TT NIL
          "(progn (rplaca g0002 (dpb g0003 g0001 (car g0002))) g0003)")))
       (:ROW NIL (:CELL NIL) (:CELL NIL " ;storing form "))
       (:ROW NIL (:CELL NIL (:TT NIL "(ldb g0001 (car g0002))"))
        (:CELL NIL " ; accessing form ")))
      " " :PAR (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS")
      " " :PAR)
     :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Kinds of Places") :TAGS (:KINDS-OF-PLACES)) " " :PAR
    (:COMMENT NIL "% 7.2.0 7") "Several kinds of " (:TERM NIL "places")
    " are defined by " (:RM NIL " Common Lisp")
    "; this section enumerates them. This set can be extended by "
    (:TERM NIL "implementations") " and by " (:TERM NIL "programmer code") ". "
    :PAR (:COMMENT NIL "% 7.2.0 8") :PAR
    (:SUBSUBSECTION (:TITLE ("Variable Names as Places")) "The name of a "
     (:TERM NIL "lexical variable") " or " (:TERM NIL "dynamic variable")
     " can be used as a " (:TERM NIL "place") ". " :PAR)
    :PAR (:COMMENT NIL "% 7.2.0 9")
    (:SUBSUBSECTION
     (:TITLE ("Function Call Forms as Places") :TAGS (:FN-FORMS-AS-GEN-REFS))
     " " :PAR "A " (:TERM NIL "function form") " can be used as a "
     (:TERM NIL "place") " if it falls into one of the following categories: "
     :PAR
     (:LIST NIL
      (:ITEM NIL
       " A function call form whose first element is the name of any one of the functions in "
       (:NEXTFIGURE NIL) ". "
       (:COMMENT NIL
        "% Barmar: Unnecessary as binding these symbols is disallowed."
        " \\issue{FUNCTION-NAME:LARGE}"
        " The function name must refer to the global function definition, "
        " rather than a locally defined \\term{function}."
        " \\endissue{FUNCTION-NAME:LARGE}")
       :PAR
       (:COMMENT NIL
        "!!! CLASS-NAME and DOCUMENTATION maybe deserve their own table,"
        "    since they are the only two defined by setf method.")
       (:ISSUE NIL "CONDITION-ACCESSORS-SETFABLE:NO") " " :PAR
       (:EDITORNOTE NIL
        "KMP: Note that what are in some places still called `condition accessors' are deliberately omitted from this table, and are not labeled as accessors in their entries. I have not yet had time to do a full search for these items and eliminate stray references to them as `accessors', which they are not, but I will do that at some point.")
       (:COMMENT NIL "!!!") :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
       (:ISSUE NIL "AREF-1D") " " (:ISSUE NIL "FUNCTION-NAME:LARGE") " "
       (:COMMENT NIL
        "Merged BIT, SBIT, CHAR, SCHAR, and SUBSEQ from next table on advice of Moon and others."
        " -kmp 13-Feb-92"
        " I added COMPILER-MACRO-FUNCTION, READTABLE-CASE, and SLOT-VALUE, "
        " which were also missing.  --sjl 5 Mar 92")
       (:TABLE (:NAME ("Functions that setf can be used with—1"))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " aref"))
         (:CELL NIL (:FUNREF NIL "cdadr")) (:CELL NIL (:FUNREF NIL "get")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " bit"))
         (:CELL NIL (:FUNREF NIL "cdar")) (:CELL NIL (:FUNREF NIL "gethash")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " caaaar"))
         (:CELL NIL (:FUNREF NIL "cddaar"))
         (:CELL NIL (:FUNREF NIL "logical-pathname-translations")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " caaadr"))
         (:CELL NIL (:FUNREF NIL "cddadr"))
         (:CELL NIL (:FUNREF NIL "macro-function")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " caaar"))
         (:CELL NIL (:FUNREF NIL "cddar")) (:CELL NIL (:FUNREF NIL "ninth")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " caadar"))
         (:CELL NIL (:FUNREF NIL "cdddar")) (:CELL NIL (:FUNREF NIL "nth")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " caaddr"))
         (:CELL NIL (:FUNREF NIL "cddddr"))
         (:CELL NIL (:FUNREF NIL "readtable-case")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " caadr"))
         (:CELL NIL (:FUNREF NIL "cdddr")) (:CELL NIL (:FUNREF NIL "rest")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " caar"))
         (:CELL NIL (:FUNREF NIL "cddr"))
         (:CELL NIL (:FUNREF NIL "row-major-aref")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " cadaar"))
         (:CELL NIL (:FUNREF NIL "cdr")) (:CELL NIL (:FUNREF NIL "sbit")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " cadadr"))
         (:CELL NIL (:FUNREF NIL "char")) (:CELL NIL (:FUNREF NIL "schar")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " cadar"))
         (:CELL NIL (:FUNREF NIL "class-name"))
         (:CELL NIL (:FUNREF NIL "second")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " caddar"))
         (:CELL NIL (:FUNREF NIL "compiler-macro-function"))
         (:CELL NIL (:FUNREF NIL "seventh")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " cadddr"))
         (:CELL NIL (:FUNREF NIL "documentation"))
         (:CELL NIL (:FUNREF NIL "sixth")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " caddr"))
         (:CELL NIL (:FUNREF NIL "eighth"))
         (:CELL NIL (:FUNREF NIL "slot-value")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " cadr"))
         (:CELL NIL (:FUNREF NIL "elt")) (:CELL NIL (:FUNREF NIL "subseq")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " car"))
         (:CELL NIL (:FUNREF NIL "fdefinition"))
         (:CELL NIL (:FUNREF NIL "svref")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " cdaaar"))
         (:CELL NIL (:FUNREF NIL "fifth"))
         (:CELL NIL (:FUNREF NIL "symbol-function")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " cdaadr"))
         (:CELL NIL (:FUNREF NIL "fill-pointer"))
         (:CELL NIL (:FUNREF NIL "symbol-plist")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " cdaar"))
         (:CELL NIL (:FUNREF NIL "find-class"))
         (:CELL NIL (:FUNREF NIL "symbol-value")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " cdadar"))
         (:CELL NIL (:FUNREF NIL "first")) (:CELL NIL (:FUNREF NIL "tenth")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " cdaddr"))
         (:CELL NIL (:FUNREF NIL "fourth")) (:CELL NIL (:FUNREF NIL "third"))))
       " " (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " " (:ENDISSUE NIL "AREF-1D")
       " " (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
       (:ENDISSUE NIL "CONDITION-ACCESSORS-SETFABLE:NO") " " :PAR
       (:COMMENT NIL
        "% This text used to belong after the next table, which is now commented out. -kmp 13-Feb-92")
       "In the case of " (:FUNREF NIL "subseq")
       ", the replacement value must be a " (:TERM NIL "sequence")
       " whose elements might be contained by the sequence argument to "
       (:FUNREF NIL "subseq") ", but does not have to be a "
       (:TERM NIL "sequence") " of the same " (:TERM NIL "type") " "
       (:COMMENT NIL "!!! Moon thinks this next is awkward.") "as the "
       (:TERM NIL "sequence")
       " of which the subsequence is specified. If the length of the replacement value does not equal the length of the subsequence to be replaced, then the shorter length determines the number of elements to be stored, as for "
       (:FUNREF NIL "replace") ". " :PAR)
      (:ITEM NIL " " (:COMMENT NIL "% 7.2.0 10")
       "A function call form whose first element is the name of a selector function constructed by "
       (:MACREF NIL "defstruct") ". "
       (:COMMENT NIL
        "% Barmar: Unnecessary as binding these symbols is disallowed."
        "% KMP: I'm not so sure in this case.")
       (:ISSUE NIL "FUNCTION-NAME:LARGE")
       " The function name must refer to the global function definition, rather than a locally defined "
       (:TERM NIL "function") ". " (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " "
       :PAR
       (:COMMENT NIL "% Moon:"
        "%  The distinction between this and the previous table is strange. After all,"
        "%  fill-pointer, symbol-function, and class-name have type restrictions, too."
        "%  Also, the text above this table seems garbled.  I would merge these into previous"
        "%  and delete the text." "% KMP: Done. (13-Feb-92)" " "
        " \\itemitem{\\bull}" " %% 7.2.0 11"
        " A function call form whose first element is the name of"
        " any one of the functions in \\thenextfigure, "
        " provided that the new value"
        " is of the specified type so that it can be used to"
        " place in the specified ``location'' (which is in each of these cases"
        " not truly a \\term{place})."
        " %% Barmar: Unnecessary as binding these symbols is disallowed."
        " % \\issue{FUNCTION-NAME:LARGE}"
        " % The function name must refer to the global "
        " % function definition, rather than a locally defined \\term{function}."
        " % \\endissue{FUNCTION-NAME:LARGE}" " "
        " \\issue{CHARACTER-PROPOSAL:2-1-1}"
        " \\tablefigtwo{Functions that setf can be used with---n}{Function name}{Required type}{"
        " \\funref{bit}&\\typeref{bit}\\cr"
        " \\funref{sbit}&\\typeref{bit}\\cr"
        " \\funref{char}&\\typeref{character}\\cr"
        " \\funref{schar}&\\typeref{character}\\cr"
        " \\funref{subseq}&\\typeref{sequence}\\cr" " }"
        " \\endissue{CHARACTER-PROPOSAL:2-1-1}")
       :PAR)
      (:ITEM NIL " " (:COMMENT NIL "% 7.2.0 12")
       "A function call form whose first element is the name of any one of the functions in "
       (:NEXTFIGURE NIL)
       ", provided that the supplied argument to that function is in turn a "
       (:TERM NIL "place") " form; in this case the new " (:TERM NIL "place")
       " has stored back into it the result of applying the supplied “update” function. "
       (:COMMENT NIL "% Moon thought this next was just confusing."
        "(which is in each of these cases not a true update function)."
        "% Barmar: Unnecessary as binding these symbols is disallowed."
        " \\issue{FUNCTION-NAME:LARGE}"
        " The function name must refer to the global function "
        " definition, rather than a locally defined \\term{function}."
        " \\endissue{FUNCTION-NAME:LARGE}")
       :PAR (:ISSUE NIL "SETF-SUB-METHODS:DELAYED-ACCESS-STORES") " "
       (:TABLE (:NAME ("Functions that setf can be used with—2"))
        (:ROW NIL (:CELL NIL "Function name")
         (:CELL NIL "Argument that is a " (:PARAM NIL "place"))
         (:CELL NIL "Update function used"))
        (:ROW NIL (:CELL NIL (:FUNREF NIL "ldb")) (:CELL NIL " second ")
         (:CELL NIL (:FUNREF NIL "dpb")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL "mask-field")) (:CELL NIL " second ")
         (:CELL NIL (:FUNREF NIL "deposit-field")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL "getf")) (:CELL NIL " first ")
         (:CELL NIL (:TERM NIL "implementation-dependent"))))
       " "
       (:COMMENT NIL "% Moon thinks this is redundant."
        " The \\param{place} forms listed in the above figure admit other"
        " \\param{places} as arguments; these are called sub-recursive \\param{places}.")
       "During the " (:MACREF NIL "setf") " expansion of these "
       (:TERM NIL "forms") ", it is necessary to call "
       (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
       (:FUNREF NIL "get-setf-expansion") " "
       (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS")
       " in order to figure out how the inner, nested generalized variable must be treated. "
       :PAR "The information from "
       (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
       (:FUNREF NIL "get-setf-expansion") " "
       (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS")
       " is used as follows. "
       (:LIST NIL
        (:ITEM NIL (:FUNREF NIL "ldb") " " :PAR "In a form such as: " :PAR
         (:TT NIL " (setf (ldb " (:PARAM NIL "byte-spec") " "
          (:PARAM NIL "place-form") ") " (:PARAM NIL "value-form") ")")
         " " :PAR "the place referred to by the " (:PARAM NIL "place-form")
         " must always be both " (:TERM NIL "read") " and "
         (:TERM NIL "written")
         "; note that the update is to the generalized variable specified by "
         (:PARAM NIL "place-form") ", not to any object of " (:TERM NIL "type")
         " " (:TYPEREF NIL "integer") ". " :PAR "Thus this "
         (:MACREF NIL "setf") " should generate code to do the following: "
         :PAR
         (:LIST NIL
          (:ITEM NIL "1. Evaluate " (:PARAM NIL "byte-spec")
           " (and bind it into a temporary variable). ")
          (:ITEM NIL "2. Bind the temporary variables for "
           (:PARAM NIL "place-form") ". ")
          (:ITEM NIL "3. Evaluate " (:PARAM NIL "value-form") " (and bind "
           (:ISSUE NIL "SETF-MULTIPLE-STORE-VARIABLES:ALLOW")
           " its value or values into the store variable). "
           (:COMMENT NIL "% Moon: Can only be ONE store variable here."
            " or variables")
           (:ENDISSUE NIL "SETF-MULTIPLE-STORE-VARIABLES:ALLOW") " ")
          (:ITEM NIL "4. Do the " (:TERM NIL "read") " from "
           (:PARAM NIL "place-form") ". ")
          (:ITEM NIL "5. Do the " (:TERM NIL "write") " into "
           (:PARAM NIL "place-form") " with the given bits of the "
           (:TERM NIL "integer")
           " fetched in step 4 replaced with the value from step 3. "))
         " If the evaluation of " (:PARAM NIL "value-form")
         " in step 3 alters what is found in " (:PARAM NIL "place-form")
         ", such as setting different bits of " (:TERM NIL "integer")
         ", then the change of the bits denoted by " (:PARAM NIL "byte-spec")
         " is to that altered " (:TERM NIL "integer")
         ", because step 4 is done after the " (:PARAM NIL "value-form")
         " evaluation. Nevertheless, the evaluations required for "
         (:TERM NIL "binding")
         " the temporary variables are done in steps 1 and 2, and thus the expected left-to-right evaluation order is seen. For example: "
         :PAR
         (:CODE NIL " (setq integer #x69) → #x69
 (rotatef (ldb (byte 4 4) integer) 
          (ldb (byte 4 0) integer))
 integer → #x96
;;; This example is trying to swap two independent bit fields 
;;; in an integer.  Note that the generalized variable of 
;;; interest here is just the (possibly local) program variable
;;; integer.
")
         " " :PAR)
        (:ITEM NIL (:FUNREF NIL "mask-field") " " :PAR
         "This case is the same as " (:FUNREF NIL "ldb")
         " in all essential aspects. " :PAR)
        (:ITEM NIL (:FUNREF NIL "getf") " " :PAR "In a form such as: " :PAR
         (:TT NIL "(setf (getf " (:PARAM NIL "place-form") " "
          (:PARAM NIL "ind-form") ") " (:PARAM NIL "value-form") ")")
         " " :PAR "the place referred to by " (:PARAM NIL "place-form")
         " must always be both " (:TERM NIL "read") " and "
         (:TERM NIL "written")
         "; note that the update is to the generalized variable specified by "
         (:PARAM NIL "place-form") ", not necessarily to the particular "
         (:TERM NIL "list") " that is the property list in question. " :PAR
         "Thus this " (:MACREF NIL "setf")
         " should generate code to do the following: "
         (:LIST NIL
          (:ITEM NIL "1. Bind the temporary variables for "
           (:PARAM NIL "place-form") ". ")
          (:ITEM NIL "2. Evaluate " (:PARAM NIL "ind-form")
           " (and bind it into a temporary variable). ")
          (:ITEM NIL "3. Evaluate " (:PARAM NIL "value-form") " (and bind "
           (:ISSUE NIL "SETF-MULTIPLE-STORE-VARIABLES:ALLOW")
           " its value or values into the store variable). "
           (:COMMENT NIL "%Moon: Can only be one store variable"
            " or variables")
           (:ENDISSUE NIL "SETF-MULTIPLE-STORE-VARIABLES:ALLOW") " ")
          (:ITEM NIL "4. Do the " (:TERM NIL "read") " from "
           (:PARAM NIL "place-form") ". ")
          (:ITEM NIL "5. Do the " (:TERM NIL "write") " into "
           (:PARAM NIL "place-form")
           " with a possibly-new property list obtained by combining the values from steps 2, 3, and 4. (Note that the phrase “possibly-new property list” can mean that the former property list is somehow destructively re-used, or it can mean partial or full copying of it. Since either copying or destructive re-use can occur, the treatment of the resultant value for the possibly-new property list must proceed as if it were a different copy needing to be stored back into the generalized variable.) "))
         " If the evaluation of " (:PARAM NIL "value-form")
         " in step 3 alters what is found in " (:PARAM NIL "place-form")
         ", such as setting a different named property in the list, then the change of the property denoted by "
         (:PARAM NIL "ind-form")
         " is to that altered list, because step 4 is done after the "
         (:PARAM NIL "value-form")
         " evaluation. Nevertheless, the evaluations required for "
         (:TERM NIL "binding")
         " the temporary variables are done in steps 1 and 2, and thus the expected left-to-right evaluation order is seen. "
         :PAR "For example: " :PAR
         (:CODE NIL
          " (setq s (setq r (list (list 'a 1 'b 2 'c 3)))) → ((a 1 b 2 c 3))
 (setf (getf (car r) 'b) 
       (progn (setq r nil) 6)) → 6
 r → NIL
 s → ((A 1 B 6 C 3))
;;; Note that the (setq r nil) does not affect the actions of 
;;; the SETF because the value of R had already been saved in 
;;; a temporary variable as part of the step 1. Only the CAR
;;; of this value will be retrieved, and subsequently modified 
;;; after the value computation.
")
         " " :PAR))
       " "))
     " " :PAR (:ENDISSUE NIL "SETF-SUB-METHODS:DELAYED-ACCESS-STORES") " "
     :PAR)
    :PAR (:COMMENT NIL " This section added.  --sjl 4 Mar 92")
    (:ISSUE NIL "SETF-OF-VALUES:ADD") " "
    (:SUBSUBSECTION (:TITLE ("VALUES Forms as Places") :TAGS (:SETF-OF-VALUES))
     " " :PAR "A " (:FUNREF NIL "values") " " (:TERM NIL "form")
     " can be used as a " (:TERM NIL "place") ", provided that each of its "
     (:TERM NIL "subforms") " is also a " (:TERM NIL "place") " form. " :PAR
     "A form such as " :PAR
     (:TT NIL " (setf (values " (:PARAM NIL "place-1") " … "
      (:PARAM NIL "place-n") ") " (:PARAM NIL "values-form") ")")
     " " :PAR "does the following: " :PAR
     (:LIST NIL
      (:ITEM NIL "1. The " (:TERM NIL "subforms") " of each nested "
       (:PARAM NIL "place") " are evaluated in left-to-right order. ")
      (:ITEM NIL "2. The " (:PARAM NIL "values-form")
       " is evaluated, and the first store variable from each "
       (:PARAM NIL "place") " is bound to its return values as if by "
       (:MACREF NIL "multiple-value-bind") ". ")
      (:ITEM NIL "3. If the " (:TERM NIL "setf expansion") " for any "
       (:PARAM NIL "place")
       " involves more than one store variable, then the additional store variables are bound to "
       (:MISC NIL "nil") ". ")
      (:ITEM NIL "4. The storing forms for each " (:PARAM NIL "place")
       " are evaluated in left-to-right order. "))
     " " :PAR "The storing form in the " (:TERM NIL "setf expansion") " of "
     (:FUNREF NIL "values") " returns as " (:TERM NIL "multiple values")
     (:SUB NIL "2")
     " the values of the store variables in step 2. That is, the number of values returned is the same as the number of "
     (:TERM NIL "place")
     " forms. This may be more or fewer values than are produced by the "
     (:PARAM NIL "values-form") ". " :PAR
     (:COMMENT NIL " There probably ought to be some examples here.") :PAR)
    (:ENDISSUE NIL "SETF-OF-VALUES:ADD") " " :PAR
    (:SUBSUBSECTION (:TITLE ("THE Forms as Places")) "A " (:SPECREF NIL "the")
     " " (:TERM NIL "form") " can be used as a " (:TERM NIL "place")
     ", in which case the declaration is transferred to the "
     (:PARAM NIL "newvalue") " form, and the resulting " (:MACREF NIL "setf")
     " is analyzed. For example, " :PAR
     (:CODE NIL " (setf (the integer (cadr x)) (+ y 3))
")
     " is processed as if it were " :PAR
     (:CODE NIL " (setf (cadr x) (the integer (+ y 3)))
")
     " " :PAR)
    :PAR (:ISSUE NIL "SETF-APPLY-EXPANSION:IGNORE-EXPANDER") " "
    (:ISSUE NIL "SETF-OF-APPLY:ONLY-AREF-AND-FRIENDS") " "
    (:ISSUE NIL "JUN90-TRIVIAL-ISSUES:27") " "
    (:SUBSUBSECTION (:TITLE ("APPLY Forms as Places") :TAGS (:SETF-OF-APPLY))
     " " :PAR "The following situations involving " (:MACREF NIL "setf") " of "
     (:FUNREF NIL "apply") " must be supported: " :PAR
     (:LIST NIL
      (:ITEM NIL " "
       (:TT NIL "(setf (apply #'aref " (:PARAM NIL "array") " "
        (:STAR NIL (:CURLY NIL (:PARAM NIL "subscript"))) " "
        (:PARAM NIL "more-subscripts") ") " (:PARAM NIL "new-element") ")")
       " ")
      (:ITEM NIL " "
       (:TT NIL "(setf (apply #'bit " (:PARAM NIL "array") " "
        (:STAR NIL (:CURLY NIL (:PARAM NIL "subscript"))) " "
        (:PARAM NIL "more-subscripts") ") " (:PARAM NIL "new-element") ")")
       " ")
      (:ITEM NIL " "
       (:TT NIL "(setf (apply #'sbit " (:PARAM NIL "array") " "
        (:STAR NIL (:CURLY NIL (:PARAM NIL "subscript"))) " "
        (:PARAM NIL "more-subscripts") ") " (:PARAM NIL "new-element") ")")
       " "))
     " " :PAR "In all three cases, the " (:TERM NIL "element") " of "
     (:PARAM NIL "array") " designated by the concatenation of "
     (:PARAM NIL "subscripts") " and " (:PARAM NIL "more-subscripts") " ("
     (:I NIL "i.e.") ",  the same " (:TERM NIL "element") " which would be "
     (:TERM NIL "read") " by the call to " (:TERM NIL "apply")
     " if it were not part of a " (:MACREF NIL "setf") " " (:TERM NIL "form")
     ") is changed to have the " (:TERM NIL "value") " given by "
     (:PARAM NIL "new-element") ". " (:ISSUE NIL "FUNCTION-NAME:LARGE")
     " For these usages, the function name (" (:FUNREF NIL "aref") ", "
     (:FUNREF NIL "bit") ", or " (:FUNREF NIL "sbit")
     ") must refer to the global function definition, rather than a locally defined "
     (:TERM NIL "function") ". " (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " " :PAR
     "No other " (:TERM NIL "standardized") " " (:TERM NIL "function")
     " is required to be supported, but an " (:TERM NIL "implementation")
     " may define such support. An " (:TERM NIL "implementation")
     " may also define support for " (:TERM NIL "implementation-defined") " "
     (:TERM NIL "operators") ". " :PAR "If a user-defined "
     (:TERM NIL "function")
     " is used in this context, the following equivalence is true, except that care is taken to preserve proper left-to-right evaluation of argument "
     (:TERM NIL "subforms") ": " :PAR
     (:CODE NIL " (setf (apply #'" (:PARAM NIL "name") " "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "arg"))) ") " (:PARAM NIL "val") ")
 ≡ (apply #'(setf "
      (:PARAM NIL "name") ") " (:PARAM NIL "val") " "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "arg"))) ")
")
     " " :PAR
     (:COMMENT NIL
      " Removed reference to (setf (apply #'name a1 a2 ...) (values v1 v2 ...)) as bogus.")
     :PAR)
    (:ENDISSUE NIL "JUN90-TRIVIAL-ISSUES:27") " "
    (:ENDISSUE NIL "SETF-OF-APPLY:ONLY-AREF-AND-FRIENDS") " "
    (:ENDISSUE NIL "SETF-APPLY-EXPANSION:IGNORE-EXPANDER") " " :PAR
    (:SUBSUBSECTION (:TITLE ("Setf Expansions and Places")) "Any "
     (:TERM NIL "compound form") " for which the " (:TERM NIL "operator")
     " has a " (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
     (:TERM NIL "setf expander") " "
     (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS")
     " defined can be used as a " (:TERM NIL "place") ". "
     (:ISSUE NIL "FUNCTION-NAME:LARGE") " The "
     (:COMMENT NIL " function name that is the \\param{access-fn} "
      " argument to \\macref{defsetf} or "
      " \\issue{SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS}"
      " \\macref{define-setf-expander}"
      " \\endissue{SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS}"
      "% previous phrase replaced by Moon as just \"operator\" -kmp 4-Dec-91")
     (:TERM NIL "operator")
     " must refer to the global function definition, rather than a locally defined "
     (:TERM NIL "function") " or " (:TERM NIL "macro") ". "
     (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " " :PAR
     (:ISSUE NIL "FUNCTION-NAME:LARGE") " " :PAR)
    :PAR (:COMMENT NIL "% 7.2.0 16")
    (:SUBSUBSECTION (:TITLE ("Macro Forms as Places")) "A "
     (:TERM NIL "macro form") " can be used as a " (:TERM NIL "place")
     ", in which case " (:RM NIL " Common Lisp") " expands the "
     (:TERM NIL "macro form") " " (:ISSUE NIL "FUNCTION-NAME:LARGE")
     " as if by " (:FUNREF NIL "macroexpand-1") " "
     (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " and then uses the "
     (:TERM NIL "macro expansion") " in place of the original "
     (:TERM NIL "place") ". " (:ISSUE NIL "SETF-MACRO-EXPANSION:LAST") " "
     (:COMMENT NIL
      "This is true for GET-SETF-EXPANSION, too, but there's no obvious place to say that."
      " -kmp 5-Jun-91")
     "Such " (:TERM NIL "macro expansion")
     " is attempted only after exhausting all other possibilities other than expanding into a call to a function named "
     (:TT NIL "(setf " (:PARAM NIL "reader") ")") ". "
     (:ENDISSUE NIL "SETF-MACRO-EXPANSION:LAST") " " :PAR)
    :PAR
    (:COMMENT NIL " I moved this section here from below.  --sjl 5 Mar 92")
    (:ISSUE NIL "SYMBOL-MACROLET-SEMANTICS:SPECIAL-FORM") " "
    (:SUBSUBSECTION (:TITLE ("Symbol Macros as Places")) "A reference to a "
     (:TERM NIL "symbol") " that has been " (:TERM NIL "established") " as a "
     (:TERM NIL "symbol macro") " can be used as a " (:TERM NIL "place")
     ". In this case, " (:MACREF NIL "setf")
     " expands the reference and then analyzes the resulting "
     (:TERM NIL "form") ". "
     (:ENDISSUE NIL "SYMBOL-MACROLET-SEMANTICS:SPECIAL-FORM") " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Other Compound Forms as Places"))
     "For any other " (:TERM NIL "compound form") " for which the "
     (:TERM NIL "operator") " is a " (:TERM NIL "symbol") " " (:PARAM NIL "f")
     ", the " (:MACREF NIL "setf") " " (:TERM NIL "form")
     " expands into a call to the " (:TERM NIL "function") " named "
     (:TT NIL "(setf " (:PARAM NIL "f") ")") ". The first "
     (:TERM NIL "argument") " in the newly constructed "
     (:TERM NIL "function form") " is " (:PARAM NIL "newvalue")
     " and the remaining " (:TERM NIL "arguments") " are the remaining "
     (:TERM NIL "elements") " of " (:PARAM NIL "place")
     ". This expansion occurs regardless of whether " (:PARAM NIL "f") " or "
     (:TT NIL "(setf " (:PARAM NIL "f") ")") " is defined as a "
     (:TERM NIL "function") " locally, globally, or not at all. For example, "
     :PAR
     (:TT NIL "(setf (" (:PARAM NIL "f") " " (:PARAM NIL "arg1") " "
      (:PARAM NIL "arg2") " ...) " (:PARAM NIL "new-value") ")")
     " " :PAR "expands into a form with the same effect and value as " :PAR
     (:CODE NIL
      " (let ((#:temp-1 arg1)          ;force correct order of evaluation
       (#:temp-2 arg2)
       ...
       (#:temp-0 "
      (:PARAM NIL "new-value") "))
   (funcall (function (setf "
      (:PARAM NIL "f") ")) #:temp-0 #:temp-1 #:temp-2...))
")
     " " :PAR "A " (:TERM NIL "function") " named "
     (:TT NIL "(setf " (:PARAM NIL "f") ")")
     " must return its first argument as its only value in order to preserve the semantics of "
     (:MACREF NIL "setf") ". " :PAR (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " "
     :PAR)
    :PAR
    (:COMMENT NIL
     " I moved the symbol macro section up to be with the ordinary macro"
     " section.  --sjl 5 Mar 92")
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Treatment of Other Macros Based on SETF"))
    (:ISSUE NIL "READ-MODIFY-WRITE-EVALUATION-ORDER:DELAYED-ACCESS-STORES") " "
    :PAR "For each of the “read-modify-write” " (:TERM NIL "operators") " in "
    (:NEXTFIGURE NIL) ", and for any additional " (:TERM NIL "macros")
    " defined by the " (:TERM NIL "programmer") " using "
    (:MACREF NIL "define-modify-macro")
    ", an exception is made to the normal rule of left-to-right evaluation of arguments. Evaluation of "
    (:TERM NIL "argument") " " (:TERM NIL "forms")
    " occurs in left-to-right order, with the exception that for the "
    (:PARAM NIL "place") " " (:TERM NIL "argument") ", the actual "
    (:TERM NIL "read") " of the “old value” from that " (:PARAM NIL "place")
    " happens after all of the " (:TERM NIL "argument") " " (:TERM NIL "form")
    " " (:TERM NIL "evaluations")
    ", and just before a “new value” is computed and " (:TERM NIL "written")
    " back into the " (:PARAM NIL "place") ". " :PAR
    "Specifically, each of these " (:TERM NIL "operators")
    " can be viewed as involving a " (:TERM NIL "form")
    " with the following general syntax: " :PAR
    (:CODE NIL " (" (:TERM NIL "operator") " "
     (:STAR NIL (:CURLY NIL (:PARAM NIL "preceding-form"))) " "
     (:PARAM NIL "place") " "
     (:STAR NIL (:CURLY NIL (:PARAM NIL "following-form"))) ")
")
    " " :PAR "The evaluation of each such " (:TERM NIL "form")
    " proceeds like this: " :PAR
    (:LIST NIL
     (:ITEM NIL "1. " (:TERM NIL "Evaluate") " each of the "
      (:PARAM NIL "preceding-forms") ", in left-to-right order. ")
     (:ITEM NIL "2. " (:TERM NIL "Evaluate") " the " (:TERM NIL "subforms")
      " of the " (:PARAM NIL "place")
      ", in the order specified by the second value of the "
      (:TERM NIL "setf expansion") " for that " (:PARAM NIL "place") ". ")
     (:ITEM NIL "3. " (:TERM NIL "Evaluate") " each of the "
      (:PARAM NIL "following-forms") ", in left-to-right order. ")
     (:ITEM NIL "4. " (:TERM NIL "Read") " the old value from "
      (:PARAM NIL "place") ". ")
     (:ITEM NIL "5. Compute the new value. ")
     (:ITEM NIL "6. Store the new value into " (:PARAM NIL "place") ". "))
    " " :PAR
    (:TABLE (:NAME ("Read-Modify-Write Macros"))
     (:ROW NIL (:CELL NIL (:MACREF NIL " decf"))
      (:CELL NIL (:MACREF NIL "pop")) (:CELL NIL (:MACREF NIL "pushnew")))
     (:ROW NIL (:CELL NIL (:MACREF NIL " incf"))
      (:CELL NIL (:MACREF NIL "push")) (:CELL NIL (:MACREF NIL "remf"))))
    " " :PAR
    (:ENDISSUE NIL "READ-MODIFY-WRITE-EVALUATION-ORDER:DELAYED-ACCESS-STORES")
    " " :PAR))
  :PAR
  (:SECTION
   (:TITLE ("Transfer of Control to an Exit Point") :TAGS
    (:TRANSFER-OF-CONTROL))
   " " (:COMMENT NIL "% Exit Extents") :PAR
   (:COMMENT NIL
    " This text was originally duplicated in each of GO, RETURN-FROM,"
    " and THROW.  I thought it would be less redundant to centralize it here."
    " --sjl 7 Mar 92")
   :PAR (:ISSUE NIL "EXIT-EXTENT:MINIMAL")
   " When a transfer of control is initiated by " (:SPECREF NIL "go") ", "
   (:SPECREF NIL "return-from") ", or " (:SPECREF NIL "throw")
   " the following events occur in order to accomplish the transfer of control. Note that for "
   (:SPECREF NIL "go") ", the " (:TERM NIL "exit point") " is the "
   (:TERM NIL "form") " within the " (:SPECREF NIL "tagbody")
   " that is being executed at the time the " (:SPECREF NIL "go")
   " is performed; for " (:SPECREF NIL "return-from") ", the "
   (:TERM NIL "exit point") " is the corresponding " (:SPECREF NIL "block") " "
   (:TERM NIL "form") "; and for " (:SPECREF NIL "throw") ", the "
   (:TERM NIL "exit point") " is the corresponding " (:SPECREF NIL "catch") " "
   (:TERM NIL "form") ". " :PAR
   (:LIST NIL
    (:ITEM NIL "1. Intervening " (:TERM NIL "exit points") " are “abandoned” ("
     (:I NIL "i.e.") ",  their " (:TERM NIL "extent")
     " ends and it is no longer valid to attempt to transfer control through them). "
     :PAR)
    (:ITEM NIL "2. The cleanup clauses of any intervening "
     (:SPECREF NIL "unwind-protect") " clauses are evaluated. " :PAR)
    (:ITEM NIL "3. "
     (:COMMENT NIL " added condition handlers and restarts  -- sjl 7 Mar 92")
     "Intervening dynamic " (:TERM NIL "bindings") " of "
     (:DECLREF NIL "special") " variables, " (:TERM NIL "catch tags") ", "
     (:TERM NIL "condition handlers") ", and " (:TERM NIL "restarts")
     " are undone. " :PAR)
    (:ITEM NIL "4. The " (:TERM NIL "extent") " of the "
     (:TERM NIL "exit point")
     " being invoked ends, and control is passed to the target. "))
   " " :PAR
   "The extent of an exit being “abandoned” because it is being passed over ends as soon as the transfer of control is initiated. That is, event 1 occurs at the beginning of the initiation of the transfer of control. The consequences are undefined if an attempt is made to transfer control to an "
   (:TERM NIL "exit point") " whose " (:TERM NIL "dynamic extent")
   " has ended. " :PAR
   (:COMMENT NIL
    "Moon had me add the part about \"interleaved\" -kmp 13-Feb-92")
   "Events 2 and 3 are actually performed interleaved, in the order corresponding to the reverse order in which they were established. The effect of this is that the cleanup clauses of an "
   (:SPECREF NIL "unwind-protect") " see the same dynamic "
   (:TERM NIL "bindings") " of variables and " (:TERM NIL "catch tags")
   " as were visible when the " (:SPECREF NIL "unwind-protect")
   " was entered. " :PAR
   "Event 4 occurs at the end of the transfer of control. " :PAR
   (:ENDISSUE NIL "EXIT-EXTENT:MINIMAL") " ")
  :PAR
  (:DICTIONARY NIL :PAR
   (:COMMENT NIL " Control and Data flow" "  Functions" "  Variables"
    "  Control Transfer" "  Predicates and Truth Values" "   Truth Values"
    "   Identity/Equality" "   Functional Composition" "   Boolean Composition"
    "  Conditionals" "  Dispatch" "  Multiple Values" "  Data and Control"
    "  Setf")
   :PAR (:COMMENT NIL "-------------------- Functions --------------------")
   :PAR
   (:COMMENT NIL "%% ========== APPLY"
    " should this be an accessor rather than a function?  --sjl 5 mar 92")
   (:COM (:NAME "apply" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "apply")
      (:ARGLIST NIL "function " (:KEYWORD NIL " &rest") " " (:PLUS NIL "args"))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " (:PARAM NIL "function")
     "—a " (:TERM NIL "function designator") ". "
     (:ENDISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR
     (:PARAM NIL "args") "—a "
     (:TERM NIL "spreadable argument list designator") ". " :PAR
     (:COMMENT NIL "% 7.9.2 5") (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " returned by " (:PARAM NIL "function") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.3.0 2")
     (:TERM NIL "Applies") " the " (:PARAM NIL "function") " to the "
     (:PARAM NIL "args") ". " :PAR
     (:COMMENT NIL
      "%This is implied by the use of \"spreadable argument list designator\" above. -kmp 15-Aug-91"
      " All but the last \\param{arg} must be the"
      " arguments taken by \\param{function}."
      " The last \\param{arg} supplied must be a \\term{list} of such arguments."
      " "
      " The argument list for \\param{function} consists of the last \\param{arg} supplied"
      " appended to the end of a \\term{list} of all the other \\param{args}.")
     :PAR (:ISSUE NIL "REST-LIST-ALLOCATION:MAY-SHARE") " When the "
     (:PARAM NIL "function") " receives its arguments via "
     (:KEYREF NIL "rest") ", it is permissible (but not required) for the "
     (:TERM NIL "implementation") " to " (:TERM NIL "bind") " the "
     (:TERM NIL "rest parameter") " to an " (:TERM NIL "object")
     " that shares structure with the last argument to " (:FUNREF NIL "apply")
     ". Because a " (:TERM NIL "function")
     " can neither detect whether it was called via " (:FUNREF NIL "apply")
     " nor whether (if so) the last argument to " (:FUNREF NIL "apply")
     " was a " (:TERM NIL "constant") ", " (:TERM NIL "conforming programs")
     " must neither rely on the " (:TERM NIL "list") " structure of a "
     (:TERM NIL "rest list") " to be freshly consed, nor modify that "
     (:TERM NIL "list") " structure. "
     (:ENDISSUE NIL "REST-LIST-ALLOCATION:MAY-SHARE") " " :PAR
     (:MACREF NIL "setf") " can be used with " (:FUNREF NIL "apply")
     " in certain circumstances; see " (:SECREF NIL :SETF-OF-APPLY) ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:ISSUE NIL "REST-LIST-ALLOCATION:MAY-SHARE") " "
     (:CODE NIL " (setq f '+) → +
 (apply f '(1 2)) → 3
 (setq f #'-) → #<FUNCTION ->
 (apply f '(1 2)) → -1
 (apply #'max 3 5 '(2 7 3)) → 7
 (apply 'cons '((+ 2 3) 4)) → ((+ 2 3) . 4)
 (apply #'+ '()) → 0

 (defparameter *some-list* '(a b c))
 (defun strange-test (&rest x) (eq x *some-list*))
 (apply #'strange-test *some-list*) → "
      (:TERM NIL "implementation-dependent") "

 (defun bad-boy (&rest x) (rplacd x 'y))
 (bad-boy 'a 'b 'c) has undefined consequences.
 (apply #'bad-boy *some-list*) has undefined consequences.
")
     " " (:ENDISSUE NIL "REST-LIST-ALLOCATION:MAY-SHARE") " " :PAR
     (:CODE NIL " (defun foo (size &rest keys &key double &allow-other-keys)
   (let ((v (apply #'make-array size :allow-other-keys t keys)))
     (if double (concatenate (type-of v) v v) v)))
 (foo 4 :initial-contents '(a b c d) :double t)
    → #(A B C D A B C D)
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR
     (:COMMENT NIL "!!! Barmar: \"Last argument must be a list.\"") :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "funcall") ", "
     (:FUNREF NIL "fdefinition") ", " (:SPECREF NIL "function") ", "
     (:SECREF NIL :EVALUATION) ", " (:SECREF NIL :SETF-OF-APPLY) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DEFUN")
   (:COM (:NAME "defun" :FTYPE "Macro") (:ISSUE NIL "DECLS-AND-DOC") " "
    (:ISSUE NIL "FUNCTION-NAME:LARGE") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "defun")
      (:ARGLIST NIL "function-name lambda-list "
       (:INTERLEAVE NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration")))
        " | " (:PARAM NIL "documentation"))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL "function-name"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "function-name")
     "—a " (:TERM NIL "function name") ". " :PAR
     (:COMMENT NIL " tweaked --sjl 5 Mar 92"
      "\\param{lambda-list}---a \\term{lambda list}.")
     (:PARAM NIL "lambda-list") "—an " (:TERM NIL "ordinary lambda list") ". "
     :PAR (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR
     (:COMMENT NIL "% 5.3.1 3") (:PARAM NIL "documentation") "—a "
     (:TERM NIL "string") "; not evaluated. " :PAR (:COMMENT NIL "% 5.3.1 4")
     (:PARAM NIL "forms") "—an " (:TERM NIL "implicit progn") ". " :PAR
     (:PARAM NIL "block-name") "—the " (:TERM NIL "function block name")
     " of the " (:PARAM NIL "function-name") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Defines a new "
     (:TERM NIL "function") " named " (:PARAM NIL "function-name") " in the "
     (:TERM NIL "global environment") ". The body of the "
     (:TERM NIL "function") " defined by " (:MACREF NIL "defun")
     " consists of " (:PARAM NIL "forms") "; they are executed as an "
     (:TERM NIL "implicit progn") " when the " (:TERM NIL "function")
     " is called. " (:COMMENT NIL "% 5.3.1 6") (:MACREF NIL "defun")
     " can be used to define a new " (:TERM NIL "function")
     ", to install a corrected version of an incorrect definition, to redefine an already-defined "
     (:TERM NIL "function") ", or to redefine a " (:TERM NIL "macro") " as a "
     (:TERM NIL "function") ". " :PAR (:COMMENT NIL "% 5.3.1 5" "% 7.7.0 4")
     (:MACREF NIL "defun") " implicitly puts a " (:SPECREF NIL "block")
     " named " (:PARAM NIL "block-name") " around the body "
     (:PARAM NIL "forms") " "
     (:ISSUE NIL "DEFMACRO-BLOCK-SCOPE:EXCLUDES-BINDINGS") " (but not the "
     (:TERM NIL "forms") " in the " (:PARAM NIL "lambda-list") ") "
     (:ENDISSUE NIL "DEFMACRO-BLOCK-SCOPE:EXCLUDES-BINDINGS") " of the "
     (:TERM NIL "function") " defined. " :PAR (:COMMENT NIL "% 5.3.1 3")
     (:ISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " "
     (:PARAM NIL "Documentation") " is attached as a "
     (:TERM NIL "documentation string") " to " (:PARAM NIL "name") " (as kind "
     (:SPECREF NIL "function") ") and to the " (:TERM NIL "function") " "
     (:TERM NIL "object") ". "
     (:ENDISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " " :PAR
     (:COMMENT NIL "% 5.3.1 2") "Evaluating " (:MACREF NIL "defun") " causes "
     (:PARAM NIL "function-name") " to be a global name for the "
     (:TERM NIL "function") " specified by the "
     (:TERM NIL "lambda expression") " " :PAR
     (:CODE NIL " (lambda " (:PARAM NIL "lambda-list") "
   "
      (:INTERLEAVE NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration")))
       " | " (:PARAM NIL "documentation"))
      "
   (block "
      (:PARAM NIL "block-name") " "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))) "))
")
     " " :PAR "processed in the " (:TERM NIL "lexical environment")
     " in which " (:MACREF NIL "defun") " was executed. " :PAR
     "(None of the arguments are evaluated at macro expansion time.) " :PAR
     (:ISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     (:MACREF NIL "defun")
     " is not required to perform any compile-time side effects. In particular, "
     (:MACREF NIL "defun") " does not make the " (:TERM NIL "function")
     " definition available at compile time. An " (:TERM NIL "implementation")
     " may choose to store information about the " (:TERM NIL "function")
     " for the purposes of compile-time error-checking (such as checking the number of arguments on calls), or to enable the "
     (:TERM NIL "function") " to be expanded inline. "
     (:ENDISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun recur (x)
  (when (> x 0)
    (recur (1- x)))) → RECUR 
 (defun ex (a b &optional c (d 66) &rest keys &key test (start 0))
    (list a b c d keys test start)) → EX 
 (ex 1 2) → (1 2 NIL 66 NIL NIL 0)
 (ex 1 2 3 4 :test 'equal :start 50) 
→ (1 2 3 4 (:TEST EQUAL :START 50) EQUAL 50)
 (ex :test 1 :start 2) → (:TEST 1 :START 2 NIL NIL 0)

 ;; This function assumes its callers have checked the types of the
 ;; arguments, and authorizes the compiler to build in that assumption.
 (defun discriminant (a b c)
   (declare (number a b c))
   \"Compute the discriminant for a quadratic equation.\"
   (- (* b b) (* 4 a c))) → DISCRIMINANT
 (discriminant 1 2/3 -2) → 76/9

 ;; This function assumes its callers have not checked the types of the
 ;; arguments, and performs explicit type checks before making any assumptions. 
 (defun careful-discriminant (a b c)
   \"Compute the discriminant for a quadratic equation.\"
   (check-type a number)
   (check-type b number)
   (check-type c number)
   (locally (declare (number a b c))
     (- (* b b) (* 4 a c)))) → CAREFUL-DISCRIMINANT
 (careful-discriminant 1 2/3 -2) → 76/9
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR
     (:COMMENT NIL
      " adequately addressed in the packages chapter.  --sjl 5 mar 92"
      " \\issue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}"
      " For each \\i{S} that is a \\term{symbol} in \\thepackage{common-lisp},"
      " the consequences are undefined if either \\i{S} or \\f{(setf \\i{S})}"
      " is used as the \\param{function-name}."
      " \\endissue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "flet") ", "
     (:SPECREF NIL "labels") ", " (:SPECREF NIL "block") ", "
     (:SPECREF NIL "return-from") ", " (:MISC NIL "declare") ", "
     (:FUNREF NIL "documentation") ", " (:SECREF NIL :EVALUATION) ", "
     (:SECREF NIL :ORDINARY-LAMBDA-LISTS) ", " (:SECREF NIL :DOC-VS-DECLS) " "
     :PAR)
    (:PART (:NAME "Notes") " " (:COMMENT NIL "% 5.3.1 5")
     (:SPECREF NIL "return-from") " can be used to return prematurely from a "
     (:TERM NIL "function") " defined by " (:MACREF NIL "defun") ". " :PAR
     "Additional side effects might take place when additional information (typically debugging information) about the function definition is recorded. "
     :PAR (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " "
     (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FDEFINITION")
   (:COM (:NAME "fdefinition" :FTYPE "Accessor")
    (:ISSUE NIL "FUNCTION-NAME:LARGE") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "fdefinition")
      (:ARGLIST NIL "function-name") (:VALUES NIL "definition"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "fdefinition")
      (:ARGLIST NIL "function-name") (:NEW-VALUE NIL "new-definition"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "function-name")
     "—a " (:TERM NIL "function name") ". "
     (:ISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " In the non-"
     (:MACREF NIL "setf") " case, the " (:TERM NIL "name") " must be "
     (:TERM NIL "fbound") " in the " (:TERM NIL "global environment") ". "
     (:ENDISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR
     (:PARAM NIL "definition") "—Current global function definition named by "
     (:PARAM NIL "function-name") ". " :PAR (:PARAM NIL "new-definition") "—a "
     (:TERM NIL "function") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "fdefinition") " "
     (:TERM NIL "accesses") " the current global function definition named by "
     (:PARAM NIL "function-name") ". The definition may be a "
     (:TERM NIL "function") " or may be an " (:TERM NIL "object")
     " representing a " (:TERM NIL "special form") " or " (:TERM NIL "macro")
     ". " (:ISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " The value returned by "
     (:FUNREF NIL "fdefinition") " when " (:FUNREF NIL "fboundp")
     " returns true but the " (:PARAM NIL "function-name") " denotes a "
     (:TERM NIL "macro") " or " (:TERM NIL "special form")
     " is not well-defined, but " (:FUNREF NIL "fdefinition")
     " does not signal an error. "
     (:ENDISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "function-name")
     " is not a " (:TERM NIL "function name") ". " :PAR "An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "undefined-function")
     " is signaled in the non-" (:MACREF NIL "setf") " case if "
     (:PARAM NIL "function-name") " is not " (:TERM NIL "fbound") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "fboundp") ", "
     (:FUNREF NIL "fmakunbound") ", " (:FUNREF NIL "macro-function") ", "
     (:ISSUE NIL "SPECIAL-FORM-P-MISNOMER:RENAME") " "
     (:FUNREF NIL "special-operator-p") ", "
     (:ENDISSUE NIL "SPECIAL-FORM-P-MISNOMER:RENAME") " "
     (:FUNREF NIL "symbol-function") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "fdefinition") " cannot "
     (:TERM NIL "access") " the value of a lexical function name produced by "
     (:SPECREF NIL "flet") " or " (:SPECREF NIL "labels") "; it can "
     (:TERM NIL "access") " only the global function value. " :PAR
     (:MACREF NIL "setf") " can be used with " (:FUNREF NIL "fdefinition")
     " to replace a global function definition when the "
     (:PARAM NIL "function-name")
     "'s function definition does not represent a " (:TERM NIL "special form")
     ". " (:ISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " (:MACREF NIL "setf")
     " of " (:FUNREF NIL "fdefinition") " requires a " (:TERM NIL "function")
     " as the new value. It is an error to set the "
     (:FUNREF NIL "fdefinition") " of a " (:PARAM NIL "function-name") " to a "
     (:TERM NIL "symbol") ", a " (:TERM NIL "list")
     ", or the value returned by " (:FUNREF NIL "fdefinition")
     " on the name of a " (:TERM NIL "macro") " or " (:TERM NIL "special form")
     ". " (:ENDISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR
     (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " "))
   " " :PAR (:COMMENT NIL "%% ========== FBOUNDP")
   (:COM (:NAME "fboundp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "fboundp") (:ARGLIST NIL "name")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Pronunciation") " " :PAR
     (:PRONOUNCED NIL (:LO-STRESS NIL "ef") (:HI-STRESS NIL "ba.und") "pē") " "
     :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "FUNCTION-NAME:LARGE") " " (:PARAM NIL "name") "—a "
     (:TERM NIL "function name") ". " (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " "
     :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.1.1 20")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "name") " is "
     (:TERM NIL "fbound") "; otherwise, returns " (:TERM NIL "false") ". "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:COMMENT NIL
      "Some \"implementation dependent\" => \"true\" per Moore #2 (first public review). -kmp 12-May-93")
     (:CODE NIL " (fboundp 'car) → " (:TERM NIL "true") "
 (fboundp 'nth-value) → "
      (:TERM NIL "false") "
 (fboundp 'with-open-file) → "
      (:TERM NIL "true") "
 (fboundp 'unwind-protect) → "
      (:TERM NIL "true") "
 (defun my-function (x) x) → MY-FUNCTION
 (fboundp 'my-function) → "
      (:TERM NIL "true") "
 (let ((saved-definition (symbol-function 'my-function)))
   (unwind-protect (progn (fmakunbound 'my-function)
                          (fboundp 'my-function))
     (setf (symbol-function 'my-function) saved-definition)))
→ "
      (:TERM NIL "false") "
 (fboundp 'my-function) → "
      (:TERM NIL "true") "
 (defmacro my-macro (x) `',x) → MY-MACRO
 (fboundp 'my-macro) → "
      (:TERM NIL "true") "
 (fmakunbound 'my-function) → MY-FUNCTION
 (fboundp 'my-function) → "
      (:TERM NIL "false") "
 (flet ((my-function (x) x))
   (fboundp 'my-function)) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "name") " is not a "
     (:TERM NIL "function name") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "symbol-function") ", "
     (:FUNREF NIL "fmakunbound") ", " (:FUNREF NIL "fdefinition") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "It is permissible to call "
     (:FUNREF NIL "symbol-function") " on any " (:TERM NIL "symbol")
     " that is " (:TERM NIL "fbound") ". " :PAR (:FUNREF NIL "fboundp")
     " is sometimes used to “guard” an access to the "
     (:TERM NIL "function cell") ", as in: "
     (:CODE NIL "(if (fboundp x) (symbol-function x))
")
     " " :PAR (:ISSUE NIL "SETF-FUNCTIONS-AGAIN:MINIMAL-CHANGES")
     " Defining a " (:TERM NIL "setf expander") " " (:PARAM NIL "F")
     " does not cause the " (:TERM NIL "setf function") " "
     (:TT NIL "(setf " (:PARAM NIL "F") ")") " to become defined. "
     (:COMMENT NIL
      "% Moon wanted this removed because he thinks it is \"redundant and pompous\". -kmp 4-Dec-91"
      " as such, if there is such a definition"
      " of a \\term{setf expander} \\param{F}, the \\term{function} \\f{(setf \\param{F})}"
      " can be \\term{fbound} if and only if, by design or coincidence, a"
      " function binding for \\f{(setf \\param{F})} has been independently established.")
     (:ENDISSUE NIL "SETF-FUNCTIONS-AGAIN:MINIMAL-CHANGES") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FMAKUNBOUND")
   (:COM (:NAME "fmakunbound" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "fmakunbound") (:ARGLIST NIL "name")
      (:VALUES NIL "name"))
     " " :PAR)
    (:PART (:NAME "Pronunciation") " " :PAR
     (:PRONOUNCED NIL (:LO-STRESS NIL "ef") (:HI-STRESS NIL "mak") "ə n"
      (:LO-STRESS NIL "ba.und"))
     " or "
     (:PRONOUNCED NIL (:LO-STRESS NIL "ef") (:HI-STRESS NIL "mā k") "ə n"
      (:LO-STRESS NIL "ba.und"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "FUNCTION-NAME:LARGE") " " (:PARAM NIL "name") "—a "
     (:TERM NIL "function name") ". " (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " "
     :PAR)
    (:PART (:NAME "Description") " " :PAR "Removes the " (:TERM NIL "function")
     " or " (:TERM NIL "macro") " definition, if any, of " (:PARAM NIL "name")
     " in the " (:TERM NIL "global environment") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL "(defun add-some (x) (+ x 19)) → ADD-SOME
 (fboundp 'add-some) → "
      (:TERM NIL "true") "
 (flet ((add-some (x) (+ x 37)))
    (fmakunbound 'add-some)
    (add-some 1)) → 38
 (fboundp 'add-some) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR
     (:COMMENT NIL " I see no symbol here.  --sjl 5 Mar 92"
      "The \\term{function cell} of \\param{symbol} is modified.")
     :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "name") " is not a "
     (:TERM NIL "function name") ". " :PAR "The consequences are undefined if "
     (:PARAM NIL "name") " is a " (:TERM NIL "special operator") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "fboundp") ", "
     (:FUNREF NIL "makunbound") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== FLET" "%% ========== LABELS"
    "%% ========== MACROLET")
   (:COM (:NAME "flet, labels, macrolet" :FTYPE "Special Operator")
    (:ISSUE NIL "DECLS-AND-DOC") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR (:ISSUE NIL "FLET-DECLARATIONS:ALLOW") " "
     (:DEF (:KIND "special-operator") (:NAMES NIL "flet")
      (:ARGLIST NIL
       (:PAREN NIL
        (:STAR NIL
         (:CURLY NIL
          (:PAREN NIL (:PARAM NIL "function-name") " "
           (:PARAM NIL "lambda-list") " "
           (:INTERLEAVE NIL
            (:STAR NIL (:CURLY NIL (:PARAM NIL "local-declaration"))) " | "
            (:PARAM NIL "local-documentation"))
           " " (:STAR NIL (:CURLY NIL (:PARAM NIL "local-form")))))))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "labels")
      (:ARGLIST NIL
       (:PAREN NIL
        (:STAR NIL
         (:CURLY NIL
          (:PAREN NIL (:PARAM NIL "function-name") " "
           (:PARAM NIL "lambda-list") " "
           (:INTERLEAVE NIL
            (:STAR NIL (:CURLY NIL (:PARAM NIL "local-declaration"))) " | "
            (:PARAM NIL "local-documentation"))
           " " (:STAR NIL (:CURLY NIL (:PARAM NIL "local-form")))))))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "macrolet")
      (:ARGLIST NIL
       (:PAREN NIL
        (:STAR NIL
         (:CURLY NIL
          (:PAREN NIL (:PARAM NIL "name") " " (:PARAM NIL "lambda-list") " "
           (:INTERLEAVE NIL
            (:STAR NIL (:CURLY NIL (:PARAM NIL "local-declaration"))) " | "
            (:PARAM NIL "local-documentation"))
           " " (:STAR NIL (:CURLY NIL (:PARAM NIL "local-form")))))))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " (:ENDISSUE NIL "FLET-DECLARATIONS:ALLOW") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "FUNCTION-NAME:LARGE") " " (:PARAM NIL "function-name") "—a "
     (:TERM NIL "function name") ". " (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " "
     :PAR (:PARAM NIL "name") "—a " (:TERM NIL "symbol") ". "
     (:COMMENT NIL "name of the \\term{macro} being defined.") :PAR
     (:PARAM NIL "lambda-list") "—a " (:TERM NIL "lambda list") "; for "
     (:SPECREF NIL "flet") " and " (:SPECREF NIL "labels") ", it is an "
     (:TERM NIL "ordinary lambda list") "; for " (:SPECREF NIL "macrolet")
     ", it is a " (:TERM NIL "macro lambda list") ". " :PAR
     (:PARAM NIL "local-declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR
     (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR
     (:PARAM NIL "local-documentation") "—a " (:TERM NIL "string")
     "; not evaluated. " :PAR (:PARAM NIL "local-forms") ", "
     (:PARAM NIL "forms") "—an " (:TERM NIL "implicit progn") ". " :PAR
     (:PARAM NIL "results") "—the " (:TERM NIL "values") " of the "
     (:PARAM NIL "forms") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:SPECREF NIL "flet") ", "
     (:SPECREF NIL "labels") ", and " (:SPECREF NIL "macrolet")
     " define local " (:TERM NIL "functions") " and " (:TERM NIL "macros")
     ", and execute " (:PARAM NIL "forms") " using the local definitions. "
     (:PARAM NIL "Forms") " are executed in order of occurrence. " :PAR
     (:ISSUE NIL "FLET-IMPLICIT-BLOCK:YES") " "
     (:ISSUE NIL "FUNCTION-NAME:LARGE") " "
     (:ISSUE NIL "DEFMACRO-BLOCK-SCOPE:EXCLUDES-BINDINGS")
     " The body forms (but not the " (:TERM NIL "lambda list") ") "
     (:ENDISSUE NIL "DEFMACRO-BLOCK-SCOPE:EXCLUDES-BINDINGS") " of each "
     (:TERM NIL "function") " created by " (:SPECREF NIL "flet") " and "
     (:SPECREF NIL "labels") " and each " (:TERM NIL "macro") " created by "
     (:SPECREF NIL "macrolet") " are enclosed in an "
     (:TERM NIL "implicit block") " whose name is the "
     (:TERM NIL "function block name") " of the " (:PARAM NIL "function-name")
     " or " (:PARAM NIL "name") ", as appropriate. "
     (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " "
     (:ENDISSUE NIL "FLET-IMPLICIT-BLOCK:YES") " " :PAR
     (:ISSUE NIL "FLET-DECLARATIONS") " The scope of the "
     (:PARAM NIL "declarations")
     " between the list of local function/macro definitions and the body "
     (:PARAM NIL "forms") " in " (:SPECREF NIL "flet") " and "
     (:SPECREF NIL "labels")
     " does not include the bodies of the locally defined "
     (:TERM NIL "functions") ", except that for " (:SPECREF NIL "labels")
     ", any " (:DECLREF NIL "inline") ", " (:DECLREF NIL "notinline") ", or "
     (:DECLREF NIL "ftype")
     " declarations that refer to the locally defined functions do apply to the local function bodies. That is, their "
     (:TERM NIL "scope") " is the same as the function name that they affect. "
     (:ISSUE NIL "DECLARATION-SCOPE:NO-HOISTING") " "
     (:COMMENT NIL "The following will be deleted from the standard:"
      "when the \\param{declarations} "
      "are \\term{pervasive}. Non-\\term{pervasive}"
      "\\param{declarations} have no effect on those bodies, except when "
      "\\specref{labels} includes the"
      "body in the \\term{scope} of a function non-\\term{pervasively} declared.  "
      "End of deletion.")
     (:ENDISSUE NIL "DECLARATION-SCOPE:NO-HOISTING") " The scope of these "
     (:PARAM NIL "declarations")
     " does not include the bodies of the macro expander functions defined by "
     (:SPECREF NIL "macrolet") ". " (:ENDISSUE NIL "FLET-DECLARATIONS") " "
     :PAR
     (:COMMENT NIL
      " This is adequately covered in the packages chapter.  --sjl 5 mar 92"
      "\\issue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}"
      "The consequences are undefined if a \\term{symbol} in \\thepackage{common-lisp}"
      "that is defined as a \\term{function}, \\term{macro}, or \\term{special form} "
      "is used as the function-name or name argument."
      "If such a \\term{symbol} is not defined as a \\term{function}, \\term{macro}, or "
      "\\term{special form}, it is allowed to (lexically) bind it as a \\term{function} "
      "or \\term{macro}." "\\endissue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}")
     :PAR
     (:LIST NIL
      (:ITEM NIL (:B NIL " flet") " " :PAR (:COMMENT NIL "% 7.5.0 17")
       (:SPECREF NIL "flet") " defines locally named " (:TERM NIL "functions")
       " and executes a series of " (:PARAM NIL "forms")
       " with these definition " (:TERM NIL "bindings")
       ". Any number of such local " (:TERM NIL "functions")
       " can be defined. " :PAR "The " (:TERM NIL "scope") " of the name "
       (:TERM NIL "binding") " encompasses only the body. Within the body of "
       (:SPECREF NIL "flet") ", " (:PARAM NIL "function-names")
       " matching those defined by " (:SPECREF NIL "flet")
       " refer to the locally defined " (:TERM NIL "functions")
       " rather than to the global function definitions of the same name. "
       (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
       (:ISSUE NIL "GET-SETF-METHOD-ENVIRONMENT:ADD-ARG")
       " Also, within the scope of " (:SPECREF NIL "flet") ", global "
       (:TERM NIL "setf expander") " definitions of the "
       (:PARAM NIL "function-name") " defined by " (:SPECREF NIL "flet")
       " do not apply. "
       (:COMMENT NIL
        "% This shouldn't be needed any more under SETF-METHOD-VS-SETF-METHOD."
        "!!! Issue: (defun (setf x) ...) vs (defmethod (setf x) ...) is really the issue, isn't it?")
       "Note that this applies to " (:TT NIL " (defsetf " (:I NIL "f") " ...)")
       ", not " (:TT NIL " (defmethod (setf " (:I NIL "f") ") ...)") ". "
       (:ENDISSUE NIL "GET-SETF-METHOD-ENVIRONMENT:ADD-ARG") " "
       (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " " :PAR
       "The names of " (:TERM NIL "functions") " defined by "
       (:SPECREF NIL "flet") " are in the " (:TERM NIL "lexical environment")
       "; they retain their local definitions only within the body of "
       (:SPECREF NIL "flet")
       ". The function definition bindings are visible only in the body of "
       (:SPECREF NIL "flet")
       ", not the definitions themselves. Within the function definitions, local function names that match those being defined refer to "
       (:TERM NIL "functions") " or " (:TERM NIL "macros")
       " defined outside the " (:SPECREF NIL "flet") ". " (:SPECREF NIL "flet")
       " can locally " (:TERM NIL "shadow")
       " a global function name, and the new definition can refer to the global definition. "
       :PAR "Any " (:PARAM NIL "local-documentation")
       " is attached to the corresponding local " (:PARAM NIL "function")
       " (if one is actually created) as a " (:TERM NIL "documentation string")
       ". " :PAR)
      (:ITEM NIL (:B NIL " labels") " " :PAR (:COMMENT NIL "% 7.5.0 18")
       (:SPECREF NIL "labels") " is equivalent to " (:SPECREF NIL "flet")
       " except that the scope of the defined function names for "
       (:SPECREF NIL "labels")
       " encompasses the function definitions themselves as well as the body. "
       (:COMMENT NIL " That is, within the body of \\specref{labels}, "
        " \\param{function-names} matching those defined by \\specref{labels} "
        " refer to the locally defined \\term{functions} " " rather than to"
        " the global function definitions of the same name."
        "!!! FLET duplicates this same text.  Is there a way to centralize it?")
       (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
       (:ISSUE NIL "GET-SETF-METHOD-ENVIRONMENT:ADD-ARG") " "
       (:COMMENT NIL
        "% Moon says this is \"redundant and confusing\"--presumably because it's"
        "% already said under FLET, which LABELS purports to be equivalent to. -kmp 4-Dec-91"
        " Within the scope of \\specref{labels}, "
        " any global \\term{setf expander} definitions whose names are among the \\param{function-names}"
        " are lexically disabled. "
        "% This shouldn't be needed under SETF-METHOD-VS-SETF-METHOD"
        " Note that this applies to {\\tt (defsetf \\i{f} ...)}, not"
        " {\\tt (defmethod (setf \\i{f}) ...)}.")
       (:ENDISSUE NIL "GET-SETF-METHOD-ENVIRONMENT:ADD-ARG") " "
       (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " " :PAR)
      (:ITEM NIL (:B NIL " macrolet") " " :PAR (:COMMENT NIL "% 7.5.0 19")
       (:SPECREF NIL "macrolet") " "
       (:COMMENT NIL "is different from \\specref{flet} in that it")
       "establishes local " (:TERM NIL "macro")
       " definitions, using the same format used by " (:MACREF NIL "defmacro")
       ". " :PAR
       (:COMMENT NIL
        "!!! Duplicated in FLET and LABELS.  Centralize? -kmp 8-May-91")
       (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
       (:ISSUE NIL "GET-SETF-METHOD-ENVIRONMENT:ADD-ARG") " "
       (:COMMENT NIL
        " We haven't defined what the scope is yet.  --sjl 5 mar 92"
        "Within the scope of \\specref{macrolet}, ")
       "Within the body of " (:SPECREF NIL "macrolet") ", global "
       (:TERM NIL "setf expander") " definitions of the " (:PARAM NIL "names")
       " defined by the " (:SPECREF NIL "macrolet") " do not apply; rather, "
       (:MACREF NIL "setf") " expands the " (:TERM NIL "macro form")
       " and recursively process the resulting " (:TERM NIL "form") ". "
       (:COMMENT NIL "!!! See note above about (defun (setf x) ...) ..."
        " Note that this applies to {\\tt (defsetf \\i{f} ...)}, not"
        " {\\tt (defmethod (setf \\i{f}) ...)}.")
       (:ENDISSUE NIL "GET-SETF-METHOD-ENVIRONMENT:ADD-ARG") " "
       (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " " :PAR
       (:COMMENT NIL
        "!!! Barmar: Mention that macros are expadned at semantic analysis time"
        " so even global varaible references must be to variables gieven values at compile time.")
       :PAR (:COMMENT NIL "% 7.5.0 20")
       "The macro-expansion functions defined by " (:SPECREF NIL "macrolet")
       " are defined in the "
       (:ISSUE NIL "DEFINING-MACROS-NON-TOP-LEVEL:ALLOW") " "
       (:TERM NIL "lexical environment") " in which the "
       (:SPECREF NIL "macrolet") " form appears. "
       (:COMMENT NIL "global environment.") "Declarations and "
       (:SPECREF NIL "macrolet") " and " (:SPECREF NIL "symbol-macrolet")
       " definitions affect the local macro definitions in a "
       (:SPECREF NIL "macrolet")
       ", but the consequences are undefined if the local macro definitions reference any local "
       (:TERM NIL "variable") " or " (:TERM NIL "function") " "
       (:TERM NIL "bindings") " that are visible in that "
       (:TERM NIL "lexical environment") ". "
       (:COMMENT NIL
        "Lexical entities that would ordinarily be lexically apparent"
        "are not visible within the expansion functions.  However,"
        "lexical entities are visible"
        "within the body of the \\specref{macrolet} form and are visible"
        "to the code that is the expansion of a macro call.  ")
       (:ENDISSUE NIL "DEFINING-MACROS-NON-TOP-LEVEL:ALLOW") " " :PAR "Any "
       (:PARAM NIL "local-documentation")
       " is attached to the corresponding local " (:PARAM NIL "macro function")
       " as a " (:TERM NIL "documentation string") ". " :PAR))
     " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun foo (x flag)
   (macrolet ((fudge (z)
                 ;The parameters x and flag are not accessible
                 ; at this point; a reference to flag would be to
                 ; the global variable of that name.
                 ` (if flag (* ,z ,z) ,z)))
    ;The parameters x and flag are accessible here.
     (+ x
        (fudge x)
        (fudge (+ x 1)))))
 ≡
 (defun foo (x flag)
   (+ x
      (if flag (* x x) x)
      (if flag (* (+ x 1) (+ x 1)) (+ x 1))))
")
     " after macro expansion. The occurrences of " (:TT NIL "x") " and "
     (:TT NIL "flag") " legitimately refer to the parameters of the function "
     (:TT NIL "foo")
     " because those parameters are visible at the site of the macro call which produced the expansion. "
     :PAR (:ISSUE NIL "LISP-SYMBOL-REDEFINITION:MAR89-X3J13") " "
     (:COMMENT NIL
      "Barmar points out that this example violated LISP-SYMBOL-REDEFINITION:"
      " \\code"
      "  (flet ((+ (&rest args) 'crossed-out)) (+ 1 2 3)) \\EV CROSSED-OUT"
      " \\endcode")
     (:ENDISSUE NIL "LISP-SYMBOL-REDEFINITION:MAR89-X3J13") " " :PAR
     (:CODE NIL " (flet ((flet1 (n) (+ n n)))
    (flet ((flet1 (n) (+ 2 (flet1 n))))
      (flet1 2))) → 6

 (defun dummy-function () 'top-level) → DUMMY-FUNCTION 
 (funcall #'dummy-function) → TOP-LEVEL 
 (flet ((dummy-function () 'shadow)) 
      (funcall #'dummy-function)) → SHADOW 
 (eq (funcall #'dummy-function) (funcall 'dummy-function))
→ "
      (:TERM NIL "true") " 
 (flet ((dummy-function () 'shadow))
   (eq (funcall #'dummy-function)
       (funcall 'dummy-function)))
→ "
      (:TERM NIL "false") " 

 (defun recursive-times (k n)
   (labels ((temp (n) 
              (if (zerop n) 0 (+ k (temp (1- n))))))
     (temp n))) → RECURSIVE-TIMES
 (recursive-times 2 3) → 6

 (defmacro mlets (x &environment env) 
    (let ((form `(babbit ,x)))
      (macroexpand form env))) → MLETS
 (macrolet ((babbit (z) `(+ ,z ,z))) (mlets 5)) → 10
")
     " " :PAR
     (:CODE NIL " (flet ((safesqrt (x) (sqrt (abs x))))
  ;; The safesqrt function is used in two places.
   (safesqrt (apply #'+ (map 'list #'safesqrt '(1 2 3 4 5 6)))))
→ 3.291173
")
     " " :PAR
     (:CODE NIL " (defun integer-power (n k)     
   (declare (integer n))         
   (declare (type (integer 0 *) k))
   (labels ((expt0 (x k a)
              (declare (integer x a) (type (integer 0 *) k))
              (cond ((zerop k) a)
                    ((evenp k) (expt1 (* x x) (floor k 2) a))
                    (t (expt0 (* x x) (floor k 2) (* x a)))))
            (expt1 (x k a)
              (declare (integer x a) (type (integer 0 *) k))
              (cond ((evenp k) (expt1 (* x x) (floor k 2) a))
                    (t (expt0 (* x x) (floor k 2) (* x a))))))
    (expt0 n k 1))) → INTEGER-POWER
")
     " " :PAR (:ISSUE NIL "FLET-DECLARATIONS") " "
     (:CODE NIL " (defun example (y l)
   (flet ((attach (x)
            (setq l (append l (list x)))))
     (declare (inline attach))
     (dolist (x y)
       (unless (null (cdr x))
         (attach x)))
     l))

 (example '((a apple apricot) (b banana) (c cherry) (d) (e))
          '((1) (2) (3) (4 2) (5) (6 3 2)))
→ ((1) (2) (3) (4 2) (5) (6 3 2) (A APPLE APRICOT) (B BANANA) (C CHERRY))
")
     " " (:ENDISSUE NIL "FLET-DECLARATIONS") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MISC NIL "declare") ", "
     (:MACREF NIL "defmacro") ", " (:MACREF NIL "defun") ", "
     (:FUNREF NIL "documentation") ", " (:MACREF NIL "let") ", "
     (:SECREF NIL :EVALUATION) ", " (:SECREF NIL :DOC-VS-DECLS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "It is not possible to define recursive "
     (:TERM NIL "functions") " with " (:SPECREF NIL "flet") ". "
     (:SPECREF NIL "labels") " can be used to define mutually recursive "
     (:TERM NIL "functions") ". " :PAR "If a " (:SPECREF NIL "macrolet") " "
     (:TERM NIL "form") " is a " (:TERM NIL "top level form") ", the body "
     (:PARAM NIL "forms") " are also processed as "
     (:TERM NIL "top level forms") ". See " (:SECREF NIL :FILE-COMPILATION)
     ". " :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FUNCALL")
   (:COM (:NAME "funcall" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "funcall")
      (:ARGLIST NIL "function " (:KEYWORD NIL " &rest") " args")
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "function")
     "—a " (:TERM NIL "function designator") ". " :PAR (:PARAM NIL "args") "—"
     (:TERM NIL "arguments") " to the " (:PARAM NIL "function") ". " :PAR
     (:COMMENT NIL "% 7.9.2 5") (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " returned by the " (:PARAM NIL "function") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.3.0 3")
     (:FUNREF NIL "funcall") " applies " (:PARAM NIL "function") " to "
     (:PARAM NIL "args") ". " (:ISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " "
     (:COMMENT NIL "!!! Barmar: \"a symbol\" => \"a function name\"") "If "
     (:PARAM NIL "function") " is a " (:TERM NIL "symbol")
     ", it is coerced to a " (:TERM NIL "function") " as if by "
     (:COMMENT NIL "!!! Barmar: => \"... as if fdefinition.\" ") "finding its "
     (:TERM NIL "functional value") " in the " (:TERM NIL "global environment")
     ". " (:ENDISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (funcall #'+ 1 2 3) → 6
 (funcall 'car '(1 2 3)) → 1
 (funcall 'position 1 '(1 2 3 2 1) :start 1) → 4
 (cons 1 2) → (1 . 2)
 (flet ((cons (x y) `(kons ,x ,y)))
   (let ((cons (symbol-function '+)))
     (funcall #'cons
              (funcall 'cons 1 2)
              (funcall cons 1 2))))
→ (KONS (1 . 2) 3)
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "undefined-function")
     " should be signaled if " (:PARAM NIL "function") " is a "
     (:TERM NIL "symbol") " that does not have a global definition as a "
     (:TERM NIL "function") " or that has a global definition as a "
     (:TERM NIL "macro") " or a " (:TERM NIL "special operator") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "apply") ", "
     (:SPECREF NIL "function") ", " (:SECREF NIL :EVALUATION) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (funcall " (:PARAM NIL "function") " " (:PARAM NIL "arg1")
      " " (:PARAM NIL "arg2") " ...)
 ≡ (apply "
      (:PARAM NIL "function") " " (:PARAM NIL "arg1") " " (:PARAM NIL "arg2")
      " ... nil)
 ≡ (apply "
      (:PARAM NIL "function") " (list " (:PARAM NIL "arg1") " "
      (:PARAM NIL "arg2") " ...))
")
     " " :PAR "The difference between " (:FUNREF NIL "funcall")
     " and an ordinary function call is that in the former case the "
     (:PARAM NIL "function") " is obtained by ordinary "
     (:TERM NIL "evaluation") " of a " (:TERM NIL "form")
     ", and in the latter case it is obtained by the special interpretation of the function position that normally occurs. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FUNCTION")
   (:COM (:NAME "function" :FTYPE "Special Operator")
    (:ISSUE NIL "FUNCTION-NAME:LARGE") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "function")
      (:ARGLIST NIL "name") (:VALUES NIL "function"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "function name") " or " (:TERM NIL "lambda expression") ". "
     :PAR (:COMMENT NIL "% 2.13.0 5 ") (:PARAM NIL "function") "—a "
     (:TERM NIL "function") " " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.1.1 4") "The "
     (:TERM NIL "value") " of " (:SPECREF NIL "function") " is the "
     (:TERM NIL "functional value") " of " (:PARAM NIL "name")
     " in the current " (:TERM NIL "lexical environment") ". " :PAR "If "
     (:PARAM NIL "name") " is a " (:TERM NIL "function name")
     ", the functional definition of that name " (:COMMENT NIL "which is that")
     "is that "
     (:COMMENT NIL "!!! Must be a better way to say this! -kmp"
      " Yup. -- sjl 5 Mar 92")
     "established by the innermost lexically enclosing " (:SPECREF NIL "flet")
     ", " (:SPECREF NIL "labels") ", or " (:SPECREF NIL "macrolet") " "
     (:TERM NIL "form") ", "
     (:COMMENT NIL
      "if there is one, or else the global functional definition of the \\term{symbol}")
     "if there is one. Otherwise the global functional definition of the "
     (:TERM NIL "function name") " is returned. " :PAR "If "
     (:PARAM NIL "name") " is a " (:TERM NIL "lambda expression") ", then a "
     (:TERM NIL "lexical closure") " is returned. In situations where a "
     (:TERM NIL "closure") " over the same set of " (:TERM NIL "bindings")
     " might be produced more than once, the various resulting "
     (:TERM NIL "closures") " might or might not be " (:FUNREF NIL "eq") ". "
     :PAR (:ISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " It is an error to use "
     (:SPECREF NIL "function") " on a " (:TERM NIL "function name")
     " that does not denote a " (:TERM NIL "function")
     " in the lexical environment in which the " (:SPECREF NIL "function")
     " form appears. Specifically, it is an error to use "
     (:SPECREF NIL "function") " on a " (:TERM NIL "symbol") " that denotes a "
     (:TERM NIL "macro") " or " (:TERM NIL "special form")
     ". An implementation may choose not to signal this error for performance reasons, but implementations are forbidden from defining the failure to signal an error as a useful behavior. "
     (:ENDISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun adder (x) (function (lambda (y) (+ x y))))
")
     " The result of " (:TT NIL "(adder 3)") " is a function that adds "
     (:TT NIL "3") " to its argument: " :PAR
     (:CODE NIL " (setq add3 (adder 3))
 (funcall add3 5) → 8
")
     " This works because " (:SPECREF NIL "function") " creates a "
     (:TERM NIL "closure") " of the " (:TERM NIL "lambda expression")
     " that is able to refer to the " (:TERM NIL "value") " " (:TT NIL "3")
     " of the variable " (:TT NIL "x")
     " even after control has returned from the function " (:TT NIL "adder")
     ". " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " "
     (:COMMENT NIL
      "!!! Moon: Perhaps \"should signal\" undefined-function and/or type-error.")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defun") ", "
     (:FUNREF NIL "fdefinition") ", " (:SPECREF NIL "flet") ", "
     (:SPECREF NIL "labels") ", " (:FUNREF NIL "symbol-function") ", "
     (:SECREF NIL :SYMBOLS-AS-FORMS) ", " (:SECREF NIL :SHARPSIGN-QUOTE) ", "
     (:SECREF NIL :PRINTING-OTHER-OBJECTS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The notation "
     (:TT NIL " #'" (:PARAM NIL "name")) " may be used as an abbreviation for "
     (:TT NIL " (function " (:PARAM NIL "name") ")") ". "
     (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FUNCTION-LAMBDA-EXPRESSION")
   (:COM (:NAME "function-lambda-expression" :FTYPE "Function")
    (:ISSUE NIL "FUNCTION-DEFINITION:JAN89-X3J13") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "function-lambda-expression")
      (:ARGLIST NIL "function")
      (:VALUES NIL "lambda-expression, closure-p, name"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "function")
     "—a " (:TERM NIL "function") ". " :PAR (:PARAM NIL "lambda-expression")
     "—a " (:TERM NIL "lambda expression") " or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "closure-p") "—a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "name") "—an " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns information about "
     (:PARAM NIL "function") " as follows: " :PAR "The "
     (:TERM NIL "primary value") ", " (:PARAM NIL "lambda-expression") ", is "
     (:PARAM NIL "function") "'s defining " (:TERM NIL "lambda expression")
     ", or " (:MISC NIL "nil") " if the information is not available. The "
     (:TERM NIL "lambda expression")
     " may have been pre-processed in some ways, but it should remain a suitable argument to "
     (:FUNREF NIL "compile") " or " (:SPECREF NIL "function") ". Any "
     (:TERM NIL "implementation") " may legitimately return " (:MISC NIL "nil")
     " as the " (:PARAM NIL "lambda-expression") " of any "
     (:PARAM NIL "function") ". " :PAR "The " (:TERM NIL "secondary value")
     ", " (:PARAM NIL "closure-p") ", is " (:MISC NIL "nil") " if "
     (:PARAM NIL "function") "'s definition was enclosed in the "
     (:TERM NIL "null lexical environment") " or something "
     (:TERM NIL "non-nil") " if " (:PARAM NIL "function")
     "'s definition might have been enclosed in some "
     (:TERM NIL "non-null lexical environment") ". Any "
     (:TERM NIL "implementation") " may legitimately return "
     (:TERM NIL "true") " as the " (:PARAM NIL "closure-p") " of any "
     (:PARAM NIL "function") ". " :PAR "The " (:TERM NIL "tertiary value") ", "
     (:PARAM NIL "name") ", is the “name” of " (:PARAM NIL "function")
     ". The name is intended for debugging only and is not necessarily one that would be valid for use as a name in "
     (:MACREF NIL "defun") " or " (:SPECREF NIL "function")
     ", for example. By convention, " (:MISC NIL "nil")
     " is used to mean that " (:PARAM NIL "function") " has no name. Any "
     (:TERM NIL "implementation") " may legitimately return " (:MISC NIL "nil")
     " as the " (:PARAM NIL "name") " of any " (:PARAM NIL "function") ". "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     "The following examples illustrate some possible return values, but are not intended to be exhaustive: "
     :PAR
     (:CODE NIL " (function-lambda-expression #'(lambda (x) x))
→ NIL, "
      (:TERM NIL "false") ", NIL
OR→ NIL, "
      (:TERM NIL "true") ", NIL
OR→ (LAMBDA (X) X), "
      (:TERM NIL "true") ", NIL
OR→ (LAMBDA (X) X), "
      (:TERM NIL "false") ", NIL

 (function-lambda-expression
    (funcall #'(lambda () #'(lambda (x) x))))
→ NIL, "
      (:TERM NIL "false") ", NIL
OR→ NIL, "
      (:TERM NIL "true") ", NIL
OR→ (LAMBDA (X) X), "
      (:TERM NIL "true") ", NIL
OR→ (LAMBDA (X) X), "
      (:TERM NIL "false") ", NIL
 
 (function-lambda-expression 
    (funcall #'(lambda (x) #'(lambda () x)) nil))
→ NIL, "
      (:TERM NIL "true") ", NIL
OR→ (LAMBDA () X), "
      (:TERM NIL "true") ", NIL
NOT→ NIL, "
      (:TERM NIL "false") ", NIL
NOT→ (LAMBDA () X), "
      (:TERM NIL "false") ", NIL
  
 (flet ((foo (x) x))
   (setf (symbol-function 'bar) #'foo)
   (function-lambda-expression #'bar))
→ NIL, "
      (:TERM NIL "false") ", NIL
OR→ NIL, "
      (:TERM NIL "true") ", NIL
OR→ (LAMBDA (X) (BLOCK FOO X)), "
      (:TERM NIL "true") ", NIL
OR→ (LAMBDA (X) (BLOCK FOO X)), "
      (:TERM NIL "false") ", FOO
OR→ (SI::BLOCK-LAMBDA FOO (X) X), "
      (:TERM NIL "false") ", FOO
 
 (defun foo ()
   (flet ((bar (x) x))
     #'bar))
 (function-lambda-expression (foo))
→ NIL, "
      (:TERM NIL "false") ", NIL
OR→ NIL, "
      (:TERM NIL "true") ", NIL
OR→ (LAMBDA (X) (BLOCK BAR X)), "
      (:TERM NIL "true") ", NIL
OR→ (LAMBDA (X) (BLOCK BAR X)), "
      (:TERM NIL "true") ", (:INTERNAL FOO 0 BAR)
OR→ (LAMBDA (X) (BLOCK BAR X)), "
      (:TERM NIL "false") ", \"BAR in FOO\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "Although " (:TERM NIL "implementations")
     " are free to return “" (:MISC NIL "nil") ", " (:TERM NIL "true") ", "
     (:MISC NIL "nil") "” in all cases, they are encouraged to return a "
     (:TERM NIL "lambda expression") " as the " (:TERM NIL "primary value")
     " in the case where the argument was created by a call to "
     (:FUNREF NIL "compile") " or " (:FUNREF NIL "eval")
     " (as opposed to being created by " (:TERM NIL "loading") " a "
     (:TERM NIL "compiled file") "). " :PAR
     (:ENDISSUE NIL "FUNCTION-DEFINITION:JAN89-X3J13") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FUNCTIONP")
   (:COM (:NAME "functionp" :FTYPE "Function")
    (:ISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "functionp") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns " (:TERM NIL "true") " if "
     (:PARAM NIL "object") " is of " (:TERM NIL "type") " "
     (:TYPEREF NIL "function") "; otherwise, returns " (:TERM NIL "false") ". "
     :PAR
     (:COMMENT NIL "% 6.2.2 26" "% 6.2.2 27"
      " These are overridden by FUNCTION-TYPE:X3J13-MARCH-88.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (functionp 'append) → " (:TERM NIL "false") "
 (functionp #'append) → "
      (:TERM NIL "true") "
 (functionp (symbol-function 'append)) → "
      (:TERM NIL "true") "
 (flet ((f () 1)) (functionp #'f)) → "
      (:TERM NIL "true") "
 (functionp (compile nil '(lambda () 259))) → "
      (:TERM NIL "true") "
 (functionp nil) → "
      (:TERM NIL "false") "
 (functionp 12) → "
      (:TERM NIL "false") "
 (functionp '(lambda (x) (* x x))) → "
      (:TERM NIL "false") "
 (functionp #'(lambda (x) (* x x))) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (functionp " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'function)
")
     " " :PAR (:ENDISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== COMPILED-FUNCTION-P")
   (:COM (:NAME "compiled-function-p" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "compiled-function-p")
      (:ARGLIST NIL "object") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 28")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "compiled-function")
     "; otherwise, returns " (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun f (x) x) → F
 (compiled-function-p #'f)
→ "
      (:TERM NIL "false") "
OR→ "
      (:TERM NIL "true") "
 (compiled-function-p 'f) → "
      (:TERM NIL "false") "
 (compile 'f) → F
 (compiled-function-p #'f) → "
      (:TERM NIL "true") "
 (compiled-function-p 'f) → "
      (:TERM NIL "false") "
 (compiled-function-p (compile nil '(lambda (x) x)))
→ "
      (:TERM NIL "true") "
 (compiled-function-p #'(lambda (x) x))
→ "
      (:TERM NIL "false") "
OR→ "
      (:TERM NIL "true") "
 (compiled-function-p '(lambda (x) x)) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "compile") ", "
     (:FUNREF NIL "compile-file") ", " (:FUNREF NIL "compiled-function") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (compiled-function-p " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'compiled-function)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== CALL-ARGUMENTS-LIMIT")
   (:COM (:NAME "call-arguments-limit" :FTYPE "Constant Variable")
    (:PART (:NAME "Constant Value") " " :PAR "An integer not smaller than "
     (:TT NIL "50") " and at least as great as the " (:TERM NIL "value") " of "
     (:CONREF NIL "lambda-parameters-limit")
     ", the exact magnitude of which is "
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.3.0 7")
     "The upper exclusive bound on the number of " (:TERM NIL "arguments")
     " that may be passed to a " (:TERM NIL "function") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:CONREF NIL "lambda-parameters-limit")
     ", " (:CONREF NIL "multiple-values-limit") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LAMBDA-LIST-KEYWORDS")
   (:COM (:NAME "lambda-list-keywords" :FTYPE "Constant Variable")
    (:PART (:NAME "Constant Value") " " :PAR "a " (:TERM NIL "list") ", the "
     (:TERM NIL "elements") " of which are "
     (:TERM NIL "implementation-dependent")
     ", but which must contain at least the " (:TERM NIL "symbols") " "
     (:KEYREF NIL "allow-other-keys") ", " (:KEYREF NIL "aux") ", "
     (:KEYREF NIL "body") ", " (:KEYREF NIL "environment") ", "
     (:KEYREF NIL "key") ", " (:KEYREF NIL "optional") ", "
     (:KEYREF NIL "rest") ", and " (:KEYREF NIL "whole") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 5.2.2 27") "A "
     (:TERM NIL "list") " of all the " (:TERM NIL "lambda list keywords")
     " used in the " (:TERM NIL "implementation")
     ", including the additional ones used only by " (:TERM NIL "macro")
     " definition " (:TERM NIL "forms") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defun") ", "
     (:SPECREF NIL "flet") ", " (:MACREF NIL "defmacro") ", "
     (:SPECREF NIL "macrolet") ", " (:SECREF NIL :EVALUATION-MODEL) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LAMBDA-PARAMETERS-LIMIT")
   (:COM (:NAME "lambda-parameters-limit" :FTYPE "Constant Variable")
    (:PART (:NAME "Constant Value") " " :PAR
     (:TERM NIL "implementation-dependent") ", but not smaller than "
     (:TT NIL "50") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 5.2.2 29")
     "A positive " (:TERM NIL "integer")
     " that is the upper exclusive bound on the number of "
     (:TERM NIL "parameter") " " (:TERM NIL "names")
     " that can appear in a single " (:TERM NIL "lambda list") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:CONREF NIL "call-arguments-limit") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR "Implementors are encouraged to make the "
     (:TERM NIL "value") " of " (:CONREF NIL "lambda-parameters-limit")
     " as large as possible. " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Variables --------------------") :PAR
   (:COMMENT NIL "%% ========== DEFCONSTANT")
   (:COM (:NAME "defconstant" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR (:COMMENT NIL "% 5.3.2 14")
     (:DEF (:KIND "macro") (:NAMES NIL "defconstant")
      (:ARGLIST NIL "name initial-value " (:BRAC NIL "documentation"))
      (:VALUES NIL "name"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "symbol") "; not evaluated. " :PAR (:PARAM NIL "initial-value")
     "—a " (:TERM NIL "form") "; evaluated. " :PAR (:COMMENT NIL "% 5.3.2 10")
     (:ISSUE NIL "DEFVAR-DOCUMENTATION:UNEVALUATED") " "
     (:PARAM NIL "documentation") "—a " (:TERM NIL "string")
     "; not evaluated. " (:ENDISSUE NIL "DEFVAR-DOCUMENTATION:UNEVALUATED") " "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 5.3.2 7")
     (:MACREF NIL "defconstant") " "
     (:COMMENT NIL "!!! KMP: Maybe use \"establishes\" here somewhere?")
     "causes the global variable named by " (:PARAM NIL "name")
     " to be given a value that is the result of evaluating "
     (:PARAM NIL "initial-value") ". "
     (:COMMENT NIL
      "Once \\param{name} has been defined using \\macref{defconstant}, its value"
      "is constant and cannot be changed by assignment or \\term{binding}.")
     :PAR (:COMMENT NIL "% 5.1.2 6") "A constant defined by "
     (:MACREF NIL "defconstant") " can be redefined with "
     (:MACREF NIL "defconstant") ". "
     (:COMMENT NIL "This sentence added per Barmar: -kmp 28-Dec-90")
     "However, the consequences are undefined if an attempt is made to assign a "
     (:TERM NIL "value") " to the " (:TERM NIL "symbol")
     " using another operator, or to assign it to a " (:TERM NIL "different")
     " "
     (:COMMENT NIL
      "%I gave different a formal meaning the same as non-EQL. -kmp 1-Jan-91"
      " (non-\\funref{eql})")
     (:TERM NIL "value") " using a subsequent " (:MACREF NIL "defconstant")
     ". " :PAR "If " (:PARAM NIL "documentation")
     " is supplied, it is attached to " (:PARAM NIL "name") " as a "
     (:TERM NIL "documentation string") " of kind " (:MISC NIL "variable") ". "
     :PAR (:ISSUE NIL "DEFINING-MACROS-NON-TOP-LEVEL:ALLOW") " "
     (:MACREF NIL "defconstant") " normally appears as a "
     (:TERM NIL "top level form")
     ", but it is meaningful for it to appear as a "
     (:TERM NIL "non-top-level form")
     ". However, the compile-time side effects described below only take place when "
     (:MACREF NIL "defconstant") " appears as a " (:TERM NIL "top level form")
     ". " (:ENDISSUE NIL "DEFINING-MACROS-NON-TOP-LEVEL:ALLOW") " " :PAR
     (:COMMENT NIL "% 5.3.2 8")
     "The consequences are undefined if there are any " (:TERM NIL "bindings")
     " of the variable named by " (:PARAM NIL "name") " at the time "
     (:MACREF NIL "defconstant") " is executed or if the value is not "
     (:FUNREF NIL "eql") " to the value of " (:PARAM NIL "initial-value") ". "
     :PAR
     (:COMMENT NIL "%% 5.3.2 9"
      "Once \\param{name} has been declared by \\macref{defconstant} to be constant,"
      "the consequences are undefined if any further assignment to or \\term{binding} "
      "of \\param{name} is attempted.")
     (:ISSUE NIL "DEFCONSTANT-SPECIAL:NO")
     " The consequences are undefined when constant " (:TERM NIL "symbols")
     " are rebound as either lexical or dynamic variables. In other words, a reference to a "
     (:TERM NIL "symbol") " declared with " (:MACREF NIL "defconstant")
     " always refers to its global value. "
     (:ENDISSUE NIL "DEFCONSTANT-SPECIAL:NO") " " :PAR
     "The side effects of the execution of " (:MACREF NIL "defconstant")
     " must be equivalent to at least the side effects of the execution of the following code: "
     :PAR
     (:COMMENT NIL
      " We explicitly addressed the question of whether DEFCONSTANT must"
      " proclaim the variable SPECIAL in issue DEFCONSTANT-SPECIAL; the final"
      " decision was that it might or might not.  Including such a proclamation"
      " here as required behavior is incorrect.  --sjl 5 Mar 92" " \\code"
      "  (declaim (special \\i{name}))"
      "  (setf (symbol-value '\\i{name}) \\i{initial-value})"
      "  (setf (documentation '\\i{name} 'variable) '\\i{documentation})"
      " \\endcode")
     :PAR
     (:CODE NIL " (setf (symbol-value '" (:I NIL "name") ") "
      (:I NIL "initial-value") ")
 (setf (documentation '"
      (:I NIL "name") " 'variable) '" (:I NIL "documentation") ")
")
     " " :PAR (:ISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY")
     " "
     (:COMMENT NIL " added qualification about top-level-ness  --sjl 5 Mar 92")
     "If a " (:MACREF NIL "defconstant") " " (:TERM NIL "form")
     " appears as a " (:TERM NIL "top level form") ", the "
     (:TERM NIL "compiler") " must recognize that " (:PARAM NIL "name")
     " names a " (:TERM NIL "constant variable")
     ". An implementation may choose to evaluate the value-form at compile time, load time, or both. Therefore, users must ensure that the "
     (:PARAM NIL "initial-value") " can be " (:TERM NIL "evaluated")
     " at compile time (regardless of whether or not references to "
     (:PARAM NIL "name") " appear in the file) and that it always "
     (:TERM NIL "evaluates") " to the same value. "
     (:ENDISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     :PAR (:EDITORNOTE NIL "KMP: Does “same value” here mean eql or similar?")
     " "
     (:REVIEWER NIL
      "Moon: Probably depends on whether load time is compared to compile time, or two compiles.")
     " " :PAR
     (:COMMENT NIL " Removed redundant text.  --sjl 5 Mar 92"
      " Names of \\term{constant variables} defined by \\macref{defconstant} "
      " become reserved and may not be further assigned to or bound (although"
      " they may be redefined by using \\macref{defconstant}).")
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL
      " (defconstant this-is-a-constant 'never-changing \"for a test\") → THIS-IS-A-CONSTANT
this-is-a-constant → NEVER-CHANGING
 (documentation 'this-is-a-constant 'variable) → \"for a test\"
 (constantp 'this-is-a-constant) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "declaim") ", "
     (:MACREF NIL "defparameter") ", " (:MACREF NIL "defvar") ", "
     (:FUNREF NIL "documentation") ", " (:FUNREF NIL "proclaim") ", "
     (:SECREF NIL :CONSTANT-VARS) ", " (:SECREF NIL :COMPILATION) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DEFVAR" "%% ========== DEFPARAMETER")
   (:COM (:NAME "defparameter, defvar" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "defparameter")
      (:ARGLIST NIL "name initial-value " (:BRAC NIL "documentation") " ")
      (:VALUES NIL "name"))
     " "
     (:DEF (:KIND "macro") (:NAMES NIL "defvar")
      (:ARGLIST NIL "name "
       (:BRAC NIL "initial-value " (:BRAC NIL "documentation")))
      (:VALUES NIL "name"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "symbol") "; not evaluated. " :PAR
     (:ISSUE NIL "DEFVAR-INIT-TIME:NOT-DELAYED") " "
     (:COMMENT NIL
      " I believe that the confusing wording of CLtL about evaluation has been avoided here,"
      " so there is no explicit wording to support the intent of this proposal.")
     (:ENDISSUE NIL "DEFVAR-INIT-TIME:NOT-DELAYED") " " :PAR
     (:PARAM NIL "initial-value") "—a " (:TERM NIL "form") "; for "
     (:MACREF NIL "defparameter") ", it is always " (:TERM NIL "evaluated")
     ", but for " (:MACREF NIL "defvar") " it is " (:TERM NIL "evaluated")
     " only if " (:PARAM NIL "name") " is not already " (:TERM NIL "bound")
     ". " :PAR (:ISSUE NIL "DEFVAR-DOCUMENTATION:UNEVALUATED") " "
     (:PARAM NIL "documentation") "—a " (:PARAM NIL "string")
     "; not evaluated. " (:ENDISSUE NIL "DEFVAR-DOCUMENTATION:UNEVALUATED") " "
     :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 5.3.2 2" "% 5.3.2 4") :PAR (:MACREF NIL "defparameter")
     " and " (:MACREF NIL "defvar") " " (:TERM NIL "establish") " "
     (:PARAM NIL "name") " as a " (:TERM NIL "dynamic variable") ". " :PAR
     (:MACREF NIL "defparameter") " unconditionally " (:TERM NIL "assigns")
     " the " (:PARAM NIL "initial-value") " to the "
     (:TERM NIL "dynamic variable") " named " (:PARAM NIL "name") ". "
     (:MACREF NIL "defvar") ", by contrast, " (:TERM NIL "assigns") " "
     (:PARAM NIL "initial-value") " (if supplied) to the "
     (:TERM NIL "dynamic variable") " named " (:PARAM NIL "name") " only if "
     (:PARAM NIL "name") " is not already " (:TERM NIL "bound") ". " :PAR
     (:ISSUE NIL "DEFVAR-INITIALIZATION:CONSERVATIVE") " If no "
     (:PARAM NIL "initial-value") " is supplied, " (:MACREF NIL "defvar")
     " leaves the " (:TERM NIL "value cell") " of the "
     (:TERM NIL "dynamic variable") " named " (:PARAM NIL "name")
     " undisturbed; if " (:PARAM NIL "name") " was previously "
     (:TERM NIL "bound") ", its old " (:TERM NIL "value")
     " persists, and if it was previously " (:TERM NIL "unbound")
     ", it remains " (:TERM NIL "unbound") ". "
     (:ENDISSUE NIL "DEFVAR-INITIALIZATION:CONSERVATIVE") " " :PAR "If "
     (:PARAM NIL "documentation") " is supplied, it is attached to "
     (:PARAM NIL "name") " as a " (:TERM NIL "documentation string")
     " of kind " (:MISC NIL "variable") ". " :PAR
     (:ISSUE NIL "DEFINING-MACROS-NON-TOP-LEVEL:ALLOW") " "
     (:MACREF NIL "defparameter") " and " (:MACREF NIL "defvar")
     " normally appear as a " (:TERM NIL "top level form")
     ", but it is meaningful for them to appear as "
     (:TERM NIL "non-top-level forms")
     ". However, the compile-time side effects described below only take place when they appear as "
     (:TERM NIL "top level forms") ". "
     (:ENDISSUE NIL "DEFINING-MACROS-NON-TOP-LEVEL:ALLOW") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defparameter *p* 1) → *P*
 *p* → 1
 (constantp '*p*) → "
      (:TERM NIL "false") "
 (setq *p* 2) → 2
 (defparameter *p* 3) → *P*
 *p* → 3

 (defvar *v* 1) → *V*
 *v* → 1
 (constantp '*v*) → "
      (:TERM NIL "false") "
 (setq *v* 2) → 2
 (defvar *v* 3) → *V*
 *v* → 2

 (defun foo ()
   (let ((*p* 'p) (*v* 'v))
     (bar))) → FOO
 (defun bar () (list *p* *v*)) → BAR
 (foo) → (P V)
")
     " " :PAR "The principal operational distinction between "
     (:MACREF NIL "defparameter") " and " (:MACREF NIL "defvar") " is that "
     (:MACREF NIL "defparameter") " makes an unconditional assignment to "
     (:PARAM NIL "name") ", while " (:MACREF NIL "defvar")
     " makes a conditional one. In practice, this means that "
     (:MACREF NIL "defparameter")
     " is useful in situations where loading or reloading the definition would want to pick up a new value of the variable, while "
     (:MACREF NIL "defvar")
     " is used in situations where the old value would want to be retained if the file were loaded or reloaded. For example, one might create a file which contained: "
     :PAR
     (:CODE NIL " (defvar *the-interesting-numbers* '())
 (defmacro define-interesting-number (name n)
   `(progn (defvar ,name ,n)
           (pushnew ,name *the-interesting-numbers*)
           ',name))
 (define-interesting-number *my-height* 168) ;cm
 (define-interesting-number *my-weight* 13)  ;stones
")
     " " :PAR "Here the initial value, " (:TT NIL "()") ", for the variable "
     (:TT NIL "*the-interesting-numbers*")
     " is just a seed that we are never likely to want to reset to something else once something has been grown from it. As such, we have used "
     (:MACREF NIL "defvar") " to avoid having the "
     (:TT NIL "*interesting-numbers*")
     " information reset if the file is loaded a second time. It is true that the two calls to "
     (:MACREF NIL "define-interesting-number")
     " here would be reprocessed, but if there were additional calls in another file, they would not be and that information would be lost. On the other hand, consider the following code: "
     :PAR
     (:CODE NIL " (defparameter *default-beep-count* 3)
 (defun beep (&optional (n *default-beep-count*))
   (dotimes (i n) (si:%beep 1000. 100000.) (sleep 0.1)))
")
     " " :PAR
     "Here we could easily imagine editing the code to change the initial value of "
     (:TT NIL "*default-beep-count*")
     ", and then reloading the file to pick up the new value. In order to make value updating easy, we have used "
     (:MACREF NIL "defparameter") ". " :PAR
     "On the other hand, there is potential value to using "
     (:MACREF NIL "defvar")
     " in this situation. For example, suppose that someone had predefined an alternate value for "
     (:TT NIL "*default-beep-count*")
     ", or had loaded the file and then manually changed the value. In both cases, if we had used "
     (:MACREF NIL "defvar") " instead of " (:MACREF NIL "defparameter")
     ", those user preferences would not be overridden by (re)loading the file. "
     :PAR "The choice of whether to use " (:MACREF NIL "defparameter") " or "
     (:MACREF NIL "defvar")
     " has visible consequences to programs, but is nevertheless often made for subjective reasons. "
     :PAR)
    (:PART (:NAME "Side Effects") " " :PAR
     (:ISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     (:COMMENT NIL " added qualification about top-level-ness  --sjl 5 Mar 92")
     "If a " (:MACREF NIL "defvar") " or " (:MACREF NIL "defparameter") " "
     (:TERM NIL "form") " appears as a " (:TERM NIL "top level form") ", the "
     (:TERM NIL "compiler") " must recognize that the " (:PARAM NIL "name")
     " has been proclaimed " (:DECLREF NIL "special")
     ". However, it must neither " (:TERM NIL "evaluate") " the "
     (:PARAM NIL "initial-value") " " (:TERM NIL "form") " nor "
     (:TERM NIL "assign") " the " (:TERM NIL "dynamic variable") " named "
     (:PARAM NIL "name") " at compile time. "
     (:ENDISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     :PAR "There may be additional (" (:TERM NIL "implementation-defined")
     ") compile-time or run-time side effects, as long as such effects do not interfere with the correct operation of "
     (:TERM NIL "conforming programs") ". " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:MACREF NIL "defvar")
     " is affected by whether " (:PARAM NIL "name") " is already "
     (:TERM NIL "bound") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "declaim") ", "
     (:MACREF NIL "defconstant") ", " (:FUNREF NIL "documentation") ", "
     (:SECREF NIL :COMPILATION) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "It is customary to name "
     (:TERM NIL "dynamic variables") " with an " (:TERM NIL "asterisk")
     " at the beginning and end of the name. e.g., " (:TT NIL "*foo*")
     " is a good name for a " (:TERM NIL "dynamic variable") ", but not for a "
     (:TERM NIL "lexical variable") "; " (:TT NIL "foo")
     " is a good name for a " (:TERM NIL "lexical variable") ", but not for a "
     (:TERM NIL "dynamic variable")
     ". This naming convention is observed for all "
     (:TERM NIL "defined names") " in " (:RM NIL " Common Lisp")
     "; however, neither " (:TERM NIL "conforming programs") " nor "
     (:TERM NIL "conforming implementations")
     " are obliged to adhere to this convention. " :PAR
     "The intent of the permission for additional side effects is to allow "
     (:TERM NIL "implementations")
     " to do normal “bookkeeping” that accompanies definitions. For example, the "
     (:TERM NIL "macro expansion") " of a " (:MACREF NIL "defvar") " or "
     (:MACREF NIL "defparameter") " " (:TERM NIL "form")
     " might include code that arranges to record the name of the source file in which the definition occurs. "
     :PAR (:MACREF NIL "defparameter") " and " (:MACREF NIL "defvar")
     " might be defined as follows: " :PAR
     (:CODE NIL " (defmacro defparameter (name initial-value 
                         &optional (documentation nil documentation-p))
   `(progn (declaim (special ,name))
           (setf (symbol-value ',name) ,initial-value)
           ,(when documentation-p
              `(setf (documentation ',name 'variable) ',documentation))
           ',name))
 (defmacro defvar (name &optional
                        (initial-value nil initial-value-p)
                        (documentation nil documentation-p))
   `(progn (declaim (special ,name))
           ,(when initial-value-p
              `(unless (boundp ',name)
                 (setf (symbol-value ',name) ,initial-value)))
           ,(when documentation-p
              `(setf (documentation ',name 'variable) ',documentation))
           ',name))
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DESTRUCTURING-BIND")
   (:COM (:NAME "destructuring-bind" :FTYPE "Macro")
    (:ISSUE NIL "DECLS-AND-DOC") " "
    (:ISSUE NIL "DESTRUCTURING-BIND:NEW-MACRO") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "destructuring-bind")
      (:ARGLIST NIL "lambda-list expression "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL "% 8.1.0 9" "% 8.1.0 10" "% 8.1.0 11" "% 8.1.0 12"
      " tweaked --sjl 5 Mar 92"
      "\\param{lambda-list}---a \\term{lambda list}; "
      " can contain the \\term{lambda list keywords} "
      "  \\keyref{allow-other-keys}," "  \\keyref{aux}," "  \\keyref{body},"
      "  \\keyref{key}," "  \\keyref{optional}, " "  \\keyref{rest}," " and"
      "  \\keyref{whole}.")
     (:PARAM NIL "lambda-list") "—a " (:TERM NIL "destructuring lambda list")
     ". " :PAR (:PARAM NIL "expression") "—a " (:TERM NIL "form") ". " :PAR
     (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR (:PARAM NIL "forms")
     "—an " (:TERM NIL "implicit progn") ". " :PAR (:PARAM NIL "results")
     "—the " (:TERM NIL "values") " returned by the " (:TERM NIL "forms") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "destructuring-bind")
     " binds the variables specified in " (:PARAM NIL "lambda-list")
     " to the corresponding values in the tree structure resulting from the evaluation of "
     (:PARAM NIL "expression") "; then " (:MACREF NIL "destructuring-bind")
     " evaluates " (:PARAM NIL "forms") ". " :PAR
     (:COMMENT NIL
      " All of this text is redundant; a simple cross-reference will do.  "
      " --sjl 5 Mar 92"
      " Anywhere in \\param{lambda-list} where a parameter name can appear, and"
      " where ordinary \\term{lambda list} syntax as described in {\\secref\\OrdinaryLambdaLists}"
      " does not otherwise allow a \\term{list}, a \\term{lambda list} can appear "
      " in place of the parameter name. When this is done, then the portion of"
      " the tree structure resulting from the evaluation of \\param{expression}"
      " that would match the parameter is treated as a tree structure for satisfying"
      " the parameters in the embedded \\term{lambda list}." "  "
      " If any of the \\term{lambda list keywords} "
      " \\keyref{optional}, \\keyref{rest}, \\keyref{key}, \\keyref{allow-other-keys} "
      " and \\keyref{aux} appears in \\param{lambda-list}, "
      " it is treated as it would be in an \\term{ordinary lambda list}." "  "
      " If the \\term{lambda list keyword} \\keyref{body} appears, "
      " it is treated the same as if \\keyref{rest} had appeared."
      " (Only one of \\keyref{body} or \\keyref{rest} can be used at any one level.)"
      "  " " If the \\term{lambda list keyword} \\keyref{whole} appears,"
      " it must be immediately followed by a single variable that is bound "
      " to the entire tree at the current level. "
      " \\keyref{whole} and its following variable should appear first in the list,"
      " before any other \\term{parameter} or \\term{lambda list keyword}."
      "  "
      " It is also permissible for any level of \\param{lambda-list} to be a"
      " \\term{dotted list}, ending in a parameter name. This situation is"
      " treated exactly as if the parameter name that ends the \\term{dotted list}"
      " had appeared preceded by \\keyref{rest} in a \\term{proper list}. "
      " For example, the notation \\f{(x y . z)} is equivalent to \\f{(x y \\&rest z)}."
      "  "
      " For \\keyref{optional} and \\keyref{key} parameters, initialization forms and ``supplied-p''"
      " parameters can be supplied, just as for \\macref{defun}.")
     :PAR "The " (:PARAM NIL "lambda-list")
     " supports destructuring as described in "
     (:SECREF NIL :DESTRUCTURING-LAMBDA-LISTS) ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL
      " (defun iota (n) (loop for i from 1 to n collect i))       ;helper
 (destructuring-bind ((a &optional (b 'bee)) one two three)
     `((alpha) ,@(iota 3))
   (list a b three two one)) → (ALPHA BEE 3 2 1)
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "If the result of evaluating the " (:PARAM NIL "expression")
     " does not match the destructuring pattern, an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error") " should be signaled. "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "macrolet") ", "
     (:MACREF NIL "defmacro") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "DESTRUCTURING-BIND:NEW-MACRO") " "
     (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LET" "%% ========== LET*")
   (:COM (:NAME "let, let*" :FTYPE "Special Operator")
    (:ISSUE NIL "DECLS-AND-DOC") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "VARIABLE-LIST-ASYMMETRY:SYMMETRIZE") " "
     (:DEF (:KIND "special-operator") (:NAMES NIL "let")
      (:ARGLIST NIL
       (:PAREN NIL
        (:STAR NIL
         (:CURLY NIL (:PARAM NIL "var") " | "
          (:PAREN NIL (:PARAM NIL "var") " "
           (:BRAC NIL (:PARAM NIL "init-form"))))))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "let*")
      (:ARGLIST NIL
       (:PAREN NIL
        (:STAR NIL
         (:CURLY NIL (:PARAM NIL "var") " | "
          (:PAREN NIL (:PARAM NIL "var") " "
           (:BRAC NIL (:PARAM NIL "init-form"))))))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " (:ENDISSUE NIL "VARIABLE-LIST-ASYMMETRY:SYMMETRIZE") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL
      "!!! Barmar thinks this should say \"non-constant symbol\".")
     (:PARAM NIL "var") "—a " (:TERM NIL "symbol") ". " :PAR
     (:COMMENT NIL
      " fixed some confusion about whether this is ``init-form'' or ``value''."
      " --sjl 5 Mar 92")
     (:PARAM NIL "init-form") "—a " (:TERM NIL "form") ". " :PAR
     (:COMMENT NIL
      "!!! Barmar asks why \"not evaluated\" is only specified for this argument."
      "% 7.5.0 6" "% 7.5.0 10")
     (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR (:PARAM NIL "form")
     "—a " (:TERM NIL "form") ". " :PAR (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " returned by the " (:TERM NIL "forms") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.5.0 3")
     (:SPECREF NIL "let") " and " (:SPECREF NIL "let*") " create new variable "
     (:TERM NIL "bindings") " and execute a series of " (:PARAM NIL "forms")
     " that use these " (:TERM NIL "bindings") ". " (:SPECREF NIL "let")
     " performs the " (:TERM NIL "bindings") " in parallel and "
     (:SPECREF NIL "let*") " does them sequentially. " :PAR
     (:COMMENT NIL "% 7.5.0 4" "% 7.5.0 5") "The form " :PAR
     (:ISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " "
     (:CODE NIL " (let ((" (:PARAM NIL "var1") " " (:PARAM NIL "init-form-1") ")
       ("
      (:PARAM NIL "var2") " " (:PARAM NIL "init-form-2") ")
       ...
       ("
      (:PARAM NIL "varm") " " (:PARAM NIL "init-form-m") "))
   "
      (:PARAM NIL "declaration1") "
   "
      (:PARAM NIL "declaration2") "
   ...
   "
      (:PARAM NIL "declarationp") "
   "
      (:PARAM NIL "form1") "
   "
      (:PARAM NIL "form2") "
   ...
   "
      (:PARAM NIL "formn") ")
")
     " first evaluates the expressions " (:PARAM NIL "init-form-1") ", "
     (:PARAM NIL "init-form-2") ", and so on, "
     (:ENDISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92")
     " in that order, saving the resulting values. Then all of the variables "
     (:PARAM NIL "varj") " are bound to the corresponding values; each "
     (:TERM NIL "binding") " is lexical unless there is a "
     (:DECLREF NIL "special") " declaration to the contrary. The expressions "
     (:PARAM NIL "formk")
     " are then evaluated in order; the values of all but the last are discarded (that is, the body of a "
     (:SPECREF NIL "let") " is an " (:TERM NIL "implicit progn") "). " :PAR
     (:COMMENT NIL "% 7.5.0 7" "% 7.5.0 9") (:SPECREF NIL "let*")
     " is similar to " (:SPECREF NIL "let") ", but the " (:TERM NIL "bindings")
     " of variables are performed sequentially rather than in parallel. The expression for the "
     (:PARAM NIL "init-form") " of a " (:PARAM NIL "var") " can refer to "
     (:PARAM NIL "vars") " previously bound in the " (:SPECREF NIL "let*") ". "
     :PAR (:COMMENT NIL "% 7.5.0 8") "The form " :PAR
     (:ISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " "
     (:CODE NIL " (let* ((" (:PARAM NIL "var1") " " (:PARAM NIL "init-form-1")
      ")
        ("
      (:PARAM NIL "var2") " " (:PARAM NIL "init-form-2") ")
        ...
        ("
      (:PARAM NIL "varm") " " (:PARAM NIL "init-form-m") "))
   "
      (:PARAM NIL "declaration1") "
   "
      (:PARAM NIL "declaration2") "
   ...
   "
      (:PARAM NIL "declarationp") "
   "
      (:PARAM NIL "form1") "
   "
      (:PARAM NIL "form2") "
   ...
   "
      (:PARAM NIL "formn") ")
")
     " first evaluates the expression " (:PARAM NIL "init-form-1")
     ", then binds the variable " (:PARAM NIL "var1")
     " to that value; then it evaluates " (:PARAM NIL "init-form-2")
     " and binds "
     (:ENDISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " "
     (:PARAM NIL "var2") ", and so on. The expressions " (:PARAM NIL "formj")
     " are then evaluated in order; the values of all but the last are discarded (that is, the body of "
     (:SPECREF NIL "let*") " is an implicit " (:SPECREF NIL "progn") "). " :PAR
     "For both " (:SPECREF NIL "let") " and " (:SPECREF NIL "let*")
     ", if there is not an " (:PARAM NIL "init-form") " associated with a "
     (:PARAM NIL "var") ", " (:PARAM NIL "var") " is initialized to "
     (:MISC NIL "nil") ". " :PAR
     (:COMMENT NIL
      " This is a property of TYPE declarations and doesn't need to"
      " be said again here.  --sjl 5 Mar 92"
      " The consequences are undefined if a type \\param{declaration} is supplied for a "
      " \\param{var} and the initial \\param{value} of"
      " that \\param{var} is not consistent with the type \\param{declaration}.")
     :PAR "The special form " (:SPECREF NIL "let")
     " has the property that the " (:TERM NIL "scope")
     " of the name binding does not include any initial value form. For "
     (:SPECREF NIL "let*") ", a variable's " (:TERM NIL "scope")
     " also includes the remaining initial value forms for subsequent variable bindings. "
     :PAR
     (:COMMENT NIL "New name bindings take precedence over any "
      "higher level binding or declarations.  For example, " "\\code"
      " (locally (declare (special x) (float y)) " "   (let ((x 5) (y 10)) "
      "     (print (+ x y))))" "\\endcode" "If there are no "
      "proclamations are in effect, "
      "then {\\tt x} is local (not \\declref{special})"
      "and {\\tt y} is bound with no particular"
      "type information because the {\\tt y} being bound is a different variable"
      "from the {\\tt y} declared {\\tt float}.")
     :PAR (:COMMENT NIL "See \\misc{declare}.") :PAR
     (:COMMENT NIL
      " This is adequately addressed in the packages chapter.  --sjl 5 Mar 92"
      "\\issue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}"
      "It is permissible to use symbols in \\thepackage{common-lisp} as lexical variable names,"
      "provided they are not globally defined as \\term{variables}."
      "\\endissue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq a 'top) → TOP
 (defun dummy-function () a) → DUMMY-FUNCTION
 (let ((a 'inside) (b a))
    (format nil \"~S ~S ~S\" a b (dummy-function))) → \"INSIDE TOP TOP\" 
 (let* ((a 'inside) (b a))
    (format nil \"~S ~S ~S\" a b (dummy-function))) → \"INSIDE INSIDE TOP\" 
 (let ((a 'inside) (b a))
    (declare (special a))
    (format nil \"~S ~S ~S\" a b (dummy-function))) → \"INSIDE TOP INSIDE\"
")
     " " :PAR " The code " :PAR
     (:CODE NIL " (let (x)
   (declare (integer x))
   (setq x (gcd y z))
   ...)
")
     " is incorrect; although " (:TT NIL "x")
     " is indeed set before it is used, and is set to a value of the declared type "
     (:TERM NIL "integer") ", nevertheless " (:TT NIL "x")
     " initially takes on the value " (:MISC NIL "nil")
     " in violation of the type declaration. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "progv") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PROGV")
   (:COM (:NAME "progv" :FTYPE "Special Operator")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "progv")
      (:ARGLIST NIL (:PARAM NIL "symbols") " " (:PARAM NIL "values") " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL
      "!!! Barmar thinks this should say \"non-constant symbols\"")
     (:PARAM NIL "symbols") "—a " (:TERM NIL "list") " of "
     (:TERM NIL "symbols") "; evaluated. " :PAR (:PARAM NIL "values") "—a "
     (:TERM NIL "list") " of " (:TERM NIL "objects") "; evaluated. " :PAR
     (:PARAM NIL "forms") "—an " (:TERM NIL "implicit progn") ". " :PAR
     (:PARAM NIL "results") "—the " (:TERM NIL "values") " returned by the "
     (:TERM NIL "forms") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:SPECREF NIL "progv")
     " creates new dynamic variable " (:TERM NIL "bindings")
     " and executes each " (:PARAM NIL "form") " using those "
     (:TERM NIL "bindings") ". Each " (:PARAM NIL "form")
     " is evaluated in order. " :PAR (:COMMENT NIL "% 7.5.0 14")
     (:SPECREF NIL "progv") " allows " (:TERM NIL "binding")
     " one or more dynamic variables whose names may be determined at run time. Each "
     (:PARAM NIL "form")
     " is evaluated in order with the dynamic variables whose names are in "
     (:PARAM NIL "symbols") " bound to corresponding " (:PARAM NIL "values")
     ". If too few " (:PARAM NIL "values") " are supplied, the remaining "
     (:TERM NIL "symbols")
     " are bound and then made to have no value. If too many "
     (:PARAM NIL "values") " are supplied, the excess values are ignored. The "
     (:TERM NIL "bindings")
     " of the dynamic variables are undone on exit from "
     (:SPECREF NIL "progv") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (setq *x* 1) → 1
 (progv '(*x*) '(2) *x*) → 2
 *x* → 1

Assuming *x* is not globally special,

 (let ((*x* 3)) 
    (progv '(*x*) '(4) 
      (list *x* (symbol-value '*x*)))) → (3 4)
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "let") ", "
     (:SECREF NIL :EVALUATION) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 7.5.0 16")
     "Among other things, " (:SPECREF NIL "progv")
     " is useful when writing interpreters for languages embedded in "
     (:RM NIL " Lisp") "; it provides a handle on the mechanism for "
     (:TERM NIL "binding") " " (:TERM NIL "dynamic variables") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SETQ")
   (:COM (:NAME "setq" :FTYPE "Special Operator")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "setq")
      (:ARGLIST NIL (:STAR NIL (:CURLY NIL (:DOWN NIL "pair"))))
      (:VALUES NIL "result"))
     " " :PAR (:BNF (:NAME "pair") "var form") " " :PAR)
    (:PART (:NAME "Pronunciation") " " :PAR
     (:PRONOUNCED NIL (:HI-STRESS NIL "set") (:LO-STRESS NIL "ky\"u")) " "
     :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL
      "!!! Perhaps there should be a glossary term which makes this more convenient to say.")
     (:PARAM NIL "var") "—a " (:TERM NIL "symbol") " naming a "
     (:TERM NIL "variable") " other than a " (:TERM NIL "constant variable")
     ". " :PAR (:PARAM NIL "form") "—a " (:TERM NIL "form") ". " :PAR
     (:COMMENT NIL "% 7.1.2 4") (:PARAM NIL "result") "—the "
     (:TERM NIL "primary value") " of the last " (:PARAM NIL "form") ", or "
     (:MISC NIL "nil") " if no " (:PARAM NIL "pairs") " were supplied. " :PAR)
    (:PART (:NAME "Description") " " :PAR "Assigns values to "
     (:TERM NIL "variables") ". " :PAR (:COMMENT NIL "% 7.1.2 3")
     (:TT NIL "(setq " (:I NIL "var1") " " (:I NIL "form1") " " (:I NIL "var2")
      " " (:I NIL "form2") " ...)")
     " is the simple variable assignment statement of " (:RM NIL " Lisp")
     ". First " (:PARAM NIL "form1")
     " is evaluated and the result is stored in the variable "
     (:PARAM NIL "var1") ", then " (:PARAM NIL "form2")
     " is evaluated and the result stored in " (:PARAM NIL "var2")
     ", and so forth. " (:SPECREF NIL "setq")
     " may be used for assignment of both lexical and dynamic variables. " :PAR
     (:ISSUE NIL "SYMBOL-MACROLET-SEMANTICS:SPECIAL-FORM") " If any "
     (:PARAM NIL "var") " refers to a " (:TERM NIL "binding") " made by "
     (:SPECREF NIL "symbol-macrolet") ", then that " (:PARAM NIL "var")
     " is treated as if " (:MACREF NIL "setf") " (not " (:SPECREF NIL "setq")
     ") had been used. "
     (:ENDISSUE NIL "SYMBOL-MACROLET-SEMANTICS:SPECIAL-FORM") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " ;; A simple use of SETQ to establish values for variables.
 (setq a 1 b 2 c 3) → 3
 a → 1
 b → 2
 c → 3

 ;; Use of SETQ to update values by sequential assignment.
 (setq a (1+ b) b (1+ a) c (+ a b)) → 7
 a → 3
 b → 4
 c → 7

 ;; This illustrates the use of SETQ on a symbol macro.
 (let ((x (list 10 20 30)))
   (symbol-macrolet ((y (car x)) (z (cadr x)))
     (setq y (1+ z) z (1+ y))
     (list x y z)))
→ ((21 22 30) 21 22)
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:TERM NIL "primary value")
     " of each " (:PARAM NIL "form") " is assigned to the corresponding "
     (:PARAM NIL "var") ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "psetq") ", "
     (:FUNREF NIL "set") ", " (:MACREF NIL "setf") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PSETQ")
   (:COM (:NAME "psetq" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "psetq")
      (:ARGLIST NIL (:STAR NIL (:CURLY NIL (:DOWN NIL "pair"))))
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR (:BNF (:NAME "pair") "var form") " " :PAR)
    (:PART (:NAME "Pronunciation") " " :PAR (:MACREF NIL "psetq") ": "
     (:PRONOUNCED NIL (:LO-STRESS NIL "pē") (:HI-STRESS NIL "set")
      (:LO-STRESS NIL "ky\"u"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL
      "!!! Perhaps there should be a glossary term which makes this more convenient to say.")
     (:PARAM NIL "var") "—a " (:TERM NIL "symbol") " naming a "
     (:TERM NIL "variable") " other than a " (:TERM NIL "constant variable")
     ". " :PAR (:PARAM NIL "form") "—a " (:TERM NIL "form") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Assigns values to "
     (:TERM NIL "variables") ". " :PAR "This is just like "
     (:SPECREF NIL "setq")
     ", except that the assignments happen “in parallel.” That is, first all of the forms are evaluated, and only then are the variables set to the resulting values. In this way, the assignment to one variable does not affect the value computation of another in the way that would occur with "
     (:SPECREF NIL "setq") "'s sequential assignment. " :PAR
     (:ISSUE NIL "SYMBOL-MACROLET-SEMANTICS:SPECIAL-FORM") " If any "
     (:PARAM NIL "var") " refers to a " (:TERM NIL "binding") " made by "
     (:SPECREF NIL "symbol-macrolet") ", then that " (:PARAM NIL "var")
     " is treated as if " (:MACREF NIL "psetf") " (not " (:MACREF NIL "psetq")
     ") had been used. "
     (:ENDISSUE NIL "SYMBOL-MACROLET-SEMANTICS:SPECIAL-FORM") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " ;; A simple use of PSETQ to establish values for variables.
 ;; As a matter of style, many programmers would prefer SETQ 
 ;; in a simple situation like this where parallel assignment
 ;; is not needed, but the two have equivalent effect.
 (psetq a 1 b 2 c 3) → NIL
 a → 1
 b → 2
 c → 3

 ;; Use of PSETQ to update values by parallel assignment.
 ;; The effect here is very different than if SETQ had been used.
 (psetq a (1+ b) b (1+ a) c (+ a b)) → NIL
 a → 3
 b → 2
 c → 3

 ;; Use of PSETQ on a symbol macro.
 (let ((x (list 10 20 30)))
   (symbol-macrolet ((y (car x)) (z (cadr x)))
     (psetq y (1+ z) z (1+ y))
     (list x y z)))
→ ((21 11 30) 21 11)

 ;; Use of parallel assignment to swap values of A and B.
 (let ((a 1) (b 2))
   (psetq a b  b a)
   (values a b))
→ 2, 1
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The values of "
     (:PARAM NIL "forms") " are assigned to " (:PARAM NIL "vars") ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "psetf") ", "
     (:SPECREF NIL "setq") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL
    " I moved the dictionary entry for the SPECIAL declaration to chapter 3,"
    " to live with all the other declaration specifiers.  --sjl 5 Mar 92")
   :PAR
   (:COMMENT NIL "-------------------- Control Transfer --------------------")
   :PAR (:COMMENT NIL "%% ========== BLOCK")
   (:COM (:NAME "block" :FTYPE "Special Operator")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "block")
      (:ARGLIST NIL (:PARAM NIL "name") " " (:STAR NIL (:PARAM NIL "form")))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:COMMENT NIL "% 7.7.0 3")
     (:PARAM NIL "name") "—a " (:TERM NIL "symbol") ". " :PAR
     (:PARAM NIL "form") "—a " (:TERM NIL "form") ". " :PAR
     (:COMMENT NIL "% 7.9.2 11" "% 7.9.2 12") (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " of the " (:TERM NIL "forms") " if a "
     (:TERM NIL "normal return") " occurs, or else, if an "
     (:TERM NIL "explicit return") " occurs, the " (:TERM NIL "values")
     " that were transferred. " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.7.0 2")
     (:SPECREF NIL "block") " " (:TERM NIL "establishes") " a "
     (:TERM NIL "block") " named " (:PARAM NIL "name") " and then evaluates "
     (:PARAM NIL "forms") " as an " (:TERM NIL "implicit progn") ". " :PAR
     (:COMMENT NIL
      " If a \\macref{return} or \\specref{return-from} that specifies"
      " \\param{name} is executed during the execution of some \\param{form}, then"
      " the results specified by the \\macref{return} or \\specref{return-from}"
      " are immediately returned as the value of \\specref{block},"
      " and execution proceeds as if the \\specref{block} had terminated"
      " normally.  Only a \\macref{return} or \\specref{return-from}"
      " textually contained in some \\param{form} can exit from the \\specref{block}.")
     :PAR "The " (:TERM NIL "special operators") " " (:SPECREF NIL "block")
     " and " (:SPECREF NIL "return-from")
     " work together to provide a structured, lexical, non-local exit facility. At any point lexically contained within "
     (:TERM NIL "forms") ", " (:SPECREF NIL "return-from")
     " can be used with the given " (:PARAM NIL "name")
     " to return control and values from the " (:SPECREF NIL "block") " "
     (:TERM NIL "form") ", except when an intervening " (:TERM NIL "block")
     " with the same name has been " (:TERM NIL "established")
     ", in which case the outer " (:TERM NIL "block")
     " is shadowed by the inner one. " :PAR "The " (:TERM NIL "block")
     " named " (:TERM NIL "name") " has " (:TERM NIL "lexical scope") " and "
     (:TERM NIL "dynamic extent") ". " :PAR
     (:COMMENT NIL
      " It is only possible to exit from a given run-time incarnation of a"
      " \\specref{block} once, either normally or by explicit return.")
     :PAR "Once established, a " (:TERM NIL "block")
     " may only be exited once, whether by " (:TERM NIL "normal return") " or "
     (:TERM NIL "explicit return") ". " :PAR
     (:COMMENT NIL
      "%Barmar didn't think the following was really essential. I agree. -kmp 21-Dec-90"
      "% 7.7.0 6" " The fact that \\param{name} is lexical "
      " has consequences that might be surprising"
      " to users and implementors." " For example:" " " " \\code"
      "  (block loser" "    (catch 'stuff"
      "       (mapcar #'(lambda (x) (if (numberp x)"
      "                                 (hairyfun x)"
      "                                 (return-from loser \\nil)))"
      "                 items)))" " \\endcode" " "
      " A \\macref{return} can break up catchers if necessary to get"
      " to the block in question."
      " It is possible for a \\term{closure} created by \\specref{function} for"
      " a \\term{lambda expression} to refer to a \\specref{block} "
      " name as long as the name" " is lexically apparent.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (block empty) → NIL
 (block whocares (values 1 2) (values 3 4)) → 3, 4
 (let ((x 1)) 
   (block stop (setq x 2) (return-from stop) (setq x 3))
   x) → 2
 (block early (return-from early (values 1 2)) (values 3 4)) → 1, 2
 (block outer (block inner (return-from outer 1)) 2) → 1
 (block twin (block twin (return-from twin 1)) 2) → 2
 ;; Contrast behavior of this example with corresponding example of CATCH.
 (block b
   (flet ((b1 () (return-from b 1)))
     (block b (b1) (print 'unreachable))
     2)) → 1
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "return") ", "
     (:SPECREF NIL "return-from") ", " (:SECREF NIL :EVALUATION) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL "%This seems random to me. -kmp"
      " \\specref{block} differs from \\specref{progn} in that \\specref{progn} "
      " has nothing to do with \\macref{return}.")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== CATCH")
   (:COM (:NAME "catch" :FTYPE "Special Operator")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "catch")
      (:ARGLIST NIL (:PARAM NIL "tag") " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:COMMENT NIL "% 7.10.0 3")
     (:PARAM NIL "tag") "—a " (:TERM NIL "catch tag") "; evaluated. " :PAR
     (:PARAM NIL "forms") "—an " (:TERM NIL "implicit progn") ". " :PAR
     (:PARAM NIL "results") "—if the " (:PARAM NIL "forms")
     " exit normally, the " (:TERM NIL "values") " returned by the "
     (:PARAM NIL "forms") "; if a throw occurs to the " (:PARAM NIL "tag")
     ", the " (:TERM NIL "values") " that are thrown. " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "!!! "
      " Barmar: Tags are compared using EQ, not EQL. Therefore, the consequences"
      "   of using numbers and characters as tags are unspecified."
      " KMP: Personally, I think we should fix that to simplify the language"
      "   description.  I don't approve of our using EQ anywhere in the spec.")
     :PAR (:COMMENT NIL "% 7.10.0 2") (:SPECREF NIL "catch")
     " is used as the destination of a non-local control transfer by "
     (:SPECREF NIL "throw") ". " (:PARAM NIL "Tags") " are used to find the "
     (:SPECREF NIL "catch") " to which a " (:SPECREF NIL "throw")
     " is transferring control. " (:TT NIL "(catch 'foo " (:I NIL "form") ")")
     " catches a " (:TT NIL "(throw 'foo " (:I NIL "form") ")") " but not a "
     (:TT NIL "(throw 'bar " (:I NIL "form") ")") ". " :PAR
     (:COMMENT NIL "% 7.10.0 4") "The order of execution of "
     (:SPECREF NIL "catch") " follows:" (:IDXTEXT NIL "order of evaluation")
     (:IDXTEXT NIL "evaluation order") " " :PAR
     (:LIST NIL
      (:ITEM NIL "1. " (:PARAM NIL "Tag")
       " is evaluated. It serves as the name of the " (:SPECREF NIL "catch")
       ". " :PAR)
      (:ITEM NIL "2. " (:PARAM NIL "Forms")
       " are then evaluated as an implicit " (:SPECREF NIL "progn")
       ", and the results of the last " (:PARAM NIL "form")
       " are returned unless a " (:SPECREF NIL "throw") " occurs. " :PAR)
      (:ITEM NIL "3. If a " (:SPECREF NIL "throw")
       " occurs during the execution of one of the " (:PARAM NIL "forms")
       ", control is transferred to the " (:SPECREF NIL "catch") " "
       (:TERM NIL "form") " whose " (:PARAM NIL "tag") " is "
       (:FUNREF NIL "eq") " to the tag argument of the " (:SPECREF NIL "throw")
       " and which is the most recently established " (:SPECREF NIL "catch")
       " with that " (:PARAM NIL "tag") ". "
       (:COMMENT NIL "The evaluation of \\param{forms} is aborted.")
       "No further evaluation of " (:PARAM NIL "forms") " occurs. "
       (:COMMENT NIL
        "%Barmar thinks this is not redundant. I agree. -kmp 22-Dec-90"
        " If several tags match the tag" " argument of a \\specref{throw}, "
        " control is  transferred to the dynamically most recently established"
        " \\specref{catch}.")
       :PAR)
      (:ITEM NIL "4. The " (:PARAM NIL "tag") " " (:TERM NIL "established")
       " by " (:SPECREF NIL "catch") " is " (:TERM NIL "disestablished")
       " just before the results are returned. " :PAR))
     " " :PAR (:COMMENT NIL "% 7.9.2 14" "% 7.9.2 15" "% gray's rewording")
     "If during the execution of one of the " (:PARAM NIL "forms") ", a "
     (:SPECREF NIL "throw") " is executed whose tag is " (:FUNREF NIL "eq")
     " to the " (:SPECREF NIL "catch")
     " tag, then the values specified by the " (:SPECREF NIL "throw")
     " are returned as the result of the dynamically most recently established "
     (:SPECREF NIL "catch") " form with that tag. "
     (:COMMENT NIL " If a \\specref{throw} occurs"
      "during the execution of one of the \\param{forms},"
      "and there is a \\specref{catch} \\param{tag} that is "
      "\\funref{eq} to the \\specref{throw} tag,"
      "the value or values resulting from "
      "the \\specref{throw} are returned.")
     :PAR "The mechanism for " (:SPECREF NIL "catch") " and "
     (:SPECREF NIL "throw") " works even if " (:SPECREF NIL "throw")
     " is not within the lexical scope of " (:SPECREF NIL "catch") ". "
     (:SPECREF NIL "throw") " must occur within the "
     (:TERM NIL "dynamic extent") " of the " (:TERM NIL "evaluation")
     " of the body of a " (:SPECREF NIL "catch") " with a corresponding "
     (:PARAM NIL "tag") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (catch 'dummy-tag 1 2 (throw 'dummy-tag 3) 4) → 3
 (catch 'dummy-tag 1 2 3 4) → 4
 (defun throw-back (tag) (throw tag t)) → THROW-BACK
 (catch 'dummy-tag (throw-back 'dummy-tag) 2) → T

 ;; Contrast behavior of this example with corresponding example of BLOCK.
 (catch 'c
   (flet ((c1 () (throw 'c 1)))
     (catch 'c (c1) (print 'unreachable))
     2)) → 2
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " ")
    (:PART (:NAME "Exceptional Situations") " An error of " (:TERM NIL "type")
     " " (:TYPEREF NIL "control-error") " is signaled if "
     (:SPECREF NIL "throw") " is done when there is no suitable "
     (:SPECREF NIL "catch") " " (:PARAM NIL "tag") ". ")
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "throw") ", "
     (:SECREF NIL :EVALUATION) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "It is customary for "
     (:TERM NIL "symbols") " to be used as " (:PARAM NIL "tags") ", but any "
     (:TERM NIL "object")
     " is permitted. However, numbers should not be used because the comparison is done using "
     (:FUNREF NIL "eq") ". " :PAR (:SPECREF NIL "catch") " differs from "
     (:SPECREF NIL "block") " in that " (:SPECREF NIL "catch")
     " tags have dynamic " (:TERM NIL "scope") " while " (:SPECREF NIL "block")
     " names have " (:TERM NIL "lexical scope") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== GO")
   (:COM (:NAME "go" :FTYPE "Special Operator")
    (:PART (:NAME "Syntax") " " :PAR (:COMMENT NIL "% 7.8.5 17")
     (:DEF (:KIND "special-operator" :NO-RETURN T) (:NAMES NIL "go")
      (:ARGLIST NIL "tag"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "tag") "—a "
     (:TERM NIL "go tag") ". "
     (:COMMENT NIL " a \\term{symbol} or an \\term{integer}.") :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.8.5 16")
     (:SPECREF NIL "go")
     " transfers control to the point in the body of an enclosing "
     (:SPECREF NIL "tagbody") " form labeled by a tag " (:FUNREF NIL "eql")
     " to " (:PARAM NIL "tag") ". "
     (:COMMENT NIL
      "!!! Barmar: Which TAGBODY forms was the first sentence talking about??"
      "      GO only examines lexically containing forms.")
     "If there is no such " (:PARAM NIL "tag")
     " in the body, the bodies of lexically containing "
     (:SPECREF NIL "tagbody") " " (:TERM NIL "forms")
     " (if any) are examined as well. If several tags are " (:FUNREF NIL "eql")
     " to " (:PARAM NIL "tag")
     ", control is transferred to whichever matching " (:PARAM NIL "tag")
     " is contained in the innermost " (:SPECREF NIL "tagbody")
     " form that contains the " (:SPECREF NIL "go")
     ". The consequences are undefined if there is no matching "
     (:PARAM NIL "tag") " lexically visible to the point of the "
     (:SPECREF NIL "go") ". " :PAR
     (:COMMENT NIL
      " This is all said in a concept section now.  --sjl 7 Mar 92"
      "\\issue{EXIT-EXTENT:MINIMAL}"
      "When a transfer of control is initiated by \\specref{go}, "
      "the following events occur in order to accomplish the transfer of control."
      "Note that for \\specref{go}, "
      "the \\term{exit point} is the \\term{form} within the \\specref{tagbody}"
      "that is being executed at the time the \\specref{go} is performed."
      "\\beginlist" "\\itemitem{1.} "
      " Intervening \\term{exit points} are ``abandoned''"
      " (\\ie their \\term{extent} ends "
      "      and it is no longer valid to attempt to transfer control through them)."
      "\\itemitem{2.} "
      " The cleanup clauses of any intervening \\specref{unwind-protect} clauses"
      " are evaluated." " " "\\itemitem{3.} "
      " Intervening dynamic \\term{bindings} of \\declref{special} variables and "
      " \\term{catch tags} are undone." " " "\\itemitem{4.} "
      " The \\term{extent} of the \\term{exit point} being invoked ends,"
      " and control is passed to the target." "\\endlist " " "
      "The extent of an exit being ``abandoned'' because it is being passed over"
      "ends as soon as the transfer of control is initiated. That is,"
      "event 1 occurs at the beginning of the initiation of the transfer of"
      "control. "
      "The consequences are undefined if an attempt is made to transfer control "
      "to an \\term{exit point} whose \\term{dynamic extent} has ended." " "
      "%Moon had me add the part about \"interleaved\" -kmp 13-Feb-92"
      "Events 2 and 3 are actually performed interleaved, in the order"
      "corresponding to the reverse order in which they were established."
      "The effect of this is that the cleanup clauses of an \\specref{unwind-protect}"
      "sees the same dynamic \\term{bindings} "
      "of variables and \\term{catch tags} as were"
      "visible when the \\specref{unwind-protect} was entered." " "
      "Event 4 occurs at the end of the transfer of control." " "
      "\\endissue{EXIT-EXTENT:MINIMAL}")
     :PAR "The transfer of control initiated by " (:SPECREF NIL "go")
     " is performed as described in " (:SECREF NIL :TRANSFER-OF-CONTROL) ". "
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (tagbody
   (setq val 2)
   (go lp)
   (incf val 3)
   lp (incf val 4)) → NIL
 val → 6 
")
     " " :PAR (:ISSUE NIL "EXIT-EXTENT:MINIMAL") " " :PAR
     "The following is in error because there is a normal exit of the "
     (:SPECREF NIL "tagbody") " before the " (:SPECREF NIL "go")
     " is executed. " :PAR
     (:CODE NIL " (let ((a nil)) 
   (tagbody t (setq a #'(lambda () (go t))))
   (funcall a))
")
     " " :PAR "The following is in error because the " (:SPECREF NIL "tagbody")
     " is passed over before the " (:SPECREF NIL "go") " " (:TERM NIL "form")
     " is executed. " :PAR
     (:CODE NIL " (funcall (block nil
            (tagbody a (return #'(lambda () (go a))))))
")
     " " (:ENDISSUE NIL "EXIT-EXTENT:MINIMAL") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "tagbody") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL "% Moon: Is this just here to confuse people?"
      " \\issue{EXIT-EXTENT:MINIMAL}" " "
      " Implementations can support longer \\term{extents} for "
      " \\term{exit points} than is"
      " required here; in particular, an implementation may be extended to"
      " allow a larger extent as follows:" "  "
      " Events of 1, 2, 3, and 4 are interwoven in the reverse "
      " order in which they were established. In particular, the \\term{extent} of "
      " a passed-over \\term{exit point} ends when control reaches a "
      " frame that was "
      " established before the \\term{exit point} was established.  " "  "
      " In particular, it would be valid, during the evaluation of an "
      " \\specref{unwind-protect} "
      " cleanup form executed because of a non-local transfer of control, to"
      " initiate a new transfer of control to an "
      " \\term{exit point} intervening between the "
      " \\specref{unwind-protect} "
      " and the original target; the original processing of "
      " transfer of control is abandoned.  " " "
      " \\endissue{EXIT-EXTENT:MINIMAL}")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== RETURN-FROM")
   (:COM (:NAME "return-from" :FTYPE "Special Operator")
    (:PART (:NAME "Syntax") " " :PAR (:COMMENT NIL "% 7.7.0 7")
     (:DEF (:KIND "special-operator" :NO-RETURN T) (:NAMES NIL "return-from")
      (:ARGLIST NIL (:PARAM NIL "name") " " (:BRAC NIL (:PARAM NIL "result"))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "block tag") "; not evaluated. " :PAR (:PARAM NIL "result")
     "—a " (:TERM NIL "form") "; evaluated. The default is " (:MISC NIL "nil")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns control and "
     (:TERM NIL "multiple values") (:SUB NIL "2")
     " from a lexically enclosing " (:TERM NIL "block") ". " :PAR "A "
     (:SPECREF NIL "block") " " (:TERM NIL "form") " named "
     (:PARAM NIL "name") " must lexically enclose the occurrence of "
     (:SPECREF NIL "return-from") "; any " (:TERM NIL "values") " "
     (:TERM NIL "yielded") " by the " (:TERM NIL "evaluation") " of "
     (:PARAM NIL "result")
     " are immediately returned from the innermost such lexically enclosing "
     (:TERM NIL "block") ". " :PAR
     (:COMMENT NIL
      " This is all said in a concept section now.  --sjl 7 Mar 92"
      "\\issue{EXIT-EXTENT:MINIMAL}"
      "When a transfer of control is initiated by \\specref{return-from}, "
      "the following events occur before the transfer of control is complete."
      "Note that for \\specref{return-from}, the "
      "\\term{exit point} is the corresponding "
      "\\specref{block} \\term{form}. " "\\beginlist" "\\itemitem{1.} "
      "Intervening \\term{exit points} are ``abandoned'' "
      "(\\ie their \\term{extent} ends and it is no longer valid to attempt"
      "to transfer control through them)." "\\itemitem{2.} "
      "The cleanup clauses of any intervening \\specref{unwind-protect} clauses"
      "    are evaluated." " " "\\itemitem{3.} "
      "Intervening dynamic \\term{bindings} of \\declref{special} variables and "
      "\\term{catch tags} are undone."
      "% what about condition handlers and restarts?  --sjl 5 Mar 92" " "
      "\\itemitem{4.} "
      "The \\term{extent} of the \\term{exit point} being invoked ends,"
      "and control is passed to the target." "\\endlist " " "
      "The extent of an exit being ``abandoned'' because it is being passed over"
      "ends as soon as the transfer of control is initiated. That is,"
      "event 1 occurs at the beginning of the initiation of the transfer of"
      "control. "
      "The consequences are undefined if an attempt is made to transfer control "
      "to an \\term{exit point} whose \\term{dynamic extent} has ended." " "
      "%Moon had me add the part about \"interleaved\" -kmp 13-Feb-92"
      "Events 2 and 3 are actually performed interleaved, in the order"
      "corresponding to the reverse order in which they were established."
      "The effect of this is that the cleanup clauses of an \\specref{unwind-protect}"
      "sees the same dynamic \\term{bindings} "
      "of variables and \\term{catch tags} as were"
      "visible when the \\specref{unwind-protect} was entered."
      "Event 4 occurs at the end of the transfer of control." " "
      "%Dussud removed some additional detailed discussion here about longer extents,"
      "% how events are interwoven, etc." "\\endissue{EXIT-EXTENT:MINIMAL}")
     :PAR "The transfer of control initiated by " (:SPECREF NIL "return-from")
     " is performed as described in " (:SECREF NIL :TRANSFER-OF-CONTROL) ". "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR (:ISSUE NIL "EXIT-EXTENT:MINIMAL") " "
     (:CODE NIL " (block alpha (return-from alpha) 1) → NIL
 (block alpha (return-from alpha 1) 2) → 1
 (block alpha (return-from alpha (values 1 2)) 3) → 1, 2
 (let ((a 0))
    (dotimes (i 10) (incf a) (when (oddp i) (return)))
    a) → 2
 (defun temp (x)
    (if x (return-from temp 'dummy))
    44) → TEMP
 (temp nil) → 44
 (temp t) → DUMMY
 (block out
   (flet ((exit (n) (return-from out n)))
     (block out (exit 1)))
   2) → 1
 (block nil   
   (unwind-protect (return-from nil 1)
     (return-from nil 2)))
→ 2
 (dolist (flag '(nil t))
   (block nil
     (let ((x 5))
       (declare (special x))
       (unwind-protect (return-from nil)
         (print x))))
   (print 'here))
⊳ 5
⊳ HERE
⊳ 5
⊳ HERE
→ NIL
 (dolist (flag '(nil t))
   (block nil
     (let ((x 5))
       (declare (special x))
       (unwind-protect
           (if flag (return-from nil))
         (print x))))
   (print 'here))
⊳ 5
⊳ HERE
⊳ 5
⊳ HERE
→ NIL
")
     " " :PAR "The following has undefined consequences because the "
     (:SPECREF NIL "block") " " (:TERM NIL "form")
     " exits normally before the " (:MACREF NIL "return-from") " "
     (:TERM NIL "form") " is attempted. " :PAR
     (:CODE NIL
      " (funcall (block nil #'(lambda () (return-from nil)))) is an error.
")
     " " :PAR (:ENDISSUE NIL "EXIT-EXTENT:MINIMAL") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "block") ", "
     (:MACREF NIL "return") ", " (:SECREF NIL :EVALUATION) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== RETURN")
   (:COM (:NAME "return" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR (:COMMENT NIL "% 7.7.0 7")
     (:DEF (:KIND "macro" :NO-RETURN T) (:NAMES NIL "return")
      (:ARGLIST NIL (:BRAC NIL (:PARAM NIL "result"))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "result") "—a "
     (:TERM NIL "form") "; evaluated. The default is " (:MISC NIL "nil") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns, as if by "
     (:SPECREF NIL "return-from") ", from the " (:TERM NIL "block") " named "
     (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (block nil (return) 1) → NIL
 (block nil (return 1) 2) → 1
 (block nil (return (values 1 2)) 3) → 1, 2
 (block nil (block alpha (return 1) 2)) → 1
 (block alpha (block nil (return 1)) 2) → 2
 (block nil (block nil (return 1) 2)) → 1
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Conditions" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "block") ", "
     (:SPECREF NIL "return-from") ", " (:SECREF NIL :EVALUATION) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (return) ≡ (return-from nil)
 (return "
      (:PARAM NIL "form") ") ≡ (return-from nil " (:PARAM NIL "form") ")
")
     " " :PAR "The " (:TERM NIL "implicit blocks") " "
     (:TERM NIL "established") " by " (:TERM NIL "macros") " such as "
     (:MACREF NIL "do") " are often named " (:MISC NIL "nil") ", so that "
     (:MACREF NIL "return") " can be used to exit from such "
     (:TERM NIL "forms") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== TAGBODY")
   (:COM (:NAME "tagbody" :FTYPE "Special Operator")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "tagbody")
      (:ARGLIST NIL
       (:STAR NIL
        (:CURLY NIL (:PARAM NIL "tag") " | " (:PARAM NIL "statement"))))
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:COMMENT NIL "% 7.8.5 8")
     (:PARAM NIL "tag") "—a " (:TERM NIL "go tag") "; not evaluated. " :PAR
     (:PARAM NIL "statement") "—a " (:TERM NIL "compound form")
     "; evaluated as described below. " :PAR)
    (:PART (:NAME "Description") " " :PAR "Executes zero or more "
     (:TERM NIL "statements") " in a " (:COMMENT NIL "context")
     (:TERM NIL "lexical environment")
     " that provides for control transfers to labels indicated by the "
     (:PARAM NIL "tags") ". " :PAR (:COMMENT NIL "% 7.8.5 4" "% 7.8.5 5")
     "The " (:PARAM NIL "statements") " in a " (:SPECREF NIL "tagbody") " are "
     (:TERM NIL "evaluated") " in order from left to right, and their "
     (:TERM NIL "values")
     " are discarded. If at any time there are no remaining "
     (:PARAM NIL "statements") ", " (:SPECREF NIL "tagbody") " returns "
     (:MISC NIL "nil") ". " (:COMMENT NIL "% 7.8.5 6") "However, if "
     (:TT NIL "(go " (:PARAM NIL "tag") ")") " is " (:TERM NIL "evaluated")
     ", control jumps to the part of the body labeled with the "
     (:PARAM NIL "tag") ". (Tags are compared with " (:FUNREF NIL "eql") ".) "
     :PAR
     (:COMMENT NIL
      "!!! Need to introduce the word \"lexical\" in more places here.")
     "A " (:PARAM NIL "tag") " established by " (:SPECREF NIL "tagbody")
     " has " (:TERM NIL "lexical scope") " and has "
     (:TERM NIL "dynamic extent") ". Once " (:SPECREF NIL "tagbody")
     " has been exited, it is no longer valid to " (:SPECREF NIL "go") " to a "
     (:PARAM NIL "tag") " in its body. It is permissible for "
     (:SPECREF NIL "go") " to jump to a " (:SPECREF NIL "tagbody")
     " that is not the innermost " (:SPECREF NIL "tagbody") " containing that "
     (:SPECREF NIL "go") "; the " (:PARAM NIL "tags") " established by a "
     (:SPECREF NIL "tagbody") " only shadow other " (:PARAM NIL "tags")
     " of like name. " :PAR (:ISSUE NIL "TAGBODY-TAG-EXPANSION:NO")
     " The determination of which elements of the body are "
     (:PARAM NIL "tags") " and which are " (:PARAM NIL "statements")
     " is made prior to any " (:TERM NIL "macro expansion")
     " of that element. If a " (:PARAM NIL "statement") " is a "
     (:TERM NIL "macro form") " and its " (:TERM NIL "macro expansion")
     " is an " (:TERM NIL "atom") ", that " (:TERM NIL "atom")
     " is treated as a " (:PARAM NIL "statement") ", not a " (:PARAM NIL "tag")
     ". " (:ENDISSUE NIL "TAGBODY-TAG-EXPANSION:NO") " " :PAR
     (:COMMENT NIL "!!! Barmar: Didn't we say something about duplicate tags?"
      "KMP: Apparently not, but maybe something should be added about `explicitly vague'.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (let (val)
    (tagbody
      (setq val 1)
      (go point-a)
      (incf val 16)
     point-c
      (incf val 04)
      (go point-b)
      (incf val 32)
     point-a
      (incf val 02)
      (go point-c)
      (incf val 64)
     point-b
      (incf val 08))
    val)
→ 15
 (defun f1 (flag)
   (let ((n 1))
     (tagbody 
       (setq n (f2 flag #'(lambda () (go out))))
      out
       (prin1 n))))
→ F1
 (defun f2 (flag escape)
   (if flag (funcall escape) 2))
→ F2
 (f1 nil)
⊳ 2
→ NIL
 (f1 t)
⊳ 1
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "go") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The " (:TERM NIL "macros") " in "
     (:NEXTFIGURE NIL) " have " (:TERM NIL "implicit tagbodies") ". " :PAR
     (:TABLE (:NAME ("Macros that have implicit tagbodies."))
      (:ROW NIL (:CELL NIL (:MACREF NIL " do"))
       (:CELL NIL (:MACREF NIL "do-external-symbols"))
       (:CELL NIL (:MACREF NIL "dotimes")))
      (:ROW NIL (:CELL NIL (:MACREF NIL " do*"))
       (:CELL NIL (:MACREF NIL "do-symbols")) (:CELL NIL (:MACREF NIL "prog")))
      (:ROW NIL (:CELL NIL (:MACREF NIL " do-all-symbols"))
       (:CELL NIL (:MACREF NIL "dolist")) (:CELL NIL (:MACREF NIL "prog*"))))
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== THROW")
   (:COM (:NAME "throw" :FTYPE "Special Operator")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator" :NO-RETURN T) (:NAMES NIL "throw")
      (:ARGLIST NIL "tag result-form"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "tag") "—a "
     (:TERM NIL "catch tag") "; evaluated. " :PAR (:PARAM NIL "result-form")
     "—a " (:TERM NIL "form") "; evaluated as described below. " :PAR)
    (:PART (:NAME "Description") " " :PAR (:SPECREF NIL "throw")
     " causes a non-local control transfer to a " (:SPECREF NIL "catch")
     " whose tag is " (:FUNREF NIL "eq") " to " (:PARAM NIL "tag") ". "
     (:COMMENT NIL "% 7.10.0 11"
      "% This is said more precisely below. -moon & kmp 13-feb-92"
      " Dynamic variable \\term{bindings} are undone back to the point of the \\specref{catch},"
      " and any intervening \\specref{unwind-protect} clean-up code is executed.")
     :PAR (:PARAM NIL "Tag") " is evaluated first to produce an "
     (:TERM NIL "object") " called the throw tag; then "
     (:PARAM NIL "result-form")
     " is evaluated, and its results are saved. If the "
     (:PARAM NIL "result-form")
     " produces multiple values, then all the values are saved. The most recent outstanding "
     (:SPECREF NIL "catch") " whose " (:PARAM NIL "tag") " is "
     (:FUNREF NIL "eq")
     " to the throw tag is exited; the saved results are returned as the value or values of "
     (:SPECREF NIL "catch") ". " :PAR
     (:COMMENT NIL
      " This is all said in a concept section now.  --sjl 7 Mar 92"
      "\\issue{EXIT-EXTENT:MINIMAL}     "
      "When a transfer of control is initiated by \\specref{throw}, "
      "the following events occur before the transfer of control is complete."
      "Note that for \\specref{throw}, the "
      "\\term{exit point} is the corresponding "
      "\\specref{catch} \\term{form}. " "\\beginlist" "\\itemitem{1.} "
      "Intervening \\term{exit points} are ``abandoned''"
      "(\\ie their \\term{extent} ends "
      "     and it is no longer valid to attempt to transfer control through them)."
      "\\itemitem{2.}"
      "  The cleanup clauses of any intervening \\specref{unwind-protect} clauses"
      "  are evaluated." " " "\\itemitem{3.}"
      "  Intervening dynamic \\term{bindings} of \\declref{special} variables "
      "  and \\term{catch tags} are undone."
      "% what about condition handlers and restarts?  --sjl 5 Mar 92" " "
      "\\itemitem{4.} "
      "  The \\term{extent} of the \\term{exit point} being invoked ends, "
      "  and control is passed to the target." "\\endlist " " "
      "The extent of an exit being ``abandoned'' because it is being passed over"
      "ends as soon as the transfer of control is initiated. That is,"
      "event 1 occurs at the beginning of the initiation of the transfer of"
      "control. The consequences are undefined if an attempt is made "
      "to transfer control to an \\term{exit point} whose \\term{dynamic extent} has"
      "ended." " "
      "%Moon had me add the part about \"interleaved\" -kmp 13-Feb-92"
      "Events 2 and 3 are actually performed interleaved, in the order"
      "corresponding to the reverse order" "in which they were established."
      "The effect of this is that the cleanup clauses of an \\specref{unwind-protect}"
      "sees the same dynamic \\term{bindings} "
      "of variables and \\term{catch tags} as were"
      "visible when the \\specref{unwind-protect} was entered." " "
      "Event 4 occurs at the end of the transfer of control."
      "                                                                   "
      "\\endissue{EXIT-EXTENT:MINIMAL}")
     :PAR "The transfer of control initiated by " (:SPECREF NIL "throw")
     " is performed as described in " (:SECREF NIL :TRANSFER-OF-CONTROL) ". "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (catch 'result
    (setq i 0 j 0)
    (loop (incf j 3) (incf i)
          (if (= i 3) (throw 'result (values i j))))) → 3, 9

")
     " " :PAR (:ISSUE NIL "EXIT-EXTENT:MINIMAL") " "
     (:CODE NIL " (catch nil 
   (unwind-protect (throw nil 1)
     (throw nil 2))) → 2
")
     " " :PAR "The consequences of the following are undefined because the "
     (:SPECREF NIL "catch") " of " (:TT NIL "b")
     " is passed over by the first " (:SPECREF NIL "throw")
     ", hence portable programs must assume that its "
     (:TERM NIL "dynamic extent") " is terminated. The " (:TERM NIL "binding")
     " of the " (:TERM NIL "catch tag") " is not yet "
     (:TERM NIL "disestablished")
     " and therefore it is the target of the second " (:SPECREF NIL "throw")
     ". "
     (:COMMENT NIL
      "% Moon: Belongs with redundant and confusing text now commented out in Notes."
      " If the implementation is extended as outlined above, "
      " the following returns \\f{2}.")
     :PAR
     (:CODE NIL " (catch 'a
   (catch 'b
     (unwind-protect (throw 'a 1)
       (throw 'b 2))))
")
     " " :PAR "The following prints “"
     (:TT NIL "The inner catch returns :SECOND-THROW") "” and then returns "
     (:TT NIL ":outer-catch") ". " :PAR
     (:CODE NIL " (catch 'foo
         (format t \"The inner catch returns ~s.~%\"
                 (catch 'foo
                     (unwind-protect (throw 'foo :first-throw)
                         (throw 'foo :second-throw))))
         :outer-catch)
⊳ The inner catch returns :SECOND-THROW
→ :OUTER-CATCH
")
     " " :PAR
     (:COMMENT NIL "% Moon: This whole example is redundant."
      " The consequences of the following are undefined because the \\term{extent} of"
      " the {\\tt (catch 'bar ...)} \\term{exit point} "
      " ends when the {\\tt (THROW 'FOO ...)}" " commences."
      " %% Moon: Belongs with redundant and confusing text now commented out in Notes."
      " % If the implementation is extended as described above, "
      " % the pending \\term{exit point} to tag {\\tt foo} is discarded by the"
      " % second \\specref{throw} to {\\tt bar} and the value 4 is transferred to"
      " % {\\tt (catch 'bar ...)}, that returns 4. The {\\tt (catch 'foo ...)}"
      " % then returns the 4 because its first argument has returned"
      " % normally.  {\\tt xxx} is not printed." "  " " \\code" "  (catch 'foo"
      "    (catch 'bar" "        (unwind-protect (throw 'foo 3)"
      "          (throw 'bar 4)" "          (print 'xxx))))" " \\endcode")
     :PAR (:ENDISSUE NIL "EXIT-EXTENT:MINIMAL") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL "% 7.10.0 12") "If there is no outstanding "
     (:TERM NIL "catch tag")
     " that matches the throw tag, no unwinding of the stack is performed, and an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "control-error")
     " is signaled. When the error is signaled, "
     (:COMMENT NIL "  the outstanding \\specref{catch tags}"
      "  the dynamic variable \\term{bindings}, ... are those"
      "% Replaced by more general terms.")
     "the " (:TERM NIL "dynamic environment")
     " is that which was in force at the point of the " (:SPECREF NIL "throw")
     ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "block") ", "
     (:SPECREF NIL "catch") ", " (:SPECREF NIL "return-from") ", "
     (:SPECREF NIL "unwind-protect") ", " (:SECREF NIL :EVALUATION) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL "% Moon thinks this is just confusing and unnecessary."
      " Implementations can support longer \\term{extents} for "
      " \\term{exit points} than is"
      " required here; in particular, an implementation may be extended to"
      " allow a larger extent as follows:" "  "
      " Events of 1, 2, 3, and 4 are interwoven in the reverse "
      " order in which they were established. In particular, the \\term{extent} of "
      " a passed-over \\term{exit point} ends when control reaches a "
      " frame that was "
      " established before the \\term{exit point} was established.  " "  "
      " In particular, it would be valid, during the evaluation of an "
      " \\specref{unwind-protect} "
      " cleanup form executed because of a non-local transfer of control, to"
      " initiate a new transfer of control to an "
      " \\term{exit point} intervening between the "
      " \\specref{unwind-protect} "
      " and the original target; the original processing of "
      " transfer of control is abandoned.  ")
     :PAR (:SPECREF NIL "catch") " and " (:SPECREF NIL "throw")
     " are normally used when the " (:TERM NIL "exit point") " must have "
     (:TERM NIL "dynamic scope") " (" (:I NIL "e.g.") ",  the "
     (:SPECREF NIL "throw") " is not lexically enclosed by the "
     (:SPECREF NIL "catch") "), while " (:SPECREF NIL "block") " and "
     (:SPECREF NIL "return") " are used when " (:TERM NIL "lexical scope")
     " is sufficient. " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== UNWIND-PROTECT")
   (:COM (:NAME "unwind-protect" :FTYPE "Special Operator")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "unwind-protect")
      (:ARGLIST NIL (:PARAM NIL "protected-form") " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "cleanup-form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "protected-form") "—a " (:TERM NIL "form") ". " :PAR
     (:PARAM NIL "cleanup-form") "—a " (:TERM NIL "form") ". " :PAR
     (:COMMENT NIL "% 7.9.2 18") (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " of the " (:PARAM NIL "protected-form") ". " :PAR)
    (:PART (:NAME "Description") " " (:COMMENT NIL "% 7.10.0 6" "% 7.10.0 7")
     (:SPECREF NIL "unwind-protect") " evaluates "
     (:PARAM NIL "protected-form") " and guarantees that "
     (:PARAM NIL "cleanup-forms") " are executed before "
     (:SPECREF NIL "unwind-protect")
     " exits, whether it terminates normally or is aborted by a control transfer of some kind. "
     (:SPECREF NIL "unwind-protect")
     " is intended to be used to make sure that certain side effects take place after the evaluation of "
     (:PARAM NIL "protected-form") ". " :PAR (:COMMENT NIL "% 7.10.0 9")
     "If a " (:TERM NIL "non-local exit") " occurs during execution of "
     (:PARAM NIL "cleanup-forms") ", no special action is taken. The "
     (:PARAM NIL "cleanup-forms") " of " (:SPECREF NIL "unwind-protect")
     " are not protected by that " (:SPECREF NIL "unwind-protect") ". "
     (:COMMENT NIL
      "% Moon and I couldn't figure out what this was about. -kmp 13-Feb-92"
      " , though they might be"
      " protected if that \\specref{unwind-protect} occurs within the protected"
      " form of another \\specref{unwind-protect}.")
     :PAR (:COMMENT NIL "% 7.10.0 10") (:SPECREF NIL "unwind-protect")
     " protects against all attempts to exit from "
     (:PARAM NIL "protected-form") ", including " (:SPECREF NIL "go") ", "
     (:MACREF NIL "handler-case") ", " (:MACREF NIL "ignore-errors") ", "
     (:MACREF NIL "restart-case") ", " (:SPECREF NIL "return-from") ", "
     (:SPECREF NIL "throw") ", and " (:MACREF NIL "with-simple-restart") ". "
     :PAR
     (:COMMENT NIL
      "!!! Moon: And other stuff -- see previous page.  Obviously need to collect all"
      " this stuff into a glossary entry.")
     (:ISSUE NIL "EXIT-EXTENT-AND-CONDITION-SYSTEM:LIKE-DYNAMIC-BINDINGS")
     " Undoing of " (:TERM NIL "handler") " and " (:TERM NIL "restart") " "
     (:TERM NIL "bindings")
     " during an exit happens in parallel with the undoing of the bindings of "
     (:TERM NIL "dynamic variables") " and " (:SPECREF NIL "catch")
     " tags, in the reverse order in which they were established. The effect of this is that "
     (:PARAM NIL "cleanup-form") " sees the same " (:TERM NIL "handler")
     " and " (:TERM NIL "restart") " " (:TERM NIL "bindings") ", as well as "
     (:TERM NIL "dynamic variable") " " (:TERM NIL "bindings") " and "
     (:SPECREF NIL "catch") " tags, as were visible when the "
     (:SPECREF NIL "unwind-protect") " was entered. "
     (:ENDISSUE NIL "EXIT-EXTENT-AND-CONDITION-SYSTEM:LIKE-DYNAMIC-BINDINGS")
     " " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (tagbody
   (let ((x 3))
     (unwind-protect
       (if (numberp x) (go out))
       (print x)))
  out
   ...)
")
     " When " (:SPECREF NIL "go") " is executed, the call to "
     (:FUNREF NIL "print")
     " is executed first, and then the transfer of control to the tag "
     (:TT NIL "out") " is completed. " :PAR
     (:CODE NIL " (defun dummy-function (x)
    (setq state 'running)
    (unless (numberp x) (throw 'abort 'not-a-number))
    (setq state (1+ x))) → DUMMY-FUNCTION
 (catch 'abort (dummy-function 1)) → 2
 state → 2
 (catch 'abort (dummy-function 'trash)) → NOT-A-NUMBER
 state → RUNNING
 (catch 'abort (unwind-protect (dummy-function 'trash) 
                  (setq state 'aborted))) → NOT-A-NUMBER
 state → ABORTED
")
     " " :PAR (:COMMENT NIL "% 7.10.0 8") "The following code is not correct: "
     :PAR
     (:CODE NIL " (unwind-protect
   (progn (incf *access-count*)
          (perform-access))
   (decf *access-count*))
")
     " If an exit occurs before completion of " (:MACREF NIL "incf") ", the "
     (:MACREF NIL "decf") " " (:TERM NIL "form")
     " is executed anyway, resulting in an incorrect value for "
     (:TT NIL "*access-count*")
     ". The correct way to code this is as follows: " :PAR
     (:CODE NIL " (let ((old-count *access-count*))
   (unwind-protect
     (progn (incf *access-count*)
            (perform-access))
     (setq *access-count* old-count)))
")
     " " :PAR (:ISSUE NIL "EXIT-EXTENT:MINIMAL") " " :PAR
     (:CODE NIL ";;; The following returns 2.
 (block nil   
   (unwind-protect (return 1)
     (return 2)))
 
;;; The following has undefined consequences.
 (block a    
   (block b
     (unwind-protect (return-from a 1)
       (return-from b 2))))
 
;;; The following returns 2.
 (catch nil 
   (unwind-protect (throw nil 1)
     (throw nil 2)))
 
;;; The following has undefined consequences because the catch of B is 
;;; passed over by the first THROW, hence portable programs must assume 
;;; its dynamic extent is terminated.  The binding of the catch tag is not
;;; yet disestablished and therefore it is the target of the second throw.
 (catch 'a
   (catch 'b
     (unwind-protect (throw 'a 1)
       (throw 'b 2))))
 
;;; The following prints \"The inner catch returns :SECOND-THROW\"
;;; and then returns :OUTER-CATCH.
 (catch 'foo
         (format t \"The inner catch returns ~s.~%\"
                 (catch 'foo
                     (unwind-protect (throw 'foo :first-throw)
                         (throw 'foo :second-throw))))
         :outer-catch)
 
 
;;; The following returns 10. The inner CATCH of A is passed over, but 
;;; because that CATCH is disestablished before the THROW to A is executed,
;;; it isn't seen.
 (catch 'a
   (catch 'b
     (unwind-protect (1+ (catch 'a (throw 'b 1)))
       (throw 'a 10))))
 
 
;;; The following has undefined consequences because the extent of
;;; the (CATCH 'BAR ...) exit ends when the (THROW 'FOO ...)
;;; commences.
 (catch 'foo
   (catch 'bar
       (unwind-protect (throw 'foo 3)
         (throw 'bar 4)
         (print 'xxx))))
 
 
;;; The following returns 4; XXX is not printed.
;;; The (THROW 'FOO ...) has no effect on the scope of the BAR
;;; catch tag or the extent of the (CATCH 'BAR ...) exit.
 (catch 'bar
   (catch 'foo
       (unwind-protect (throw 'foo 3)
         (throw 'bar 4)
         (print 'xxx))))
 
 
;;; The following prints 5.
 (block nil
   (let ((x 5))
     (declare (special x))
     (unwind-protect (return)
       (print x))))          
")
     " " :PAR (:ENDISSUE NIL "EXIT-EXTENT:MINIMAL") " ")
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "catch") ", "
     (:SPECREF NIL "go") ", " (:MACREF NIL "handler-case") ", "
     (:MACREF NIL "restart-case") ", " (:MACREF NIL "return") ", "
     (:SPECREF NIL "return-from") ", " (:SPECREF NIL "throw") ", "
     (:SECREF NIL :EVALUATION) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Truth Values --------------------") :PAR
   (:COMMENT NIL "%% ========== NIL")
   (:COM (:NAME "nil" :FTYPE "Constant Variable")
    (:PART (:NAME "Constant Value") " " :PAR (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " "
     (:COMMENT NIL "% 6.1.0 1" "% 6.1.0 2"
      "\\nil\\ is a \\term{symbol} which appears to be treated as a variable when evaluated."
      "To modify the value of \\nil\\ is not permitted."
      "The value of the object \\oftype{null} is \\nil."
      "\\nil\\ represents both the "
      "logical false value and the \\term{empty list}. " "% 14.0.0 3"
      "\\nil\\ is considered to be a \\term{sequence} of length zero.")
     :PAR (:MISC NIL "nil") " represents both " (:TERM NIL "boolean") " (and "
     (:TERM NIL "generalized boolean") ") " (:TERM NIL "false") " and the "
     (:TERM NIL "empty list") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " nil → NIL 
")
     " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:CONREF NIL "t") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== NOT")
   (:COM (:NAME "not" :FTYPE "Function")
    (:ISSUE NIL "NOT-AND-NULL-RETURN-VALUE:X3J13-MAR-93") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "not") (:ARGLIST NIL "x")
      (:VALUES NIL "boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "x") "—a "
     (:TERM NIL "generalized boolean") " (" (:I NIL "i.e.") ",  any "
     (:TERM NIL "object") "). " :PAR (:PARAM NIL "boolean") "—a "
     (:TERM NIL "boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.4.0 3") "Returns "
     (:MISC NIL "t") " if " (:PARAM NIL "x") " is " (:TERM NIL "false")
     "; otherwise, returns " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (not nil) → T
 (not '()) → T
 (not (integerp 'sss)) → T
 (not (integerp 1)) → NIL
 (not 3.7) → NIL
 (not 'apple) → NIL
")
     " " :PAR (:ENDISSUE NIL "NOT-AND-NULL-RETURN-VALUE:X3J13-MAR-93") " "
     :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "null") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL " \\code" " (not x) \\EQ (null x)" " \\endcode") :PAR
     (:COMMENT NIL "% 6.4.0 $") (:FUNREF NIL "not")
     " is intended to be used to invert the `truth value' of a "
     (:TERM NIL "boolean") " (or " (:TERM NIL "generalized boolean")
     ") whereas " (:FUNREF NIL "null")
     " is intended to be used to test for the " (:TERM NIL "empty list")
     ". Operationally, " (:FUNREF NIL "not") " and " (:FUNREF NIL "null")
     " compute the same result; which to use is a matter of style. " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== T")
   (:COM (:NAME "t" :FTYPE "Constant Variable")
    (:PART (:NAME "Constant Value") " " :PAR (:COMMENT NIL "% 6.1.0 3")
     (:MISC NIL "t") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "boolean")
     " representing true, and the canonical " (:TERM NIL "generalized boolean")
     " representing true. Although any " (:TERM NIL "object") " other than "
     (:MISC NIL "nil") " is considered " (:TERM NIL "true") ", "
     (:MISC NIL "t")
     " is generally used when there is no special reason to prefer one such "
     (:TERM NIL "object") " over another. " :PAR "The " (:TERM NIL "symbol")
     " " (:MISC NIL "t")
     " is also sometimes used for other purposes as well. For example, as the "
     (:TERM NIL "name") " of a " (:TERM NIL "class") ", as a "
     (:TERM NIL "designator") " (" (:I NIL "e.g.") ",  a "
     (:TERM NIL "stream designator")
     ") or as a special symbol for some syntactic reason (" (:I NIL "e.g.")
     ",  in " (:MACREF NIL "case") " and " (:MACREF NIL "typecase")
     " to label the " (:PARAM NIL "otherwise-clause") "). " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " t → T 
 (eq t 't) → "
      (:TERM NIL "true") "
 (find-class 't) → #<CLASS T 610703333>
 (case 'a (a 1) (t 2)) → 1
 (case 'b (a 1) (t 2)) → 2
 (prin1 'hello t)
⊳ HELLO
→ HELLO
")
     " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:CONREF NIL "nil") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Identity Equality --------------------")
   :PAR (:COMMENT NIL "%% ========== EQ")
   (:COM (:NAME "eq" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "eq") (:ARGLIST NIL "x y")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "x") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "y") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.3.0 3") "Returns "
     (:TERM NIL "true") " if its " (:TERM NIL "arguments")
     " are the same, identical " (:TERM NIL "object") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (eq 'a 'b) → " (:TERM NIL "false") "
 (eq 'a 'a) → "
      (:TERM NIL "true") "
 (eq 3 3)
→ "
      (:TERM NIL "true") "
OR→ "
      (:TERM NIL "false") "
 (eq 3 3.0) → "
      (:TERM NIL "false") "
 (eq 3.0 3.0)
→ "
      (:TERM NIL "true") "
OR→ "
      (:TERM NIL "false") "
 (eq #c(3 -4) #c(3 -4))
→ "
      (:TERM NIL "true") "
OR→ "
      (:TERM NIL "false") "
 (eq #c(3 -4.0) #c(3 -4)) → "
      (:TERM NIL "false") "
 (eq (cons 'a 'b) (cons 'a 'c)) → "
      (:TERM NIL "false") "
 (eq (cons 'a 'b) (cons 'a 'b)) → "
      (:TERM NIL "false") "
 (eq '(a . b) '(a . b))
→ "
      (:TERM NIL "true") "
OR→ "
      (:TERM NIL "false") "
 (progn (setq x (cons 'a 'b)) (eq x x)) → "
      (:TERM NIL "true") "
 (progn (setq x '(a . b)) (eq x x)) → "
      (:TERM NIL "true") "
 (eq #\\A #\\A)
→ "
      (:TERM NIL "true") "
OR→ "
      (:TERM NIL "false") "
 (let ((x \"Foo\")) (eq x x)) → "
      (:TERM NIL "true") "
 (eq \"Foo\" \"Foo\")
→ "
      (:TERM NIL "true") "
OR→ "
      (:TERM NIL "false") "
 (eq \"Foo\" (copy-seq \"Foo\")) → "
      (:TERM NIL "false") "
 (eq \"FOO\" \"foo\") → "
      (:TERM NIL "false") "
 (eq \"string-seq\" (copy-seq \"string-seq\")) → "
      (:TERM NIL "false") "
 (let ((x 5)) (eq x x))
→ "
      (:TERM NIL "true") "
OR→ "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "eql") ", "
     (:FUNREF NIL "equal") ", " (:FUNREF NIL "equalp") ", " (:FUNREF NIL "=")
     ", " (:SECREF NIL :COMPILATION) " " :PAR)
    (:PART (:NAME "Notes") " " (:COMMENT NIL "% 6.3.0 4") (:TERM NIL "Objects")
     " that appear the same when printed are not necessarily "
     (:FUNREF NIL "eq") " to each other. " (:TERM NIL "Symbols")
     " that print the same usually are " (:FUNREF NIL "eq")
     " to each other because of the use of the " (:FUNREF NIL "intern")
     " function. However, " (:TERM NIL "numbers")
     " with the same value need not be " (:FUNREF NIL "eq")
     ", and two similar " (:TERM NIL "lists") " are usually not "
     (:TERM NIL "identical") ". " :PAR
     "An implementation is permitted to make “copies” of "
     (:TERM NIL "characters") " and " (:TERM NIL "numbers")
     " at any time. The effect is that " (:RM NIL " Common Lisp")
     " makes no guarantee that " (:FUNREF NIL "eq")
     " is true even when both its arguments are “the same thing” if that thing is a "
     (:TERM NIL "character") " or " (:TERM NIL "number") ". " :PAR "Most "
     (:RM NIL " Common Lisp") " " (:TERM NIL "operators") " use "
     (:FUNREF NIL "eql") " rather than " (:FUNREF NIL "eq")
     " to compare objects, or else they default to " (:FUNREF NIL "eql")
     " and only use " (:FUNREF NIL "eq")
     " if specifically requested to do so. However, the following "
     (:TERM NIL "operators") " are defined to use " (:FUNREF NIL "eq")
     " rather than " (:FUNREF NIL "eql")
     " in a way that cannot be overridden by the " (:TERM NIL "code")
     " which employs them: " :PAR
     (:TABLE (:NAME ("Operators that always prefer EQ over EQL"))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " catch"))
       (:CELL NIL (:FUNREF NIL "getf")) (:CELL NIL (:FUNREF NIL "throw")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " get"))
       (:CELL NIL (:FUNREF NIL "remf")) (:CELL NIL))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " get-properties"))
       (:CELL NIL (:FUNREF NIL "remprop"))))
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== EQL")
   (:COM (:NAME "eql" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "eql") (:ARGLIST NIL "x y")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "x") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "y") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.3.0 7")
     "The value of " (:FUNREF NIL "eql") " is " (:TERM NIL "true")
     " of two objects, " (:PARAM NIL "x") " and " (:PARAM NIL "y")
     ", in the folowing cases: "
     (:LIST NIL
      (:ITEM NIL "1. If " (:PARAM NIL "x") " and " (:PARAM NIL "y") " are "
       (:FUNREF NIL "eq") ". ")
      (:ITEM NIL "2. If " (:PARAM NIL "x") " and " (:PARAM NIL "y")
       " are both " (:TERM NIL "numbers") " of the same " (:TERM NIL "type")
       " and the same value. ")
      (:ITEM NIL "3. If they are both " (:TERM NIL "characters")
       " that represent the same character. "))
     " " :PAR "Otherwise the value of " (:FUNREF NIL "eql") " is "
     (:TERM NIL "false") ". " :PAR (:COMMENT NIL "% 6.3.0 8")
     "If an implementation supports positive and negative zeros as "
     (:TERM NIL "distinct") " values, then " (:TT NIL "(eql 0.0 -0.0)")
     " returns " (:TERM NIL "false") ". Otherwise, when the syntax "
     (:TT NIL "-0.0") " is read it is interpreted as the value "
     (:TT NIL "0.0") ", and so " (:TT NIL "(eql 0.0 -0.0)") " returns "
     (:TERM NIL "true") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (eql 'a 'b) → " (:TERM NIL "false") "
 (eql 'a 'a) → "
      (:TERM NIL "true") "
 (eql 3 3) → "
      (:TERM NIL "true") "
 (eql 3 3.0) → "
      (:TERM NIL "false") "
 (eql 3.0 3.0) → "
      (:TERM NIL "true") "
 (eql #c(3 -4) #c(3 -4)) → "
      (:TERM NIL "true") "
 (eql #c(3 -4.0) #c(3 -4)) → "
      (:TERM NIL "false") "
 (eql (cons 'a 'b) (cons 'a 'c)) → "
      (:TERM NIL "false") "
 (eql (cons 'a 'b) (cons 'a 'b)) → "
      (:TERM NIL "false") "
 (eql '(a . b) '(a . b))
→ "
      (:TERM NIL "true") "
OR→ "
      (:TERM NIL "false") "
 (progn (setq x (cons 'a 'b)) (eql x x)) → "
      (:TERM NIL "true") "
 (progn (setq x '(a . b)) (eql x x)) → "
      (:TERM NIL "true") "
 (eql #\\A #\\A) → "
      (:TERM NIL "true") "
 (eql \"Foo\" \"Foo\")
→ "
      (:TERM NIL "true") "
OR→ "
      (:TERM NIL "false") "
 (eql \"Foo\" (copy-seq \"Foo\")) → "
      (:TERM NIL "false") "
 (eql \"FOO\" \"foo\") → "
      (:TERM NIL "false") "
")
     " " :PAR "Normally " (:TT NIL "(eql 1.0s0 1.0d0)")
     " is false, under the assumption that " (:TT NIL "1.0s0") " and "
     (:TT NIL "1.0d0")
     " are of distinct data types. However, implementations that do not provide four distinct floating-point formats are permitted to “collapse” the four formats into some smaller number of them; in such an implementation "
     (:TT NIL "(eql 1.0s0 1.0d0)") " might be true. " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "eq") ", "
     (:FUNREF NIL "equal") ", " (:FUNREF NIL "equalp") ", " (:FUNREF NIL "=")
     ", " (:FUNREF NIL "char=") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "eql") " is the same as "
     (:FUNREF NIL "eq") ", except that if the arguments are "
     (:TERM NIL "characters") " or " (:TERM NIL "numbers")
     " of the same type then their values are compared. Thus "
     (:FUNREF NIL "eql") " tells whether two " (:TERM NIL "objects")
     " are conceptually the same, whereas " (:FUNREF NIL "eq")
     " tells whether two " (:TERM NIL "objects")
     " are implementationally identical. It is for this reason that "
     (:FUNREF NIL "eql") ", not " (:FUNREF NIL "eq")
     ", is the default comparison predicate for " (:TERM NIL "operators")
     " that take " (:TERM NIL "sequences") " as arguments. " :PAR
     (:FUNREF NIL "eql") " may not be true of two " (:TERM NIL "floats")
     " even when they represent the same value. " (:FUNREF NIL "=")
     " is used to compare mathematical values. " :PAR
     (:COMMENT NIL "% 6.3.0 9") "Two " (:TERM NIL "complex")
     " numbers are considered to be " (:FUNREF NIL "eql")
     " if their real parts are " (:FUNREF NIL "eql")
     " and their imaginary parts are " (:FUNREF NIL "eql") ". For example, "
     (:TT NIL "(eql #C(4 5) #C(4 5))") " is " (:TERM NIL "true") " and "
     (:TT NIL "(eql #C(4 5) #C(4.0 5.0))") " is " (:TERM NIL "false")
     ". Note that while " (:TT NIL "(eql #C(5.0 0.0) 5.0)") " is "
     (:TERM NIL "false") ", " (:TT NIL "(eql #C(5 0) 5)") " is "
     (:TERM NIL "true") ". In the case of " (:TT NIL "(eql #C(5.0 0.0) 5.0)")
     " the two arguments are of different types, and so cannot satisfy "
     (:FUNREF NIL "eql") ". In the case of " (:TT NIL "(eql #C(5 0) 5)") ", "
     (:TT NIL "#C(5 0)") " is not a " (:TERM NIL "complex")
     " number, but is automatically reduced to the " (:TERM NIL "integer") " "
     (:TT NIL "5") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== EQUAL")
   (:COM (:NAME "equal" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "equal") (:ARGLIST NIL "x y")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "x") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "y") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.3.0 12")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "x") " and "
     (:PARAM NIL "y") " are structurally similar (isomorphic) "
     (:TERM NIL "objects") ". " (:TERM NIL "Objects")
     " are treated as follows by " (:FUNREF NIL "equal") ". " :PAR
     (:LIST NIL
      (:ITEM NIL (:TERM NIL "Symbols") ", " (:TERM NIL "Numbers") ", and "
       (:TERM NIL "Characters") " " :PAR (:COMMENT NIL "% 6.3.0 13")
       (:FUNREF NIL "equal") " is " (:TERM NIL "true") " of two "
       (:TERM NIL "objects") " if they are " (:TERM NIL "symbols") " that are "
       (:FUNREF NIL "eq") ", if they are " (:TERM NIL "numbers") " that are "
       (:FUNREF NIL "eql") ", or if they are " (:TERM NIL "characters")
       " that are " (:FUNREF NIL "eql") ". " :PAR)
      (:ITEM NIL (:TERM NIL "Conses") " " :PAR (:COMMENT NIL "% 6.3.0 15")
       "For " (:TERM NIL "conses") ", " (:FUNREF NIL "equal")
       " is defined recursively as the two " (:TERM NIL "cars") " being "
       (:FUNREF NIL "equal") " and the two " (:TERM NIL "cdrs") " being "
       (:FUNREF NIL "equal") ". " :PAR)
      (:ITEM NIL (:TERM NIL "Arrays") " " :PAR (:COMMENT NIL "% 6.3.0 16")
       "Two " (:TERM NIL "arrays") " are " (:FUNREF NIL "equal")
       " only if they are " (:FUNREF NIL "eq") ", with one exception: "
       (:TERM NIL "strings") " and " (:TERM NIL "bit vectors")
       " are compared element-by-element (using " (:FUNREF NIL "eql")
       "). If either " (:PARAM NIL "x") " or " (:PARAM NIL "y") " has a "
       (:TERM NIL "fill pointer") ", the " (:TERM NIL "fill pointer")
       " limits the number of elements examined by " (:FUNREF NIL "equal")
       ". Uppercase and lowercase letters in " (:TERM NIL "strings")
       " are considered by " (:FUNREF NIL "equal") " to be different. " :PAR)
      (:ITEM NIL (:TERM NIL "Pathnames") " " :PAR (:COMMENT NIL "% 6.3.0 18")
       "Two " (:TERM NIL "pathnames") " are " (:FUNREF NIL "equal")
       " if and only if all the corresponding components (host, device, and so on) are "
       (:COMMENT NIL "!!! Barmar: \"equivalent\" ??? ")
       "equivalent. Whether or not uppercase and lowercase letters are considered equivalent in "
       (:TERM NIL "strings") " appearing in components is "
       (:TERM NIL "implementation-dependent") ". " (:TERM NIL "pathnames")
       " that are " (:FUNREF NIL "equal")
       " should be functionally equivalent. " :PAR
       (:COMMENT NIL "Barmar didn't think this belonged here.  I agree."
        " %% 23.1.1 19"
        " For \\term{pathnames}, \\funref{eql} is the same as \\funref{eq}.")
       :PAR (:ISSUE NIL "EQUAL-STRUCTURE:MAYBE-STATUS-QUO") " ")
      (:ITEM NIL
       (:B NIL " Other (Structures, hash-tables, instances, "
        (:MATH NIL (:MO NIL "…")) ")")
       " " :PAR "Two other " (:TERM NIL "objects") " are "
       (:FUNREF NIL "equal") " only if they are " (:FUNREF NIL "eq") ". " :PAR
       (:COMMENT NIL "% Barmar: \"EQUAL\" or \"EQUALP\" in this next ???"
        "% Moon: Delete this.  This is EQUAL, not EQUALP"
        " %% The following was added at the June 1989 meeting"
        " A structure defined by \\macref{defstruct} without an explicit "
        " \\kwd{type} option is called non-typed; otherwise it is typed."
        " The definition of \\funref{equalp} on \\macref{defstruct}"
        " instances is as follows:"
        " \\funref{equalp} on two \\macref{defstruct} instances \\f{s1} and \\f{s2},"
        " where both are non-typed structures, is \\term{true} if and only if:"
        " \\beginlist" " \\itemitem{1.}"
        " The \\term{type} of \\f{s1} is the same as the type of \\f{s2}."
        " \\itemitem{2.}" " The value of each \\term{slot} of \\f{s1} "
        " is \\funref{equalp} to the value of the same \\term{slot} of \\f{s2}."
        " \\endlist")
       (:ENDISSUE NIL "EQUAL-STRUCTURE:MAYBE-STATUS-QUO") " " :PAR))
     " " :PAR (:ISSUE NIL "EQUAL-STRUCTURE:MAYBE-STATUS-QUO") " "
     (:FUNREF NIL "equal") " does not descend any " (:TERM NIL "objects")
     " other than the ones explicitly specified above. "
     (:NEXTFIGURE (:CAPS T))
     " summarizes the information given in the previous list. "
     (:COMMENT NIL " !!! Moon: Strange way to phrase it. ")
     "In addition, the figure specifies the priority of the behavior of "
     (:FUNREF NIL "equal")
     ", with upper entries taking priority over lower ones. " :PAR
     (:TABLE
      (:NAME ("Summary and priorities of behavior of " (:FUNREF NIL "equal")))
      (:ROW NIL (:CELL NIL "Type") (:CELL NIL "Behavior"))
      (:ROW NIL (:CELL NIL (:TERM NIL "number"))
       (:CELL NIL " uses " (:FUNREF NIL "eql")))
      (:ROW NIL (:CELL NIL (:TERM NIL "character"))
       (:CELL NIL " uses " (:FUNREF NIL "eql")))
      (:ROW NIL (:CELL NIL (:TERM NIL "cons")) (:CELL NIL " descends "))
      (:ROW NIL (:CELL NIL (:TERM NIL "bit vector")) (:CELL NIL " descends "))
      (:ROW NIL (:CELL NIL (:TERM NIL "string")) (:CELL NIL " descends "))
      (:ROW NIL (:CELL NIL (:TERM NIL "pathname"))
       (:CELL NIL " “functionally equivalent” "))
      (:ROW NIL (:CELL NIL (:TERM NIL "structure"))
       (:CELL NIL " uses " (:FUNREF NIL "eq")))
      (:ROW NIL (:CELL NIL " Other " (:TERM NIL "array"))
       (:CELL NIL " uses " (:FUNREF NIL "eq")))
      (:ROW NIL (:CELL NIL (:TERM NIL "hash table"))
       (:CELL NIL " uses " (:FUNREF NIL "eq")))
      (:ROW NIL
       (:CELL NIL
        (:COMMENT NIL " Redundant. -kmp 3-Feb-92"
         "  \\term{standard object}	 & uses \\funref{eq}            \\cr")
        "Other " (:TERM NIL "object"))
       (:CELL NIL " uses " (:FUNREF NIL "eq"))))
     " " (:ENDISSUE NIL "EQUAL-STRUCTURE:MAYBE-STATUS-QUO") " " :PAR "Any two "
     (:TERM NIL "objects") " that are " (:FUNREF NIL "eql") " are also "
     (:FUNREF NIL "equal") ". " :PAR (:FUNREF NIL "equal")
     " may fail to terminate if " (:PARAM NIL "x") " or " (:PARAM NIL "y")
     " is circular. " :PAR)
    (:PART (:NAME "Examples") " " (:COMMENT NIL "% 6.3.0 19") :PAR
     (:CODE NIL " (equal 'a 'b) → " (:TERM NIL "false") "
 (equal 'a 'a) → "
      (:TERM NIL "true") "
 (equal 3 3) → "
      (:TERM NIL "true") "
 (equal 3 3.0) → "
      (:TERM NIL "false") "
 (equal 3.0 3.0) → "
      (:TERM NIL "true") "
 (equal #c(3 -4) #c(3 -4)) → "
      (:TERM NIL "true") "
 (equal #c(3 -4.0) #c(3 -4)) → "
      (:TERM NIL "false") "
 (equal (cons 'a 'b) (cons 'a 'c)) → "
      (:TERM NIL "false") "
 (equal (cons 'a 'b) (cons 'a 'b)) → "
      (:TERM NIL "true") "
 (equal #\\A #\\A) → "
      (:TERM NIL "true") "
 (equal #\\A #\\a) → "
      (:TERM NIL "false") "
 (equal \"Foo\" \"Foo\") → "
      (:TERM NIL "true") "
 (equal \"Foo\" (copy-seq \"Foo\")) → "
      (:TERM NIL "true") "
 (equal \"FOO\" \"foo\") → "
      (:TERM NIL "false") "
 (equal \"This-string\" \"This-string\") → "
      (:TERM NIL "true") "
 (equal \"This-string\" \"this-string\") → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "eq") ", "
     (:FUNREF NIL "eql") ", " (:FUNREF NIL "equalp") ", " (:FUNREF NIL "=")
     ", " (:FUNREF NIL "string=") ", " (:FUNREF NIL "string-equal") ", "
     (:FUNREF NIL "char=") ", " (:FUNREF NIL "char-equal") ", "
     (:FUNREF NIL "tree-equal") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:ISSUE NIL "EQUAL-STRUCTURE:MAYBE-STATUS-QUO") " " (:TERM NIL "Object")
     " equality is not a concept for which there is a uniquely determined correct algorithm. The appropriateness of an equality predicate can be judged only in the context of the needs of some particular program. Although these functions take any type of argument and their names sound very generic, "
     (:FUNREF NIL "equal") " and " (:FUNREF NIL "equalp")
     " are not appropriate for every application. "
     (:ENDISSUE NIL "EQUAL-STRUCTURE:MAYBE-STATUS-QUO") " " :PAR
     "A rough rule of thumb is that two " (:TERM NIL "objects") " are "
     (:FUNREF NIL "equal")
     " if and only if their printed representations are the same. " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== EQUALP")
   (:COM (:NAME "equalp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "equalp") (:ARGLIST NIL "x y")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "x") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "y") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 6.3.0 21" "% 6.3.0 22") "Returns " (:TERM NIL "true")
     " if " (:PARAM NIL "x") " and " (:PARAM NIL "y") " are "
     (:FUNREF NIL "equal") ", or if they have components that are of the same "
     (:TERM NIL "type") " as each other and if those components are "
     (:FUNREF NIL "equalp") "; specifically, " (:FUNREF NIL "equalp")
     " returns " (:TERM NIL "true") " in the following cases: "
     (:LIST NIL
      (:ITEM NIL (:TERM NIL "Characters") " " :PAR "If two "
       (:TERM NIL "characters") " are " (:FUNREF NIL "char-equal") ". " :PAR)
      (:ITEM NIL (:TERM NIL "Numbers") " " :PAR "If two " (:TERM NIL "numbers")
       " are the " (:TERM NIL "same") " under " (:FUNREF NIL "=") ". "
       (:COMMENT NIL
        "% Change made due to v8 of EQUAL-STRUCTURE. -kmp 30-Jan-92"
        " have the same numerical value (even if they are of different"
        " \\term{types}),"
        " or if they have components that are all \\funref{equalp}.")
       :PAR)
      (:ITEM NIL (:TERM NIL "Conses") " " :PAR "If the two " (:TERM NIL "cars")
       " in the " (:TERM NIL "conses") " are " (:FUNREF NIL "equalp")
       " and the two " (:TERM NIL "cdrs") " in the " (:TERM NIL "conses")
       " are " (:FUNREF NIL "equalp") ". "
       (:COMMENT NIL
        "% Laubsch thinks this goes without saying (and I agree.) -kmp 19-Jan-92"
        "(defined recursively).")
       :PAR)
      (:ITEM NIL (:TERM NIL "Arrays") " " :PAR (:COMMENT NIL "% 6.3.0 23")
       "If two " (:TERM NIL "arrays")
       " have the same number of dimensions, the dimensions match, and the corresponding "
       (:COMMENT NIL "\"components\" => \"active elements\" -kmp 30-Jan-92")
       (:TERM NIL "active elements") " are " (:FUNREF NIL "equalp") ". The "
       (:TERM NIL "types") " for which the " (:TERM NIL "arrays") " are "
       (:TERM NIL "specialized") " need not match; for example, a "
       (:TERM NIL "string") " and a general " (:TERM NIL "array")
       " that happens to contain the same " (:TERM NIL "characters") " are "
       (:FUNREF NIL "equalp") ". "
       (:COMMENT NIL
        "% Not needed with \"components\" => \"active elements\" above. -kmp 30-Jan-92"
        " If either \\param{x} or \\param{y} has a \\term{fill pointer}, "
        " the \\term{fill pointer} limits the number of elements examined by \\funref{equalp}.")
       "Because " (:FUNREF NIL "equalp") " performs " (:TERM NIL "element")
       "-by-" (:TERM NIL "element") " comparisons of " (:TERM NIL "strings")
       " and ignores the " (:TERM NIL "case") " of " (:TERM NIL "characters")
       ", " (:TERM NIL "case") " distinctions are ignored when "
       (:FUNREF NIL "equalp") " compares " (:TERM NIL "strings") ". " :PAR
       (:COMMENT NIL
        "% Barmar points out these are implied by the remarks about EQUAL in the first paragraph."
        " \\itemitem{\\term{Symbols}}" " " " %% 6.3.0 24"
        " If two \\term{symbols} are \\term{identical}." " "
        "\\issue{EQUAL-STRUCTURE:MAYBE-STATUS-QUO}"
        " \\itemitem{\\term {Structures}, \\term{Instances}, other}   " " "
        " If two \\term{structures}, \\term{hash tables}, \\term{instances},"
        " or other \\term{objects} are \\term{identical}. "
        "\\endissue{EQUAL-STRUCTURE:MAYBE-STATUS-QUO}")
       :PAR (:ISSUE NIL "EQUAL-STRUCTURE:MAYBE-STATUS-QUO") " ")
      (:ITEM NIL (:TERM NIL "Structures") " " :PAR
       (:COMMENT NIL "% Here's the text of the cleanup issue.  "
        "   EQUALP on two DEFSTRUCT objects 's1' and 's2', where one is a"
        "   non-:TYPEed DEFSTRUCT and the other is typed, is false." " "
        "   EQUALP on two DEFSTRUCT objects 's1' and 's2', where both are"
        "   non-:TYPEed DEFSTRUCTS is true iff:" " "
        "   (1) The type of 's1' is the same as the type of 's2' (this is"
        "    the same as saying that the defstruct name for 's1' is the same"
        "    as that for 's2')." " "
        "   (2) The value of each slot of 's1' is EQUALP to the value of the"
        "   same slot of 's2' (where \"same\" means same name) (this is not the"
        "% This doesn't use the same wording as in the cleanup, but I couldn't figure"
        "% out that wording. -kmp 30-Jan-92")
       "If two " (:TERM NIL "structures") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MN NIL "1"))) " and "
       (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MN NIL "2"))) " have the same "
       (:TERM NIL "class") " and the value of each " (:TERM NIL "slot") " in "
       (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MN NIL "1"))) " is the "
       (:TERM NIL "same") " under " (:FUNREF NIL "equalp")
       " as the value of the corresponding " (:TERM NIL "slot") " in "
       (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MN NIL "2"))) ". " :PAR)
      (:ITEM NIL (:TERM NIL "Hash Tables") " " :PAR
       (:COMMENT NIL "If two \\term{hash tables} are \\funref{equalp}.")
       (:FUNREF NIL "equalp") " descends " (:TERM NIL "hash tables")
       " by first comparing the count of entries and the " (:KWD NIL "test")
       " function; if those are the same, it compares the keys of the tables using the "
       (:KWD NIL "test")
       " function and then the values of the matching keys using "
       (:FUNREF NIL "equalp") " recursively. "
       (:ENDISSUE NIL "EQUAL-STRUCTURE:MAYBE-STATUS-QUO") " " :PAR))
     " " :PAR (:ISSUE NIL "EQUAL-STRUCTURE:MAYBE-STATUS-QUO") " "
     (:FUNREF NIL "equalp") " does not descend any " (:TERM NIL "objects")
     " other than the ones explicitly specified above. "
     (:NEXTFIGURE (:CAPS T))
     " summarizes the information given in the previous list. In addition, the figure specifies the priority of the behavior of "
     (:FUNREF NIL "equalp")
     ", with upper entries taking priority over lower ones. " :PAR
     (:TABLE
      (:NAME ("Summary and priorities of behavior of " (:FUNREF NIL "equalp")))
      (:ROW NIL (:CELL NIL "Type") (:CELL NIL "Behavior"))
      (:ROW NIL (:CELL NIL (:TERM NIL "number"))
       (:CELL NIL " uses " (:FUNREF NIL "=")))
      (:ROW NIL (:CELL NIL (:TERM NIL "character"))
       (:CELL NIL " uses " (:FUNREF NIL "char-equal")))
      (:ROW NIL (:CELL NIL (:TERM NIL "cons")) (:CELL NIL " descends "))
      (:ROW NIL (:CELL NIL (:TERM NIL "bit vector")) (:CELL NIL " descends "))
      (:ROW NIL (:CELL NIL (:TERM NIL "string")) (:CELL NIL " descends "))
      (:ROW NIL (:CELL NIL (:TERM NIL "pathname"))
       (:CELL NIL " same as " (:FUNREF NIL "equal")))
      (:ROW NIL (:CELL NIL (:TERM NIL "structure"))
       (:CELL NIL " descends, as described above "))
      (:ROW NIL (:CELL NIL " Other " (:TERM NIL "array"))
       (:CELL NIL " descends "))
      (:ROW NIL (:CELL NIL (:TERM NIL "hash table"))
       (:CELL NIL " descends, as described above "))
      (:ROW NIL
       (:CELL NIL
        (:COMMENT NIL "% This is redundant. -kmp 25-Aug-91"
         "  \\term{standard object}	     & uses \\funref{eq}             \\cr")
        "Other " (:TERM NIL "object"))
       (:CELL NIL " uses " (:FUNREF NIL "eq"))))
     " " (:ENDISSUE NIL "EQUAL-STRUCTURE:MAYBE-STATUS-QUO") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR (:COMMENT NIL "% 6.3.0 25    ")
     (:CODE NIL " (equalp 'a 'b) → " (:TERM NIL "false") "
 (equalp 'a 'a) → "
      (:TERM NIL "true") "
 (equalp 3 3) → "
      (:TERM NIL "true") "
 (equalp 3 3.0) → "
      (:TERM NIL "true") "
 (equalp 3.0 3.0) → "
      (:TERM NIL "true") "
 (equalp #c(3 -4) #c(3 -4)) → "
      (:TERM NIL "true") "
 (equalp #c(3 -4.0) #c(3 -4)) → "
      (:TERM NIL "true") "
 (equalp (cons 'a 'b) (cons 'a 'c)) → "
      (:TERM NIL "false") "
 (equalp (cons 'a 'b) (cons 'a 'b)) → "
      (:TERM NIL "true") "
 (equalp #\\A #\\A) → "
      (:TERM NIL "true") "
 (equalp #\\A #\\a) → "
      (:TERM NIL "true") "
 (equalp \"Foo\" \"Foo\") → "
      (:TERM NIL "true") "
 (equalp \"Foo\" (copy-seq \"Foo\")) → "
      (:TERM NIL "true") "
 (equalp \"FOO\" \"foo\") → "
      (:TERM NIL "true") "
")
     " "
     (:CODE NIL " (setq array1 (make-array 6 :element-type 'integer
                            :initial-contents '(1 1 1 3 5 7))) 
→ #(1 1 1 3 5 7)
 (setq array2 (make-array 8 :element-type 'integer
                            :initial-contents '(1 1 1 3 5 7 2 6)
                            :fill-pointer 6))
→ #(1 1 1 3 5 7)
 (equalp array1 array2) → "
      (:TERM NIL "true") "
 (setq vector1 (vector 1 1 1 3 5 7)) → #(1 1 1 3 5 7)
 (equalp array1 vector1) → "
      (:TERM NIL "true") " 
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "eq") ", "
     (:FUNREF NIL "eql") ", " (:FUNREF NIL "equal") ", " (:FUNREF NIL "=") ", "
     (:FUNREF NIL "string=") ", " (:FUNREF NIL "string-equal") ", "
     (:FUNREF NIL "char=") ", " (:FUNREF NIL "char-equal") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:ISSUE NIL "EQUAL-STRUCTURE:MAYBE-STATUS-QUO") " " (:TERM NIL "Object")
     " equality is not a concept for which there is a uniquely determined correct algorithm. The appropriateness of an equality predicate can be judged only in the context of the needs of some particular program. Although these functions take any type of argument and their names sound very generic, "
     (:FUNREF NIL "equal") " and " (:FUNREF NIL "equalp")
     " are not appropriate for every application. "
     (:ENDISSUE NIL "EQUAL-STRUCTURE:MAYBE-STATUS-QUO") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== IDENTITY")
   (:COM (:NAME "identity" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "identity") (:ARGLIST NIL "object")
      (:VALUES NIL "object"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 25.5.0 2")
     "Returns its argument " (:PARAM NIL "object") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (identity 101) → 101
 (mapcan #'identity (list (list 1 2 3) '(4 5 6))) → (1 2 3 4 5 6)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "identity")
     " is intended for use with functions that require a "
     (:TERM NIL "function") " as an argument. " :PAR
     (:TT NIL "(eql x (identity x))") " returns " (:TERM NIL "true")
     " for all possible values of " (:PARAM NIL "x") ", but "
     (:TT NIL "(eq x (identity x))") " might return " (:TERM NIL "false")
     " when " (:PARAM NIL "x") " is a " (:TERM NIL "number") " or "
     (:TERM NIL "character") ". " :PAR (:FUNREF NIL "identity")
     " could be defined by " :PAR
     (:CODE NIL "(defun identity (x) x)
")
     " " :PAR))
   " " :PAR
   (:COMMENT NIL
    "-------------------- Functional Composition --------------------")
   :PAR (:COMMENT NIL "%% ========== COMPLEMENT")
   (:COM (:NAME "complement" :FTYPE "Function")
    (:ISSUE NIL "FUNCTION-COMPOSITION:JAN89-X3J13") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "complement")
      (:ARGLIST NIL "function") (:VALUES NIL "complement-function"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "function")
     "—a " (:TERM NIL "function") ". " :PAR (:PARAM NIL "complement-function")
     "—a " (:TERM NIL "function") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns a " (:TERM NIL "function")
     " that takes the same " (:TERM NIL "arguments") " as "
     (:PARAM NIL "function") ", and has the same side-effect behavior as "
     (:PARAM NIL "function") ", but returns only a single value: a "
     (:TERM NIL "generalized boolean")
     " with the opposite truth value of that which would be returned as the "
     (:TERM NIL "primary value") " of " (:PARAM NIL "function")
     ". That is, when the " (:PARAM NIL "function") " would have returned "
     (:TERM NIL "true") " as its " (:TERM NIL "primary value") " the "
     (:PARAM NIL "complement-function") " returns " (:TERM NIL "false")
     ", and when the " (:PARAM NIL "function") " would have returned "
     (:TERM NIL "false") " as its " (:TERM NIL "primary value") " the "
     (:PARAM NIL "complement-function") " returns " (:TERM NIL "true") ". "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (funcall (complement #'zerop) 1) → " (:TERM NIL "true") "
 (funcall (complement #'characterp) #\\A) → "
      (:TERM NIL "false") "
 (funcall (complement #'member) 'a '(a b c)) → "
      (:TERM NIL "false") "
 (funcall (complement #'member) 'd '(a b c)) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "not") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (complement " (:I NIL "x")
      ") ≡ #'(lambda (&rest arguments) (not (apply " (:I NIL "x") " arguments)))
")
     " " :PAR "In " (:RM NIL " Common Lisp") ", functions with names like “"
     (:TT NIL (:I NIL "xxx") "-if-not")
     "” are related to functions with names like “"
     (:TT NIL (:I NIL " xxx") "-if") "” in that " :PAR
     (:CODE NIL "(" (:I NIL "xxx") "-if-not " (:I NIL "f") " . "
      (:I NIL "arguments") ") ≡ (" (:I NIL "xxx") "-if (complement "
      (:I NIL "f") ") . " (:I NIL "arguments") ")
")
     " " :PAR "For example, " :PAR
     (:CODE NIL " (find-if-not #'zerop '(0 0 3)) ≡
 (find-if (complement #'zerop) '(0 0 3)) → 3
")
     " " :PAR "Note that since the “" (:TT NIL (:I NIL "xxx") "-if-not") "” "
     (:TERM NIL "functions") " and the " (:KWD NIL "test-not")
     " arguments have been deprecated, uses of “"
     (:TT NIL (:I NIL "xxx") "-if") "” " (:TERM NIL "functions") " or "
     (:KWD NIL "test") " arguments with " (:FUNREF NIL "complement")
     " are preferred. " (:ENDISSUE NIL "FUNCTION-COMPOSITION:JAN89-X3J13") " "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== CONSTANTLY")
   (:COM (:NAME "constantly" :FTYPE "Function")
    (:ISSUE NIL "FUNCTION-COMPOSITION:JAN89-X3J13") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "constantly") (:ARGLIST NIL "value")
      (:VALUES NIL "function"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "value") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "function") "—a "
     (:TERM NIL "function") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "constantly")
     " returns a " (:TERM NIL "function")
     " that accepts any number of arguments, that has no side-effects, and that always returns "
     (:PARAM NIL "value") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (mapcar (constantly 3) '(a b c d)) → (3 3 3 3)
 (defmacro with-vars (vars &body forms)
   `((lambda ,vars ,@forms) ,@(mapcar (constantly nil) vars)))
→ WITH-VARS
 (macroexpand '(with-vars (a b) (setq a 3 b (* a a)) (list a b)))
→ ((LAMBDA (A B) (SETQ A 3 B (* A A)) (LIST A B)) NIL NIL), "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:COMMENT NIL
      "% \"not\" => \"identity\" per Boyer/Kaufmann/Moore #10 (by X3J13 vote at May 4-5, 1994 meeting)"
      "% -kmp 9-May-94")
     (:FUNREF NIL "identity") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "constantly")
     " could be defined by: " :PAR
     (:CODE NIL " (defun constantly (object)
   #'(lambda (&rest arguments) object))
")
     " " :PAR (:ENDISSUE NIL "FUNCTION-COMPOSITION:JAN89-X3J13") " " :PAR))
   " " :PAR
   (:COMMENT NIL
    "-------------------- Boolean Composition --------------------")
   :PAR
   (:COMMENT NIL "%% ========== EVERY" "%% ========== SOME"
    "%% ========== NOTEVERY" "%% ========== NOTANY")
   (:COM (:NAME "every, some, notevery, notany" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:COMMENT NIL "Moon: \"result\"=>\"boolean\" in NOTEVERY")
     (:DEF (:KIND "function") (:NAMES NIL "every")
      (:ARGLIST NIL "predicate " (:KEYWORD NIL " &rest") " "
       (:PLUS NIL "sequences"))
      (:VALUES NIL "generalized-boolean"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "some")
      (:ARGLIST NIL "predicate " (:KEYWORD NIL " &rest") " "
       (:PLUS NIL "sequences"))
      (:VALUES NIL "result"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "notevery")
      (:ARGLIST NIL "predicate " (:KEYWORD NIL " &rest") " "
       (:PLUS NIL "sequences"))
      (:VALUES NIL "generalized-boolean"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "notany")
      (:ARGLIST NIL "predicate " (:KEYWORD NIL " &rest") " "
       (:PLUS NIL "sequences"))
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "predicate")
     "—a " (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of as many " (:TERM NIL "arguments") " as there are "
     (:PARAM NIL "sequences") ". " :PAR (:PARAM NIL "sequence") "—a "
     (:TERM NIL "sequence") ". " :PAR (:PARAM NIL "result") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 14.2.0 10" "% 14.2.0 11") (:FUNREF NIL "every") ", "
     (:FUNREF NIL "some") ", " (:FUNREF NIL "notevery") ", and "
     (:FUNREF NIL "notany") " test " (:TERM NIL "elements") " of "
     (:PARAM NIL "sequences") " for satisfaction of a given "
     (:PARAM NIL "predicate") ". "
     (:COMMENT NIL "% Redundant with arg info." " These \\term{functions}"
      " operate on as many \\param{sequences} as the given \\param{predicate}"
      " takes \\term{arguments}.  ")
     "The first argument to " (:PARAM NIL "predicate") " is an "
     (:TERM NIL "element") " of the first " (:PARAM NIL "sequence")
     "; each succeeding argument is an " (:TERM NIL "element")
     " of a succeeding " (:PARAM NIL "sequence") ". " :PAR
     (:PARAM NIL "Predicate") " is first applied to the elements with index "
     (:TT NIL "0") " in each of the " (:PARAM NIL "sequences")
     ", and possibly then to the elements with index " (:TT NIL "1")
     ", and so on, until a termination criterion is met or the end of the shortest of the "
     (:PARAM NIL "sequences") " is reached. " :PAR (:COMMENT NIL "% 14.2.0 13")
     (:FUNREF NIL "every") " returns " (:TERM NIL "false")
     " as soon as any invocation of " (:PARAM NIL "predicate") " returns "
     (:TERM NIL "false") ". If the end of a " (:PARAM NIL "sequence")
     " is reached, " (:FUNREF NIL "every") " returns " (:TERM NIL "true")
     ". Thus, " (:FUNREF NIL "every") " returns " (:TERM NIL "true")
     " if and only if every invocation of " (:PARAM NIL "predicate")
     " returns " (:TERM NIL "true") ". " :PAR (:FUNREF NIL "some")
     " returns the first " (:TERM NIL "non-nil")
     " value which is returned by an invocation of " (:PARAM NIL "predicate")
     ". If the end of a " (:PARAM NIL "sequence")
     " is reached without any invocation of the " (:PARAM NIL "predicate")
     " returning " (:TERM NIL "true") ", " (:FUNREF NIL "some") " returns "
     (:TERM NIL "false") ". Thus, " (:FUNREF NIL "some") " returns "
     (:TERM NIL "true") " if and only if some invocation of "
     (:PARAM NIL "predicate") " returns " (:TERM NIL "true") ". " :PAR
     (:COMMENT NIL "% 14.2.0 14") (:FUNREF NIL "notany") " returns "
     (:TERM NIL "false") " as soon as any invocation of "
     (:PARAM NIL "predicate") " returns " (:TERM NIL "true")
     ". If the end of a " (:PARAM NIL "sequence") " is reached, "
     (:FUNREF NIL "notany") " returns " (:TERM NIL "true") ". Thus, "
     (:FUNREF NIL "notany") " returns " (:TERM NIL "true")
     " if and only if it is not the case that any invocation of "
     (:PARAM NIL "predicate") " returns " (:TERM NIL "true") ". " :PAR
     (:COMMENT NIL "% 14.2.0 15") (:FUNREF NIL "notevery") " returns "
     (:TERM NIL "true") " as soon as any invocation of "
     (:PARAM NIL "predicate") " returns " (:TERM NIL "false")
     ". If the end of a " (:PARAM NIL "sequence") " is reached, "
     (:FUNREF NIL "notevery") " returns " (:TERM NIL "false") ". Thus, "
     (:FUNREF NIL "notevery") " returns " (:TERM NIL "true")
     " if and only if it is not the case that every invocation of "
     (:PARAM NIL "predicate") " returns " (:TERM NIL "true") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (every #'characterp \"abc\") → " (:TERM NIL "true") "
 (some #'= '(1 2 3 4 5) '(5 4 3 2 1)) → "
      (:TERM NIL "true") "
 (notevery #'< '(1 2 3 4) '(5 6 7 8) '(9 10 11 12)) → "
      (:TERM NIL "false") "
 (notany #'> '(1 2 3 4) '(5 6 7 8) '(9 10 11 12)) → "
      (:TERM NIL "true") " 
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "Should signal "
     (:TYPEREF NIL "type-error") " if its first argument is neither a "
     (:TERM NIL "symbol") " nor a " (:TERM NIL "function")
     " or if any subsequent argument is not a " (:TERM NIL "proper sequence")
     ". " :PAR
     "Other exceptional situations are possible, depending on the nature of the "
     (:PARAM NIL "predicate") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "and") ", "
     (:MACREF NIL "or") ", "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (notany " (:PARAM NIL "predicate") " "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "sequence"))) ") ≡ (not (some "
      (:PARAM NIL "predicate") " "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "sequence"))) "))
 (notevery "
      (:PARAM NIL "predicate") " "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "sequence"))) ") ≡ (not (every "
      (:PARAM NIL "predicate") " "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "sequence"))) "))
")
     " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Conditionals --------------------") :PAR
   (:COMMENT NIL "%% ========== AND")
   (:COM (:NAME "and" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "and")
      (:ARGLIST NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "form") "—a "
     (:TERM NIL "form") ". " :PAR (:COMMENT NIL "!!! Look more at this.")
     (:PARAM NIL "results") "—the " (:TERM NIL "values")
     " resulting from the evaluation of the last " (:PARAM NIL "form")
     ", or the symbols " (:MISC NIL "nil") " or " (:MISC NIL "t") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.4.0 5")
     "The macro " (:MACREF NIL "and") " evaluates each " (:PARAM NIL "form")
     " one at a time from left to right. As soon as any " (:PARAM NIL "form")
     " evaluates to " (:MISC NIL "nil") ", " (:MACREF NIL "and") " returns "
     (:MISC NIL "nil") " without evaluating the remaining "
     (:PARAM NIL "forms") ". If all " (:PARAM NIL "forms")
     " but the last evaluate to " (:TERM NIL "true") " values, "
     (:MACREF NIL "and")
     " returns the results produced by evaluating the last "
     (:PARAM NIL "form") ". " :PAR "If no " (:PARAM NIL "forms")
     " are supplied, " (:TT NIL "(and)") " returns " (:MISC NIL "t") ". " :PAR
     (:COMMENT NIL "% 7.9.2 9") (:MACREF NIL "and")
     " passes back multiple values from the last " (:TERM NIL "subform")
     " but not from subforms other than the last. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (if (and (>= n 0)
          (< n (length a-simple-vector))
          (eq (elt a-simple-vector n) 'foo))
     (princ \"Foo!\"))
")
     " The above expression prints " (:TT NIL "Foo!") " if element "
     (:TT NIL "n") " of " (:TT NIL "a-simple-vector") " is the symbol "
     (:TT NIL "foo") ", provided also that " (:TT NIL "n")
     " is indeed a valid index for " (:TT NIL "a-simple-vector") ". Because "
     (:MACREF NIL "and") " guarantees left-to-right testing of its parts, "
     (:FUNREF NIL "elt") " is not called if " (:TT NIL "n")
     " is out of range. " :PAR
     (:CODE NIL " (setq temp1 1 temp2 1 temp3 1) → 1 
 (and (incf temp1) (incf temp2) (incf temp3)) → 2 
 (and (eql 2 temp1) (eql 2 temp2) (eql 2 temp3)) → "
      (:TERM NIL "true") "
 (decf temp3) → 1 
 (and (decf temp1) (decf temp2) (eq temp3 'nil) (decf temp3)) → NIL 
 (and (eql temp1 temp2) (eql temp2 temp3)) → "
      (:TERM NIL "true") "
 (and) → T 
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "cond") ", "
     (:FUNREF NIL "every") ", " (:SPECREF NIL "if") ", " (:MACREF NIL "or")
     ", " (:MACREF NIL "when") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL " The first example is wrong because it violates issue"
      " MACRO-SUBFORMS-TOP-LEVEL-P.  --sjl 5 Mar 92" " \\code"
      " (and \\param{form}) \\EQ \\param{form}"
      " (and \\param{form1} \\param{form2} ...) \\EQ (when \\param{form1} (and \\param{form2} ...))"
      "\\endcode")
     :PAR
     (:CODE NIL " (and " (:PARAM NIL "form") ") ≡ (let () " (:PARAM NIL "form")
      ")
 (and "
      (:PARAM NIL "form1") " " (:PARAM NIL "form2") " ...) ≡ (when "
      (:PARAM NIL "form1") " (and " (:PARAM NIL "form2") " ...))
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== COND")
   (:COM (:NAME "cond" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR (:COMMENT NIL "% 7.6.0 7")
     (:DEF (:KIND "macro") (:NAMES NIL "cond")
      (:ARGLIST NIL (:STAR NIL (:CURLY NIL (:DOWN NIL "clause"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR
     (:BNF (:NAME "clause")
      (:PAREN NIL "test-form " (:STAR NIL (:CURLY NIL (:PARAM NIL "form")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "test-form")
     "—a " (:TERM NIL "form") ". " :PAR (:PARAM NIL "forms") "—an "
     (:TERM NIL "implicit progn") ". " :PAR (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " of the " (:PARAM NIL "forms") " in the first "
     (:PARAM NIL "clause") " whose " (:PARAM NIL "test-form") " "
     (:TERM NIL "yields") " " (:TERM NIL "true") ", or the "
     (:TERM NIL "primary value") " of the " (:PARAM NIL "test-form")
     " if there are no " (:PARAM NIL "forms") " in that " (:PARAM NIL "clause")
     ", or else " (:MISC NIL "nil") " if no " (:PARAM NIL "test-form") " "
     (:TERM NIL "yields") " " (:TERM NIL "true") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "cond")
     " allows the execution of " (:PARAM NIL "forms") " to be dependent on "
     (:PARAM NIL "test-form") ". " :PAR (:PARAM NIL "Test-forms")
     " are evaluated one at a time in the order in which they are given in the argument list until a "
     (:PARAM NIL "test-form") " is found that evaluates to " (:TERM NIL "true")
     ". " :PAR (:COMMENT NIL "% 7.6.0 8") "If there are no "
     (:TERM NIL "forms") " in that clause, the " (:TERM NIL "primary value")
     " of the " (:PARAM NIL "test-form") " is returned by the "
     (:MACREF NIL "cond") " " (:TERM NIL "form") ". Otherwise, the "
     (:PARAM NIL "forms") " associated with this " (:PARAM NIL "test-form")
     " are evaluated in order, left to right, as an "
     (:TERM NIL "implicit progn") ", and the " (:TERM NIL "values")
     " returned by the last " (:PARAM NIL "form") " are returned by the "
     (:MACREF NIL "cond") " " (:TERM NIL "form") ". " :PAR "Once one "
     (:PARAM NIL "test-form") " has " (:TERM NIL "yielded") " "
     (:TERM NIL "true") ", no additional " (:PARAM NIL "test-forms") " are "
     (:TERM NIL "evaluated") ". If no " (:PARAM NIL "test-form") " "
     (:TERM NIL "yields") " " (:TERM NIL "true") ", " (:MISC NIL "nil")
     " is returned. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun select-options ()
   (cond ((= a 1) (setq a 2))
         ((= a 2) (setq a 3))
         ((and (= a 3) (floor a 2)))
         (t (floor a 3)))) → SELECT-OPTIONS
 (setq a 1) → 1
 (select-options) → 2
 a → 2
 (select-options) → 3
 a → 3
 (select-options) → 1
 (setq a 5) → 5
 (select-options) → 1, 2
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "if") ", "
     (:MACREF NIL "case") ". " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== IF")
   (:COM (:NAME "if" :FTYPE "Special Operator")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "if")
      (:ARGLIST NIL (:PARAM NIL "test-form") " " (:PARAM NIL "then-form") " "
       (:BRAC NIL (:PARAM NIL "else-form")))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "Test-form")
     "—a " (:TERM NIL "form") ". " :PAR (:PARAM NIL "Then-form") "—a "
     (:TERM NIL "form") ". " :PAR (:COMMENT NIL "% 7.6.0 4")
     (:PARAM NIL "Else-form") "—a " (:TERM NIL "form") ". The default is "
     (:MISC NIL "nil") ". " :PAR (:COMMENT NIL "% 7.9.2 7" "% 7.9.2 8")
     (:PARAM NIL "results") "—if the " (:PARAM NIL "test-form") " "
     (:TERM NIL "yielded") " " (:TERM NIL "true") ", the " (:TERM NIL "values")
     " returned by the " (:PARAM NIL "then-form") "; otherwise, the "
     (:TERM NIL "values") " returned by the " (:PARAM NIL "else-form") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:SPECREF NIL "if")
     " allows the execution of a " (:TERM NIL "form")
     " to be dependent on a single " (:PARAM NIL "test-form") ". " :PAR
     (:COMMENT NIL "% 7.6.0 3") "First " (:PARAM NIL "test-form")
     " is evaluated. If the result is " (:TERM NIL "true") ", then "
     (:PARAM NIL "then-form") " is selected; otherwise "
     (:PARAM NIL "else-form")
     " is selected. Whichever form is selected is then evaluated. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (if t 1) → 1
 (if nil 1 2) → 2 
 (defun test ()
   (dolist (truth-value '(t nil 1 (a b c)))
     (if truth-value (print 'true) (print 'false))
     (prin1 truth-value))) → TEST
 (test)
⊳ TRUE T
⊳ FALSE NIL
⊳ TRUE 1
⊳ TRUE (A B C)
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "cond") ", "
     (:MACREF NIL "unless") ", " (:MACREF NIL "when") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL
      "!!! Barmar thinks we should encourage implementations to signal an error or issue a"
      "    warning if additional subforms are detected.")
     :PAR
     (:CODE NIL " (if " (:PARAM NIL "test-form") " " (:PARAM NIL "then-form")
      " " (:PARAM NIL "else-form") ")
 ≡ (cond ("
      (:PARAM NIL "test-form") " " (:PARAM NIL "then-form") ") (t "
      (:PARAM NIL "else-form") "))
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== OR")
   (:COM (:NAME "or" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "or")
      (:ARGLIST NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "results")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "form") "—a "
     (:TERM NIL "form") ". " :PAR (:COMMENT NIL "!!! Look more at this.")
     (:PARAM NIL "results") "—the " (:TERM NIL "values") " or "
     (:TERM NIL "primary value")
     " (see below) resulting from the evaluation of the last "
     (:PARAM NIL "form") " executed or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.4.0 11")
     (:MACREF NIL "or") " evaluates each " (:PARAM NIL "form")
     ", one at a time, from left to right. The evaluation of all "
     (:PARAM NIL "forms") " terminates when a " (:PARAM NIL "form")
     " evaluates to " (:TERM NIL "true") " (" (:I NIL "i.e.")
     ",  something other than " (:MISC NIL "nil") "). " :PAR "If the "
     (:TERM NIL "evaluation") " of any " (:PARAM NIL "form")
     " other than the last returns a " (:TERM NIL "primary value") " that is "
     (:TERM NIL "true") ", " (:MACREF NIL "or") " immediately returns that "
     (:TERM NIL "value") " (but no additional " (:TERM NIL "values")
     ") without evaluating the remaining " (:PARAM NIL "forms") ". If every "
     (:PARAM NIL "form") " but the last returns " (:TERM NIL "false")
     " as its " (:TERM NIL "primary value") ", " (:MACREF NIL "or")
     " returns all " (:TERM NIL "values") " returned by the last "
     (:PARAM NIL "form") ". If no " (:PARAM NIL "forms") " are supplied, "
     (:MACREF NIL "or") " returns " (:MISC NIL "nil") ". " :PAR
     (:COMMENT NIL
      " I've rewritten the above so that this is now implied. -kmp 1-Jan-91"
      " %% 7.9.2 9" " \\macref{or} returns multiple values from "
      " the last \\param{form}"
      " but not from \\param{forms} other than the last.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (or) → NIL 
 (setq temp0 nil temp1 10 temp2 20 temp3 30) → 30
 (or temp0 temp1 (setq temp2 37)) → 10
 temp2 → 20
 (or (incf temp1) (incf temp2) (incf temp3)) → 11
 temp1 → 11
 temp2 → 20
 temp3 → 30
 (or (values) temp1) → 11
 (or (values temp1 temp2) temp3) → 11
 (or temp0 (values temp1 temp2)) → 11, 20
 (or (values temp0 temp1) (values temp2 temp3)) → 20, 30
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "and") ", "
     (:MACREF NIL "some") ", " (:MACREF NIL "unless") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== WHEN")
   (:COM (:NAME "when, unless" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "when")
      (:ARGLIST NIL "test-form " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "unless")
      (:ARGLIST NIL "test-form " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "test-form")
     "—a " (:TERM NIL "form") ". " :PAR (:PARAM NIL "forms") "—an "
     (:TERM NIL "implicit progn") ". " :PAR (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " of the " (:TERM NIL "forms") " in a "
     (:MACREF NIL "when") " " (:TERM NIL "form") " if the "
     (:PARAM NIL "test-form") " " (:TERM NIL "yields") " " (:TERM NIL "true")
     " or in an " (:MACREF NIL "unless") " " (:TERM NIL "form") " if the "
     (:PARAM NIL "test-form") " " (:TERM NIL "yields") " " (:TERM NIL "false")
     "; otherwise " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "when") " and "
     (:MACREF NIL "unless") " allow the execution of " (:PARAM NIL "forms")
     " to be dependent on a single " (:PARAM NIL "test-form") ". " :PAR
     (:COMMENT NIL "% 7.6.0 5") "In a " (:MACREF NIL "when") " "
     (:TERM NIL "form") ", if the " (:PARAM NIL "test-form") " "
     (:TERM NIL "yields") " " (:TERM NIL "true") ", the " (:PARAM NIL "forms")
     " are " (:TERM NIL "evaluated") " in order from left to right and the "
     (:TERM NIL "values") " returned by the " (:PARAM NIL "forms")
     " are returned from the " (:MACREF NIL "when") " " (:TERM NIL "form")
     ". Otherwise, if the " (:PARAM NIL "test-form") " " (:TERM NIL "yields")
     " " (:TERM NIL "false") ", the " (:PARAM NIL "forms") " are not "
     (:TERM NIL "evaluated") ", and the " (:MACREF NIL "when") " "
     (:TERM NIL "form") " returns " (:MISC NIL "nil") ". " :PAR
     (:COMMENT NIL "% 7.6.0 6") "In an " (:MACREF NIL "unless") " "
     (:TERM NIL "form") ", if the " (:PARAM NIL "test-form") " "
     (:TERM NIL "yields") " " (:TERM NIL "false") ", the " (:PARAM NIL "forms")
     " are " (:TERM NIL "evaluated") " in order from left to right and the "
     (:TERM NIL "values") " returned by the " (:PARAM NIL "forms")
     " are returned from the " (:MACREF NIL "unless") " " (:TERM NIL "form")
     ". Otherwise, if the " (:PARAM NIL "test-form") " " (:TERM NIL "yields")
     " " (:TERM NIL "false") ", the " (:PARAM NIL "forms") " are not "
     (:TERM NIL "evaluated") ", and the " (:MACREF NIL "unless") " "
     (:TERM NIL "form") " returns " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (when t 'hello) → HELLO
 (unless t 'hello) → NIL
 (when nil 'hello) → NIL
 (unless nil 'hello) → HELLO
 (when t) → NIL
 (unless nil) → NIL
 (when t (prin1 1) (prin1 2) (prin1 3))
⊳ 123
→ 3
 (unless t (prin1 1) (prin1 2) (prin1 3)) → NIL
 (when nil (prin1 1) (prin1 2) (prin1 3)) → NIL
 (unless nil (prin1 1) (prin1 2) (prin1 3))
⊳ 123
→ 3
 (let ((x 3))
   (list (when (oddp x) (incf x) (list x))
         (when (oddp x) (incf x) (list x))
         (unless (oddp x) (incf x) (list x))
         (unless (oddp x) (incf x) (list x))
         (if (oddp x) (incf x) (list x)) 
         (if (oddp x) (incf x) (list x)) 
         (if (not (oddp x)) (incf x) (list x)) 
         (if (not (oddp x)) (incf x) (list x))))
→ ((4) NIL (5) NIL 6 (6) 7 (7))
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "and") ", "
     (:MACREF NIL "cond") ", " (:MACREF NIL "if") ", " (:MACREF NIL "or") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (when " (:PARAM NIL "test") " "
      (:PLUS NIL (:CURLY NIL (:PARAM NIL "form"))) ") ≡ (and "
      (:PARAM NIL "test") " (progn "
      (:PLUS NIL (:CURLY NIL (:PARAM NIL "form"))) "))
 (when "
      (:PARAM NIL "test") " " (:PLUS NIL (:CURLY NIL (:PARAM NIL "form")))
      ") ≡ (cond (" (:PARAM NIL "test") " "
      (:PLUS NIL (:CURLY NIL (:PARAM NIL "form"))) "))
 (when "
      (:PARAM NIL "test") " " (:PLUS NIL (:CURLY NIL (:PARAM NIL "form")))
      ") ≡ (if " (:PARAM NIL "test") " (progn "
      (:PLUS NIL (:CURLY NIL (:PARAM NIL "form"))) ") nil)
 (when "
      (:PARAM NIL "test") " " (:PLUS NIL (:CURLY NIL (:PARAM NIL "form")))
      ") ≡ (unless (not " (:PARAM NIL "test") ") "
      (:PLUS NIL (:CURLY NIL (:PARAM NIL "form"))) ")
 (unless "
      (:PARAM NIL "test") " " (:PLUS NIL (:CURLY NIL (:PARAM NIL "form")))
      ") ≡ (cond ((not " (:PARAM NIL "test") ") "
      (:PLUS NIL (:CURLY NIL (:PARAM NIL "form"))) "))
 (unless "
      (:PARAM NIL "test") " " (:PLUS NIL (:CURLY NIL (:PARAM NIL "form")))
      ") ≡ (if " (:PARAM NIL "test") " nil (progn "
      (:PLUS NIL (:CURLY NIL (:PARAM NIL "form"))) "))
 (unless "
      (:PARAM NIL "test") " " (:PLUS NIL (:CURLY NIL (:PARAM NIL "form")))
      ") ≡ (when (not " (:PARAM NIL "test") ") "
      (:PLUS NIL (:CURLY NIL (:PARAM NIL "form"))) ")
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "-------------------- Dispatch --------------------")
   :PAR
   (:COMMENT NIL "%% ========== CASE" "%% ========== CCASE"
    "%% ========== ECASE" "%% ========== OTHERWISE" "%% ========== T")
   (:COM (:NAME "case, ccase, ecase" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "case")
      (:ARGLIST NIL "keyform "
       (:STAR NIL (:CURLY NIL (:DOWN NIL "normal-clause"))) " "
       (:BRAC NIL (:DOWN NIL "otherwise-clause")))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " "
     (:DEF (:KIND "macro") (:NAMES NIL "ccase")
      (:ARGLIST NIL "keyplace "
       (:STAR NIL (:CURLY NIL (:DOWN NIL "normal-clause"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " "
     (:DEF (:KIND "macro") (:NAMES NIL "ecase")
      (:ARGLIST NIL "keyform "
       (:STAR NIL (:CURLY NIL (:DOWN NIL "normal-clause"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR
     (:BNF (:NAME "normal-clause")
      (:PAREN NIL "keys " (:STAR NIL (:CURLY NIL (:PARAM NIL "form")))))
     " "
     (:BNF (:NAME "otherwise-clause")
      (:PAREN NIL (:CURLY NIL "otherwise | t") " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form")))))
     " " (:BNF (:NAME "clause") "normal-clause | otherwise-clause") " "
     (:IDXREF NIL "otherwise") (:IDXREF NIL "t") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL "% 7.6.0 13" "% 7.6.0 14") :PAR (:PARAM NIL "keyform") "—a "
     (:TERM NIL "form") "; evaluated to produce a " (:PARAM NIL "test-key")
     ". " :PAR (:PARAM NIL "keyplace") "—a " (:TERM NIL "form")
     "; evaluated initially to produce a " (:PARAM NIL "test-key")
     ". Possibly also used later as a " (:TERM NIL "place") " if no "
     (:PARAM NIL "keys") " match. " :PAR (:PARAM NIL "test-key")
     "—an object produced by evaluating " (:PARAM NIL "keyform") " or "
     (:PARAM NIL "keyplace") ". " :PAR (:PARAM NIL "keys") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "list") " of "
     (:TERM NIL "objects") ". In the case of " (:MACREF NIL "case") ", the "
     (:TERM NIL "symbols") " " (:MISC NIL "t") " and " (:MISC NIL "otherwise")
     " may not be used as the " (:PARAM NIL "keys") " "
     (:TERM NIL "designator") ". To refer to these " (:TERM NIL "symbols")
     " by themselves as " (:PARAM NIL "keys") ", the designators "
     (:TT NIL "(t)") " and " (:TT NIL "(otherwise)")
     ", respectively, must be used instead. " :PAR (:PARAM NIL "forms") "—an "
     (:TERM NIL "implicit progn") ". " :PAR (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " returned by the " (:PARAM NIL "forms")
     " in the matching " (:PARAM NIL "clause") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.6.0 11") "These "
     (:TERM NIL "macros") " allow the conditional execution of a body of "
     (:PARAM NIL "forms") " in a " (:PARAM NIL "clause")
     " that is selected by matching the " (:PARAM NIL "test-key")
     " on the basis of its identity. " :PAR (:COMMENT NIL "% 7.6.0 12") "The "
     (:PARAM NIL "keyform") " or " (:PARAM NIL "keyplace") " is "
     (:TERM NIL "evaluated") " to produce the " (:PARAM NIL "test-key") ". "
     :PAR "Each of the " (:PARAM NIL "normal-clauses")
     " is then considered in turn. If the " (:PARAM NIL "test-key") " is the "
     (:TERM NIL "same") " as any " (:TERM NIL "key") " for that "
     (:PARAM NIL "clause") ", the " (:PARAM NIL "forms") " in that "
     (:PARAM NIL "clause") " are " (:PARAM NIL "evaluated") " as an "
     (:TERM NIL "implicit progn") ", and the " (:TERM NIL "values")
     " it returns are returned as the value of the " (:MACREF NIL "case") ", "
     (:MACREF NIL "ccase") ", or " (:MACREF NIL "ecase") " " (:TERM NIL "form")
     ". " :PAR "These " (:TERM NIL "macros") " differ only in their "
     (:TERM NIL "behavior") " when no " (:PARAM NIL "normal-clause")
     " matches; specifically: " :PAR
     (:LIST NIL
      (:ITEM NIL (:MACREF NIL "case") " " :PAR "If no "
       (:PARAM NIL "normal-clause") " matches, and there is an "
       (:PARAM NIL "otherwise-clause") ", then that "
       (:PARAM NIL "otherwise-clause") " automatically matches; the "
       (:PARAM NIL "forms") " in that " (:PARAM NIL "clause") " are "
       (:PARAM NIL "evaluated") " as an " (:TERM NIL "implicit progn")
       ", and the " (:TERM NIL "values")
       " it returns are returned as the value of the " (:MACREF NIL "case")
       ". " :PAR "If there is no " (:PARAM NIL "otherwise-clause") ", "
       (:MACREF NIL "case") " returns " (:MISC NIL "nil") ". " :PAR)
      (:ITEM NIL (:MACREF NIL "ccase") " " :PAR (:COMMENT NIL "% 7.6.0 15")
       "If no " (:PARAM NIL "normal-clause") " matches, a "
       (:TERM NIL "correctable") " " (:TERM NIL "error") " of "
       (:TERM NIL "type") " " (:TYPEREF NIL "type-error")
       " is signaled. The offending datum is the " (:PARAM NIL "test-key")
       " and the expected type is " (:TERM NIL "type equivalent") " to "
       (:TT NIL "(member " (:PARAM NIL "key1") " " (:PARAM NIL "key2") " ...)")
       ". The " (:MISC NIL "store-value") " " (:TERM NIL "restart")
       " can be used to correct the error. " :PAR "If the "
       (:MISC NIL "store-value") " " (:TERM NIL "restart") " is invoked, its "
       (:TERM NIL "argument") " becomes the new " (:PARAM NIL "test-key")
       ", and is stored in " (:PARAM NIL "keyplace") " as if by "
       (:TT NIL "(setf " (:PARAM NIL "keyplace") " " (:PARAM NIL "test-key")
        ")")
       ". Then " (:MACREF NIL "ccase") " starts over, considering each "
       (:PARAM NIL "clause") " anew. " :PAR
       (:REVIEWER NIL
        "Barmar: Will it prompt for multiple values if keyplace is a VALUES general ref?")
       (:COMMENT NIL "!!!") :PAR "The subforms of " (:PARAM NIL "keyplace")
       " might be evaluated again if none of the cases holds. " :PAR)
      (:ITEM NIL (:MACREF NIL "ecase") " " :PAR "If no "
       (:PARAM NIL "normal-clause") " matches, a "
       (:TERM NIL "non-correctable") " " (:TERM NIL "error") " of "
       (:TERM NIL "type") " " (:TYPEREF NIL "type-error")
       " is signaled. The offending datum is the " (:PARAM NIL "test-key")
       " and the expected type is " (:TERM NIL "type equivalent") " to "
       (:TT NIL "(member " (:PARAM NIL "key1") " " (:PARAM NIL "key2") " ...)")
       ". " :PAR "Note that in contrast with " (:MACREF NIL "ccase")
       ", the caller of " (:MACREF NIL "ecase") " may rely on the fact that "
       (:MACREF NIL "ecase") " does not return if a "
       (:PARAM NIL "normal-clause") " does not match. " :PAR))
     " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (dolist (k '(1 2 3 :four #\\v () t 'other))
    (format t \"~S \"
       (case k ((1 2) 'clause1)
               (3 'clause2)
               (nil 'no-keys-so-never-seen)
               ((nil) 'nilslot)
               ((:four #\\v) 'clause4)
               ((t) 'tslot)
               (otherwise 'others)))) 
⊳ CLAUSE1 CLAUSE1 CLAUSE2 CLAUSE4 CLAUSE4 NILSLOT TSLOT OTHERS 
→ NIL
 (defun add-em (x) (apply #'+ (mapcar #'decode x)))
→ ADD-EM
 (defun decode (x)
   (ccase x
     ((i uno) 1)
     ((ii dos) 2)
     ((iii tres) 3)
     ((iv cuatro) 4)))
→ DECODE
 (add-em '(uno iii)) → 4
 (add-em '(uno iiii))
⊳ Error: The value of X, IIII, is not I, UNO, II, DOS, III,
⊳        TRES, IV, or CUATRO.
⊳  1: Supply a value to use instead.
⊳  2: Return to Lisp Toplevel.
⊳ Debug> "
      (:IN NIL ":CONTINUE 1") "
⊳ Value to evaluate and use for X: "
      (:IN NIL "'IV") "
→ 5
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR
     "The debugger might be entered. If the " (:MISC NIL "store-value") " "
     (:TERM NIL "restart") " is invoked, the " (:TERM NIL "value") " of "
     (:PARAM NIL "keyplace") " might be changed. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:MACREF NIL "ccase") " and "
     (:MACREF NIL "ecase")
     ", since they might signal an error, are potentially affected by existing "
     (:PARAM NIL "handlers") " and " (:VARREF NIL "*debug-io*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR (:MACREF NIL "ccase")
     " and " (:MACREF NIL "ecase") " signal an error of " (:TERM NIL "type")
     " " (:TYPEREF NIL "type-error") " if no " (:PARAM NIL "normal-clause")
     " matches. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "cond") ", "
     (:MACREF NIL "typecase") ", " (:MACREF NIL "setf") ", "
     (:SECREF NIL :GENERALIZED-REFERENCE) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL "(case " (:PARAM NIL "test-key") "
  "
      (:STAR NIL
       (:CURLY NIL "((" (:STAR NIL (:CURLY NIL (:PARAM NIL "key"))) ") "
        (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))) ")"))
      ")
≡
(let ((#1=#:g0001 "
      (:PARAM NIL "test-key") "))
  (cond "
      (:STAR NIL
       (:CURLY NIL "((member #1# '("
        (:STAR NIL (:CURLY NIL (:PARAM NIL "key"))) ")) "
        (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))) ")"))
      "))
")
     " " :PAR "The specific error message used by " (:MACREF NIL "ecase")
     " and " (:MACREF NIL "ccase")
     " can vary between implementations. In situations where control of the specific wording of the error message is important, it is better to use "
     (:MACREF NIL "case") " with an " (:PARAM NIL "otherwise-clause")
     " that explicitly signals an error with an appropriate message. " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== TYPECASE" "%% ========== CTYPECASE"
    "%% ========== ETYPECASE" "%% ========== OTHERWISE" "%% ========== T")
   (:COM (:NAME "typecase, ctypecase, etypecase" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "typecase")
      (:ARGLIST NIL "keyform "
       (:STAR NIL (:CURLY NIL (:DOWN NIL "normal-clause"))) " "
       (:BRAC NIL (:DOWN NIL "otherwise-clause")))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " "
     (:DEF (:KIND "macro") (:NAMES NIL "ctypecase")
      (:ARGLIST NIL "keyplace "
       (:STAR NIL (:CURLY NIL (:DOWN NIL "normal-clause"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " "
     (:DEF (:KIND "macro") (:NAMES NIL "etypecase")
      (:ARGLIST NIL "keyform "
       (:STAR NIL (:CURLY NIL (:DOWN NIL "normal-clause"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR
     (:BNF (:NAME "normal-clause")
      (:PAREN NIL "type " (:STAR NIL (:CURLY NIL (:PARAM NIL "form")))))
     " "
     (:BNF (:NAME "otherwise-clause")
      (:PAREN NIL (:CURLY NIL "otherwise | t") " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form")))))
     " " (:BNF (:NAME "clause") "normal-clause | otherwise-clause") " "
     (:IDXREF NIL "otherwise") (:IDXREF NIL "t") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL "% 7.6.0 13" "% 7.6.0 14") :PAR (:PARAM NIL "keyform") "—a "
     (:TERM NIL "form") "; evaluated to produce a " (:PARAM NIL "test-key")
     ". " :PAR (:PARAM NIL "keyplace") "—a " (:TERM NIL "form")
     "; evaluated initially to produce a " (:PARAM NIL "test-key")
     ". Possibly also used later as a " (:TERM NIL "place") " if no "
     (:PARAM NIL "types") " match. " :PAR (:PARAM NIL "test-key")
     "—an object produced by evaluating " (:PARAM NIL "keyform") " or "
     (:PARAM NIL "keyplace") ". " :PAR (:PARAM NIL "type") "—a "
     (:TERM NIL "type specifier") ". " :PAR (:PARAM NIL "forms") "—an "
     (:TERM NIL "implicit progn") ". " :PAR (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " returned by the " (:PARAM NIL "forms")
     " in the matching " (:PARAM NIL "clause") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 7.6.0 18" "% 7.6.0 19" "% 7.6.0 20") :PAR "These "
     (:TERM NIL "macros") " allow the conditional execution of a body of "
     (:PARAM NIL "forms") " in a " (:PARAM NIL "clause")
     " that is selected by matching the " (:PARAM NIL "test-key")
     " on the basis of its " (:TERM NIL "type") ". " :PAR "The "
     (:PARAM NIL "keyform") " or " (:PARAM NIL "keyplace") " is "
     (:TERM NIL "evaluated") " to produce the " (:PARAM NIL "test-key") ". "
     :PAR "Each of the " (:PARAM NIL "normal-clauses")
     " is then considered in turn. If the " (:PARAM NIL "test-key")
     " is of the " (:TERM NIL "type") " given by the " (:PARAM NIL "clauses")
     "'s " (:PARAM NIL "type") ", the " (:PARAM NIL "forms") " in that "
     (:PARAM NIL "clause") " are " (:PARAM NIL "evaluated") " as an "
     (:TERM NIL "implicit progn") ", and the " (:TERM NIL "values")
     " it returns are returned as the value of the " (:MACREF NIL "typecase")
     ", " (:MACREF NIL "ctypecase") ", or " (:MACREF NIL "etypecase") " "
     (:TERM NIL "form") ". " :PAR "These " (:TERM NIL "macros")
     " differ only in their " (:TERM NIL "behavior") " when no "
     (:PARAM NIL "normal-clause") " matches; specifically: " :PAR
     (:LIST NIL
      (:ITEM NIL (:MACREF NIL "typecase") " " :PAR "If no "
       (:PARAM NIL "normal-clause") " matches, and there is an "
       (:PARAM NIL "otherwise-clause") ", then that "
       (:PARAM NIL "otherwise-clause") " automatically matches; the "
       (:PARAM NIL "forms") " in that " (:PARAM NIL "clause") " are "
       (:PARAM NIL "evaluated") " as an " (:TERM NIL "implicit progn")
       ", and the " (:TERM NIL "values")
       " it returns are returned as the value of the " (:MACREF NIL "typecase")
       ". " :PAR "If there is no " (:PARAM NIL "otherwise-clause") ", "
       (:MACREF NIL "typecase") " returns " (:MISC NIL "nil") ". " :PAR)
      (:ITEM NIL (:MACREF NIL "ctypecase") " " :PAR "If no "
       (:PARAM NIL "normal-clause") " matches, a " (:TERM NIL "correctable")
       " " (:TERM NIL "error") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "type-error") " is signaled. The offending datum is the "
       (:PARAM NIL "test-key") " and the expected type is "
       (:TERM NIL "type equivalent") " to "
       (:TT NIL "(or " (:PARAM NIL "type1") " " (:PARAM NIL "type2") " ...)")
       ". The " (:MISC NIL "store-value") " " (:TERM NIL "restart")
       " can be used to correct the error. " :PAR "If the "
       (:MISC NIL "store-value") " " (:TERM NIL "restart") " is invoked, its "
       (:TERM NIL "argument") " becomes the new " (:PARAM NIL "test-key")
       ", and is stored in " (:PARAM NIL "keyplace") " as if by "
       (:TT NIL "(setf " (:PARAM NIL "keyplace") " " (:PARAM NIL "test-key")
        ")")
       ". Then " (:MACREF NIL "ctypecase") " starts over, considering each "
       (:PARAM NIL "clause") " anew. " :PAR "If the " (:MISC NIL "store-value")
       " " (:TERM NIL "restart")
       " is invoked interactively, the user is prompted for a new "
       (:PARAM NIL "test-key") " to use. " :PAR "The subforms of "
       (:PARAM NIL "keyplace")
       " might be evaluated again if none of the cases holds. " :PAR)
      (:ITEM NIL (:MACREF NIL "etypecase") " " :PAR "If no "
       (:PARAM NIL "normal-clause") " matches, a "
       (:TERM NIL "non-correctable") " " (:TERM NIL "error") " of "
       (:TERM NIL "type") " " (:TYPEREF NIL "type-error")
       " is signaled. The offending datum is the " (:PARAM NIL "test-key")
       " and the expected type is " (:TERM NIL "type equivalent") " to "
       (:TT NIL "(or " (:PARAM NIL "type1") " " (:PARAM NIL "type2") " ...)")
       ". " :PAR "Note that in contrast with " (:MACREF NIL "ctypecase")
       ", the caller of " (:MACREF NIL "etypecase")
       " may rely on the fact that " (:MACREF NIL "etypecase")
       " does not return if a " (:PARAM NIL "normal-clause")
       " does not match. " :PAR))
     " " :PAR (:COMMENT NIL "% 7.6.0 22")
     "In all three cases, is permissible for more than one "
     (:PARAM NIL "clause") " to specify a matching " (:TERM NIL "type")
     ", particularly if one is a " (:TERM NIL "subtype")
     " of another; the earliest applicable " (:PARAM NIL "clause")
     " is chosen. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL ";;; (Note that the parts of this example which use TYPE-OF 
;;;  are implementation-dependent.)
 (defun what-is-it (x)
   (format t \"~&~S is ~A.~%\"
           x (typecase x
               (float \"a float\")
               (null \"a symbol, boolean false, or the empty list\")
               (list \"a list\")
               (t (format nil \"a(n) ~(~A~)\" (type-of x))))))
→ WHAT-IS-IT
 (map 'nil #'what-is-it '(nil (a b) 7.0 7 box))
⊳ NIL is a symbol, boolean false, or the empty list.
⊳ (A B) is a list.
⊳ 7.0 is a float.
⊳ 7 is a(n) integer.
⊳ BOX is a(n) symbol.
→ NIL
 (setq x 1/3)
→ 1/3
 (ctypecase x
     (integer (* x 4))
     (symbol  (symbol-value x)))
⊳ Error: The value of X, 1/3, is neither an integer nor a symbol.
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Specify a value to use instead.
⊳  2: Return to Lisp Toplevel.
⊳ Debug> "
      (:IN NIL ":CONTINUE 1") "
⊳ Use value: "
      (:IN NIL "3.7") "
⊳ Error: The value of X, 3.7, is neither an integer nor a symbol.
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Specify a value to use instead.
⊳  2: Return to Lisp Toplevel.
⊳ Debug> "
      (:IN NIL ":CONTINUE 1") "
⊳ Use value: "
      (:IN NIL "12") "
→ 48
 x → 12
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:MACREF NIL "ctypecase") " and "
     (:MACREF NIL "etypecase")
     ", since they might signal an error, are potentially affected by existing "
     (:PARAM NIL "handlers") " and " (:VARREF NIL "*debug-io*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR (:MACREF NIL "ctypecase")
     " and " (:MACREF NIL "etypecase") " signal an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error") " if no "
     (:PARAM NIL "normal-clause") " matches. " :PAR "The "
     (:TERM NIL "compiler") " may choose to issue a warning of "
     (:TERM NIL "type") " " (:TYPEREF NIL "style-warning") " if a "
     (:PARAM NIL "clause")
     " will never be selected because it is completely shadowed by earlier clauses. "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "case") ", "
     (:MACREF NIL "cond") ", " (:MACREF NIL "setf") ", "
     (:SECREF NIL :GENERALIZED-REFERENCE) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL "(typecase " (:PARAM NIL "test-key") "
  "
      (:STAR NIL
       (:CURLY NIL "(" (:PARAM NIL "type") " "
        (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))) ")"))
      ")
≡
(let ((#1=#:g0001 "
      (:PARAM NIL "test-key") "))
  (cond "
      (:STAR NIL
       (:CURLY NIL "((typep #1# '" (:PARAM NIL "type") ") "
        (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))) ")"))
      "))
")
     " " :PAR "The specific error message used by " (:MACREF NIL "etypecase")
     " and " (:MACREF NIL "ctypecase")
     " can vary between implementations. In situations where control of the specific wording of the error message is important, it is better to use "
     (:MACREF NIL "typecase") " with an " (:PARAM NIL "otherwise-clause")
     " that explicitly signals an error with an appropriate message. " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Multiple Values --------------------")
   :PAR (:COMMENT NIL "%% ========== MULTIPLE-VALUE-BIND")
   (:COM (:NAME "multiple-value-bind" :FTYPE "Macro")
    (:ISSUE NIL "DECLS-AND-DOC") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "multiple-value-bind")
      (:ARGLIST NIL (:PAREN NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "var"))))
       " " (:PARAM NIL "values-form") " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "var") "—a "
     (:TERM NIL "symbol") " naming a variable; not evaluated. " :PAR
     (:PARAM NIL "values-form") "—a " (:TERM NIL "form") "; evaluated. " :PAR
     (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR (:PARAM NIL "forms")
     "—an " (:TERM NIL "implicit progn") ". " :PAR (:PARAM NIL "results")
     "—the " (:TERM NIL "values") " returned by the " (:PARAM NIL "forms") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR "Creates new variable "
     (:TERM NIL "bindings") " for the " (:PARAM NIL "vars")
     " and executes a series of " (:PARAM NIL "forms") " that use these "
     (:TERM NIL "bindings") ". " :PAR "The variable " (:TERM NIL "bindings")
     " created are lexical unless " (:DECLREF NIL "special")
     " declarations are specified. " :PAR (:COMMENT NIL "% 7.9.1 13")
     (:PARAM NIL "Values-form") " is evaluated, and each of the "
     (:PARAM NIL "vars") " is bound to the respective value returned by that "
     (:TERM NIL "form") ". If there are more " (:PARAM NIL "vars")
     " than values returned, extra values of " (:MISC NIL "nil")
     " are given to the remaining " (:PARAM NIL "vars")
     ". If there are more values than " (:PARAM NIL "vars")
     ", the excess values are discarded. The " (:PARAM NIL "vars")
     " are bound to the values over the execution of the " (:PARAM NIL "forms")
     ", which make up an implicit " (:SPECREF NIL "progn")
     ". The consequences are unspecified if a type " (:PARAM NIL "declaration")
     " is specified for a " (:PARAM NIL "var") ", but the value to which that "
     (:PARAM NIL "var") " is bound is not consistent with the type "
     (:PARAM NIL "declaration") ". " :PAR "The " (:TERM NIL "scopes")
     " of the name binding and " (:PARAM NIL "declarations")
     " do not include the " (:PARAM NIL "values-form") ". "
     (:COMMENT NIL " KMP: Surely this must refer only to bound declarations."
      " Moon: No, the stupid DECLARATION-SCOPE:NO-HOISTING vote made it this way.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (multiple-value-bind (f r) 
     (floor 130 11)
   (list f r)) → (11 9)
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "let") ", "
     (:SPECREF NIL "multiple-value-call") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (multiple-value-bind ("
      (:STAR NIL (:CURLY NIL (:PARAM NIL "var"))) ") "
      (:PARAM NIL "values-form") " "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))) ")
 ≡ (multiple-value-call #'(lambda (&optional "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "var"))) " &rest #1=#:ignore)
                             (declare (ignore #1#))
                             "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))) ")
                         "
      (:PARAM NIL "values-form") ")
")
     " " :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MULTIPLE-VALUE-CALL")
   (:COM (:NAME "multiple-value-call" :FTYPE "Special Operator")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "multiple-value-call")
      (:ARGLIST NIL (:PARAM NIL "function-form") " "
       (:STAR NIL (:PARAM NIL "form")))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "function-form")
     "—a " (:TERM NIL "form") "; evaluated to produce " (:PARAM NIL "function")
     ". " :PAR (:PARAM NIL "function") "—a " (:TERM NIL "function designator")
     " resulting from the evaluation of " (:PARAM NIL "function-form") ". "
     :PAR (:PARAM NIL "form") "—a " (:TERM NIL "form") ". " :PAR
     (:COMMENT NIL "% 7.9.2 5") (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " returned by the " (:PARAM NIL "function") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR "Applies " (:PARAM NIL "function")
     " to a " (:TERM NIL "list") " of the " (:TERM NIL "objects")
     " collected from groups of " (:TERM NIL "multiple values") (:SUB NIL "2")
     ". " :PAR (:COMMENT NIL "% 7.9.1 11") (:SPECREF NIL "multiple-value-call")
     " first evaluates the " (:PARAM NIL "function-form") " to obtain "
     (:PARAM NIL "function") ", and then evaluates each " (:PARAM NIL "form")
     ". All the values of each " (:PARAM NIL "form")
     " are gathered together (not just one value from each) and given as arguments to the "
     (:PARAM NIL "function") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL
      " (multiple-value-call #'list 1 '/ (values 2 3) '/ (values) '/ (floor 2.5))
→ (1 / 2 3 / / 2 0.5)
 (+ (floor 5 3) (floor 19 4)) ≡ (+ 1 4)
→ 5
 (multiple-value-call #'+ (floor 5 3) (floor 19 4)) ≡ (+ 1 2 4 3)
→ 10
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "multiple-value-list") ", "
     (:MACREF NIL "multiple-value-bind") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MULTIPLE-VALUE-LIST")
   (:COM (:NAME "multiple-value-list" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "multiple-value-list")
      (:ARGLIST NIL "form") (:VALUES NIL "list"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "form") "—a "
     (:TERM NIL "form") "; evaluated as described below. " :PAR
     (:PARAM NIL "list") "—a " (:TERM NIL "list") " of the "
     (:TERM NIL "values") " returned by " (:PARAM NIL "form") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.9.1 10")
     (:MACREF NIL "multiple-value-list") " evaluates " (:PARAM NIL "form")
     " and creates a " (:TERM NIL "list") " of the "
     (:TERM NIL "multiple values") (:SUB NIL "2") " it returns. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (multiple-value-list (floor -3 4)) → (-1 1)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "values-list") ", "
     (:SPECREF NIL "multiple-value-call") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:MACREF NIL "multiple-value-list") " and "
     (:FUNREF NIL "values-list") " are inverses of each other. " :PAR
     (:CODE NIL " (multiple-value-list form) ≡ (multiple-value-call #'list form)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MULTIPLE-VALUE-PROG1")
   (:COM (:NAME "multiple-value-prog1" :FTYPE "Special Operator")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "multiple-value-prog1")
      (:ARGLIST NIL "first-form " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL "first-form-results"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "first-form")
     "—a " (:TERM NIL "form") "; evaluated as described below. " :PAR
     (:PARAM NIL "form") "—a " (:TERM NIL "form")
     "; evaluated as described below. " :PAR (:COMMENT NIL "% 7.9.2 17")
     (:PARAM NIL "first-form-results") "—the " (:TERM NIL "values")
     " resulting from the " (:TERM NIL "evaluation") " of "
     (:PARAM NIL "first-form") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.9.1 12")
     (:MACREF NIL "multiple-value-prog1") " evaluates "
     (:PARAM NIL "first-form") " and saves all the values produced by that "
     (:TERM NIL "form") ". It then evaluates each " (:PARAM NIL "form")
     " from left to right, discarding their values. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq temp '(1 2 3)) → (1 2 3)
 (multiple-value-prog1
    (values-list temp)
    (setq temp nil)
    (values-list temp)) → 1, 2, 3
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "prog1") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MULTIPLE-VALUE-SETQ")
   (:COM (:NAME "multiple-value-setq" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "multiple-value-setq")
      (:ARGLIST NIL "vars form") (:VALUES NIL "result"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "vars") "—a "
     (:TERM NIL "list") " of " (:TERM NIL "symbols") " that are either "
     (:TERM NIL "variable") " " (:TERM NIL "names") " or " (:TERM NIL "names")
     " of " (:TERM NIL "symbol macros") ". " :PAR (:PARAM NIL "form") "—a "
     (:TERM NIL "form") ". " :PAR (:COMMENT NIL "% 7.9.1 17")
     (:PARAM NIL "result") "—The " (:TERM NIL "primary value")
     " returned by the " (:PARAM NIL "form") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "multiple-value-setq")
     " assigns values to " (:PARAM NIL "vars") ". " :PAR
     (:COMMENT NIL "% 7.9.1 15") "The " (:PARAM NIL "form")
     " is evaluated, and each " (:PARAM NIL "var") " is "
     (:TERM NIL "assigned") " to the corresponding " (:TERM NIL "value")
     " returned by that " (:TERM NIL "form") ". If there are more "
     (:PARAM NIL "vars") " than " (:TERM NIL "values") " returned, "
     (:MISC NIL "nil") " is " (:TERM NIL "assigned") " to the extra "
     (:PARAM NIL "vars") ". If there are more " (:TERM NIL "values") " than "
     (:PARAM NIL "vars") ", the extra " (:TERM NIL "values") " are discarded. "
     :PAR (:ISSUE NIL "SYMBOL-MACROLET-SEMANTICS:SPECIAL-FORM") " If any "
     (:PARAM NIL "var") " is the " (:TERM NIL "name") " of a "
     (:TERM NIL "symbol macro") ", then it is " (:TERM NIL "assigned")
     " as if by " (:MACREF NIL "setf") ". Specifically, " :PAR
     (:ISSUE NIL "MULTIPLE-VALUE-SETQ-ORDER:LIKE-SETF-OF-VALUES") "    "
     (:CODE NIL " (multiple-value-setq (" (:I NIL "symbol")
      (:MATH NIL (:MSUB NIL (:MROW NIL) (:MN NIL "1"))) " ... "
      (:I NIL "symbol") (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "n"))) ") "
      (:I NIL "value-producing-form") ")
")
     " is defined to always behave in the same way as " :PAR
     (:CODE NIL " (values (setf (values " (:I NIL "symbol")
      (:MATH NIL (:MSUB NIL (:MROW NIL) (:MN NIL "1"))) " ... "
      (:I NIL "symbol") (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "n"))) ") "
      (:I NIL "value-producing-form") "))
")
     "  in order that the rules for order of evaluation and side-effects be consistent with those used by "
     (:MACREF NIL "setf") "." (:IDXTEXT NIL "order of evaluation")
     (:IDXTEXT NIL "evaluation order") " "
     (:COMMENT NIL " added  --sjl 4 Mar 92") "See "
     (:SECREF NIL :SETF-OF-VALUES) ". "
     (:ENDISSUE NIL "MULTIPLE-VALUE-SETQ-ORDER:LIKE-SETF-OF-VALUES") " "
     (:ENDISSUE NIL "SYMBOL-MACROLET-SEMANTICS:SPECIAL-FORM") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (multiple-value-setq (quotient remainder) (truncate 3.2 2)) → 1
 quotient → 1
 remainder → 1.2
 (multiple-value-setq (a b c) (values 1 2)) → 1
 a → 1
 b → 2
 c → NIL
 (multiple-value-setq (a b) (values 4 5 6)) → 4
 a → 4
 b → 5
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "setq") ", "
     (:SPECREF NIL "symbol-macrolet") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== VALUES"
    " incorporated issue SETF-OF-VALUES --sjl 4 Mar 92")
   :PAR
   (:COM (:NAME "values" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "values")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " object")
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "object")))))
     " " (:ISSUE NIL "SETF-OF-VALUES:ADD") " "
     (:DEF (:KIND "setf") (:NAMES NIL "values")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " place")
      (:NEW-VALUE NIL "new-values"))
     " " (:ENDISSUE NIL "SETF-OF-VALUES:ADD") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:ISSUE NIL "SETF-OF-VALUES:ADD") " "
     (:PARAM NIL "place") "—a " (:TERM NIL "place") ". " :PAR
     (:PARAM NIL "new-value") "—an " (:TERM NIL "object") ". "
     (:ENDISSUE NIL "SETF-OF-VALUES:ADD") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 7.9.1 4" "% 7.9.1 5") (:FUNREF NIL "values")
     " returns the " (:PARAM NIL "objects") " as "
     (:TERM NIL "multiple values") (:SUB NIL "2") ". " :PAR
     (:ISSUE NIL "SETF-OF-VALUES:ADD") " " (:MACREF NIL "setf") " of "
     (:FUNREF NIL "values") " is used to store the "
     (:TERM NIL "multiple values") (:SUB NIL "2") " " (:PARAM NIL "new-values")
     " into the " (:PARAM NIL "places") ". See " (:SECREF NIL :SETF-OF-VALUES)
     ". " (:ENDISSUE NIL "SETF-OF-VALUES:ADD") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (values) → " (:ANG NIL "no " (:TERM NIL "values")) "
 (values 1) → 1
 (values 1 2) → 1, 2
 (values 1 2 3) → 1, 2, 3
 (values (values 1 2 3) 4 5) → 1, 4, 5
 (defun polar (x y)
   (values (sqrt (+ (* x x) (* y y))) (atan y x))) → POLAR
 (multiple-value-bind (r theta) (polar 3.0 4.0)
   (vector r theta))
→ #(5.0 0.927295)
")
     " " :PAR (:COMMENT NIL "% 7.9.1 6")
     "Sometimes it is desirable to indicate explicitly that a function returns exactly one value. For example, the function "
     :PAR
     (:CODE NIL " (defun foo (x y)
   (floor (+ x y) y)) → FOO
")
     " returns two values because " (:FUNREF NIL "floor")
     " returns two values. It may be that the second value makes no sense, or that for efficiency reasons it is desired not to compute the second value. "
     (:FUNREF NIL "values")
     " is the standard idiom for indicating that only one value is to be returned: "
     :PAR
     (:CODE NIL " (defun foo (x y)
   (values (floor (+ x y) y))) → FOO
")
     " This works because " (:FUNREF NIL "values")
     " returns exactly one value for each of " (:PARAM NIL "args")
     "; as for any function call, if any of " (:PARAM NIL "args")
     " produces more than one value, all but the first are discarded. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "values-list") ", "
     (:MACREF NIL "multiple-value-bind") ", "
     (:CONREF NIL "multiple-values-limit") ", " (:SECREF NIL :EVALUATION) " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR "Since " (:FUNREF NIL "values") " is a "
     (:TERM NIL "function") ", not a " (:TERM NIL "macro") " or "
     (:TERM NIL "special form") ", it receives as " (:TERM NIL "arguments")
     " only the " (:TERM NIL "primary values") " of its "
     (:TERM NIL "argument") " " (:TERM NIL "forms") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== VALUES-LIST")
   (:COM (:NAME "values-list" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "values-list") (:ARGLIST NIL "list")
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "element")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "list") "—a "
     (:TERM NIL "list") ". " :PAR (:PARAM NIL "elements") "—the "
     (:TERM NIL "elements") " of the " (:PARAM NIL "list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.9.1 9")
     "Returns the " (:TERM NIL "elements") " of the " (:PARAM NIL "list")
     " as " (:TERM NIL "multiple values") (:SUB NIL "2") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (values-list nil) → " (:ANG NIL "no " (:TERM NIL "values")) "
 (values-list '(1)) → 1
 (values-list '(1 2)) → 1, 2
 (values-list '(1 2 3)) → 1, 2, 3
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "Should signal "
     (:TYPEREF NIL "type-error") " if its argument is not a "
     (:TERM NIL "proper list") ". " :PAR
     (:COMMENT NIL
      "KMP: Isn't there also some issue to do with max number of values?"
      "Moon: No different than in VALUES if (> CALL-ARGUMENTS-LIMIT MULTIPLE-VALUES-LIMIT).")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "multiple-value-bind") ", "
     (:CONREF NIL "multiple-value-list") ", "
     (:CONREF NIL "multiple-values-limit") ", " (:FUNREF NIL "values") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (values-list " (:PARAM NIL "list") ") ≡ (apply #'values "
      (:PARAM NIL "list") ")
")
     " " :PAR
     (:TT NIL "(equal " (:PARAM NIL "x") " (multiple-value-list (values-list "
      (:PARAM NIL "x") ")))")
     " returns " (:TERM NIL "true") " for all " (:TERM NIL "lists") " "
     (:PARAM NIL "x") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MULTIPLE-VALUES-LIMIT")
   (:COM (:NAME "multiple-values-limit" :FTYPE "Constant Variable")
    (:PART (:NAME "Constant Value") " " :PAR "An " (:TERM NIL "integer")
     " not smaller than " (:TT NIL "20") ", the exact magnitude of which is "
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.9.1 8")
     "The upper exclusive bound on the number of " (:TERM NIL "values")
     " that may be returned from a " (:TERM NIL "function") ", "
     (:ISSUE NIL "MULTIPLE-VALUES-LIMIT-ON-VARIABLES:UNDEFINED")
     " bound or assigned by " (:MACREF NIL "multiple-value-bind") " or "
     (:MACREF NIL "multiple-value-setq") ", or passed as a first argument to "
     (:MACREF NIL "nth-value")
     ". (If these individual limits might differ, the minimum value is used.) "
     (:ENDISSUE NIL "MULTIPLE-VALUES-LIMIT-ON-VARIABLES:UNDEFINED") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:CONREF NIL "lambda-parameters-limit")
     ", " (:CONREF NIL "call-arguments-limit") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "Implementors are encouraged to make this limit as large as possible. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== NTH-VALUE")
   (:COM (:NAME "nth-value" :FTYPE "Macro") (:ISSUE NIL "NTH-VALUE:ADD") " "
    :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "nth-value") (:ARGLIST NIL "n form")
      (:VALUES NIL "object"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "n")
     "—a non-negative " (:TERM NIL "integer") "; evaluated. " :PAR
     (:PARAM NIL "form") "—a " (:TERM NIL "form")
     "; evaluated as described below. " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Evaluates " (:PARAM NIL "n")
     " and then " (:PARAM NIL "form") ", returning as its only value the "
     (:PARAM NIL "n") "th value " (:TERM NIL "yielded") " by "
     (:PARAM NIL "form") ", or " (:MISC NIL "nil") " if " (:PARAM NIL "n")
     " is greater than or equal to the number of " (:TERM NIL "values")
     " returned by " (:PARAM NIL "form")
     ". (The first returned value is numbered " (:TT NIL "0") ".) " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (nth-value 0 (values 'a 'b)) → A
 (nth-value 1 (values 'a 'b)) → B
 (nth-value 2 (values 'a 'b)) → NIL
 (let* ((x 83927472397238947423879243432432432)
        (y 32423489732)
        (a (nth-value 1 (floor x y)))
        (b (mod x y)))
   (values a b (= a b)))
→ 3332987528, 3332987528, "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "multiple-value-list") ", "
     (:FUNREF NIL "nth") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "Operationally, the following relationship is true, although "
     (:SPECREF NIL "nth-value") " might be more efficient in some "
     (:TERM NIL "implementations") " because, for example, some "
     (:TERM NIL "consing") " might be avoided. " :PAR
     (:CODE NIL " (nth-value " (:PARAM NIL "n") " " (:PARAM NIL "form")
      ") ≡ (nth " (:PARAM NIL "n") " (multiple-value-list " (:PARAM NIL "form")
      "))
")
     " " :PAR (:ENDISSUE NIL "NTH-VALUE:ADD") " "))
   " " :PAR
   (:COMMENT NIL "-------------------- Data and Control --------------------")
   :PAR (:COMMENT NIL "%% ========== PROG" "%% ========== PROG*")
   (:COM (:NAME "prog, prog*" :FTYPE "Macro") (:ISSUE NIL "DECLS-AND-DOC") " "
    :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "prog")
      (:ARGLIST NIL
       (:PAREN NIL
        (:STAR NIL
         (:CURLY NIL (:PARAM NIL "var") " " (:MATH NIL (:MO NIL "|")) " "
          (:PAREN NIL (:PARAM NIL "var") " "
           (:BRAC NIL (:PARAM NIL "init-form"))))))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL
        (:CURLY NIL (:PARAM NIL "tag") " " (:MATH NIL (:MO NIL "|")) " "
         (:PARAM NIL "statement"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "prog*")
      (:ARGLIST NIL
       (:PAREN NIL
        (:STAR NIL
         (:CURLY NIL (:PARAM NIL "var") " " (:MATH NIL (:MO NIL "|")) " "
          (:PAREN NIL (:PARAM NIL "var") " "
           (:BRAC NIL (:PARAM NIL "init-form"))))))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL
        (:CURLY NIL (:PARAM NIL "tag") " " (:MATH NIL (:MO NIL "|")) " "
         (:PARAM NIL "statement"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "var")
     "—variable name. " :PAR (:PARAM NIL "init-form") "—a " (:TERM NIL "form")
     ". " :PAR (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR (:PARAM NIL "tag") "—a "
     (:TERM NIL "go tag") "; not evaluated. " :PAR (:PARAM NIL "statement")
     "—a " (:TERM NIL "compound form") "; evaluated as described below. " :PAR
     (:PARAM NIL "results") "—" (:MISC NIL "nil") " if a "
     (:TERM NIL "normal return") " occurs, or else, if an "
     (:TERM NIL "explicit return") " occurs, the " (:TERM NIL "values")
     " that were transferred. " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.8.5 3")
     "Three distinct operations are performed by " (:MACREF NIL "prog") " and "
     (:MACREF NIL "prog*")
     ": they bind local variables, they permit use of the "
     (:MACREF NIL "return") " statement, and they permit use of the "
     (:SPECREF NIL "go") " statement. A typical " (:MACREF NIL "prog")
     " looks like this: " :PAR
     (:CODE NIL " (prog (var1 var2 (var3 init-form-3) var4 (var5 init-form-5))
       "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) "
       statement1
  tag1
       statement2
       statement3
       statement4
  tag2
       statement5
       ...
       )
")
     " " :PAR "For " (:MACREF NIL "prog") ", " (:PARAM NIL "init-forms")
     " are evaluated first, in the order in which they are supplied. The "
     (:PARAM NIL "vars")
     " are then bound to the corresponding values in parallel. If no "
     (:PARAM NIL "init-form") " is supplied for a given " (:PARAM NIL "var")
     ", that " (:PARAM NIL "var") " is bound to " (:MISC NIL "nil") ". " :PAR
     (:COMMENT NIL "% 7.8.5 11") "The body of " (:MACREF NIL "prog")
     " is executed as if it were a " (:SPECREF NIL "tagbody") " "
     (:TERM NIL "form") "; the " (:SPECREF NIL "go")
     " statement can be used to transfer control to a " (:PARAM NIL "tag") ". "
     (:PARAM NIL "Tags") " label " (:PARAM NIL "statements") ". " :PAR
     (:COMMENT NIL "% 7.8.5 12") (:MACREF NIL "prog")
     " implicitly establishes a " (:SPECREF NIL "block") " named "
     (:MISC NIL "nil") " around the entire " (:MACREF NIL "prog") " "
     (:TERM NIL "form") ", so that " (:MACREF NIL "return")
     " can be used at any time to exit from the " (:MACREF NIL "prog") " "
     (:TERM NIL "form") ". " :PAR (:COMMENT NIL "% 7.8.5 15")
     "The difference between " (:MACREF NIL "prog*") " and "
     (:MACREF NIL "prog") " is that in " (:MACREF NIL "prog*") " the "
     (:TERM NIL "binding") " and initialization of the " (:PARAM NIL "vars")
     " is done " (:TERM NIL "sequentially") ", so that the "
     (:PARAM NIL "init-form")
     " for each one can use the values of previous ones. " :PAR
     (:COMMENT NIL
      " I don't think anything in this next paragraph hasn't been stated"
      " elsewhere.  --sjl 5 Mar 92"
      "Any \\param{declaration} appearing in the \\macref{prog} is used as "
      "if appearing at the top of \\specref{let}."
      "It is an error if a \\term{type declaration} is supplied for a "
      "\\param{var} and the initial value of"
      "that \\param{var} is not consistent with the \\param{declaration}."
      "Similarly, declarations in \\macref{prog*} are like in \\macref{let*}.")
     :PAR
     (:COMMENT NIL "% Moon: Redundant." " For \\macref{prog}, the "
      " \\term{scope} of the name binding does not include any"
      " \\param{init-form}.  "
      " For \\macref{prog*}, a variable's \\term{scope} also includes the "
      "      remaining \\param{init-forms} for subsequent variable bindings.")
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL "(prog* ((y z) (x (car y)))
       (return x))
")
     " returns the " (:TERM NIL "car") " of the value of " (:TT NIL "z") ". "
     :PAR
     (:CODE NIL " (setq a 1) → 1
 (prog ((a 2) (b a)) (return (if (= a b) '= '/=))) → /=
 (prog* ((a 2) (b a)) (return (if (= a b) '= '/=))) → =
 (prog () 'no-return-value) → NIL
")
     " " (:COMMENT NIL "% 7.8.5 13")
     (:CODE NIL " (defun king-of-confusion (w)
   \"Take a cons of two lists and make a list of conses.
    Think of this function as being like a zipper.\"
   (prog (x y z)          ;Initialize x, y, z to NIL
        (setq y (car w) z (cdr w))
    loop
        (cond ((null y) (return x))
              ((null z) (go err)))
    rejoin
        (setq x (cons (cons (car y) (car z)) x))
        (setq y (cdr y) z (cdr z))
        (go loop)
    err
        (cerror \"Will self-pair extraneous items\"
                \"Mismatch - gleep!  ~S\" y)
        (setq z y)
        (go rejoin))) → KING-OF-CONFUSION 
")
     " This can be accomplished more perspicuously as follows: " :PAR
     (:CODE NIL " (defun prince-of-clarity (w)
   \"Take a cons of two lists and make a list of conses.
    Think of this function as being like a zipper.\"
   (do ((y (car w) (cdr y))
        (z (cdr w) (cdr z))
        (x '"
      (:TT NIL " ()") " (cons (cons (car y) (car z)) x)))
       ((null y) x)
     (when (null z)
       (cerror \"Will self-pair extraneous items\"
              \"Mismatch - gleep!  ~S\" y)
       (setq z y)))) → PRINCE-OF-CLARITY 
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "block") ", "
     (:SPECREF NIL "let") ", " (:SPECREF NIL "tagbody") ", "
     (:SPECREF NIL "go") ", " (:MACREF NIL "return") ", "
     (:SECREF NIL :EVALUATION) " " :PAR)
    (:PART (:NAME "Notes") " " (:COMMENT NIL "% 7.8.5 14") (:MACREF NIL "prog")
     " can be explained in terms of " (:SPECREF NIL "block") ", "
     (:SPECREF NIL "let") ", and " (:SPECREF NIL "tagbody") " as follows: "
     :PAR
     (:CODE NIL " (prog " (:PARAM NIL "variable-list") " "
      (:PARAM NIL "declaration") " . " (:PARAM NIL "body") ")
    ≡ (block nil (let "
      (:PARAM NIL "variable-list") " " (:PARAM NIL "declaration")
      " (tagbody . " (:PARAM NIL "body") ")))
")
     " " :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PROG1" "%% ========== PROG2")
   (:COM (:NAME "prog1, prog2" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "prog1")
      (:ARGLIST NIL "first-form " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL "result-1"))
     " "
     (:DEF (:KIND "macro") (:NAMES NIL "prog2")
      (:ARGLIST NIL "first-form second-form "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL "result-2"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "first-form")
     "—a " (:TERM NIL "form") "; evaluated as described below. " :PAR
     (:PARAM NIL "second-form") "—a " (:TERM NIL "form")
     "; evaluated as described below. " :PAR (:PARAM NIL "forms") "—an "
     (:TERM NIL "implicit progn") "; evaluated as described below. " :PAR
     (:COMMENT NIL "% 7.4.0 8") (:PARAM NIL "result-1") "—the "
     (:TERM NIL "primary value") " resulting from the "
     (:TERM NIL "evaluation") " of " (:PARAM NIL "first-form") ". " :PAR
     (:COMMENT NIL "% 7.4.0 11") (:PARAM NIL "result-2") "—the "
     (:TERM NIL "primary value") " resulting from the "
     (:TERM NIL "evaluation") " of " (:PARAM NIL "second-form") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.4.0 6")
     (:MACREF NIL "prog1") " " (:TERM NIL "evaluates") " "
     (:PARAM NIL "first-form") " and then " (:PARAM NIL "forms") ", "
     (:TERM NIL "yielding") " as its only " (:TERM NIL "value") " the "
     (:TERM NIL "primary value") " " (:TERM NIL "yielded") " by "
     (:PARAM NIL "first-form") ". " :PAR (:COMMENT NIL "% 7.4.0 9")
     (:MACREF NIL "prog2") " " (:TERM NIL "evaluates") " "
     (:PARAM NIL "first-form") ", then " (:PARAM NIL "second-form")
     ", and then " (:PARAM NIL "forms") ", " (:TERM NIL "yielding")
     " as its only " (:TERM NIL "value") " the " (:TERM NIL "primary value")
     " " (:TERM NIL "yielded") " by " (:PARAM NIL "first-form") ". " :PAR
     (:COMMENT NIL "% I hope this is implied by the above. -kmp 22-Oct-91"
      "The arguments are evaluated in the order in which they are given.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq temp 1) → 1
 (prog1 temp (print temp) (incf temp) (print temp))
⊳ 1
⊳ 2
→ 1
 (prog1 temp (setq temp nil)) → 2
 temp → NIL
 (prog1 (values 1 2 3) 4) → 1 
 (setq temp (list 'a 'b 'c))
 (prog1 (car temp) (setf (car temp) 'alpha)) → A
 temp → (ALPHA B C)
 (flet ((swap-symbol-values (x y)
          (setf (symbol-value x) 
                (prog1 (symbol-value y)
                       (setf (symbol-value y) (symbol-value x))))))
   (let ((*foo* 1) (*bar* 2))
     (declare (special *foo* *bar*))
     (swap-symbol-values '*foo* '*bar*)
     (values *foo* *bar*)))
→ 2, 1
 (setq temp 1) → 1
 (prog2 (incf temp) (incf temp) (incf temp)) → 3
 temp → 4
 (prog2 1 (values 2 3 4) 5) → 2
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "multiple-value-prog1")
     ", " (:SPECREF NIL "progn") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 7.4.0 7")
     (:MACREF NIL "prog1") " and " (:MACREF NIL "prog2")
     " are typically used to " (:TERM NIL "evaluate") " one or more "
     (:TERM NIL "forms") " with side effects and return a " (:TERM NIL "value")
     " that must be computed before some or all of the side effects happen. "
     :PAR
     (:COMMENT NIL
      " The second example is wrong because it passes top-level-ness to form1,"
      " which is forbidden by issue MACRO-SUBFORMS-TOP-LEVEL-P.  --sjl 5 Mar 92"
      "\\code"
      " (prog1 \\starparam{form}) \\EQ (values (multiple-value-prog1 \\starparam{form}))"
      " (prog2 \\param{form1} \\starparam{form}) \\EQ (progn \\param{form1} (prog1 \\starparam{form}))"
      "\\endcode")
     :PAR
     (:CODE NIL " (prog1 " (:STAR NIL (:CURLY NIL (:PARAM NIL "form")))
      ") ≡ (values (multiple-value-prog1 "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))) "))
 (prog2 "
      (:PARAM NIL "form1") " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form")))
      ") ≡ (let () " (:PARAM NIL "form1") " (prog1 "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))) "))
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PROGN")
   (:COM (:NAME "progn" :FTYPE "Special Operator")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "special-operator") (:NAMES NIL "progn")
      (:ARGLIST NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "forms") "—an "
     (:TERM NIL "implicit progn") ". " :PAR
     (:COMMENT NIL "% 7.9.2 6" "% 7.4.0 5") (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " of the " (:TERM NIL "forms") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.4.0 3")
     (:SPECREF NIL "progn") " evaluates " (:PARAM NIL "forms")
     ", in the order in which they are given. " :PAR "The values of each "
     (:PARAM NIL "form") " but the last are discarded. " :PAR
     (:COMMENT NIL "% 5.3 2") "If " (:SPECREF NIL "progn") " appears as a "
     (:TERM NIL "top level form") ", then all " (:TERM NIL "forms")
     " within that " (:SPECREF NIL "progn")
     " are considered by the compiler to be " (:TERM NIL "top level forms")
     ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (progn) → NIL
 (progn 1 2 3) → 3
 (progn (values 1 2 3)) → 1, 2, 3
 (setq a 1) → 1
 (if a
      (progn (setq a nil) 'here)
      (progn (setq a t) 'there)) → HERE
 a → NIL
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "prog1") ", "
     (:MACREF NIL "prog2") ", " (:SECREF NIL :EVALUATION) " " :PAR)
    (:PART (:NAME "Notes") " " (:COMMENT NIL "% 7.4.0 4") :PAR
     "Many places in " (:RM NIL " Common Lisp") " involve syntax that uses "
     (:TERM NIL "implicit progns")
     ". That is, part of their syntax allows many " (:TERM NIL "forms")
     " to be written that are to be evaluated sequentially, discarding the results of all "
     (:TERM NIL "forms") " but the last and returning the results of the last "
     (:TERM NIL "form")
     ". Such places include, but are not limited to, the following: the body of a "
     (:TERM NIL "lambda expression")
     "; the bodies of various control and conditional " (:TERM NIL "forms")
     " (" (:I NIL "e.g.") ",  " (:MACREF NIL "case") ", "
     (:SPECREF NIL "catch") ", " (:SPECREF NIL "progn") ", and "
     (:MACREF NIL "when") "). "
     (:COMMENT NIL
      "% This list could go on and on. Just keep it simple. -kmp&moon 13-Feb-92"
      " 		   \\specref{block}," " 		   \\specref{catch},"
      " 		   \\specref{evalwhen}," "                    \\specref{let},"
      "                    \\specref{let*},"
      " 		   \\macref{multiple-value-bind}," " 	           \\specref{progv},"
      "                    \\macref{unless},"
      "                and \\macref{when};" " " " "
      " (\\eg \\specref{block}, \\specref{catch}, \\specref{eval-when})"
      "  and clauses in the " "       \\macref{case},"
      "       \\macref{ccase}, " "       \\macref{cond},"
      "       \\macref{ctypecase}," "       \\macref{ecase},"
      "       \\macref{etypecase}," "   and \\macref{typecase}"
      "       conditional \\term{forms}.")
     :PAR))
   " " :PAR (:COMMENT NIL "-------------------- Setf --------------------")
   :PAR (:COMMENT NIL "%% ========== DEFINE-MODIFY-MACRO")
   (:COM (:NAME "define-modify-macro" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "define-modify-macro")
      (:ARGLIST NIL "name lambda-list function " (:BRAC NIL "documentation"))
      (:VALUES NIL "name"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "symbol") ". " :PAR
     (:COMMENT NIL
      " The lambda-list here was screwed up.  GET-SETF-METHOD-ENVIRONMENT:ADD-ARG"
      " did *not* add an &environment argument to define-modify-macro."
      " I moved the details of the lambda-list syntax to chapter 3, for "
      " consistency with everything else.  --sjl 5 Mar 92"
      "\\issue{GET-SETF-METHOD-ENVIRONMENT:ADD-ARG}"
      "\\param{lambda-list}---a \\term{lambda list} " " containing the"
      "  \\keyref{environment}," "  \\keyref{optional}," " and "
      "  \\keyref{rest} " " keywords only."
      "\\endissue{GET-SETF-METHOD-ENVIRONMENT:ADD-ARG}")
     :PAR (:PARAM NIL "lambda-list") "—a "
     (:TERM NIL "define-modify-macro lambda list") " " :PAR
     (:PARAM NIL "function") "—a " (:TERM NIL "symbol") ". " :PAR
     (:PARAM NIL "documentation") "—a " (:TERM NIL "string")
     "; not evaluated. " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.2.0 42")
     (:MACREF NIL "define-modify-macro") " defines a " (:TERM NIL "macro")
     " named " (:PARAM NIL "name") " to " (:TERM NIL "read") " and "
     (:TERM NIL "write") " a " (:TERM NIL "place") ". " :PAR
     "The arguments to the new " (:TERM NIL "macro") " are a "
     (:TERM NIL "place") ", followed by the arguments that are supplied in "
     (:PARAM NIL "lambda-list") ". "
     (:ISSUE NIL "GET-SETF-METHOD-ENVIRONMENT:ADD-ARG") " "
     (:TERM NIL "Macros") " defined with " (:MACREF NIL "define-modify-macro")
     " correctly pass the " (:TERM NIL "environment parameter") " to "
     (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
     (:FUNREF NIL "get-setf-expansion") ". "
     (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
     (:ENDISSUE NIL "GET-SETF-METHOD-ENVIRONMENT:ADD-ARG") " "
     (:COMMENT NIL " I see no &environment argument here.  --sjl 5 Mar 92"
      "\\issue{MACRO-ENVIRONMENT-EXTENT:DYNAMIC}"
      " The \\keyref{environment} argument has \\term{dynamic extent};"
      "the consequences are undefined if the \\keyref{environment} argument is "
      "referred to outside the \\term{dynamic extent} of the macro call."
      "\\endissue{MACRO-ENVIRONMENT-EXTENT:DYNAMIC}")
     :PAR "When the " (:TERM NIL "macro") " is invoked, "
     (:PARAM NIL "function") " is applied to the old contents of the "
     (:TERM NIL "place") " and the " (:PARAM NIL "lambda-list")
     " arguments to obtain the new value, and the " (:TERM NIL "place")
     " is updated to contain the result. " :PAR (:COMMENT NIL "% 7.2.0 43")
     "Except for the issue of avoiding multiple evaluation (see below), the expansion of a "
     (:MACREF NIL "define-modify-macro") " is equivalent to the following: "
     :PAR
     (:CODE NIL " (defmacro " (:PARAM NIL "name") " (reference . "
      (:PARAM NIL "lambda-list") ")
   "
      (:PARAM NIL "documentation") "
   `(setf ,reference
          ("
      (:PARAM NIL "function") " ,reference ," (:I NIL "arg1") " ,"
      (:I NIL "arg2") " ...)))
")
     " " :PAR "where " (:I NIL "arg1") ", " (:I NIL "arg2")
     ", ..., are the parameters appearing in " (:PARAM NIL "lambda-list")
     "; appropriate provision is made for a " (:TERM NIL "rest parameter") ". "
     :PAR (:ISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM") " The "
     (:TERM NIL "subforms") " of the macro calls defined by "
     (:MACREF NIL "define-modify-macro") " are evaluated as specified in "
     (:SECREF NIL :GEN-REF-SUB-FORM-EVAL) ". "
     (:ENDISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM") " " :PAR
     (:ISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " "
     (:PARAM NIL "Documentation") " is attached as a "
     (:TERM NIL "documentation string") " to " (:PARAM NIL "name") " (as kind "
     (:SPECREF NIL "function") ") and to the " (:TERM NIL "macro function")
     ". " (:ENDISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " " :PAR
     (:COMMENT NIL " Added.  --sjl 5 Mar 92")
     (:ISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     (:COMMENT NIL " added qualification about top-level-ness  --sjl 5 Mar 92")
     "If a " (:MACREF NIL "define-modify-macro") " " (:TERM NIL "form")
     " appears as a " (:TERM NIL "top level form") ", the "
     (:TERM NIL "compiler") " must store the " (:TERM NIL "macro")
     " definition at compile time, so that occurrences of the macro later on in the file can be expanded correctly. "
     (:ENDISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     :PAR)
    (:PART (:NAME "Examples") " " (:COMMENT NIL "% 7.2.0 44" "% 7.2.0 45")
     (:CODE NIL " (define-modify-macro appendf (&rest args) 
    append \"Append onto list\") → APPENDF
 (setq x '(a b c) y x) → (A B C)
 (appendf x '(d e f) '(1 2 3)) → (A B C D E F 1 2 3)
 x → (A B C D E F 1 2 3)
 y → (A B C)
 (define-modify-macro new-incf (&optional (delta 1)) +)
 (define-modify-macro unionf (other-set &rest keywords) union)
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "A macro definition is assigned to "
     (:PARAM NIL "name") ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defsetf") ", "
     (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
     (:MACREF NIL "define-setf-expander") ", "
     (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
     (:FUNREF NIL "documentation") ", " (:SECREF NIL :DOC-VS-DECLS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DEFSETF")
   (:COM (:NAME "defsetf" :FTYPE "Macro") (:ISSUE NIL "DECLS-AND-DOC") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR "The “short form”: " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "defsetf")
      (:ARGLIST NIL "access-fn update-fn " (:BRAC NIL "documentation"))
      (:VALUES NIL "access-fn"))
     " " :PAR "The “long form”: " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "defsetf")
      (:ARGLIST NIL "access-fn lambda-list "
       (:PAREN NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "store-variable")))) " "
       (:INTERLEAVE NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration")))
        " | " (:PARAM NIL "documentation"))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL "access-fn"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL
      "!!! Barmar: Does the function or macro needs to already be defined?")
     (:PARAM NIL "access-fn") "—a " (:TERM NIL "symbol") " which names a "
     (:TERM NIL "function") " or a " (:TERM NIL "macro") ". " :PAR
     (:PARAM NIL "update-fn") "—a " (:TERM NIL "symbol") " naming a "
     (:TERM NIL "function") " or " (:TERM NIL "macro") ". " :PAR
     (:PARAM NIL "lambda-list") "—a " (:TERM NIL "defsetf lambda list") ". "
     :PAR (:PARAM NIL "store-variable") "—a " (:TERM NIL "symbol") " (a "
     (:TERM NIL "variable") " " (:TERM NIL "name") "). " :PAR
     (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR
     (:PARAM NIL "documentation") "—a " (:TERM NIL "string")
     "; not evaluated. " :PAR (:PARAM NIL "form") "—a " (:TERM NIL "form") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.2.0 46")
     (:MACREF NIL "defsetf") " defines how to " (:MACREF NIL "setf") " a "
     (:TERM NIL "place") " of the form "
     (:TT NIL "(" (:I NIL "access-fn") " ...)")
     " for relatively simple cases. (See " (:MACREF NIL "define-setf-expander")
     " for more general access to this facility.) "
     (:ISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " "
     (:COMMENT NIL
      " These next two paragraphs apply only to the short form.  This information"
      " is presented more succinctly below anyway.  --sjl 5 Mar 92"
      " When \\macref{setf} is given a \\term{place} that is"
      " specified in terms of \\param{access-fn} and a new value for the "
      " \\term{place}," " it is expanded into a call on \\param{update-fn}."
      " The arguments of \\param{access-fn} and the new value are passed to "
      " \\param{update-fn},"
      " and \\param{update-fn} is invoked to modify the value of the "
      " \\term{place}." " "
      " The \\term{function} or \\term{macro} named by \\param{access-fn} "
      " evaluates all of its arguments." " %Barmar: Why?"
      " %Barmar (later): Answer is CLtL2, p138, para 2."
      " \\param{Update-fn} must take one more argument than"
      " \\param{access-fn}. This last argument corresponds to the new value that is"
      " to be assigned to the \\term{place}. \\param{Update-fn} must return"
      " the new value as its result.")
     "It must be the case that the " (:TERM NIL "function") " or "
     (:TERM NIL "macro") " named by " (:PARAM NIL "access-fn")
     " evaluates all of its arguments. "
     (:ENDISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " " :PAR
     (:COMMENT NIL "% 7.2.0 49") (:MACREF NIL "defsetf")
     " may take one of two forms, called the “short form” and the “long form,” which are distinguished by the "
     (:TERM NIL "type") " of the second " (:TERM NIL "argument") ". " :PAR
     "When the short form is used, "
     (:COMMENT NIL " The simple form " " " " \\code"
      "  (defsetf access-fn update-fn \\lbracket\\ doc-string\\rbracket)"
      " \\endcode")
     (:PARAM NIL "update-fn") " must name a " (:TERM NIL "function") " (or "
     (:TERM NIL "macro") ") that takes one more argument than "
     (:PARAM NIL "access-fn") " takes. When " (:MACREF NIL "setf")
     " is given a " (:TERM NIL "place") " that is a call on "
     (:PARAM NIL "access-fn") ", it expands into a call on "
     (:PARAM NIL "update-fn") " that is given all the arguments to "
     (:PARAM NIL "access-fn")
     " and also, as its last argument, the new value (which must be returned by "
     (:PARAM NIL "update-fn") " as its value). " :PAR
     (:COMMENT NIL "% 7.2.0 51") "The long form " (:MACREF NIL "defsetf") " "
     (:COMMENT NIL " looks like" " " " \\code"
      "  (defsetf access-fn lambda-list (store-variable) . body)" " \\endcode"
      " and ")
     "resembles " (:MACREF NIL "defmacro") ". " (:COMMENT NIL "% 7.2.0 52")
     "The " (:PARAM NIL "lambda-list") " describes the arguments of "
     (:PARAM NIL "access-fn") ". The " (:PARAM NIL "store-variables")
     " describe the value " (:ISSUE NIL "SETF-MULTIPLE-STORE-VARIABLES:ALLOW")
     " or values " (:ENDISSUE NIL "SETF-MULTIPLE-STORE-VARIABLES:ALLOW")
     " to be stored into the " (:TERM NIL "place") ". The " (:PARAM NIL "body")
     " must compute the expansion of a " (:MACREF NIL "setf") " of a call on "
     (:PARAM NIL "access-fn") ". "
     (:ISSUE NIL "DEFINING-MACROS-NON-TOP-LEVEL:ALLOW") " "
     (:COMMENT NIL " Reworded garbled text.  --sjl 7 Mar 92"
      " When the expansion function is called, the \\param{forms} are evaluated"
      " in the lexical environment in which the \\macref{defsetf} \\term{form} was evaluated.")
     "The expansion function is defined in the same "
     (:TERM NIL "lexical environment") " in which the " (:MACREF NIL "defsetf")
     " " (:TERM NIL "form") " appears. "
     (:ENDISSUE NIL "DEFINING-MACROS-NON-TOP-LEVEL:ALLOW") " " :PAR
     (:COMMENT NIL "% 7.2.0 54") "During the evaluation of the "
     (:PARAM NIL "forms") ", the variables in the " (:PARAM NIL "lambda-list")
     " and the "
     (:COMMENT NIL "Ikky.  --sjl 5 Mar 92" "\\param{store-variable}"
      "\\issue{SETF-MULTIPLE-STORE-VARIABLES:ALLOW} "
      "or \\param{store-variables}"
      "\\endissue{SETF-MULTIPLE-STORE-VARIABLES:ALLOW} ")
     (:PARAM NIL "store-variables")
     " are bound to names of temporary variables, generated as if by "
     (:FUNREF NIL "gensym") " "
     (:COMMENT NIL
      " !!! Moon doesn't like this.  Neither do I.  He's sent mail about this. -kmp 13-Feb-92")
     "or " (:FUNREF NIL "gentemp") ", that will be bound by the expansion of "
     (:MACREF NIL "setf") " to the values of those " (:TERM NIL "subforms")
     ". This binding permits the " (:PARAM NIL "forms")
     " to be written without regard for order-of-evaluation issues. "
     (:MACREF NIL "defsetf")
     " arranges for the temporary variables to be optimized out of the final result in cases where that is possible. "
     :PAR (:ISSUE NIL "FLET-IMPLICIT-BLOCK:YES") " The body code in "
     (:MACREF NIL "defsetf") " is implicitly enclosed in a "
     (:TERM NIL "block") " whose name is "
     (:COMMENT NIL "the same as the accessor.") (:PARAM NIL "access-fn") " "
     (:ENDISSUE NIL "FLET-IMPLICIT-BLOCK:YES") " " :PAR
     (:COMMENT NIL "% 7.2.0 47") (:MACREF NIL "defsetf") " ensures that "
     (:TERM NIL "subforms") " of the " (:TERM NIL "place")
     " are evaluated exactly once. " :PAR (:PARAM NIL "Documentation")
     " is attached to " (:PARAM NIL "access-fn") " as a "
     (:TERM NIL "documentation string") " of kind " (:MISC NIL "setf") ". "
     :PAR (:ISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     (:COMMENT NIL " added qualification about top-level-ness  --sjl 5 Mar 92")
     "If a " (:MACREF NIL "defsetf") " " (:TERM NIL "form") " appears as a "
     (:TERM NIL "top level form") ", the " (:TERM NIL "compiler")
     " must make the " (:TERM NIL "setf expander")
     " available so that it may be used to expand calls to "
     (:MACREF NIL "setf") " later on in the " (:TERM NIL "file")
     ". Users must ensure that the " (:PARAM NIL "forms")
     ", if any, can be evaluated at compile time if the "
     (:PARAM NIL "access-fn") " is used in a " (:TERM NIL "place")
     " later in the same " (:TERM NIL "file") ". The " (:TERM NIL "compiler")
     " must make these " (:TERM NIL "setf expanders")
     " available to compile-time calls to " (:FUNREF NIL "get-setf-expansion")
     " when its " (:PARAM NIL "environment")
     " argument is a value received as the "
     (:TERM NIL "environment parameter") " of a " (:TERM NIL "macro") ". "
     (:ENDISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     :PAR)
    (:PART (:NAME "Examples") " The effect of " :PAR
     (:CODE NIL " (defsetf symbol-value set)
")
     " is built into the " (:RM NIL " Common Lisp")
     " system. This causes the form " (:TT NIL "(setf (symbol-value foo) fu)")
     " to expand into " (:TT NIL "(set foo fu)") ". " :PAR
     (:COMMENT NIL "% 7.2.0 50") "Note that " :PAR
     (:CODE NIL " (defsetf car rplaca)
")
     " would be incorrect because " (:FUNREF NIL "rplaca")
     " does not return its last argument. " :PAR
     (:CODE NIL
      " (defun middleguy (x) (nth (truncate (1- (list-length x)) 2) x)) → MIDDLEGUY
 (defun set-middleguy (x v)
    (unless (null x)
      (rplaca (nthcdr (truncate (1- (list-length x)) 2) x) v))
    v) → SET-MIDDLEGUY
 (defsetf middleguy set-middleguy) → MIDDLEGUY
 (setq a (list 'a 'b 'c 'd)
       b (list 'x)
       c (list 1 2 3 (list 4 5 6) 7 8 9)) → (1 2 3 (4 5 6) 7 8 9)
 (setf (middleguy a) 3) → 3
 (setf (middleguy b) 7) → 7
 (setf (middleguy (middleguy c)) 'middleguy-symbol) → MIDDLEGUY-SYMBOL
 a → (A 3 C D)
 b → (7)
 c → (1 2 3 (4 MIDDLEGUY-SYMBOL 6) 7 8 9)
")
     " " :PAR (:COMMENT NIL "% 7.2.0 56")
     "An example of the use of the long form of " (:MACREF NIL "defsetf") ": "
     :PAR
     (:CODE NIL " (defsetf subseq (sequence start &optional end) (new-sequence)
   `(progn (replace ,sequence ,new-sequence
                    :start1 ,start :end1 ,end)
           ,new-sequence)) → SUBSEQ
")
     " " :PAR
     (:COMMENT NIL "% People thought this comment was stupid. -kmp 10-Feb-92"
      " Experience with Common Lisp prior to this specification suggests that"
      " use of the fully general notation for \\term{keyword parameters} in \\term{function}"
      " definitions is rare, and that its use in \\macref{defsetf} \\term{forms}"
      " is even more rare.  In spite of its obscure nature, "
      " the following is an illustration of \\term{conforming code}:")
     :PAR
     (:CODE NIL " (defvar *xy* (make-array '(10 10)))
 (defun xy (&key ((x x) 0) ((y y) 0)) (aref *xy* x y)) → XY
 (defun set-xy (new-value &key ((x x) 0) ((y y) 0))
   (setf (aref *xy* x y) new-value)) → SET-XY
 (defsetf xy (&key ((x x) 0) ((y y) 0)) (store)
   `(set-xy ,store 'x ,x 'y ,y)) → XY
 (get-setf-expansion '(xy a b))
→ (#:t0 #:t1),
   (a b),
   (#:store),
   ((lambda (&key ((x #:x)) ((y #:y))) 
      (set-xy #:store 'x #:x 'y #:y))
    #:t0 #:t1),
   (xy #:t0 #:t1)
 (xy 'x 1) → NIL
 (setf (xy 'x 1) 1) → 1
 (xy 'x 1) → 1
 (let ((a 'x) (b 'y))
   (setf (xy a 1 b 2) 3)
   (setf (xy b 5 a 9) 14))
→ 14
 (xy 'y 0 'x 1) → 1
 (xy 'x 1 'y 2) → 3
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "documentation") ", "
     (:MACREF NIL "setf") ", "
     (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
     (:MACREF NIL "define-setf-expander") ", "
     (:FUNREF NIL "get-setf-expansion") ", "
     (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
     (:SECREF NIL :GENERALIZED-REFERENCE) ", " (:SECREF NIL :DOC-VS-DECLS) " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 7.2.0 55")
     (:PARAM NIL "forms")
     " must include provision for returning the correct value (the value "
     (:ISSUE NIL "SETF-MULTIPLE-STORE-VARIABLES:ALLOW") " or values "
     (:ENDISSUE NIL "SETF-MULTIPLE-STORE-VARIABLES:ALLOW") " of "
     (:PARAM NIL "store-variable") "). This is handled by "
     (:PARAM NIL "forms") " rather than by " (:MACREF NIL "defsetf")
     " because in many cases this value can be returned at no extra cost, by calling a function that simultaneously stores into the "
     (:TERM NIL "place") " and returns the correct value. " :PAR "A "
     (:MACREF NIL "setf") " of a call on " (:PARAM NIL "access-fn")
     " also evaluates all of " (:PARAM NIL "access-fn")
     "'s arguments; it cannot treat any of them specially. "
     (:COMMENT NIL "!!! " "Barmar: What if update-fn is a macro?"
      "Moon: That technique won't work because DEFSETF is allowed to introduce temporary"
      "  variable bindings.  I guess that ought to be explained in this note.")
     "This means that " (:MACREF NIL "defsetf")
     " cannot be used to describe how to store into a "
     (:TERM NIL "generalized reference") " to a byte, such as "
     (:TT NIL "(ldb field reference)") ". "
     (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
     (:MACREF NIL "define-setf-expander") " "
     (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS")
     " is used to handle situations that do not fit the restrictions imposed by "
     (:MACREF NIL "defsetf") " and gives the user additional control. " :PAR
     (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DEFINE-SETF-METHOD")
   (:COM (:NAME "define-setf-expander" :FTYPE "Macro")
    (:ISSUE NIL "DECLS-AND-DOC") " "
    (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "define-setf-expander")
      (:ARGLIST NIL "access-fn lambda-list "
       (:INTERLEAVE NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration")))
        " | " (:PARAM NIL "documentation"))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL "access-fn"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "access-fn")
     "—a " (:TERM NIL "symbol") " that " (:TERM NIL "names") " a "
     (:TERM NIL "function") " or " (:TERM NIL "macro") ". " :PAR
     (:COMMENT NIL " tweaked.  --sjl 5 Mar 92"
      "\\issue{GET-SETF-METHOD-ENVIRONMENT:ADD-ARG}"
      "\\param{lambda-list} -- \\term{lambda list}; "
      "  can contain the \\term{lambda list keywords} "
      "    \\keyref{optional}, \\keyref{rest}, \\keyref{key}, \\keyref{allow-other-keys}, \\keyref{aux},"
      "    and \\keyref{environment}."
      "\\endissue{GET-SETF-METHOD-ENVIRONMENT:ADD-ARG}")
     (:PARAM NIL "lambda-list") " – " (:TERM NIL "macro lambda list") ". " :PAR
     (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR
     (:PARAM NIL "documentation") "—a " (:TERM NIL "string")
     "; not evaluated. " :PAR (:PARAM NIL "forms") "—an "
     (:TERM NIL "implicit progn") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.2.0 72")
     (:MACREF NIL "define-setf-expander") " specifies the means by which "
     (:MACREF NIL "setf") " updates a " (:TERM NIL "place")
     " that is referenced by " (:PARAM NIL "access-fn") ". " :PAR "When "
     (:MACREF NIL "setf") " is given a " (:TERM NIL "place")
     " that is specified in terms of " (:PARAM NIL "access-fn")
     " and a new value for the " (:TERM NIL "place")
     ", it is expanded into a form that performs the appropriate update. " :PAR
     (:COMMENT NIL "% Moon doesn't think this belongs."
      " Neither do I.  It's all described in gory detail in chapter 3 already."
      " --sjl 5 Mar 92"
      " %When \\macref{setf} is called with the \\param{access-fn},"
      " \\param{lambda-list} " " parameters are bound to the "
      " corresponding \\param{access-fn} arguments in the \\term{place}."
      " %% 7.2.0 73"
      " \\param{lambda-list} specifies the arguments of \\param{access-fn} by"
      " describing the \\term{subforms} of the \\term{place}."
      " \\issue{GET-SETF-METHOD-ENVIRONMENT:ADD-ARG}" " %% 8.1.0 12"
      " \\keyref{environment}"
      " is followed by a single variable that is bound"
      " to an \\term{environment} representing the lexical environment in which the"
      " \\term{macro form} is to be interpreted.   This \\term{environment} might not be the"
      " complete lexical environment; it should be used only with"
      " \\funref{macroexpand} or \\funref{get-setf-expansion} for the sake of any local"
      " macro definitions that the \\specref{macrolet} \\term{form} could have"
      " established within that lexical environment.  "
      " \\endissue{GET-SETF-METHOD-ENVIRONMENT:ADD-ARG}"
      " \\issue{MACRO-ENVIRONMENT-EXTENT:DYNAMIC}"
      " The \\keyref{environment} argument has \\term{dynamic extent}; "
      " the consequences are undefined if the \\keyref{environment} argument is "
      " referred to outside the \\term{dynamic extent} of the \\term{macro form}."
      " \\endissue{MACRO-ENVIRONMENT-EXTENT:DYNAMIC}" " "
      " Destructuring can be used, as in \\macref{defmacro}.")
     :PAR "The " (:PARAM NIL "lambda-list") " supports destructuring. See "
     (:SECREF NIL :MACRO-LAMBDA-LISTS) ". " :PAR
     (:ISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " "
     (:PARAM NIL "Documentation") " is attached to " (:PARAM NIL "access-fn")
     " as a " (:TERM NIL "documentation string") " of kind " (:MISC NIL "setf")
     ". " (:ENDISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " " :PAR
     (:PARAM NIL "Forms") " constitute the body of the "
     (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
     (:TERM NIL "setf expander") " "
     (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS")
     " definition and must compute the " (:TERM NIL "setf expansion")
     " for a call on " (:MACREF NIL "setf") " that references the "
     (:TERM NIL "place") " by means of the given " (:PARAM NIL "access-fn")
     ". " (:ISSUE NIL "DEFINING-MACROS-NON-TOP-LEVEL:ALLOW") " "
     (:COMMENT NIL " Reworded garbled text.  --sjl 7 Mar 92"
      "When the expansion function is called, the \\param{forms} are "
      "evaluated in the lexical environment in which the"
      "\\macref{define-setf-expander} form was evaluated.")
     "The " (:TERM NIL "setf expander") " function is defined in the same "
     (:TERM NIL "lexical environment") " in which the "
     (:MACREF NIL "define-setf-expander") " " (:TERM NIL "form") " appears. "
     (:ENDISSUE NIL "DEFINING-MACROS-NON-TOP-LEVEL:ALLOW") " While "
     (:PARAM NIL "forms") " are being executed, the variables in "
     (:PARAM NIL "lambda-list") " are bound to parts of the "
     (:TERM NIL "place") " " (:TERM NIL "form") ". "
     (:ISSUE NIL "FLET-IMPLICIT-BLOCK:YES") " "
     (:ISSUE NIL "DEFMACRO-BLOCK-SCOPE:EXCLUDES-BINDINGS") " The body "
     (:PARAM NIL "forms") " (but not the " (:PARAM NIL "lambda-list") ") "
     (:ENDISSUE NIL "DEFMACRO-BLOCK-SCOPE:EXCLUDES-BINDINGS") " in a "
     (:MACREF NIL "define-setf-expander") " " (:TERM NIL "form")
     " are implicitly enclosed in a " (:TERM NIL "block") " whose name is "
     (:COMMENT NIL "the same as the accessor.") (:PARAM NIL "access-fn") ". "
     (:ENDISSUE NIL "FLET-IMPLICIT-BLOCK:YES") " " :PAR
     (:COMMENT NIL
      " We don't need to duplicate all this verbiage again here.  --sjl 5 Mar 92"
      " The evaluation of \\term{forms} must result in the following "
      " five values:" " " " \\beginlist"
      " \\itemitem{1.} A \\term{list} of the temporary variables used." " "
      " \\itemitem{2.} A \\term{list} of the value forms to whose values"
      " 	      the temporary variables are bound." " "
      " \\itemitem{3.} A \\term{list} consisting of the store variables"
      " 	      (the temporary variables that are bound to the new values)." " "
      " \\itemitem{4.} The \\term{writer} \\term{form}"
      " 	      (the form that changes the \\term{value}"
      " 	       of the \\term{place} "
      " 	       and returns the new \\term{value})." " "
      " \\itemitem{5.} The \\term{reader} \\term{form} "
      " 	      (the \\term{form} that retrieves the \\term{value}"
      " 	       of the \\term{place})." " \\endlist")
     :PAR "The evaluation of " (:PARAM NIL "forms")
     " must result in the five values described in "
     (:SECREF NIL :SETF-EXPANSIONS) ". " :PAR
     (:ISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     (:COMMENT NIL " added qualification about top-level-ness  --sjl 5 Mar 92")
     "If a " (:MACREF NIL "define-setf-expander") " " (:TERM NIL "form")
     " appears as a " (:TERM NIL "top level form") ", the "
     (:TERM NIL "compiler") " must make the " (:TERM NIL "setf expander")
     " available so that it may be used to expand calls to "
     (:MACREF NIL "setf") " later on in the " (:TERM NIL "file") ". "
     (:TERM NIL "Programmers") " must ensure that the " (:PARAM NIL "forms")
     " can be evaluated at compile time if the " (:PARAM NIL "access-fn")
     " is used in a " (:TERM NIL "place") " later in the same "
     (:TERM NIL "file") ". The " (:TERM NIL "compiler") " must make these "
     (:TERM NIL "setf expanders") " available to compile-time calls to "
     (:FUNREF NIL "get-setf-expansion") " when its " (:PARAM NIL "environment")
     " argument is a value received as the "
     (:TERM NIL "environment parameter") " of a " (:TERM NIL "macro") ". "
     (:ENDISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (defun lastguy (x) (car (last x))) → LASTGUY
 (define-setf-expander lastguy (x &environment env)
   \"Set the last element in a list to the given value.\"
   (multiple-value-bind (dummies vals newval setter getter)
       (get-setf-expansion x env)
     (let ((store (gensym)))
       (values dummies
               vals
               `(,store)
               `(progn (rplaca (last ,getter) ,store) ,store)
               `(lastguy ,getter))))) → LASTGUY
 (setq a (list 'a 'b 'c 'd)
       b (list 'x)
       c (list 1 2 3 (list 4 5 6))) → (1 2 3 (4 5 6))
 (setf (lastguy a) 3) → 3
 (setf (lastguy b) 7) → 7
 (setf (lastguy (lastguy c)) 'lastguy-symbol) → LASTGUY-SYMBOL
 a → (A B C 3)
 b → (7)
 c → (1 2 3 (4 5 LASTGUY-SYMBOL))
")
     " " (:COMMENT NIL "% 7.2.0 74") :PAR
     (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
     (:CODE NIL ";;; Setf expander for the form (LDB bytespec int).
;;; Recall that the int form must itself be suitable for SETF.
 (define-setf-expander ldb (bytespec int &environment env)
   (multiple-value-bind (temps vals stores
                          store-form access-form)
       (get-setf-expansion int env);Get setf expansion for int.
     (let ((btemp (gensym))     ;Temp var for byte specifier.
           (store (gensym))     ;Temp var for byte to store.
           (stemp (first stores))) ;Temp var for int to store.
       (if (cdr stores) (error \"Can't expand this.\"))
;;; Return the setf expansion for LDB as five values.
       (values (cons btemp temps)       ;Temporary variables.
               (cons bytespec vals)     ;Value forms.
               (list store)             ;Store variables.
               `(let ((,stemp (dpb ,store ,btemp ,access-form)))
                  ,store-form
                  ,store)               ;Storing form.
               `(ldb ,btemp ,access-form) ;Accessing form.
              ))))
")
     " " (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
     :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "setf") ", "
     (:MACREF NIL "defsetf") ", " (:FUNREF NIL "documentation") ", "
     (:FUNREF NIL "get-setf-expansion") ", " (:SECREF NIL :DOC-VS-DECLS) " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:MACREF NIL "define-setf-expander")
     " differs from the long form of " (:MACREF NIL "defsetf")
     " in that while the body is being executed the " (:TERM NIL "variables")
     " in " (:PARAM NIL "lambda-list") " are bound to parts of the "
     (:TERM NIL "place") " " (:TERM NIL "form")
     ", not to temporary variables that will be bound to the values of such parts. In addition, "
     (:MACREF NIL "define-setf-expander") " does not have "
     (:MACREF NIL "defsetf") "'s restriction that " (:PARAM NIL "access-fn")
     " must be a " (:TERM NIL "function") " or a function-like "
     (:TERM NIL "macro") "; an arbitrary " (:MACREF NIL "defmacro")
     " destructuring pattern is permitted in " (:PARAM NIL "lambda-list") ". "
     :PAR (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " "
     (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== GET-SETF-EXPANSION")
   (:COM (:NAME "get-setf-expansion" :FTYPE "Function")
    (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "GET-SETF-METHOD-ENVIRONMENT:ADD-ARG") " "
     (:DEF (:KIND "function") (:NAMES NIL "get-setf-expansion")
      (:ARGLIST NIL "place " (:KEYWORD NIL " &optional") " environment")
      (:VALUES NIL "vars, vals, store-vars, writer-form, reader-form"))
     " " (:ENDISSUE NIL "GET-SETF-METHOD-ENVIRONMENT:ADD-ARG") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "place") "—a "
     (:TERM NIL "place") ". " :PAR
     (:ISSUE NIL "GET-SETF-METHOD-ENVIRONMENT:ADD-ARG") " "
     (:PARAM NIL "environment") "—an " (:TERM NIL "environment") " "
     (:TERM NIL "object") ". "
     (:ENDISSUE NIL "GET-SETF-METHOD-ENVIRONMENT:ADD-ARG") " " :PAR
     (:PARAM NIL "vars, vals, store-vars, writer-form, reader-form") "—a "
     (:TERM NIL "setf expansion") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 7.2.0 75" "% 7.2.0 77")
     "Determines five values constituting the " (:TERM NIL "setf expansion")
     " for " (:PARAM NIL "place") " in " (:PARAM NIL "environment") "; see "
     (:SECREF NIL :SETF-EXPANSIONS) ". " :PAR
     (:COMMENT NIL "% Redundat with concept info." " \\beginlist" " "
      " \\itemitem{\\bull} A \\term{list} of the temporary variables." " "
      " \\itemitem{\\bull} A \\term{list} of the value \\term{forms} to whose values"
      " 		 the temporary variables are bound." " "
      " \\itemitem{\\bull} A \\term{list} of the store variables." " "
      " \\itemitem{\\bull} The \\term{writer} \\term{form}." " "
      " \\itemitem{\\bull} The \\term{reader} \\term{form}." " " " \\endlist")
     :PAR
     (:COMMENT NIL " \\funref{get-setf-method-multiple-value} "
      " does not check the number of store variables."
      " The intent of \\funref{get-setf-method-multiple-value} "
      " is that it be used in cases "
      " that allow storing multiple values into a \\term{place}. " " "
      " \\funref{get-setf-method} takes care of"
      " error-checking and macro expansion. ")
     :PAR (:ISSUE NIL "GET-SETF-METHOD-ENVIRONMENT:ADD-ARG") " If "
     (:PARAM NIL "environment") " is not supplied or " (:MISC NIL "nil")
     ", the environment is the " (:TERM NIL "null lexical environment") ". "
     (:ENDISSUE NIL "GET-SETF-METHOD-ENVIRONMENT:ADD-ARG") " " :PAR
     (:COMMENT NIL " The consequences are undefined if \\param{place} is not"
      " %a reference to a \\term{place}.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (get-setf-expansion 'x)
→ NIL, NIL, (#:G0001), (SETQ X #:G0001), X 
")
     " " :PAR
     (:COMMENT NIL
      "% Moon: This is so monumentally confusing that it would be better to remove it."
      "%       Note that it never uses the store-variables." " " " \\code"
      "  (define-setf-expander multivalue (x)"
      "      (values '() '() `(,(gensym) ,(gensym)) `(setq ,x 3) '4))"
      " \\EV MULTIVALUE" "  (get-setf-expansion '(multivalue dummy-symbol))"
      " \\EV NIL, NIL, (#:G0002 #:G0003), (SETQ DUMMY-SYMBOL 3), 4"
      " \\endcode")
     :PAR (:ISSUE NIL "GET-SETF-METHOD-ENVIRONMENT:ADD-ARG") " "
     (:COMMENT NIL " The following example is suspect")
     (:CODE NIL ";;; This macro is like POP 

 (defmacro xpop (place &environment env)
   (multiple-value-bind (dummies vals new setter getter)
                        (get-setf-expansion place env)
      `(let* (,@(mapcar #'list dummies vals) (,(car new) ,getter))
         (if (cdr new) (error \"Can't expand this.\"))
         (prog1 (car ,(car new))
                (setq ,(car new) (cdr ,(car new)))
                ,setter))))
 
 (defsetf frob (x) (value) 
     `(setf (car ,x) ,value)) → FROB
;;; The following is an error; an error might be signaled at macro expansion time
 (flet ((frob (x) (cdr x)))  ;Invalid
   (xpop (frob z)))
 
")
     " "
     (:COMMENT NIL ";;; The following will modify (cdr z) and not (car z)"
      " (macrolet ((frob (x) `(cdr ,x)))" "      (xpop (frob z)))")
     (:ENDISSUE NIL "GET-SETF-METHOD-ENVIRONMENT:ADD-ARG") " " :PAR
     (:COMMENT NIL "%% 7.2.0 76" "A version of \\macref{setf}"
      "allowing exactly two"
      "\\term{subforms}, containing no optimization to remove unnecessary variables, and"
      "not allowing storing of multiple values, could be defined by:")
     :PAR
     (:COMMENT NIL "\\code" " (defmacro setf (reference value)"
      "   (multiple-value-bind (vars vals stores store-form access-form)"
      "       (get-setf-expansion reference)"
      "     (declare (ignore access-form))" "     \\bq(let* ,(mapcar #'list"
      "                    (append vars stores)"
      "                    (append vals (list value)))"
      "        ,store-form)))" "\\endcode")
     :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T)
     (:COMMENT NIL "Probably not true.") :PAR
     (:COMMENT NIL "Removed per SETF-METHOD-VS-SETF-METHOD."
      " An error \\oftype{error} is signaled by \\funref{get-setf-expansion}"
      " if there would be more than one store variable.")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defsetf") ", "
     (:MACREF NIL "define-setf-expander") ", " (:MACREF NIL "setf") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "Any " (:TERM NIL "compound form")
     " is a valid " (:TERM NIL "place") ", since any "
     (:TERM NIL "compound form") " whose " (:TERM NIL "operator") " "
     (:PARAM NIL "f") " has no " (:TERM NIL "setf expander")
     " are expanded into a call to " (:TT NIL "(setf " (:PARAM NIL "f") ")")
     ". " :PAR (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SETF" "%% ========== PSETF")
   (:COM (:NAME "setf, psetf" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " "
     (:DEF (:KIND "macro") (:NAMES NIL "setf")
      (:ARGLIST NIL (:STAR NIL (:CURLY NIL (:DOWN NIL "pair"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " (:ENDISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " "
     (:DEF (:KIND "macro") (:NAMES NIL "psetf")
      (:ARGLIST NIL (:STAR NIL (:CURLY NIL (:DOWN NIL "pair"))))
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR (:BNF (:NAME "pair") "place newvalue") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "place") "—a "
     (:TERM NIL "place") ". " :PAR (:PARAM NIL "newvalue") "—a "
     (:TERM NIL "form") ". " :PAR
     (:ISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " "
     (:COMMENT NIL
      " \\param{result}---the \\term{primary value} of the last \\param{newvalue},"
      " 		 or \\nil\\ if there are no \\param{pairs}.")
     (:PARAM NIL "results") "—the " (:TERM NIL "multiple values")
     (:SUB NIL "2") " returned by the storing form for the last "
     (:PARAM NIL "place") ", or " (:MISC NIL "nil") " if there are no "
     (:PARAM NIL "pairs") ". "
     (:ENDISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "setf") " changes the "
     (:TERM NIL "value") " of " (:PARAM NIL "place") " to be "
     (:PARAM NIL "newvalue") ". "
     (:COMMENT NIL
      "% Moon: Also returns a different value; anyway, this is redundant."
      "\\macref{psetf} is like \\macref{setf} except when multiple argument \\param{pairs} are supplied.")
     :PAR (:COMMENT NIL "% 7.2.0 5") (:TT NIL "(setf place newvalue)")
     " expands into an update form that stores the result of evaluating "
     (:PARAM NIL "newvalue") " into the location referred to by "
     (:PARAM NIL "place") ". "
     (:COMMENT NIL "%dussud removed."
      "\\issue{SETF-MULTIPLE-STORE-VARIABLES:ALLOW}"
      "If \\param{newvalue} produces more values than there"
      "are store variables, the extra values are ignored. If \\param{newvalue}"
      "produces fewer values than there are store variables, the missing values"
      "are set to \\nil." "\\endissue{SETF-MULTIPLE-STORE-VARIABLES:ALLOW}"
      "%% KMP/clean-up suggested additional wording.")
     "Some " (:PARAM NIL "place")
     " forms involve uses of accessors that take optional arguments. Whether those optional arguments are permitted by "
     (:MACREF NIL "setf") ", or what their use is, is up to the "
     (:MACREF NIL "setf") " expander function and is not under the control of "
     (:MACREF NIL "setf") ". The documentation for any " (:TERM NIL "function")
     " that accepts " (:KEYREF NIL "optional") ", " (:KEYREF NIL "rest")
     ", or " (:TT NIL " ") "&key arguments and that claims to be usable with "
     (:MACREF NIL "setf") " must specify how those arguments are treated. "
     (:COMMENT NIL "% End KMP/clean-up suggested additional wording.") :PAR
     (:COMMENT NIL "% 7.2.0 6") "If more than one " (:PARAM NIL "pair")
     " is supplied, the " (:PARAM NIL "pairs")
     " are processed sequentially; that is, " :PAR
     (:CODE NIL " (setf place-1 newvalue-1
       place-2 newvalue-2
       ...
       place-N newvalue-N)
")
     " is precisely equivalent to " :PAR
     (:CODE NIL " (progn (setf place-1 newvalue-1)
        (setf place-2 newvalue-2)
        ...
        (setf place-N newvalue-N))
")
     " " (:COMMENT NIL "% 7.2.0 21" "% 7.2.0 22") "For " (:MACREF NIL "psetf")
     ", if more than one " (:PARAM NIL "pair")
     " is supplied then the assignments of new values to places are done in parallel. More precisely, all "
     (:TERM NIL "subforms") " (in both the " (:PARAM NIL "place") " and "
     (:PARAM NIL "newvalue") " " (:TERM NIL "forms")
     ") that are to be evaluated are evaluated from left to right; after all evaluations have been performed, all of the assignments are performed in an unpredictable order. "
     (:COMMENT NIL "% Removed per X3J13. -kmp 5-Oct-93"
      " The unpredictability matters only if more than one \\param{place} form"
      " refers to the same place.")
     :PAR "For detailed treatment of the expansion of " (:MACREF NIL "setf")
     " and " (:MACREF NIL "psetf") ", see " (:SECREF NIL :KINDS-OF-PLACES) ". "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq x (cons 'a 'b) y (list 1 2 3)) → (1 2 3) 
 (setf (car x) 'x (cadr y) (car x) (cdr x) y) → (1 X 3) 
 x → (X 1 X 3) 
 y → (1 X 3) 
 (setq x (cons 'a 'b) y (list 1 2 3)) → (1 2 3) 
 (psetf (car x) 'x (cadr y) (car x) (cdr x) y) → NIL 
 x → (X 1 A 3) 
 y → (1 A 3) 
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:MACREF NIL "define-setf-expander")
     ", " (:MACREF NIL "defsetf") ", " (:VARREF NIL "*macroexpand-hook*") " "
     :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "define-setf-expander")
     ", " (:MACREF NIL "defsetf") ", " (:FUNREF NIL "macroexpand-1") ", "
     (:MACREF NIL "rotatef") ", " (:MACREF NIL "shiftf") ", "
     (:SECREF NIL :GENERALIZED-REFERENCE) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SHIFTF")
   (:COM (:NAME "shiftf" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "shiftf")
      (:ARGLIST NIL (:PLUS NIL (:CURLY NIL (:PARAM NIL "place"))) " newvalue")
      (:VALUES NIL "old-value-1"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:COMMENT NIL "% 7.2.0 23")
     (:PARAM NIL "place") "—a " (:TERM NIL "place") ". " :PAR
     (:PARAM NIL "newvalue") "—a " (:TERM NIL "form") "; evaluated. " :PAR
     (:PARAM NIL "old-value-1") "—an " (:TERM NIL "object") " (the old "
     (:TERM NIL "value") " of the first " (:PARAM NIL "place") "). " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "shiftf")
     " modifies the values of each " (:PARAM NIL "place") " by storing "
     (:PARAM NIL "newvalue") " into the last " (:PARAM NIL "place")
     ", and shifting the values of the second through the last "
     (:PARAM NIL "place") " into the remaining " (:PARAM NIL "places") ". "
     :PAR (:ISSUE NIL "SETF-MULTIPLE-STORE-VARIABLES:ALLOW") " If "
     (:PARAM NIL "newvalue")
     " produces more values than there are store variables, the extra values are ignored. If "
     (:PARAM NIL "newvalue")
     " produces fewer values than there are store variables, the missing values are set to "
     (:MISC NIL "nil") ". "
     (:ENDISSUE NIL "SETF-MULTIPLE-STORE-VARIABLES:ALLOW") " " :PAR
     "In the form "
     (:TT NIL " (shiftf " (:I NIL "place1") " " (:I NIL "place2") " ... "
      (:I NIL "placen") " " (:I NIL "newvalue") ")")
     ", the values in " (:I NIL "place1") " through " (:I NIL "placen") " are "
     (:TERM NIL "read") " and saved, and " (:I NIL "newvalue")
     " is evaluated, for a total of " (:TT NIL "n")
     "+1 values in all. Values 2 through " (:TT NIL "n")
     "+1 are then stored into " (:I NIL "place1") " through " (:I NIL "placen")
     ", respectively. It is as if all the " (:PARAM NIL "places")
     " form a shift register; the " (:PARAM NIL "newvalue")
     " is shifted in from the right, all values shift over to the left one place, and the value shifted out of "
     (:I NIL "place1") " is returned. " :PAR
     (:ISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM")
     " For information about the " (:TERM NIL "evaluation") " of "
     (:TERM NIL "subforms") " of " (:PARAM NIL "places") ", see "
     (:SECREF NIL :GEN-REF-SUB-FORM-EVAL) ". "
     (:ENDISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq x (list 1 2 3) y 'trash) → TRASH
 (shiftf y x (cdr x) '(hi there)) → TRASH
 x → (2 3)
 y → (1 HI THERE)

 (setq x (list 'a 'b 'c)) → (A B C)
 (shiftf (cadr x) 'z) → B
 x → (A Z C)
 (shiftf (cadr x) (cddr x) 'q) → Z
 x → (A (C) . Q)
 (setq n 0) → 0
 (setq x (list 'a 'b 'c 'd)) → (A B C D)
 (shiftf (nth (setq n (+ n 1)) x) 'z) → B
 x → (A Z C D)
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:MACREF NIL "define-setf-expander")
     ", " (:MACREF NIL "defsetf") ", " (:VARREF NIL "*macroexpand-hook*") " "
     :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "setf") ", "
     (:MACREF NIL "rotatef") ", " (:SECREF NIL :GENERALIZED-REFERENCE) " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL "% Removed per Kawabe's comment #2, first public review."
      " \\macref{shiftf} can assign values to lexical as well as dynamic variables.")
     :PAR "The effect of "
     (:TT NIL "(shiftf " (:PARAM NIL "place1") " " (:PARAM NIL "place2")
      " ... " (:PARAM NIL "placen") " " (:PARAM NIL "newvalue") ")")
     " is roughly equivalent to " :PAR
     (:CODE NIL " (let ((var1 " (:PARAM NIL "place1") ")
       (var2 "
      (:PARAM NIL "place2") ")
       ...
       (varn "
      (:PARAM NIL "placen") ")
       (var0 "
      (:PARAM NIL "newvalue") "))
   (setf "
      (:PARAM NIL "place1") " var2)
   (setf "
      (:PARAM NIL "place2") " var3)
   ...
   (setf "
      (:PARAM NIL "placen") " var0)
   var1)
")
     " except that the latter would evaluate any " (:TERM NIL "subforms")
     " of each " (:TT NIL "place") " twice, whereas " (:MACREF NIL "shiftf")
     " evaluates them once. For example, " :PAR
     (:CODE NIL " (setq n 0) → 0
 (setq x (list 'a 'b 'c 'd)) → (A B C D)
 (prog1 (nth (setq n (+ n 1)) x)
        (setf (nth (setq n (+ n 1)) x) 'z)) → B
 x → (A B Z D)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ROTATEF")
   (:COM (:NAME "rotatef" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR (:COMMENT NIL "% 7.2.0 27")
     (:DEF (:KIND "macro") (:NAMES NIL "rotatef")
      (:ARGLIST NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "place"))))
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "place") "—a "
     (:TERM NIL "place") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "rotatef")
     " modifies the values of each " (:PARAM NIL "place")
     " by rotating values from one " (:PARAM NIL "place") " into another. "
     :PAR (:ISSUE NIL "SETF-MULTIPLE-STORE-VARIABLES:ALLOW") " If a "
     (:PARAM NIL "place")
     " produces more values than there are store variables, the extra values are ignored. If a "
     (:PARAM NIL "place")
     " produces fewer values than there are store variables, the missing values are set to "
     (:MISC NIL "nil") ". "
     (:ENDISSUE NIL "SETF-MULTIPLE-STORE-VARIABLES:ALLOW") " " :PAR
     (:COMMENT NIL "% 7.2.0 25") "In the form "
     (:TT NIL "(rotatef " (:I NIL "place1") " " (:I NIL "place2") " ... "
      (:I NIL "placen") ")")
     ", the values in " (:I NIL "place1") " through " (:I NIL "placen") " are "
     (:TERM NIL "read") " and " (:TERM NIL "written") ". Values 2 through "
     (:I NIL "n") " and value 1 are then stored into " (:I NIL "place1")
     " through " (:I NIL "placen")
     ". It is as if all the places form an end-around shift register that is rotated one place to the left, with the value of "
     (:I NIL "place1") " being shifted around the end to " (:I NIL "placen")
     ". " :PAR (:ISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM")
     " For information about the " (:TERM NIL "evaluation") " of "
     (:TERM NIL "subforms") " of " (:PARAM NIL "places") ", see "
     (:SECREF NIL :GEN-REF-SUB-FORM-EVAL) ". "
     (:ENDISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM") " " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (let ((n 0)
        (x (list 'a 'b 'c 'd 'e 'f 'g)))
    (rotatef (nth (incf n) x)
             (nth (incf n) x)
             (nth (incf n) x))
    x) → (A C D B E F G)
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "define-setf-expander")
     ", " (:MACREF NIL "defsetf") ", " (:MACREF NIL "setf") ", "
     (:MACREF NIL "shiftf") ", " (:VARREF NIL "*macroexpand-hook*") ", "
     (:SECREF NIL :GENERALIZED-REFERENCE) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL
      " \\macref{rotatef} can be used to assign values to \\term{lexical variables}"
      " as well as to \\term{dynamic variables}.")
     :PAR (:COMMENT NIL "% 7.2.0 26") "The effect of "
     (:TT NIL "(rotatef " (:PARAM NIL "place1") " " (:PARAM NIL "place2")
      " ... " (:PARAM NIL "placen") ")")
     " is roughly equivalent to " :PAR
     (:CODE NIL " (psetf " (:PARAM NIL "place1") " " (:PARAM NIL "place2") "
        "
      (:PARAM NIL "place2") " " (:PARAM NIL "place3") "
        ...
        "
      (:PARAM NIL "placen") " " (:PARAM NIL "place1") ")
")
     " except that the latter would evaluate any " (:TERM NIL "subforms")
     " of each " (:TT NIL "place") " twice, whereas " (:MACREF NIL "rotatef")
     " evaluates them once. " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Flow Errors --------------------") :PAR
   (:COM (:NAME "control-error" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "control-error")
     ", " (:TYPEREF NIL "error") ", " (:TYPEREF NIL "serious-condition") ", "
     (:TYPEREF NIL "condition") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "control-error")
     " consists of error conditions that result from invalid dynamic transfers of control in a program. The errors that result from giving "
     (:SPECREF NIL "throw") " a tag that is not active or from giving "
     (:SPECREF NIL "go") " or " (:SPECREF NIL "return-from")
     " a tag that is no longer dynamically available are of "
     (:TERM NIL "type") " " (:TYPEREF NIL "control-error") ". " :PAR))
   :PAR
   (:COM (:NAME "program-error" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "program-error")
     ", " (:TYPEREF NIL "error") ", " (:TYPEREF NIL "serious-condition") ", "
     (:TYPEREF NIL "condition") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "program-error")
     " consists of error conditions related to incorrect program syntax. The errors that result from naming a "
     (:TERM NIL "go tag") " or a " (:TERM NIL "block tag")
     " that is not lexically apparent are of " (:TERM NIL "type") " "
     (:TYPEREF NIL "program-error") ". " :PAR))
   :PAR
   (:COM (:NAME "undefined-function" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " "
     (:TYPEREF NIL "undefined-function") ", " (:TYPEREF NIL "cell-error") ", "
     (:TYPEREF NIL "error") ", " (:TYPEREF NIL "serious-condition") ", "
     (:TYPEREF NIL "condition") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "undefined-function") " consists of " (:TERM NIL "error")
     " " (:TERM NIL "conditions") " that represent attempts to "
     (:TERM NIL "read") " the definition of an "
     (:TERM NIL "undefined function") ". "
     (:COMMENT NIL "Barrett: \"name\"?"
      "KMP: An \"undefined function\" is by definition just a \"name\".  See glossary.")
     :PAR "The name of the cell (see " (:TYPEREF NIL "cell-error") ") is the "
     (:TERM NIL "function name") " which was " (:TERM NIL "funbound") ". "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "cell-error-name") " "
     :PAR)))
  " " :PAR)
 (:CHAPTER
  (:NUM "6" :TITLE ("Iteration") :NUMTAG :CHAP-SIX :NAMETAG :ITERATION)
  (:SECTION (:TITLE ("The LOOP Facility") :TAGS (:LOOP-FACILITY)) " " :PAR
   (:SUBSECTION (:TITLE ("Overview of the Loop Facility")) "The "
    (:FUNREF NIL "loop") " " (:TERM NIL "macro") " performs iteration. " :PAR
    (:SUBSUBSECTION (:TITLE ("Simple vs Extended Loop")) (:MACREF NIL "loop")
     " " (:TERM NIL "forms") " are partitioned into two categories: simple "
     (:MACREF NIL "loop") " " (:TERM NIL "forms") " and extended "
     (:MACREF NIL "loop") " " (:TERM NIL "forms") ". " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Simple Loop") :TAGS (:SIMPLE-LOOP)) " " :PAR
      "A simple " (:MACREF NIL "loop") " " (:TERM NIL "form")
      " is one that has a body containing only " (:TERM NIL "compound forms")
      ". " (:COMMENT NIL "% 7.8.1 3") "Each " (:TERM NIL "form") " is "
      (:TERM NIL "evaluated") " in turn from left to right. When the last "
      (:PARAM NIL "form") " has been " (:TERM NIL "evaluated")
      ", then the first " (:PARAM NIL "form")
      " is evaluated again, and so on, in a never-ending cycle. "
      (:COMMENT NIL "% 7.8.1 4") "A simple " (:MACREF NIL "loop") " "
      (:TERM NIL "form") " establishes an " (:TERM NIL "implicit block")
      " named " (:MISC NIL "nil") ". The execution of a simple "
      (:MACREF NIL "loop")
      " can be terminated by explicitly transfering control to the "
      (:TERM NIL "implicit block") " (using " (:MACREF NIL "return") " or "
      (:SPECREF NIL "return-from") ") or to some " (:TERM NIL "exit point")
      " outside of the " (:TERM NIL "block") " (" (:I NIL "e.g.") ",  using "
      (:SPECREF NIL "throw") ", " (:SPECREF NIL "go") ", or "
      (:SPECREF NIL "return-from") "). " :PAR
      (:COMMENT NIL "KMP: What about LOOP-FINISH here?"
       "     Test cases: (loop (loop-finish)) and (loop do (loop (loop-finish)))."
       "     Mail sent to X3J13 saying I was going to make this explicitly vague,"
       "     since some implementations "
       "     See the LOOP-FINISH dictionary entry.")
      :PAR)
     (:COMMENT NIL "========================================")
     (:SUBSUBSUBSECTION (:TITLE ("Extended Loop")) "An extended "
      (:MACREF NIL "loop") " " (:TERM NIL "form")
      " is one that has a body containing " (:TERM NIL "atomic") " "
      (:TERM NIL "expressions") ". When the " (:FUNREF NIL "loop") " "
      (:TERM NIL "macro") " processes such a " (:TERM NIL "form")
      ", it invokes a facility that is commonly called “the Loop Facility.” "
      :PAR
      "The Loop Facility provides standardized access to mechanisms commonly used in iterations through Loop schemas, which are introduced by "
      (:TERM NIL "loop keywords") ". " :PAR "The body of an extended "
      (:MACREF NIL "loop") " " (:TERM NIL "form") " is divided into "
      (:MACREF NIL "loop") " clauses, each which is in turn made up of "
      (:TERM NIL "loop keywords") " and " (:TERM NIL "forms") ". " :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Loop Keywords")) (:TERM NIL "Loop keywords")
     " are not true " (:TERM NIL "keywords") (:SUB NIL "1")
     "; they are special " (:TERM NIL "symbols") ", recognized by "
     (:TERM NIL "name") " rather than " (:TERM NIL "object")
     " identity, that are meaningful only to the " (:MACREF NIL "loop")
     " facility. A " (:TERM NIL "loop keyword") " is a " (:TERM NIL "symbol")
     " but is recognized by its " (:TERM NIL "name")
     " (not its identity), regardless of the " (:TERM NIL "packages")
     " in which it is " (:TERM NIL "accessible") ". " :PAR
     (:ISSUE NIL "JUN90-TRIVIAL-ISSUES:11") " In general, "
     (:TERM NIL "loop keywords") " are not " (:TERM NIL "external symbols")
     " of the " (:PACKREF NIL "common-lisp") " " (:TERM NIL "package")
     ", except in the coincidental situation that a " (:TERM NIL "symbol")
     " with the same name as a " (:TERM NIL "loop keyword")
     " was needed for some other purpose in " (:RM NIL " Common Lisp")
     ". For example, there is a " (:TERM NIL "symbol") " in the "
     (:PACKREF NIL "common-lisp") " " (:TERM NIL "package") " whose "
     (:TERM NIL "name") " is " (:TT NIL "\"UNLESS\"") " but not one whose "
     (:TERM NIL "name") " is " (:TT NIL "\"UNTIL\"") ". "
     (:ENDISSUE NIL "JUN90-TRIVIAL-ISSUES:11") " " :PAR "If no "
     (:TERM NIL "loop keywords") " are supplied in a " (:MACREF NIL "loop") " "
     (:TERM NIL "form")
     ", the Loop Facility executes the loop body repeatedly; see "
     (:SECREF NIL :SIMPLE-LOOP) ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Parsing Loop Clauses"))
     "The syntactic parts of an extended " (:MACREF NIL "loop") " "
     (:TERM NIL "form") " are called clauses; "
     (:COMMENT NIL "the scope \\reviewer{Barmar: what meaning of scope?}%!!!"
      "of each clause")
     "the rules for parsing are determined by " (:COMMENT NIL "the parsing of")
     "that clause's keyword. The following example shows a "
     (:MACREF NIL "loop") " " (:TERM NIL "form") " with six clauses: " :PAR
     (:CODE NIL " (loop for i from 1 to (compute-top-value)       ; first clause
       while (not (unacceptable i))              ; second clause
       collect (square i)                        ; third clause
       do (format t \"Working on ~D now\" i)       ; fourth clause
       when (evenp i)                            ; fifth clause
         do (format t \"~D is a non-odd number\" i)
       finally (format t \"About to exit!\"))      ; sixth clause
")
     " " :PAR (:COMMENT NIL "8 ") "Each " (:TERM NIL "loop keyword")
     " introduces either a compound loop clause or a simple loop clause that can consist of a "
     (:TERM NIL "loop keyword") " followed by a single " (:TERM NIL "form")
     ". The number of " (:TERM NIL "forms")
     " in a clause is determined by the " (:TERM NIL "loop keyword")
     " that begins the clause and by the auxiliary keywords in the clause. The keywords "
     (:LOOPREF NIL "do") ", " (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " "
     (:LOOPREF NIL "doing") ", "
     (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " "
     (:LOOPREF NIL "initially") ", and " (:LOOPREF NIL "finally")
     " are the only loop keywords that can take any number of "
     (:TERM NIL "forms") " and group them as an " (:TERM NIL "implicit progn")
     ". " :PAR (:COMMENT NIL "9 ")
     "Loop clauses can contain auxiliary keywords, which are sometimes called prepositions. For example, the first clause in the code above includes the prepositions "
     (:LOOPREF NIL "from") " and " (:LOOPREF NIL "to")
     ", which mark the value from which stepping begins and the value at which stepping ends. "
     :PAR "For detailed information about " (:MACREF NIL "loop")
     " syntax, see the " (:TERM NIL "macro") " " (:MACREF NIL "loop") ". "
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Expanding Loop Forms")) "A " (:MACREF NIL "loop")
     " " (:TERM NIL "macro form") " expands into a " (:TERM NIL "form")
     " containing "
     (:COMMENT NIL
      "one or more \\term{lambda expressions} for the local \\term{binding} of loop variables")
     "one or more binding forms (that " (:TERM NIL "establish") " "
     (:TERM NIL "bindings") " of loop variables) and a " (:SPECREF NIL "block")
     " and a " (:SPECREF NIL "tagbody")
     " (that express a looping control structure). The variables established in "
     (:MACREF NIL "loop") " are bound as if by " (:SPECREF NIL "let") " or "
     (:MISC NIL "lambda") ". " :PAR
     "Implementations can interleave the setting of initial values with the "
     (:TERM NIL "bindings")
     ". However, the assignment of the initial values is always calculated in the order specified by the user. A variable is thus sometimes bound to a meaningless value of the correct "
     (:TERM NIL "type")
     ", and then later in the prologue it is set to the true initial value by using "
     (:SPECREF NIL "setq") ". "
     (:ISSUE NIL "LOOP-INITFORM-ENVIRONMENT:PARTIAL-INTERLEAVING-VAGUE")
     " One implication of this interleaving is that it is "
     (:TERM NIL "implementation-dependent") " whether the "
     (:TERM NIL "lexical environment") " in which the initial value "
     (:TERM NIL "forms") " (variously called the " (:PARAM NIL "form1") ", "
     (:PARAM NIL "form2") ", " (:PARAM NIL "form3") ", "
     (:PARAM NIL "step-fun") ", " (:PARAM NIL "vector") ", "
     (:PARAM NIL "hash-table") ", and " (:PARAM NIL "package") ") in any "
     (:PARAM NIL "for-as-subclause") ", except "
     (:PARAM NIL "for-as-equals-then") ", are " (:TERM NIL "evaluated")
     " includes only the loop variables preceding that " (:TERM NIL "form")
     " or includes more or all of the loop variables; the "
     (:PARAM NIL "form1") " and " (:PARAM NIL "form2") " in a "
     (:PARAM NIL "for-as-equals-then") " form includes the "
     (:TERM NIL "lexical environment") " of all the loop variables. "
     (:ENDISSUE NIL "LOOP-INITFORM-ENVIRONMENT:PARTIAL-INTERLEAVING-VAGUE") " "
     :PAR (:COMMENT NIL "4") "After the " (:TERM NIL "form")
     " is expanded, it consists of three basic parts in the "
     (:SPECREF NIL "tagbody")
     ": the loop prologue, the loop body, and the loop epilogue. " :PAR
     (:LIST NIL
      (:ITEM NIL (:B NIL "Loop prologue") " " :PAR
       "The loop prologue contains " (:TERM NIL "forms")
       " that are executed before iteration begins, such as any automatic variable initializations prescribed by the "
       (:PARAM NIL "variable") " clauses, along with any "
       (:LOOPREF NIL "initially")
       " clauses in the order they appear in the source. " :PAR)
      (:ITEM NIL (:B NIL "Loop body") " " :PAR "The loop body contains those "
       (:TERM NIL "forms")
       " that are executed during iteration, including application-specific calculations, termination tests, and variable "
       (:TERM NIL "stepping") (:SUB NIL "1") ". " :PAR)
      (:ITEM NIL (:B NIL "Loop epilogue") " " :PAR
       "The loop epilogue contains " (:TERM NIL "forms")
       " that are executed after iteration terminates, such as "
       (:LOOPREF NIL "finally")
       " clauses, if any, along with any implicit return value from an "
       (:PARAM NIL "accumulation") " clause or an "
       (:PARAM NIL "termination-test") " clause. " :PAR))
     " " :PAR (:COMMENT NIL "5") "Some clauses from the source "
     (:TERM NIL "form")
     " contribute code only to the loop prologue; these clauses must come before other clauses that are in the main body of the "
     (:MACREF NIL "loop")
     " form. Others contribute code only to the loop epilogue. All other clauses contribute to the final translated "
     (:TERM NIL "form") " in the same order given in the original source "
     (:TERM NIL "form") " of the " (:MACREF NIL "loop") ". " :PAR
     (:COMMENT NIL "6") "Expansion of the " (:MACREF NIL "loop")
     " macro produces an " (:TERM NIL "implicit block") " named "
     (:MISC NIL "nil") " " (:ISSUE NIL "LOOP-NAMED-BLOCK-NIL:OVERRIDE")
     " unless " (:LOOPREF NIL "named") " is supplied. "
     (:ENDISSUE NIL "LOOP-NAMED-BLOCK-NIL:OVERRIDE") " Thus, "
     (:SPECREF NIL "return-from") " (and sometimes " (:MACREF NIL "return")
     ") can be used to return values from " (:MACREF NIL "loop") " or to exit "
     (:MACREF NIL "loop") ". "
     (:COMMENT NIL "%Barmar: Has nothing to do with LOOP specifically."
      "   Within the executable parts of loop clauses and around the entire"
      "   \\macref{loop} form, variables can be bound by using \\specref{let}.")
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Summary of Loop Clauses"))
     "Loop clauses fall into one of the following categories: " :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Summary of Variable Initialization and Stepping Clauses"))
      "The " (:LOOPREF NIL "for") " and " (:LOOPREF NIL "as")
      " constructs provide iteration control clauses that establish a variable to be initialized. "
      (:LOOPREF NIL "for") " and " (:LOOPREF NIL "as")
      " clauses can be combined with the loop keyword " (:LOOPREF NIL "and")
      " to get " (:TERM NIL "parallel") " initialization and "
      (:TERM NIL "stepping") (:SUB NIL "1")
      ". Otherwise, the initialization and " (:TERM NIL "stepping")
      (:SUB NIL "1") " are " (:TERM NIL "sequential") ". " :PAR
      (:COMMENT NIL "\\issue{LOOP-AND-DISCREPANCY:NO-REITERATION}"
       " When two or more such clauses are joined with \\loopref{and}, "
       " clauses after the first do not have \\loopref{for} or \\loopref{as} before them."
       "\\endissue{LOOP-AND-DISCREPANCY:NO-REITERATION}")
      :PAR "The " (:LOOPREF NIL "with") " construct is similar to a single "
      (:SPECREF NIL "let") " clause. " (:LOOPREF NIL "with")
      " clauses can be combined using the " (:TERM NIL "loop keyword") " "
      (:LOOPREF NIL "and") " to get " (:TERM NIL "parallel")
      " initialization. " :PAR
      (:COMMENT NIL "% Removed per Barmar.  See Termination Clauses."
       "   The \\loopref{repeat} construct causes iteration to terminate after "
       "   a specified number of times.  It uses an internal variable "
       "   to keep track of the number of iterations.")
      :PAR "For more information, see " (:SECREF NIL :LOOP-VAR-INIT-AND-STEP)
      ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Summary of Value Accumulation Clauses"))
      "The " (:LOOPREF NIL "collect") " (or " (:LOOPREF NIL "collecting")
      ") construct takes one " (:TERM NIL "form")
      " in its clause and adds the value of that " (:TERM NIL "form")
      " to the end of a " (:TERM NIL "list") " of values. By default, the "
      (:TERM NIL "list") " of values is returned when the "
      (:MACREF NIL "loop") " finishes. " :PAR "The " (:LOOPREF NIL "append")
      " (or " (:LOOPREF NIL "appending") ") construct takes one "
      (:TERM NIL "form") " in its clause and appends the value of that "
      (:TERM NIL "form") " to the end of a " (:TERM NIL "list")
      " of values. By default, the " (:TERM NIL "list")
      " of values is returned when the " (:MACREF NIL "loop") " finishes. "
      :PAR "The " (:LOOPREF NIL "nconc") " (or " (:LOOPREF NIL "nconcing")
      ") construct is similar to the " (:LOOPREF NIL "append")
      " construct, but its " (:TERM NIL "list")
      " values are concatenated as if by the function " (:LOOPREF NIL "nconc")
      ". By default, the " (:TERM NIL "list")
      " of values is returned when the " (:MACREF NIL "loop") " finishes. "
      :PAR "The " (:LOOPREF NIL "sum") " (or " (:LOOPREF NIL "summing")
      ") construct takes one " (:TERM NIL "form")
      " in its clause that must evaluate to a " (:TERM NIL "number")
      " and accumulates the sum of all these " (:TERM NIL "numbers")
      ". By default, the cumulative sum is returned when the "
      (:MACREF NIL "loop") " finishes. " :PAR "The " (:LOOPREF NIL "count")
      " (or " (:LOOPREF NIL "counting") ") construct takes one "
      (:TERM NIL "form")
      " in its clause and counts the number of times that the "
      (:TERM NIL "form") " evaluates to " (:TERM NIL "true")
      ". By default, the count is returned when the " (:MACREF NIL "loop")
      " finishes. " :PAR "The " (:LOOPREF NIL "minimize") " (or "
      (:LOOPREF NIL "minimizing") ") construct takes one " (:TERM NIL "form")
      " in its clause and determines the minimum value obtained by evaluating that "
      (:TERM NIL "form")
      ". By default, the minimum value is returned when the "
      (:MACREF NIL "loop") " finishes. " :PAR "The " (:LOOPREF NIL "maximize")
      " (or " (:LOOPREF NIL "maximizing") ") construct takes one "
      (:TERM NIL "form")
      " in its clause and determines the maximum value obtained by evaluating that "
      (:TERM NIL "form")
      ". By default, the maximum value is returned when the "
      (:MACREF NIL "loop") " finishes. " :PAR "For more information, see "
      (:SECREF NIL :LOOP-VAL-ACC) ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Summary of Termination Test Clauses")) "The "
      (:LOOPREF NIL "for") " and " (:LOOPREF NIL "as")
      " constructs provide a termination test that is determined by the iteration control clause. "
      :PAR "The " (:LOOPREF NIL "repeat")
      " construct causes termination after a specified number of iterations. "
      (:COMMENT NIL
       "Moved from text removed by Barmar above, so it doesn't get lost. -kmp 30-Jul-91")
      "(It uses an internal variable to keep track of the number of iterations.) "
      :PAR "The " (:LOOPREF NIL "while") " construct takes one "
      (:TERM NIL "form") ", a " (:PARAM NIL "test")
      ", and terminates the iteration if the " (:PARAM NIL "test")
      " evaluates to " (:TERM NIL "false") ". "
      (:COMMENT NIL "!!! Barmar thinks this is not necessary:") "A "
      (:LOOPREF NIL "while") " clause is equivalent to the expression "
      (:TT NIL "(if (not " (:PARAM NIL "test") ") (loop-finish))") ". " :PAR
      "The " (:LOOPREF NIL "until") " construct is the inverse of "
      (:LOOPREF NIL "while") "; it terminates the iteration if the "
      (:PARAM NIL "test") " evaluates to any " (:TERM NIL "non-nil") " value. "
      (:COMMENT NIL "!!! Barmar thinks this is not necessary:") "An "
      (:LOOPREF NIL "until") " clause is equivalent to the expression "
      (:TT NIL "(if " (:PARAM NIL "test") " (loop-finish))") ". " :PAR "The "
      (:LOOPREF NIL "always") " construct takes one " (:TERM NIL "form")
      " and terminates the " (:MACREF NIL "loop") " if the " (:TERM NIL "form")
      " ever evaluates to " (:TERM NIL "false") "; in this case, the "
      (:MACREF NIL "loop") " " (:TERM NIL "form") " returns " (:MISC NIL "nil")
      ". Otherwise, it provides a default return value of " (:MISC NIL "t")
      ". " :PAR "The " (:LOOPREF NIL "never") " construct takes one "
      (:TERM NIL "form") " and terminates the " (:MACREF NIL "loop") " if the "
      (:TERM NIL "form") " ever evaluates to " (:TERM NIL "true")
      "; in this case, the " (:MACREF NIL "loop") " " (:TERM NIL "form")
      " returns " (:MISC NIL "nil")
      ". Otherwise, it provides a default return value of " (:MISC NIL "t")
      ". " :PAR "The " (:LOOPREF NIL "thereis") " construct takes one "
      (:TERM NIL "form") " and terminates the " (:MACREF NIL "loop") " if the "
      (:TERM NIL "form") " ever evaluates to a " (:TERM NIL "non-nil") " "
      (:TERM NIL "object") "; in this case, the " (:MACREF NIL "loop") " "
      (:TERM NIL "form") " returns that " (:TERM NIL "object") ". "
      (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX")
      " Otherwise, it provides a default return value of " (:MISC NIL "nil")
      ". " (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " " :PAR
      (:COMMENT NIL "Added per Barmar:")
      "If multiple termination test clauses are specified, the "
      (:MACREF NIL "loop") " " (:TERM NIL "form")
      " terminates if any are satisfied. " :PAR
      (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " "
      (:COMMENT NIL
       " Note also that the \\macref{loop-finish} macro terminates iteration and returns any"
       " accumulated result.  Any \\loopref{finally} clauses that are supplied are evaluated.")
      (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " " :PAR
      "For more information, see " (:SECREF NIL :LOOP-TERM-TEST) ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Summary of Unconditional Execution Clauses"))
      "The " (:LOOPREF NIL "do") " (or " (:LOOPREF NIL "doing")
      ") construct evaluates all " (:TERM NIL "forms") " in its clause. " :PAR
      "The " (:LOOPREF NIL "return") " construct takes one "
      (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " "
      (:COMMENT NIL " \\term{form} and returns its value.") (:TERM NIL "form")
      ". Any " (:TERM NIL "values") " returned by the " (:TERM NIL "form")
      " are immediately returned by the " (:MACREF NIL "loop") " form. "
      (:COMMENT NIL
       "  It is equivalent to the clause \\f{do (return \\i{value})}.")
      "It is equivalent to the clause "
      (:TT NIL "do (return-from " (:I NIL "block-name") " " (:I NIL "value")
       ")")
      ", where " (:I NIL "block-name") " is the name specified in a "
      (:LOOPREF NIL "named") " clause, or " (:MISC NIL "nil")
      " if there is no " (:LOOPREF NIL "named") " clause. "
      (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " " :PAR
      "For more information, see " (:SECREF NIL :LOOP-UNCONDITIONAL) ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Summary of Conditional Execution Clauses"))
      "The " (:LOOPREF NIL "if") " and " (:LOOPREF NIL "when")
      " constructs take one " (:TERM NIL "form")
      " as a test and a clause that is executed when the test "
      (:TERM NIL "yields") " " (:TERM NIL "true")
      ". The clause can be a value accumulation, unconditional, or another conditional clause; it can also be any combination of such clauses connected by the "
      (:MACREF NIL "loop") " " (:LOOPREF NIL "and") " keyword. " :PAR "The "
      (:MACREF NIL "loop") " " (:LOOPREF NIL "unless")
      " construct is similar to the " (:MACREF NIL "loop") " "
      (:LOOPREF NIL "when")
      " construct except that it complements the test result. " :PAR "The "
      (:MACREF NIL "loop") " " (:LOOPREF NIL "else")
      " construct provides an optional component of " (:LOOPREF NIL "if") ", "
      (:LOOPREF NIL "when") ", and " (:LOOPREF NIL "unless")
      " clauses that is executed when an " (:LOOPREF NIL "if") " or "
      (:LOOPREF NIL "when") " test " (:TERM NIL "yields") " "
      (:TERM NIL "false") " or when an " (:LOOPREF NIL "unless") " test "
      (:TERM NIL "yields") " " (:TERM NIL "true")
      ". The component is one of the clauses described under "
      (:LOOPREF NIL "if") ". " :PAR "The " (:MACREF NIL "loop") " "
      (:LOOPREF NIL "end")
      " construct provides an optional component to mark the end of a conditional clause. "
      :PAR "For more information, see " (:SECREF NIL :LOOP-CONDITIONAL) ". "
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Summary of Miscellaneous Clauses")) "The "
      (:MACREF NIL "loop") " " (:LOOPREF NIL "named")
      " construct gives a name for the " (:TERM NIL "block") " of the loop. "
      :PAR "The " (:MACREF NIL "loop") " " (:LOOPREF NIL "initially")
      " construct causes its " (:TERM NIL "forms")
      " to be evaluated in the loop prologue, which precedes all "
      (:MACREF NIL "loop")
      " code except for initial settings supplied by the constructs "
      (:LOOPREF NIL "with") ", " (:LOOPREF NIL "for") ", or "
      (:LOOPREF NIL "as") ". " :PAR "The " (:MACREF NIL "loop") " "
      (:LOOPREF NIL "finally") " construct causes its " (:TERM NIL "forms")
      " to be evaluated in the loop epilogue after normal iteration terminates. "
      (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " "
      (:COMMENT NIL
       "  An unconditional clause can also follow \\theloopkeyword{finally}.")
      (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " " :PAR
      "For more information, see " (:SECREF NIL :LOOP-MISC) ". " :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Order of Execution"))
     (:IDXTEXT NIL "order of evaluation") (:IDXTEXT NIL "evaluation order") " "
     :PAR (:COMMENT NIL "10")
     "With the exceptions listed below, clauses are executed in the loop body in the order in which they appear in the source. Execution is repeated until a clause terminates the "
     (:MACREF NIL "loop") " or until a " (:MACREF NIL "return") ", "
     (:SPECREF NIL "go") ", or " (:SPECREF NIL "throw") " form is encountered "
     (:COMMENT NIL "I added this next. -kmp 10-Feb-92")
     "which transfers control to a point outside of the loop. The following actions are exceptions to the linear order of execution: "
     :PAR
     (:LIST NIL
      (:ITEM NIL
       " All variables are initialized first, regardless of where the establishing clauses appear in the source. The order of initialization follows the order of these clauses. "
       :PAR)
      (:ITEM NIL " The code for any " (:LOOPREF NIL "initially")
       " clauses is collected into one " (:SPECREF NIL "progn")
       " in the order in which the clauses appear in the source. The collected code is executed once in the loop prologue after any implicit variable initializations. "
       :PAR)
      (:ITEM NIL " The code for any " (:LOOPREF NIL "finally")
       " clauses is collected into one " (:SPECREF NIL "progn")
       " in the order in which the clauses appear in the source. The collected code is executed once in the loop epilogue before any implicit values from the accumulation clauses are returned. Explicit returns anywhere in the source, however, will exit the "
       (:MACREF NIL "loop") " without executing the epilogue code. " :PAR)
      (:ITEM NIL " A " (:LOOPREF NIL "with") " clause introduces a variable "
       (:TERM NIL "binding")
       " and an optional initial value. The initial values are calculated in the order in which the "
       (:LOOPREF NIL "with") " clauses occur. " :PAR)
      (:ITEM NIL
       " Iteration control clauses implicitly perform the following actions: "
       :PAR
       (:LIST NIL (:ITEM NIL "– initialize variables; " :PAR)
        (:ITEM NIL "– " (:TERM NIL "step")
         " variables, generally between each execution of the loop body; "
         :PAR)
        (:ITEM NIL
         "– perform termination tests, generally just before the execution of the loop body. "
         :PAR))
       " "))
     " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Destructuring") :TAGS (:DESTRUCTURING-LOOP-VARS))
     " " :PAR "The " (:PARAM NIL "d-type-spec")
     " argument is used for destructuring. If the " (:PARAM NIL "d-type-spec")
     " argument consists solely of the " (:TERM NIL "type") " "
     (:TYPEREF NIL "fixnum") ", " (:TYPEREF NIL "float") ", "
     (:TYPEREF NIL "t") ", or " (:MISC NIL "nil") ", the "
     (:LOOPREF NIL "of-type") " keyword is optional. The "
     (:LOOPREF NIL "of-type")
     " construct is optional in these cases to provide backwards compatibility; thus, the following two expressions are the same: "
     :PAR (:COMMENT NIL "!!! Barmar: Examples belong in the examples section")
     (:CODE NIL ";;; This expression uses the old syntax for type specifiers.
 (loop for i fixnum upfrom 3 ...)
 
;;; This expression uses the new syntax for type specifiers.
 (loop for i of-type fixnum upfrom 3 ...)

;; Declare X and Y to be of type VECTOR and FIXNUM respectively.
 (loop for (x y) of-type (vector fixnum) 
       in l do ...)
")
     " " :PAR "A " (:TERM NIL "type specifier")
     " for a destructuring pattern is a " (:TERM NIL "tree") " of "
     (:TERM NIL "type specifiers") " with the same shape as the "
     (:TERM NIL "tree") " of " (:TERM NIL "variable") " " (:TERM NIL "names")
     ", with the following exceptions: " :PAR
     (:LIST NIL
      (:ITEM NIL " When aligning the " (:TERM NIL "trees") ", an "
       (:TERM NIL "atom") " in the " (:TERM NIL "tree") " of "
       (:TERM NIL "type specifiers") " that matches a " (:TERM NIL "cons")
       " in the variable tree declares the same " (:TERM NIL "type")
       " for each variable in the subtree rooted at the " (:TERM NIL "cons")
       ". " :PAR)
      (:ITEM NIL " A " (:TERM NIL "cons") " in the " (:TERM NIL "tree") " of "
       (:TERM NIL "type specifiers") " that matches an " (:TERM NIL "atom")
       " in the " (:TERM NIL "tree") " of " (:TERM NIL "variable") " "
       (:TERM NIL "names") " is a " (:TERM NIL "compound type specifer") ". "
       :PAR))
     " " :PAR "Destructuring allows " (:TERM NIL "binding")
     " of a set of variables to a corresponding set of values anywhere that a value can normally be bound to a single variable. During "
     (:MACREF NIL "loop")
     " expansion, each variable in the variable list is matched with the values in the values list. If there are more variables in the variable list than there are values in the values list, the remaining variables are given a value of "
     (:MISC NIL "nil")
     ". If there are more values than variables listed, the extra values are discarded. "
     :PAR "To assign values from a list to the variables " (:TT NIL "a") ", "
     (:TT NIL "b") ", and " (:TT NIL "c") ", the " (:LOOPREF NIL "for")
     " clause could be used to bind the variable " (:TT NIL "numlist")
     " to the " (:TERM NIL "car") " of the supplied " (:PARAM NIL "form")
     ", and then another " (:LOOPREF NIL "for")
     " clause could be used to bind the variables " (:TT NIL "a") ", "
     (:TT NIL "b") ", and " (:TT NIL "c") " " (:TERM NIL "sequentially") ". "
     :PAR (:ISSUE NIL "LOOP-AND-DISCREPANCY:NO-REITERATION") " "
     (:CODE NIL ";; Collect values by using FOR constructs.
 (loop for numlist in '((1 2 4.0) (5 6 8.3) (8 9 10.4))
       for a of-type integer = (first numlist)
       and b of-type integer = (second numlist)
       and c of-type float = (third numlist)
       collect (list c b a))
→ ((4.0 2 1) (8.3 6 5) (10.4 9 8))
")
     " " (:ENDISSUE NIL "LOOP-AND-DISCREPANCY:NO-REITERATION") " " :PAR
     "Destructuring makes this process easier by allowing the variables to be bound in each loop iteration. "
     (:TERM NIL "Types") " can be declared by using a list of "
     (:PARAM NIL "type-spec") " arguments. If all the " (:TERM NIL "types")
     " are the same, a shorthand destructuring syntax can be used, as the second example illustrates. "
     :PAR
     (:CODE NIL ";; Destructuring simplifies the process.
 (loop for (a b c) of-type (integer integer float) in
       '((1 2 4.0) (5 6 8.3) (8 9 10.4))
       collect (list c b a))
→ ((4.0 2 1) (8.3 6 5) (10.4 9 8))
 

;; If all the types are the same, this way is even simpler.
 (loop for (a b c) of-type float in
       '((1.0 2.0 4.0) (5.0 6.0 8.3) (8.0 9.0 10.4))
       collect (list c b a))
→ ((4.0 2.0 1.0) (8.3 6.0 5.0) (10.4 9.0 8.0))
")
     " " :PAR
     "If destructuring is used to declare or initialize a number of groups of variables into "
     (:TERM NIL "types") ", the " (:TERM NIL "loop keyword") " "
     (:LOOPREF NIL "and") " can be used to simplify the process further. "
     (:ISSUE NIL "LOOP-AND-DISCREPANCY:NO-REITERATION") " "
     (:CODE NIL
      ";; Initialize and declare variables in parallel by using the AND construct.
 (loop with (a b) of-type float = '(1.0 2.0)
       and (c d) of-type integer = '(3 4)
       and (e f)
       return (list a b c d e f))
→ (1.0 2.0 3 4 NIL NIL)
")
     " " (:ENDISSUE NIL "LOOP-AND-DISCREPANCY:NO-REITERATION") " " :PAR "If "
     (:MISC NIL "nil")
     " is used in a destructuring list, no variable is provided for its place. "
     :PAR
     (:CODE NIL " (loop for (a nil b) = '(1 2 3)
       do (return (list a b)))
→ (1 3)
")
     " " :PAR "Note that "
     (:COMMENT NIL
      "% Replaced per Moon #42 (first public review) -kmp 6-May-93"
      "nonstandard lists")
     (:TERM NIL "dotted lists") " can specify destructuring. " :PAR
     (:CODE NIL " (loop for (x . y) = '(1 . 2)
       do (return y))
→ 2
 (loop for ((a . b) (c . d)) of-type ((float . float) (integer . integer)) in
       '(((1.2 . 2.4) (3 . 4)) ((3.4 . 4.6) (5 . 6)))
       collect (list a b c d))
→ ((1.2 2.4 3 4) (3.4 4.6 5 6))
")
     " " :PAR "An error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "program-error")
     " is signaled (at macro expansion time) if the same variable is bound twice in any variable-binding clause of a single "
     (:MACREF NIL "loop")
     " expression. Such variables include local variables, iteration control variables, and variables found by destructuring. "
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Restrictions on Side-Effects"))
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " See "
     (:SECREF NIL :TRAVERSAL-RULES) ". "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Variable Initialization and Stepping Clauses") :TAGS
     (:LOOP-VAR-INIT-AND-STEP))
    " " :PAR
    (:SUBSUBSECTION (:TITLE ("Iteration Control"))
     "Iteration control clauses allow direction of " (:MACREF NIL "loop")
     " iteration. The " (:TERM NIL "loop keywords") " " (:LOOPREF NIL "for")
     " and " (:LOOPREF NIL "as") " " (:COMMENT NIL ", and \\loopref{repeat}")
     "designate iteration control clauses. Iteration control clauses differ with respect to the specification of termination tests and to the initialization and "
     (:TERM NIL "stepping") (:SUB NIL "1")
     " of loop variables. Iteration clauses by themselves do not cause the Loop Facility to return values, but they can be used in conjunction with value-accumulation clauses to return values. "
     :PAR "All variables are initialized in the loop prologue. A "
     (:TERM NIL "variable") " " (:TERM NIL "binding") " has "
     (:TERM NIL "lexical scope") " unless it is proclaimed "
     (:DECLREF NIL "special") "; thus, by default, the variable can be "
     (:TERM NIL "accessed") " only by " (:TERM NIL "forms")
     " that lie textually within the " (:MACREF NIL "loop")
     ". Stepping assignments are made in the loop body before any other "
     (:TERM NIL "forms") " are evaluated in the body. " :PAR
     "The variable argument in iteration control clauses can be a destructuring list. A destructuring list is a "
     (:TERM NIL "tree") " whose " (:TERM NIL "non-nil") " " (:TERM NIL "atoms")
     " are " (:TERM NIL "variable") " " (:TERM NIL "names") ". See "
     (:SECREF NIL :DESTRUCTURING-LOOP-VARS) ". " :PAR
     "The iteration control clauses " (:LOOPREF NIL "for") ", "
     (:LOOPREF NIL "as") ", and " (:LOOPREF NIL "repeat")
     " must precede any other loop clauses, except " (:LOOPREF NIL "initially")
     ", " (:LOOPREF NIL "with") ", and " (:LOOPREF NIL "named")
     ", since they establish variable " (:TERM NIL "bindings")
     ". When iteration control clauses are used in a " (:MACREF NIL "loop")
     ", " (:COMMENT NIL "Next line added for JonL:")
     "the corresponding termination tests in the loop body are evaluated before any other loop body code is executed. "
     :PAR
     "If multiple iteration clauses are used to control iteration, variable initialization and "
     (:TERM NIL "stepping") (:SUB NIL "1") " occur " (:TERM NIL "sequentially")
     " by default. The " (:LOOPREF NIL "and")
     " construct can be used to connect two or more iteration clauses when "
     (:TERM NIL "sequential") " " (:TERM NIL "binding") " and "
     (:TERM NIL "stepping") (:SUB NIL "1")
     " are not necessary. The iteration behavior of clauses joined by "
     (:LOOPREF NIL "and") " is analogous to the behavior of the macro "
     (:MACREF NIL "do") " with respect to " (:MACREF NIL "do*") ". " :PAR
     "The " (:LOOPREF NIL "for") " and " (:LOOPREF NIL "as")
     " clauses iterate by using one or more local loop variables that are initialized to some value and that can be modified or "
     (:TERM NIL "stepped") (:SUB NIL "1")
     " after each iteration. For these clauses, iteration terminates when a local variable reaches some supplied value or when some other loop clause terminates iteration. "
     (:COMMENT NIL
      "!!! Barmar: These aren't the only ways for/as can step the variables.")
     "At each iteration, variables can be " (:TERM NIL "stepped")
     (:SUB NIL "1")
     " by an increment or a decrement or can be assigned a new value by the evaluation of a "
     (:TERM NIL "form") "). Destructuring can be used to assign "
     (:COMMENT NIL "% Removed per barmar--It is also used during stepping."
      "initial ")
     "values to variables during iteration. " :PAR "The " (:LOOPREF NIL "for")
     " and " (:LOOPREF NIL "as")
     " keywords are synonyms; they can be used interchangeably. There are seven syntactic formats for these constructs. In each syntactic format, the "
     (:TERM NIL "type") " of " (:PARAM NIL "var")
     " can be supplied by the optional " (:PARAM NIL "type-spec")
     " argument. If " (:PARAM NIL "var") " is a destructuring list, the "
     (:TERM NIL "type") " supplied by the " (:PARAM NIL "type-spec")
     " argument must appropriately match the elements of the list. "
     (:COMMENT NIL
      "!!! Barmar: \"conventions\" belong in the \"Notes\" section.")
     "By convention, " (:LOOPREF NIL "for") " introduces new iterations and "
     (:LOOPREF NIL "as")
     " introduces iterations that depend on a previous iteration specification. "
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("The for-as-arithmetic subclause")) "In the "
      (:I NIL "for-as-arithmetic") " subclause, the " (:LOOPREF NIL "for")
      " or " (:LOOPREF NIL "as")
      " construct iterates from the value supplied by " (:PARAM NIL "form1")
      " to the value supplied by " (:PARAM NIL "form2")
      " in increments or decrements denoted by " (:PARAM NIL "form3")
      ". Each expression is evaluated only once and must evaluate to a "
      (:TERM NIL "number") ". The variable " (:PARAM NIL "var")
      " is bound to the value of " (:PARAM NIL "form1")
      " in the first iteration and is " (:TERM NIL "stepped") (:SUB NIL "1")
      " by the value of " (:PARAM NIL "form3")
      " in each succeeding iteration, or by 1 if " (:PARAM NIL "form3")
      " is not provided. The following " (:TERM NIL "loop keywords")
      " serve as valid prepositions within this syntax. At least one of the "
      (:COMMENT NIL "three classes of")
      "prepositions must be used; and at most one from each line may be used in a single subclause. "
      :PAR
      (:LIST NIL (:ITEM NIL (:TT NIL " from | downfrom | upfrom") " " :PAR)
       (:ITEM NIL (:TT NIL " to | downto | upto | below | above") " " :PAR)
       (:ITEM NIL (:TT NIL " by") " "))
      " " :PAR (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX")
      " The prepositional phrases in each subclause may appear in any order. For example, either “"
      (:TT NIL "from x by y") "” or “" (:TT NIL "by y from x")
      "” is permitted. However, because left-to-right order of evaluation is preserved, the effects will be different in the case of side effects. "
      (:IDXTEXT NIL "order of evaluation") (:IDXTEXT NIL "evaluation order")
      "Consider: " :PAR
      (:CODE NIL "(let ((x 1)) (loop for i from x by (incf x) to 10 collect i))
→ (1 3 5 7 9)
(let ((x 1)) (loop for i by (incf x) from x to 10 collect i))
→ (2 4 6 8 10)
")
      " " (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " " :PAR
      "The descriptions of the prepositions follow: " :PAR
      (:LIST NIL
       (:ITEM NIL (:TT NIL " from") " " :PAR "The " (:TERM NIL "loop keyword")
        " " (:LOOPREF NIL "from") " specifies the value from which "
        (:TERM NIL "stepping") (:SUB NIL "1") " begins, as supplied by "
        (:PARAM NIL "form1") ". " (:TERM NIL "Stepping") (:SUB NIL "1")
        " is incremental by default. If decremental " (:TERM NIL "stepping")
        (:SUB NIL "1") " is desired, the preposition " (:LOOPREF NIL "downto")
        " or " (:LOOPREF NIL "above") " must be used with "
        (:PARAM NIL "form2") ". For incremental " (:TERM NIL "stepping")
        (:SUB NIL "1") ", the default " (:LOOPREF NIL "from") " value is 0. "
        :PAR)
       (:ITEM NIL (:TT NIL " downfrom, upfrom") " " :PAR "The "
        (:TERM NIL "loop keyword") " " (:LOOPREF NIL "downfrom")
        " indicates that the variable " (:PARAM NIL "var")
        " is decreased in decrements supplied by " (:PARAM NIL "form3")
        "; the " (:TERM NIL "loop keyword") " " (:LOOPREF NIL "upfrom")
        " indicates that " (:PARAM NIL "var")
        " is increased in increments supplied by " (:PARAM NIL "form3") ". "
        :PAR)
       (:ITEM NIL (:TT NIL " to") " " :PAR "The " (:TERM NIL "loop keyword")
        " " (:LOOPREF NIL "to") " marks the end value for "
        (:TERM NIL "stepping") (:SUB NIL "1") " supplied in "
        (:PARAM NIL "form2") ". " (:TERM NIL "Stepping") (:SUB NIL "1")
        " is incremental by default. If decremental " (:TERM NIL "stepping")
        (:SUB NIL "1") " is desired, the preposition "
        (:LOOPREF NIL "downfrom") " must be used with " (:PARAM NIL "form1")
        ", or else the preposition " (:LOOPREF NIL "downto") " or "
        (:LOOPREF NIL "above") " should be used instead of "
        (:LOOPREF NIL "to") " with " (:PARAM NIL "form2") ". " :PAR)
       (:ITEM NIL (:TT NIL " downto, upto") " " :PAR "The "
        (:TERM NIL "loop keyword") " " (:LOOPREF NIL "downto")
        " specifies decremental " (:TERM NIL "stepping") "; the "
        (:TERM NIL "loop keyword") " " (:LOOPREF NIL "upto")
        " specifies incremental " (:TERM NIL "stepping")
        ". In both cases, the amount of change on each step is specified by "
        (:PARAM NIL "form3") ", and the " (:MACREF NIL "loop")
        " terminates when the variable " (:PARAM NIL "var")
        " passes the value of " (:PARAM NIL "form2")
        ". Since there is no default for " (:PARAM NIL "form1")
        " in decremental " (:TERM NIL "stepping") (:SUB NIL "1") ", a "
        (:PARAM NIL "form1") " value must be supplied (using "
        (:LOOPREF NIL "from") " or " (:LOOPREF NIL "downfrom") ") when "
        (:LOOPREF NIL "downto") " is supplied. " :PAR)
       (:ITEM NIL (:TT NIL " below, above") " " :PAR "The "
        (:TERM NIL "loop keywords") " " (:LOOPREF NIL "below") " and "
        (:LOOPREF NIL "above") " are analogous to " (:LOOPREF NIL "upto")
        " and " (:LOOPREF NIL "downto")
        " respectively. These keywords stop iteration just before the value of the variable "
        (:PARAM NIL "var") " reaches the value supplied by "
        (:PARAM NIL "form2") "; the end value of " (:PARAM NIL "form2")
        " is not included. Since there is no default for " (:PARAM NIL "form1")
        " in decremental " (:TERM NIL "stepping") (:SUB NIL "1") ", a "
        (:PARAM NIL "form1") " value must be supplied (using "
        (:LOOPREF NIL "from") " or " (:LOOPREF NIL "downfrom") ") when "
        (:LOOPREF NIL "above") " is supplied. " :PAR)
       (:ITEM NIL (:TT NIL " by") " " :PAR "The " (:TERM NIL "loop keyword")
        " " (:LOOPREF NIL "by")
        " marks the increment or decrement supplied by " (:PARAM NIL "form3")
        ". The value of " (:PARAM NIL "form3") " can be any "
        (:COMMENT NIL "!!! Jonl wants to know why \"positive\" here.")
        "positive " (:TERM NIL "number") ". The default value is 1. " :PAR))
      " " :PAR "In an iteration control clause, the " (:LOOPREF NIL "for")
      " or " (:LOOPREF NIL "as")
      " construct causes termination when the supplied limit is reached. That is, iteration continues until the value "
      (:PARAM NIL "var")
      " is stepped to the exclusive or inclusive limit supplied by "
      (:PARAM NIL "form2") ". The range is exclusive if " (:PARAM NIL "form3")
      " increases or decreases " (:PARAM NIL "var") " to the value of "
      (:PARAM NIL "form2") " without reaching that value; the loop keywords "
      (:LOOPREF NIL "below") " and " (:LOOPREF NIL "above")
      " provide exclusive limits. An inclusive limit allows "
      (:PARAM NIL "var") " to attain the value of " (:PARAM NIL "form2") "; "
      (:LOOPREF NIL "to") ", " (:LOOPREF NIL "downto") ", and "
      (:LOOPREF NIL "upto") " provide inclusive limits. " :PAR
      (:COMMENT NIL
       "!!! JonL wonders if we maybe shouldn't define \"incremental\" and \"decremental\" here.")
      :PAR
      (:SUBSUBSUBSUBSECTION
       (:TITLE ("Examples of for-as-arithmetic subclause"))
       (:CODE NIL ";; Print some numbers.
 (loop for i from 1 to 3
       do (print i))
⊳ 1
⊳ 2
⊳ 3
→ NIL
 
;; Print every third number.
 (loop for i from 10 downto 1 by 3
       do (print i))
⊳ 10 
⊳ 7 
⊳ 4 
⊳ 1 
→ NIL
 
;; Step incrementally from the default starting value.
 (loop for i below 3
       do (print i))
⊳ 0
⊳ 1
⊳ 2
→ NIL
")
       " " :PAR)
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("The for-as-in-list subclause")) "In the "
      (:I NIL "for-as-in-list") " subclause, the " (:LOOPREF NIL "for") " or "
      (:LOOPREF NIL "as") " construct iterates over the contents of a "
      (:TERM NIL "list") ". It checks for the end of the " (:TERM NIL "list")
      " as if by using " (:FUNREF NIL "endp") ". The variable "
      (:PARAM NIL "var") " is bound to the successive elements of the "
      (:TERM NIL "list") " in " (:PARAM NIL "form1")
      " before each iteration. At the end of each iteration, the function "
      (:PARAM NIL "step-fun") " is applied to the " (:TERM NIL "list")
      "; the default value for " (:PARAM NIL "step-fun") " is "
      (:FUNREF NIL "cdr") ". The " (:TERM NIL "loop keywords") " "
      (:LOOPREF NIL "in") " and " (:LOOPREF NIL "by")
      " serve as valid prepositions in this syntax. The " (:LOOPREF NIL "for")
      " or " (:LOOPREF NIL "as")
      " construct causes termination when the end of the " (:TERM NIL "list")
      " is reached. " :PAR
      (:SUBSUBSUBSUBSECTION (:TITLE ("Examples of for-as-in-list subclause"))
       (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " "
       (:COMMENT NIL "Added OF-TYPE in the third example. -kmp 29-Apr-93")
       (:CODE NIL ";; Print every item in a list.
 (loop for item in '(1 2 3) do (print item))
⊳ 1
⊳ 2
⊳ 3
→ NIL
 
;; Print every other item in a list.
 (loop for item in '(1 2 3 4 5) by #'cddr
       do (print item))
⊳ 1
⊳ 3
⊳ 5
→ NIL
 
;; Destructure a list, and sum the x values using fixnum arithmetic.
 (loop for (item . x) of-type (t . fixnum) in '((A . 1) (B . 2) (C . 3))
       unless (eq item 'B) sum x)
→ 4
")
       " " (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " " :PAR)
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("The for-as-on-list subclause"))
      (:ISSUE NIL "LOOP-FOR-AS-ON-TYPO:FIX-TYPO") " In the "
      (:I NIL "for-as-on-list") " subclause, the " (:LOOPREF NIL "for") " or "
      (:LOOPREF NIL "as") " construct iterates over "
      (:COMMENT NIL "the contents of") "a " (:TERM NIL "list")
      ". It checks for the end of the " (:TERM NIL "list") " as if by using "
      (:FUNREF NIL "atom") ". " (:ENDISSUE NIL "LOOP-FOR-AS-ON-TYPO:FIX-TYPO")
      " The variable " (:PARAM NIL "var")
      " is bound to the successive tails of the " (:TERM NIL "list") " in "
      (:PARAM NIL "form1") ". At the end of each iteration, the function "
      (:PARAM NIL "step-fun") " is applied to the " (:TERM NIL "list")
      "; the default value for " (:PARAM NIL "step-fun") " is "
      (:FUNREF NIL "cdr") ". The " (:TERM NIL "loop keywords") " "
      (:LOOPREF NIL "on") " and " (:LOOPREF NIL "by")
      " serve as valid prepositions in this syntax. The " (:LOOPREF NIL "for")
      " or " (:LOOPREF NIL "as")
      " construct causes termination when the end of the " (:TERM NIL "list")
      " is reached. " :PAR
      (:SUBSUBSUBSUBSECTION (:TITLE ("Examples of for-as-on-list subclause"))
       (:CODE NIL ";; Collect successive tails of a list.
 (loop for sublist on '(a b c d)
       collect sublist)
→ ((A B C D) (B C D) (C D) (D))
 
;; Print a list by using destructuring with the loop keyword ON.
 (loop for (item) on '(1 2 3)
       do (print item))
⊳ 1 
⊳ 2 
⊳ 3 
→ NIL
 
")
       " " :PAR)
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("The for-as-equals-then subclause")) "In the "
      (:I NIL "for-as-equals-then") " subclause the " (:LOOPREF NIL "for")
      " or " (:LOOPREF NIL "as") " construct initializes the variable "
      (:PARAM NIL "var") " by setting it to the result of evaluating "
      (:PARAM NIL "form1")
      " on the first iteration, then setting it to the result of evaluating "
      (:PARAM NIL "form2") " on the second and subsequent iterations. If "
      (:PARAM NIL "form2") " is omitted, the construct uses "
      (:PARAM NIL "form1") " on the second and subsequent iterations. "
      (:COMMENT NIL "When \\param{form2} is omitted, the expanded"
       "  code shows the following optimization:")
      "The " (:TERM NIL "loop keywords") " " (:MATH NIL (:MO NIL "=")) " and "
      (:LOOPREF NIL "then")
      " serve as valid prepositions in this syntax. This construct does not provide any termination tests. "
      :PAR
      (:SUBSUBSUBSUBSECTION
       (:TITLE ("Examples of for-as-equals-then subclause"))
       (:CODE NIL ";; Collect some numbers.
 (loop for item = 1 then (+ item 10)
       for iteration from 1 to 5
       collect item)
→ (1 11 21 31 41)
")
       " " :PAR)
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("The for-as-across subclause")) "In the "
      (:I NIL "for-as-across") " subclause the " (:LOOPREF NIL "for") " or "
      (:LOOPREF NIL "as") " construct binds the variable " (:PARAM NIL "var")
      " to the value of each element in the array " (:PARAM NIL "vector")
      ". The " (:TERM NIL "loop keyword") " " (:LOOPREF NIL "across")
      " marks the array " (:PARAM NIL "vector") "; " (:LOOPREF NIL "across")
      " is used as a preposition in this syntax. Iteration stops when there are no more elements in the supplied "
      (:TERM NIL "array")
      " that can be referenced. Some implementations might recognize a "
      (:SPECREF NIL "the") " special form in the " (:PARAM NIL "vector")
      " form to produce more efficient code. " :PAR
      (:SUBSUBSUBSUBSECTION (:TITLE ("Examples of for-as-across subclause"))
       (:CODE NIL
        " (loop for char across (the simple-string (find-message channel))
       do (write-char char stream))
")
       " " :PAR)
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("The for-as-hash subclause")) "In the "
      (:I NIL "for-as-hash") " subclause the " (:LOOPREF NIL "for") " or "
      (:LOOPREF NIL "as")
      " construct iterates over the elements, keys, and values of a "
      (:TYPEREF NIL "hash-table")
      ". In this syntax, a compound preposition is used to designate access to a "
      (:TERM NIL "hash table") ". The variable " (:PARAM NIL "var")
      " takes on the value of each hash key or hash value in the supplied "
      (:PARAM NIL "hash-table") ". The following " (:TERM NIL "loop keywords")
      " serve as valid prepositions within this syntax: " :PAR
      (:LIST NIL
       (:ITEM NIL (:LOOPREF NIL "being") " " :PAR "The keyword "
        (:LOOPREF NIL "being") " introduces either the Loop schema "
        (:LOOPREF NIL "hash-key") " or " (:LOOPREF NIL "hash-value") ". " :PAR)
       (:ITEM NIL (:LOOPREF NIL "each") ", " (:LOOPREF NIL "the") " " :PAR
        "The " (:TERM NIL "loop keyword") " " (:LOOPREF NIL "each")
        " follows the " (:TERM NIL "loop keyword") " " (:LOOPREF NIL "being")
        " when " (:LOOPREF NIL "hash-key") " or " (:LOOPREF NIL "hash-value")
        " is used. The " (:TERM NIL "loop keyword") " " (:TT NIL " the")
        " is used with " (:LOOPREF NIL "hash-keys") " and "
        (:LOOPREF NIL "hash-values")
        " only for ease of reading. This agreement isn't required. " :PAR)
       (:ITEM NIL (:LOOPREF NIL "hash-key") ", " (:LOOPREF NIL "hash-keys") " "
        :PAR "These " (:TERM NIL "loop keywords")
        " access each key entry of the " (:TERM NIL "hash table")
        ". If the name " (:LOOPREF NIL "hash-value") " is supplied in a "
        (:LOOPREF NIL "using")
        " construct with one of these Loop schemas, the iteration can optionally access the keyed value. The order in which the keys are accessed is undefined; empty slots in the "
        (:TERM NIL "hash table") " are ignored. " :PAR)
       (:ITEM NIL (:LOOPREF NIL "hash-value") ", " (:LOOPREF NIL "hash-values")
        " " :PAR "These " (:TERM NIL "loop keywords")
        " access each value entry of a " (:TERM NIL "hash table")
        ". If the name " (:LOOPREF NIL "hash-key") " is supplied in a "
        (:LOOPREF NIL "using")
        " construct with one of these Loop schemas, the iteration can optionally access the key that corresponds to the value. The order in which the keys are accessed is undefined; empty slots in the "
        (:TERM NIL "hash table") " are ignored. " :PAR)
       (:ITEM NIL (:LOOPREF NIL "using") " " :PAR "The "
        (:TERM NIL "loop keyword") " " (:LOOPREF NIL "using")
        " introduces the optional key or the keyed value to be accessed. It allows access to the hash key if iteration is over the hash values, and the hash value if iteration is over the hash keys. "
        :PAR)
       (:ITEM NIL (:LOOPREF NIL "in") ", " (:LOOPREF NIL "of") " " :PAR
        "These loop prepositions introduce " (:PARAM NIL "hash-table") ". "
        :PAR))
      " " :PAR (:COMMENT NIL "!!! Barmar: What does this mean?") "In effect "
      :PAR (:LOOPREF NIL "being") " "
      (:CURLY NIL (:LOOPREF NIL "each") " | " (:LOOPREF NIL "the")) " "
      (:CURLY NIL (:LOOPREF NIL "hash-value") " | "
       (:LOOPREF NIL "hash-values") " | " (:LOOPREF NIL "hash-key") " | "
       (:LOOPREF NIL "hash-keys"))
      " " (:CURLY NIL (:LOOPREF NIL "in") " | " (:LOOPREF NIL "of")) " " :PAR
      (:COMMENT NIL " \\code"
       " being \\lbracket\\ each|the\\rbracket \\lbracket\\ hash-value|hash-values|hash-key|hash-key\\rbracket \\lbracket\\ in|of\\rbracket "
       " \\endcode")
      :PAR "is a compound preposition. " :PAR
      "Iteration stops when there are no more hash keys or hash values to be referenced in the supplied "
      (:PARAM NIL "hash-table") ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("The for-as-package subclause")) "In the "
      (:I NIL "for-as-package") " subclause the " (:LOOPREF NIL "for") " or "
      (:LOOPREF NIL "as") " construct iterates over the " (:TERM NIL "symbols")
      " in a " (:TERM NIL "package")
      ". In this syntax, a compound preposition is used to designate access to a "
      (:TERM NIL "package") ". The variable " (:PARAM NIL "var")
      " takes on the value of each " (:TERM NIL "symbol") " in the supplied "
      (:TERM NIL "package") ". The following " (:TERM NIL "loop keywords")
      " serve as valid prepositions within this syntax: " :PAR
      (:LIST NIL
       (:ITEM NIL (:LOOPREF NIL "being") " " :PAR "The keyword "
        (:LOOPREF NIL "being") " introduces either the Loop schema "
        (:LOOPREF NIL "symbol") ", " (:LOOPREF NIL "present-symbol") ", or "
        (:LOOPREF NIL "external-symbol") ". " :PAR)
       (:ITEM NIL (:LOOPREF NIL "each") ", " (:LOOPREF NIL "the") " " :PAR
        "The " (:TERM NIL "loop keyword") " " (:LOOPREF NIL "each")
        " follows the " (:TERM NIL "loop keyword") " " (:LOOPREF NIL "being")
        " when " (:LOOPREF NIL "symbol") ", " (:LOOPREF NIL "present-symbol")
        ", or " (:LOOPREF NIL "external-symbol") " is used. The "
        (:TERM NIL "loop keyword") " " (:LOOPREF NIL "the") " is used with "
        (:LOOPREF NIL "symbols") ", " (:LOOPREF NIL "present-symbols") ", and "
        (:LOOPREF NIL "external-symbols")
        " only for ease of reading. This agreement isn't required. " :PAR)
       (:ITEM NIL (:LOOPREF NIL "present-symbol") ", "
        (:LOOPREF NIL "present-symbols") " " :PAR
        "These Loop schemas iterate over the " (:TERM NIL "symbols") " "
        (:ISSUE NIL "LOOP-PRESENT-SYMBOLS-TYPO:FLUSH-WRONG-WORDS") " that are "
        (:TERM NIL "present") " in a " (:TERM NIL "package") ". "
        (:COMMENT NIL
         " but not \\term{external symbols} of that \\term{package}.")
        (:ENDISSUE NIL "LOOP-PRESENT-SYMBOLS-TYPO:FLUSH-WRONG-WORDS") " The "
        (:PARAM NIL "package")
        " to be iterated over is supplied in the same way that "
        (:TERM NIL "package") " arguments to " (:FUNREF NIL "find-package")
        " are supplied. If the " (:PARAM NIL "package")
        " for the iteration is not supplied, the "
        (:TERM NIL "current package") " is used. If a " (:PARAM NIL "package")
        " that does not exist is supplied, an error of " (:TERM NIL "type") " "
        (:TYPEREF NIL "package-error") " is signaled. " :PAR)
       (:ITEM NIL (:LOOPREF NIL "symbol") ", " (:LOOPREF NIL "symbols") " "
        :PAR "These Loop schemas iterate over " (:TERM NIL "symbols")
        " that are " (:TERM NIL "accessible") " in a given "
        (:PARAM NIL "package") ". The " (:PARAM NIL "package")
        " to be iterated over is supplied in the same way that "
        (:TERM NIL "package") " arguments to " (:FUNREF NIL "find-package")
        " are supplied. If the " (:PARAM NIL "package")
        " for the iteration is not supplied, the "
        (:TERM NIL "current package") " is used. If a " (:PARAM NIL "package")
        " that does not exist is supplied, an error of " (:TERM NIL "type") " "
        (:TYPEREF NIL "package-error") " is signaled. " :PAR)
       (:ITEM NIL (:LOOPREF NIL "external-symbol") ", "
        (:LOOPREF NIL "external-symbols") " " :PAR
        "These Loop schemas iterate over the " (:TERM NIL "external symbols")
        " of a " (:PARAM NIL "package") ". The " (:PARAM NIL "package")
        " to be iterated over is supplied in the same way that "
        (:TERM NIL "package") " arguments to " (:FUNREF NIL "find-package")
        " are supplied. If the " (:PARAM NIL "package")
        " for the iteration is not supplied, the "
        (:TERM NIL "current package") " is used. If a " (:PARAM NIL "package")
        " that does not exist is supplied, an error of " (:TERM NIL "type") " "
        (:TYPEREF NIL "package-error") " is signaled. " :PAR)
       (:ITEM NIL (:LOOPREF NIL "in") ", " (:LOOPREF NIL "of") " " :PAR
        "These loop prepositions introduce " (:PARAM NIL "package") ". " :PAR))
      " " :PAR (:COMMENT NIL "!!! Barmar: What does this mean?") "In effect "
      :PAR (:LOOPREF NIL "being") " "
      (:CURLY NIL (:LOOPREF NIL "each") " | " (:LOOPREF NIL "the")) " "
      (:CURLY NIL (:LOOPREF NIL "symbol") " | " (:LOOPREF NIL "symbols") " | "
       (:LOOPREF NIL "present-symbol") " | " (:LOOPREF NIL "present-symbols")
       " | " (:LOOPREF NIL "external-symbol") " | "
       (:LOOPREF NIL "external-symbols"))
      " " (:CURLY NIL (:LOOPREF NIL "in") " | " (:LOOPREF NIL "of")) " " :PAR
      (:COMMENT NIL " \\code"
       " being \\lbracket\\ each|the\\rbracket \\lbracket\\ \\lbracket\\ \\lbracket\\ "
       " present|external\\rbracket\\ symbol\\rbracket | \\lbracket\\ "
       " \\lbracket\\ present|external\\rbracket symbols\\rbracket\\rbracket \\lbracket\\ in|of\\rbracket"
       " \\endcode")
      :PAR "is a compound preposition. " :PAR
      "Iteration stops when there are no more " (:TERM NIL "symbols")
      " to be referenced in the supplied " (:PARAM NIL "package") ". " :PAR
      (:SUBSUBSUBSUBSECTION (:TITLE ("Examples of for-as-package subclause"))
       (:ISSUE NIL "LOOP-PRESENT-SYMBOLS-TYPO:FLUSH-WRONG-WORDS") " "
       (:CODE NIL " (let ((*package* (make-package \"TEST-PACKAGE-1\")))
   ;; For effect, intern some symbols
   (read-from-string \"(THIS IS A TEST)\")
   (export (intern \"THIS\"))
   (loop for x being each present-symbol of *package*
          do (print x)))
⊳ A 
⊳ TEST 
⊳ THIS
⊳ IS 
→ NIL
")
       " " (:ENDISSUE NIL "LOOP-PRESENT-SYMBOLS-TYPO:FLUSH-WRONG-WORDS") " "
       :PAR)
      :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Local Variable Initializations")) "When a "
     (:MACREF NIL "loop") " " (:TERM NIL "form")
     " is executed, the local variables are bound and are initialized to some value. These local variables exist until "
     (:MACREF NIL "loop")
     " iteration terminates, at which point they cease to exist. Implicit variables are also established by iteration control clauses and the "
     (:LOOPREF NIL "into") " preposition of accumulation clauses. " :PAR "The "
     (:LOOPREF NIL "with")
     " construct initializes variables that are local to a loop. The variables are initialized one time only. If the optional "
     (:PARAM NIL "type-spec") " argument is supplied for the variable "
     (:PARAM NIL "var")
     ", but there is no related expression to be evaluated, "
     (:PARAM NIL "var")
     " is initialized to an appropriate default value for its "
     (:TERM NIL "type") ". "
     (:COMMENT NIL
      "!!! Barmar: How is this default specified for \"wierd\" types? e.g.,"
      "     CLOS classes, DEFSTRUCT types, (OR ...), (AND ...), (SATISFIES ...), package, etc.")
     "For example, for the types " (:TYPEREF NIL "t") ", "
     (:TYPEREF NIL "number") ", and " (:TYPEREF NIL "float")
     ", the default values are " (:MISC NIL "nil") ", " (:TT NIL "0") ", and "
     (:TT NIL "0.0") " respectively. The consequences are undefined if a "
     (:PARAM NIL "type-spec") " argument is supplied for " (:PARAM NIL "var")
     " if the related expression returns a value that is not of the supplied "
     (:TERM NIL "type") ". By default, the " (:LOOPREF NIL "with")
     " construct initializes variables " (:TERM NIL "sequentially")
     "; that is, one variable is assigned a value before the next expression is evaluated. However, by using the "
     (:TERM NIL "loop keyword") " " (:LOOPREF NIL "and") " to join several "
     (:LOOPREF NIL "with")
     " clauses, initializations can be forced to occur in "
     (:TERM NIL "parallel") "; that is, all of the supplied "
     (:PARAM NIL "forms")
     " are evaluated, and the results are bound to the respective variables simultaneously. "
     :PAR
     (:COMMENT NIL
      "The optional \\loopref{and} clause forces \\term{parallel} rather than \\term{sequential} "
      "initializations.")
     (:TERM NIL "Sequential") " " (:TERM NIL "binding")
     " is used when it is desireable for the initialization of some variables to depend on the values of previously bound variables. For example, suppose the variables "
     (:TT NIL "a") ", " (:TT NIL "b") ", and " (:TT NIL "c")
     " are to be bound in sequence: " :PAR
     (:CODE NIL " (loop with a = 1 
       with b = (+ a 2) 
       with c = (+ b 3)
       return (list a b c))
→ (1 3 6)
")
     " " :PAR "The execution of the above " (:MACREF NIL "loop")
     " is equivalent to the execution of the following code: " :PAR
     (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " "
     (:COMMENT NIL "BLOCK moved to outside.")
     (:CODE NIL " (block nil
   (let* ((a 1)
          (b (+ a 2))
          (c (+ b 3)))
     (tagbody
         (next-loop (return (list a b c))
                    (go next-loop)
                    end-loop))))
")
     " " (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " " :PAR
     "If the values of previously bound variables are not needed for the initialization of other local variables, an "
     (:LOOPREF NIL "and") " clause can be used to "
     (:COMMENT NIL "force the bindings to occur in \\term{parallel}:"
      "% for JonL:")
     "specify that the bindings are to occur in " (:TERM NIL "parallel") ": "
     :PAR
     (:CODE NIL " (loop with a = 1 
       and b = 2 
       and c = 3
       return (list a b c))
→ (1 2 3)
")
     " " :PAR
     "The execution of the above loop is equivalent to the execution of the following code: "
     :PAR (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " "
     (:COMMENT NIL "BLOCK moved to outside.")
     (:CODE NIL " (block nil
   (let ((a 1)
         (b 2)
         (c 3))
     (tagbody
         (next-loop (return (list a b c))
                    (go next-loop)
                    end-loop))))
")
     " " (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Examples of WITH clause"))
      (:CODE NIL ";; These bindings occur in sequence.
 (loop with a = 1 
       with b = (+ a 2) 
       with c = (+ b 3)
       return (list a b c))
→ (1 3 6)
 
;; These bindings occur in parallel.
 (setq a 5 b 10)
→ 10
 (loop with a = 1
       and b = (+ a 2)
       and c = (+ b 3)
       return (list a b c))
→ (1 7 13)
 
;; This example shows a shorthand way to declare local variables 
;; that are of different types.
 (loop with (a b c) of-type (float integer float)
       return (format nil \"~A ~A ~A\" a b c))
→ \"0.0 0 0.0\"
 
;; This example shows a shorthand way to declare local variables 
;; that are the same type.
 (loop with (a b c) of-type float 
       return (format nil \"~A ~A ~A\" a b c))
→ \"0.0 0.0 0.0\"
")
      " " :PAR)
     :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Value Accumulation Clauses") :TAGS (:LOOP-VAL-ACC))
    " " :PAR
    (:COMMENT NIL "!!! Moon (comment #40) thinks it would be nice to coalesce "
     "    the discussion of \"into\" here.")
    :PAR "The constructs " (:LOOPREF NIL "collect") ", "
    (:LOOPREF NIL "collecting") ", " (:LOOPREF NIL "append") ", "
    (:LOOPREF NIL "appending") ", " (:LOOPREF NIL "nconc") ", "
    (:LOOPREF NIL "nconcing") ", " (:LOOPREF NIL "count") ", "
    (:LOOPREF NIL "counting") ", " (:LOOPREF NIL "maximize") ", "
    (:LOOPREF NIL "maximizing") ", " (:LOOPREF NIL "minimize") ", "
    (:LOOPREF NIL "minimizing") ", " (:LOOPREF NIL "sum") ", and "
    (:LOOPREF NIL "summing") ", allow values to be accumulated in a "
    (:MACREF NIL "loop") ". " :PAR
    (:COMMENT NIL
     "Accumulating values during iteration and returning them from a loop"
     "is often useful.  Some of these accumulations occur so"
     "frequently that special loop clauses have been developed to handle them.")
    :PAR "The constructs " (:LOOPREF NIL "collect") ", "
    (:LOOPREF NIL "collecting") ", " (:LOOPREF NIL "append") ", "
    (:LOOPREF NIL "appending") ", " (:LOOPREF NIL "nconc") ", and "
    (:LOOPREF NIL "nconcing") ", designate clauses that accumulate values in "
    (:TERM NIL "lists") " and return them. The constructs "
    (:LOOPREF NIL "count") ", " (:LOOPREF NIL "counting") ", "
    (:LOOPREF NIL "maximize") ", " (:LOOPREF NIL "maximizing") ", "
    (:LOOPREF NIL "minimize") ", " (:LOOPREF NIL "minimizing") ", "
    (:LOOPREF NIL "sum") ", and " (:LOOPREF NIL "summing")
    " designate clauses that accumulate and return numerical values. " :PAR
    "During each iteration, the constructs " (:LOOPREF NIL "collect") " and "
    (:LOOPREF NIL "collecting") " collect the value of the supplied "
    (:PARAM NIL "form") " into a " (:TERM NIL "list")
    ". When iteration terminates, the " (:TERM NIL "list")
    " is returned. The argument " (:PARAM NIL "var") " is set to the "
    (:TERM NIL "list") " of collected values; if " (:PARAM NIL "var")
    " is supplied, the " (:MACREF NIL "loop") " does not return the final "
    (:TERM NIL "list") " automatically. If " (:PARAM NIL "var")
    " is not supplied, it is equivalent to supplying an internal name for "
    (:PARAM NIL "var") " and returning its value in a "
    (:LOOPREF NIL "finally") " clause. The " (:PARAM NIL "var")
    " argument is bound as if by the construct " (:LOOPREF NIL "with") ". "
    (:COMMENT NIL "A \\term{type} cannot be supplied for \\param{var};")
    "No mechanism is provided for declaring the " (:TERM NIL "type") " of "
    (:PARAM NIL "var") "; it must be of " (:TERM NIL "type") " "
    (:TYPEREF NIL "list") ". " :PAR
    (:COMMENT NIL
     "%Removed per Barmar. Fully redundant with next couple of paragraphs."
     " The \\loopref{append} construct is similar to \\loopref{collect} except the"
     " values of the supplied \\param{form} must be "
     " \\term{lists}.  These \\term{lists} are not modified"
     " but are concatenated together into a single "
     " \\term{list}, as if they were arguments" " to \\funref{append}."
     " The argument \\param{var} is "
     " bound to the list of concatenated values; if \\param{var} is supplied, the loop"
     " does not return the final "
     " \\term{list} automatically.  The \\param{var} argument"
     " is bound as if by the construct \\loopref{with}."
     "  A \\term{type} cannot be supplied for \\param{var}; it must be \\oftype{list}.")
    :PAR "The constructs " (:LOOPREF NIL "append") ", "
    (:LOOPREF NIL "appending") ", " (:LOOPREF NIL "nconc") ", and "
    (:LOOPREF NIL "nconcing") " are similar to " (:LOOPREF NIL "collect")
    " except that the values of the supplied " (:PARAM NIL "form") " must be "
    (:TERM NIL "lists") ". " :PAR
    (:LIST NIL
     (:ITEM NIL " The " (:LOOPREF NIL "append") " keyword causes its "
      (:TERM NIL "list") " values to be concatenated into a single "
      (:TERM NIL "list") ", as if they were arguments to the "
      (:TERM NIL "function") " " (:FUNREF NIL "append") ". " :PAR)
     (:ITEM NIL " The " (:LOOPREF NIL "nconc") " keyword causes its "
      (:TERM NIL "list") " values to be concatenated into a single "
      (:TERM NIL "list") ", as if they were arguments to the "
      (:TERM NIL "function") " " (:FUNREF NIL "nconc") ". "))
    " " :PAR "The argument " (:PARAM NIL "var") " is set to the "
    (:TERM NIL "list") " of concatenated values; if " (:PARAM NIL "var")
    " is supplied, " (:MACREF NIL "loop") " does not return the final "
    (:TERM NIL "list") " automatically. The " (:PARAM NIL "var")
    " argument is bound as if by the construct " (:LOOPREF NIL "with") ". A "
    (:TERM NIL "type") " cannot be supplied for " (:PARAM NIL "var")
    "; it must be of " (:TERM NIL "type") " " (:TYPEREF NIL "list")
    ". The construct " (:LOOPREF NIL "nconc")
    " destructively modifies its argument " (:TERM NIL "lists") ". " :PAR
    (:COMMENT NIL
     " Barmar: Is it required to coerce the sum to the specified type?"
     "  Test case: (loop for x in '(a b c) count x into z of-type float finally (return z))"
     "  Mail sent to Quinquevirate (issue LOOP-DECLARATION-VS-COERCION)")
    "The " (:LOOPREF NIL "count")
    " construct counts the number of times that the supplied "
    (:PARAM NIL "form") " returns " (:TERM NIL "true") ". The argument "
    (:PARAM NIL "var") " accumulates the number of occurrences; if "
    (:PARAM NIL "var") " is supplied, " (:MACREF NIL "loop")
    " does not return the final count automatically. The " (:PARAM NIL "var")
    " argument is bound as if by the construct " (:LOOPREF NIL "with") " "
    (:COMMENT NIL "% Per Moon #40, First Public Review. -kmp 28-Jul-93")
    "to a zero of the appropriate type. "
    (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93")
    "Subsequent values (including any necessary coercions) are computed as if by the function "
    (:FUNREF NIL "1+") ". If " (:LOOPREF NIL "into") " " (:PARAM NIL "var")
    " is used, a " (:TERM NIL "type") " can be supplied for "
    (:PARAM NIL "var") " with the " (:PARAM NIL "type-spec")
    " argument; the consequences are unspecified if a nonnumeric "
    (:TERM NIL "type") " is supplied. If there is no " (:LOOPREF NIL "into")
    " variable, the optional " (:PARAM NIL "type-spec")
    " argument applies to the internal variable that is keeping the count. The default "
    (:TERM NIL "type") " is " (:TERM NIL "implementation-dependent")
    "; but it must be "
    (:COMMENT NIL "% Per Moon #40, First Public Review -kmp 28-Jul-93") "a "
    (:TERM NIL "supertype") " of " (:TERM NIL "type") " "
    (:TYPEREF NIL "fixnum") ". " :PAR
    (:COMMENT NIL
     "Barmar: For these next three, is type-spec a declaration, coercion, or both?"
     "  Test cases: (loop for x in '(1 2 3) minimize x into z of-type float finally (return z))"
     " 	       (loop for x in '(1 2 3) sum x into z of-type float finally (return z))")
    "The " (:LOOPREF NIL "maximize") " and "
    (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93" "\\loopref{minimum}")
    (:LOOPREF NIL "minimize") " constructs compare the value of the supplied "
    (:PARAM NIL "form")
    " obtained during the first iteration with values obtained in successive iterations. The maximum (for "
    (:LOOPREF NIL "maximize") ") or minimum (for " (:LOOPREF NIL "minimize")
    ") value encountered is determined "
    (:COMMENT NIL "% Per Moon #40, First Public Review -kmp 28-Jul-93")
    "(as if by the " (:TERM NIL "function") " " (:FUNREF NIL "max") " for "
    (:LOOPREF NIL "maximize") " and as if by the " (:TERM NIL "function") " "
    (:FUNREF NIL "min") " for " (:LOOPREF NIL "minimize") ") and returned. "
    (:COMMENT NIL "% Per Moon #40, First Public Review -kmp 28-Jul-93")
    "If the " (:LOOPREF NIL "maximize") " or " (:LOOPREF NIL "minimize")
    " clause is never executed, the accumulated value is unspecified. The argument "
    (:PARAM NIL "var") " accumulates the maximum or minimum value; if "
    (:PARAM NIL "var") " is supplied, " (:MACREF NIL "loop")
    " does not return the maximum or minimum automatically. The "
    (:PARAM NIL "var") " argument is bound as if by the construct "
    (:LOOPREF NIL "with") ". If " (:LOOPREF NIL "into") " " (:PARAM NIL "var")
    " is used, a " (:TERM NIL "type") " can be supplied for "
    (:PARAM NIL "var") " with the " (:PARAM NIL "type-spec")
    " argument; the consequences are unspecified if a nonnumeric "
    (:TERM NIL "type") " is supplied. If there is no " (:LOOPREF NIL "into")
    " variable, the optional " (:PARAM NIL "type-spec")
    " argument applies to the internal variable that is keeping the maximum or minimum value. "
    (:COMMENT NIL "% Per Moon #40, First Public Review -kmp 28-Jul-93")
    "The default " (:TERM NIL "type") " "
    (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93") "is "
    (:TERM NIL "implementation-dependent") "; but it must be a "
    (:TERM NIL "supertype") " of " (:TERM NIL "type") " " (:TYPEREF NIL "real")
    ". " :PAR "The " (:LOOPREF NIL "sum")
    " construct forms a cumulative sum of the successive "
    (:TERM NIL "primary values") " of the supplied " (:PARAM NIL "form")
    " at each iteration. The argument " (:PARAM NIL "var")
    " is used to accumulate the sum; if " (:PARAM NIL "var") " is supplied, "
    (:MACREF NIL "loop") " does not return the final sum automatically. The "
    (:PARAM NIL "var") " argument is bound as if by the construct "
    (:LOOPREF NIL "with") " "
    (:COMMENT NIL "% Per Moon #40, First Public Review -kmp 28-Jul-93")
    "to a zero of the appropriate type. Subsequent values (including any necessary coercions) are computed as if by the "
    (:TERM NIL "function") " " (:FUNREF NIL "+") ". If " (:LOOPREF NIL "into")
    " " (:PARAM NIL "var") " is used, a " (:TERM NIL "type")
    " can be supplied for " (:PARAM NIL "var") " with the "
    (:PARAM NIL "type-spec")
    " argument; the consequences are unspecified if a nonnumeric "
    (:TERM NIL "type") " is supplied. If there is no " (:LOOPREF NIL "into")
    " variable, the optional " (:PARAM NIL "type-spec")
    " argument applies to the internal variable that is keeping the sum. "
    (:COMMENT NIL "% Per Moon #40, First Public Review -kmp 28-Jul-93")
    "The default " (:TERM NIL "type") " "
    (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93") "is "
    (:TERM NIL "implementation-dependent") "; but it must be a "
    (:TERM NIL "supertype") " of " (:TERM NIL "type") " "
    (:TYPEREF NIL "number") ". " :PAR
    (:COMMENT NIL "% Removed per barmar. Redundant with the above."
     " The loop preposition \\loopref{into} can be used to name the "
     " variable used to hold partial accumulations."
     " The variable is bound as if by the loop" " construct \\loopref{with}. ")
    "If " (:LOOPREF NIL "into")
    " is used, the construct does not provide a default return value; however, the variable is available for use in any "
    (:LOOPREF NIL "finally") " clause. " :PAR
    (:COMMENT NIL "These \\term{loop keywords}"
     "can also be spelled with the optional suffix {\\tt ing}.")
    :PAR
    (:COMMENT NIL "% Replaced per Moon #40, First Public Review -kmp 28-Jul-93"
     " Value-returning accumulation clauses can be combined in a \\macref{loop} if"
     " all the clauses accumulate the same \\term{type} of \\term{object}.  "
     " By default, the Loop Facility returns only one value;"
     " thus, the \\term{objects} collected by multiple accumulation clauses "
     " as return values must have compatible \\term{types}. For example, since both"
     " the \\loopref{collect} and \\loopref{append} constructs accumulate "
     " \\term{objects} into a" " \\term{list} that is returned from a "
     " \\macref{loop}, they can be combined safely.")
    "Certain kinds of accumulation clauses can be combined in a "
    (:MACREF NIL "loop") " if their destination is the same (the result of "
    (:MACREF NIL "loop") " or an " (:LOOPREF NIL "into") " " (:PARAM NIL "var")
    ") because they are considered to accumulate conceptually compatible quantities. In particular, any elements of following sets of accumulation clauses can be mixed with other elements of the same set for the same destination in a "
    (:MACREF NIL "loop") " " (:TERM NIL "form") ": " :PAR
    (:LIST NIL
     (:ITEM NIL " " (:LOOPREF NIL "collect") ", " (:LOOPREF NIL "append") ", "
      (:LOOPREF NIL "nconc") " " :PAR)
     (:ITEM NIL " " (:LOOPREF NIL "sum") ", " (:LOOPREF NIL "count") " " :PAR)
     (:ITEM NIL " " (:LOOPREF NIL "maximize") ", " (:LOOPREF NIL "minimize")
      " "))
    " " :PAR
    (:CODE NIL ";; Collect every name and the kids in one list by using 
;; COLLECT and APPEND.
 (loop for name in '(fred sue alice joe june)
       for kids in '((bob ken) () () (kris sunshine) ())
       collect name
       append kids)
→ (FRED BOB KEN SUE ALICE JOE KRIS SUNSHINE JUNE)
")
    " " :PAR (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93" "Multiple")
    "Any two clauses that do not accumulate the same " (:TERM NIL "type")
    " of " (:TERM NIL "object") " can coexist in a " (:MACREF NIL "loop")
    " only if each clause accumulates its values into a different "
    (:COMMENT NIL
     "% Removed per Barmar -- \"some can still use the default\" (i.e., not supply a var)"
     "user-specified")
    (:TERM NIL "variable") ". " :PAR
    (:COMMENT NIL "Any number of values can"
     "be returned from \\macref{loop} if \\thefunction{values} is used,"
     "as the next example shows:" " " "\\code"
     ";; Count and collect names and ages."
     " (loop for name in '(fred sue alice joe june)"
     "       as age in '(22 26 19 20 10)"
     "       append (list name age) into name-and-age-list"
     "       count name into name-count" "       sum age into total-age"
     "       finally" "       (return"
     "        (values (round total-age name-count)"
     "                 name-and-age-list)))"
     "\\EV 19, (FRED 22 SUE 26 ALICE 19 JOE 20 JUNE 10)" "\\endcode")
    :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of COLLECT clause"))
     (:CODE NIL ";; Collect all the symbols in a list.
 (loop for i in '(bird 3 4 turtle (1 . 4) horse cat)
       when (symbolp i) collect i)
→ (BIRD TURTLE HORSE CAT)
 
;; Collect and return odd numbers.
 (loop for i from 1 to 10
       if (oddp i) collect i)
→ (1 3 5 7 9)
 
;; Collect items into local variable, but don't return them.
 (loop for i in '(a b c d) by #'cddr
       collect i into my-list
       finally (print my-list))
⊳ (A C) 
→ NIL
")
     " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of APPEND and NCONC clauses"))
     (:CODE NIL ";; Use APPEND to concatenate some sublists.
  (loop for x in '((a) (b) ((c)))
        append x)
→ (A B (C))
 
;; NCONC some sublists together.  Note that only lists made by the
;; call to LIST are modified.
  (loop for i upfrom 0 
        as x in '(a b (c))
        nconc (if (evenp i) (list x) nil))
→ (A (C))
")
     " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of COUNT clause"))
     (:CODE NIL " (loop for i in '(a b nil c nil d e)
       count i)
→ 5
")
     " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of MAXIMIZE and MINIMIZE clauses"))
     (:CODE NIL " (loop for i in '(2 1 5 3 4)
       maximize i)
→ 5
 (loop for i in '(2 1 5 3 4)
       minimize i)
→ 1
 
;; In this example, FIXNUM applies to the internal variable that holds
;; the maximum value.
 (setq series '(1.2 4.3 5.7))
→ (1.2 4.3 5.7)
 (loop for v in series 
       maximize (round v) of-type fixnum)
→ 6
 
;; In this example, FIXNUM applies to the variable RESULT.
 (loop for v of-type float in series
       minimize (round v) into result of-type fixnum
       finally (return result))
→ 1
")
     " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of SUM clause"))
     (:CODE NIL " (loop for i of-type fixnum in '(1 2 3 4 5)
       sum i)
→ 15
 (setq series '(1.2 4.3 5.7))
→ (1.2 4.3 5.7)
 (loop for v in series 
       sum (* 2.0 v))
→ 22.4
")
     " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Termination Test Clauses") :TAGS (:LOOP-TERM-TEST))
    " " :PAR "The " (:LOOPREF NIL "repeat")
    " construct causes iteration to terminate after a specified number of times. The loop body executes "
    (:I NIL "n") " times, where " (:I NIL "n")
    " is the value of the expression " (:PARAM NIL "form") ". The "
    (:PARAM NIL "form")
    " argument is evaluated one time in the loop prologue. If the expression evaluates to 0 or to a negative "
    (:TERM NIL "number") ", the loop body is not evaluated. " :PAR
    "The constructs " (:LOOPREF NIL "always") ", " (:LOOPREF NIL "never") ", "
    (:LOOPREF NIL "thereis") ", " (:LOOPREF NIL "while") ", "
    (:LOOPREF NIL "until") ", and the macro " (:MACREF NIL "loop-finish")
    " allow conditional termination of iteration within a "
    (:MACREF NIL "loop") ". " :PAR "The constructs " (:LOOPREF NIL "always")
    ", " (:LOOPREF NIL "never") ", and " (:LOOPREF NIL "thereis")
    " provide specific values to be returned when a " (:MACREF NIL "loop")
    " terminates. Using " (:LOOPREF NIL "always") ", " (:LOOPREF NIL "never")
    ", or " (:LOOPREF NIL "thereis")
    " in a loop with value accumulation clauses that are not "
    (:LOOPREF NIL "into") " causes an error of " (:TERM NIL "type") " "
    (:TYPEREF NIL "program-error")
    " to be signaled (at macro expansion time). Since " (:LOOPREF NIL "always")
    ", " (:LOOPREF NIL "never") ", and " (:LOOPREF NIL "thereis") " use "
    (:ISSUE NIL "LOOP-NAMED-BLOCK-NIL:OVERRIDE") " the "
    (:SPECREF NIL "return-from") " " (:TERM NIL "special operator") " "
    (:ENDISSUE NIL "LOOP-NAMED-BLOCK-NIL:OVERRIDE")
    " to terminate iteration, any " (:LOOPREF NIL "finally")
    " clause that is supplied is not evaluated "
    (:COMMENT NIL "Added for JonL")
    "when exit occurs due to any of these constructs. In all other respects these constructs behave like the "
    (:LOOPREF NIL "while") " and " (:LOOPREF NIL "until") " constructs. " :PAR
    "The " (:LOOPREF NIL "always") " construct takes one " (:TERM NIL "form")
    " and terminates the " (:MACREF NIL "loop") " if the " (:TERM NIL "form")
    " ever evaluates to " (:MISC NIL "nil") "; in this case, it returns "
    (:MISC NIL "nil") ". Otherwise, it provides a default return value of "
    (:MISC NIL "t") ". If the value of the supplied " (:TERM NIL "form")
    " is never " (:MISC NIL "nil")
    ", some other construct can terminate the iteration. " :PAR
    (:COMMENT NIL "  The {\\tt never} construct takes one "
     "\\term{form} and terminates the \\macref{loop}"
     "  if the \\term{form} ever evaluates to \\term{non-nil}; in this case, it returns"
     "  \\nil.  Otherwise, it provides a default return value of {\\tt t}.")
    "The " (:LOOPREF NIL "never")
    " construct terminates iteration the first time that the value of the supplied "
    (:PARAM NIL "form") " is " (:TERM NIL "non-nil") "; the "
    (:MACREF NIL "loop") " returns " (:MISC NIL "nil")
    ". If the value of the supplied " (:PARAM NIL "form") " is always "
    (:MISC NIL "nil")
    ", some other construct can terminate the iteration. Unless some other clause contributes a return value, the default value returned is "
    (:MISC NIL "t") ". " :PAR
    (:COMMENT NIL
     "  The {\\tt thereis} construct takes one \\param{form} and terminates the "
     "\\macref{loop}"
     "  if the \\param{form} ever evaluates to \\term{non-nil}; in this case, it returns"
     "  that value.        ")
    "The " (:LOOPREF NIL "thereis")
    " construct terminates iteration the first time that the value of the supplied "
    (:PARAM NIL "form") " is " (:TERM NIL "non-nil") "; the "
    (:MACREF NIL "loop") " returns the value of the supplied "
    (:PARAM NIL "form") ". If the value of the supplied " (:PARAM NIL "form")
    " is always " (:MISC NIL "nil")
    ", some other construct can terminate the iteration. Unless some other clause contributes a return value, the default value returned is "
    (:MISC NIL "nil") ". " :PAR
    (:COMMENT NIL
     "!!! Barmar: Combine this differences info with never/until below.")
    "There are two differences between the " (:LOOPREF NIL "thereis") " and "
    (:LOOPREF NIL "until") " constructs: " :PAR
    (:LIST NIL
     (:ITEM NIL " The " (:LOOPREF NIL "until")
      " construct does not return a value or " (:MISC NIL "nil")
      " based on the value of the supplied " (:PARAM NIL "form") ". " :PAR)
     (:ITEM NIL " The " (:LOOPREF NIL "until") " construct executes any "
      (:LOOPREF NIL "finally") " clause. Since " (:LOOPREF NIL "thereis")
      " uses " (:ISSUE NIL "LOOP-NAMED-BLOCK-NIL:OVERRIDE") " the "
      (:SPECREF NIL "return-from") " " (:TERM NIL "special operator") " "
      (:ENDISSUE NIL "LOOP-NAMED-BLOCK-NIL:OVERRIDE")
      " to terminate iteration, any " (:LOOPREF NIL "finally")
      " clause that is supplied is not evaluated "
      (:COMMENT NIL "Added per JonL") "when exit occurs due to "
      (:LOOPREF NIL "thereis") ". " :PAR))
    " " :PAR "The " (:LOOPREF NIL "while")
    " construct allows iteration to continue until the supplied "
    (:PARAM NIL "form") " evaluates to " (:TERM NIL "false") ". The supplied "
    (:PARAM NIL "form") " is reevaluated at the location of the "
    (:LOOPREF NIL "while") " clause. " :PAR "The " (:LOOPREF NIL "until")
    " construct is equivalent to "
    (:TT NIL "while (not " (:PARAM NIL "form") ")…")
    ". If the value of the supplied " (:PARAM NIL "form") " is "
    (:TERM NIL "non-nil") ", iteration terminates. " :PAR
    (:COMMENT NIL "% Removed per X3J13. -kmp 4-Oct-93"
     " The \\loopref{while} and \\loopref{until} constructs can be used"
     " at any point in a \\macref{loop}.  "
     "% Next two lines (sentences) moved from farther down per X3J13.  -kmp 4-Oct-93")
    "Termination-test control constructs can be used anywhere within the loop body. The termination tests are used in the order in which they appear. If an "
    (:LOOPREF NIL "until") " or " (:LOOPREF NIL "while")
    " clause causes termination, any clauses that precede it in the source are still evaluated. If the "
    (:LOOPREF NIL "until") " and " (:TT NIL " while")
    " constructs cause termination, control is passed to the loop epilogue, where any "
    (:LOOPREF NIL "finally") " clauses will be executed. " :PAR
    "There are two differences between the " (:LOOPREF NIL "never") " and "
    (:LOOPREF NIL "until") " constructs: " :PAR
    (:LIST NIL
     (:ITEM NIL " The " (:LOOPREF NIL "until") " construct does not return "
      (:MISC NIL "t") " or " (:MISC NIL "nil")
      " based on the value of the supplied " (:PARAM NIL "form") ". " :PAR)
     (:ITEM NIL " The " (:LOOPREF NIL "until") " construct "
      (:COMMENT NIL "executes any \\loopref{finally} clause.")
      "does not bypass any " (:LOOPREF NIL "finally") " clauses. Since "
      (:LOOPREF NIL "never") " uses "
      (:ISSUE NIL "LOOP-NAMED-BLOCK-NIL:OVERRIDE") " the "
      (:SPECREF NIL "return-from") " " (:TERM NIL "special operator") " "
      (:ENDISSUE NIL "LOOP-NAMED-BLOCK-NIL:OVERRIDE")
      " to terminate iteration, any " (:LOOPREF NIL "finally")
      " clause that is supplied is not evaluated "
      (:COMMENT NIL "Added per JonL") "when exit occurs due to "
      (:LOOPREF NIL "never") ". "))
    " " :PAR
    (:COMMENT NIL "The macro \\macref{loop-finish}"
     "can be used at any time to cause normal" "termination.  ")
    :PAR
    (:COMMENT NIL
     "The macro \\macref{loop-finish} terminates iteration normally"
     "and returns any accumulated result.  If specified, a {\\tt finally} clause"
     "is evaluated.")
    :PAR "In most cases it is not necessary to use "
    (:MACREF NIL "loop-finish")
    " because other loop control clauses terminate the " (:MACREF NIL "loop")
    ". The macro " (:MACREF NIL "loop-finish")
    " is used to provide a normal exit from a nested conditional inside a "
    (:MACREF NIL "loop") ". "
    (:COMMENT NIL "You can use \\macref{loop-finish}"
     "inside nested Lisp code to provide a normal exit from a loop."
     "% Removed per X3J13. -kmp 05-Oct-93"
     " In normal termination, \\loopref{finally} clauses are "
     " executed and default return values are returned.")
    "Since " (:MACREF NIL "loop-finish")
    " transfers control to the loop epilogue, using "
    (:MACREF NIL "loop-finish") " within a " (:LOOPREF NIL "finally")
    " expression can cause infinite looping. "
    (:COMMENT NIL
     "% This information is already available in the macro entry for LOOP-FINISH."
     " %  Implementations are allowed to provide \\macref{loop-finish} "
     " %as a local macro" " %  by using \\specref{macrolet}."
     " It is \\term{implementation-dependent} whether or not,"
     " in a particular \\macref{loop} invocation, \\macref{loop-finish}"
     " is implemented as a global \\term{macro} or a local one (created as if by \\specref{macrolet}).")
    :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of REPEAT clause"))
     (:CODE NIL " (loop repeat 3
       do (format t \"~&What I say three times is true.~%\"))
⊳ What I say three times is true.
⊳ What I say three times is true.
⊳ What I say three times is true.
→ NIL
 (loop repeat -15
   do (format t \"What you see is what you expect~%\"))
→ NIL
")
     " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of ALWAYS, NEVER, and THEREIS clauses"))
     (:CODE NIL ";; Make sure I is always less than 11 (two ways).
;; The FOR construct terminates these loops.
 (loop for i from 0 to 10
       always (< i 11))
→ T
 (loop for i from 0 to 10
       never (> i 11))
→ T
 
;; If I exceeds 10 return I; otherwise, return NIL.
;; The THEREIS construct terminates this loop.
 (loop for i from 0
       thereis (when (> i 10) i) )
→ 11

;;; The FINALLY clause is not evaluated in these examples.
 (loop for i from 0 to 10
       always (< i 9)
       finally (print \"you won't see this\"))
→ NIL
 (loop never t
       finally (print \"you won't see this\"))
→ NIL
 (loop thereis \"Here is my value\"
       finally (print \"you won't see this\"))
→ \"Here is my value\"
 
;; The FOR construct terminates this loop, so the FINALLY clause 
;; is evaluated.
 (loop for i from 1 to 10
       thereis (> i 11)
       finally (prin1 'got-here))
⊳ GOT-HERE
→ NIL
 
;; If this code could be used to find a counterexample to Fermat's
;; last theorem, it would still not return the value of the
;; counterexample because all of the THEREIS clauses in this example
;; only return T.  But if Fermat is right, that won't matter
;; because this won't terminate.
 
 (loop for z upfrom 2
       thereis
         (loop for n upfrom 3 below (log z 2)
               thereis
                 (loop for x below z
                       thereis
                         (loop for y below z
                               thereis (= (+ (expt x n) (expt y n))
                                          (expt z n))))))
")
     " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of WHILE and UNTIL clauses"))
     (:CODE NIL " (loop while (hungry-p) do (eat))
 
;; UNTIL NOT is equivalent to WHILE.
 (loop until (not (hungry-p)) do (eat))
 
;; Collect the length and the items of STACK.
 (let ((stack '(a b c d e f)))
   (loop for item = (length stack) then (pop stack)
         collect item
         while stack))
→ (6 A B C D E F)
 
;; Use WHILE to terminate a loop that otherwise wouldn't terminate.
;; Note that WHILE occurs after the WHEN.
 (loop for i fixnum from 3
       when (oddp i) collect i
       while (< i 5))
→ (3 5)
")
     " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Unconditional Execution Clauses") :TAGS (:LOOP-UNCONDITIONAL))
    " " :PAR "The " (:LOOPREF NIL "do") " and " (:LOOPREF NIL "doing")
    " constructs evaluate the supplied " (:PARAM NIL "forms")
    " wherever they occur in the expanded form of " (:MACREF NIL "loop")
    ". The " (:PARAM NIL "form") " argument can be any "
    (:TERM NIL "compound form") ". Each " (:PARAM NIL "form")
    " is evaluated in every iteration. Because every loop clause must begin with a "
    (:TERM NIL "loop keyword") ", the keyword " (:LOOPREF NIL "do")
    " is used when no control action other than execution is required. " :PAR
    (:COMMENT NIL "!!! This was said somewhere already. -kmp 12-May-91")
    (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " "
    (:COMMENT NIL
     "The \\loopref{return} construct takes one \\term{form} and returns its \\term{values}.")
    "The " (:LOOPREF NIL "return") " construct takes one " (:TERM NIL "form")
    ". Any " (:TERM NIL "values") " returned by the " (:TERM NIL "form")
    " are immediately returned by the " (:MACREF NIL "loop") " form. "
    (:COMMENT NIL
     " It is equivalent to the clause \\f{do (return \\i{form})}.")
    "It is equivalent to the clause "
    (:TT NIL "do (return-from " (:I NIL "block-name") " " (:I NIL "value") ")")
    ", where " (:I NIL "block-name") " is the name specified in a "
    (:LOOPREF NIL "named") " clause, or " (:MISC NIL "nil") " if there is no "
    (:LOOPREF NIL "named") " clause. "
    (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " " :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of unconditional execution"))
     (:CODE NIL ";; Print numbers and their squares.
;; The DO construct applies to multiple forms.
 (loop for i from 1 to 3
       do (print i)
          (print (* i i)))
⊳ 1 
⊳ 1 
⊳ 2 
⊳ 4 
⊳ 3 
⊳ 9 
→ NIL

")
     " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Conditional Execution Clauses") :TAGS (:LOOP-CONDITIONAL)) " "
    :PAR (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " "
    (:COMMENT NIL " The  "
     " \\loopref{if}, \\loopref{when}, and \\loopref{unless}" " constructs "
     " establish conditional control in a \\macref{loop}."
     " If the supplied condition is \\term{true}, the succeeding loop clause"
     " is executed.  If the supplied condition is not true, the succeeding clause is"
     " skipped, and program control moves to the clause that follows "
     " the \\term{loop keyword} \\loopref{else}.  If the supplied condition is not true and no"
     " \\loopref{else} clause is supplied, control is transferred to the "
     " clause or construct following the supplied condition."
     " %the entire conditional construct" " %is skipped." " "
     " The constructs \\loopref{if} and \\loopref{when} allow execution of "
     " loop clauses conditionally.  These constructs are synonyms and"
     " can be used interchangeably."
     "  If the value of the test expression \\param{form} is \\term{non-nil}, the expression"
     " \\param{clause1} is evaluated. If the test expression evaluates to \\nil\\"
     " and an \\loopref{else} construct is supplied, the \\term{forms} that follow the"
     " \\loopref{else} are evaluated; otherwise, control passes to the next clause."
     "  If \\loopref{if} or \\loopref{when} clauses are nested, each \\loopref{else} is"
     " paired with the closest preceding \\loopref{if} or \\loopref{when} construct that has"
     " no associated \\loopref{else} or \\loopref{end}." " "
     " The \\loopref{unless} construct is equivalent to \\f{when (not \\param{form})}"
     " and \\f{if (not \\param{form})}."
     " If the value of the test expression \\param{form} is \\nil, the expression"
     " \\param{clause1} is evaluated. If the test expression evaluates to "
     " \\term{non-nil} and an \\loopref{else} construct is supplied, the statements that follow the"
     " \\loopref{else} are evaluated; otherwise, no conditional statement is evaluated."
     "  The \\param{clause} arguments must be either accumulation, unconditional,"
     " or conditional clauses.  ")
    :PAR "The " (:LOOPREF NIL "if") ", " (:LOOPREF NIL "when") ", and "
    (:LOOPREF NIL "unless") " constructs establish conditional control in a "
    (:MACREF NIL "loop")
    ". If the test passes, the succeeding loop clause is executed. If the test does not pass, the succeeding clause is skipped, and program control moves to the clause that follows the "
    (:TERM NIL "loop keyword") " " (:LOOPREF NIL "else")
    ". If the test does not pass and no " (:LOOPREF NIL "else")
    " clause is supplied, control is transferred to the clause or construct following the entire conditional clause. "
    :PAR "If conditional clauses are nested, each " (:LOOPREF NIL "else")
    " is paired with the closest preceding conditional clause that has no associated "
    (:LOOPREF NIL "else") " or " (:LOOPREF NIL "end") ". " :PAR "In the "
    (:LOOPREF NIL "if") " and " (:LOOPREF NIL "when")
    " clauses, which are synonymous, the test passes if the value of "
    (:PARAM NIL "form") " is " (:TERM NIL "true") ". " :PAR
    (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"
     " The \\loopref{unless} \\param{form} construct "
     " is equivalent to \\f{when (not \\param{form})};"
     " the test passes if the value of \\param{form} is \\term{false}.")
    "In the " (:LOOPREF NIL "unless")
    " clause, the test passes if the value of " (:PARAM NIL "form") " is "
    (:TERM NIL "false") ". " :PAR
    (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " " :PAR
    "Clauses that follow the test expression can be grouped by using the "
    (:TERM NIL "loop keyword") " " (:LOOPREF NIL "and")
    " to produce a conditional block consisting of a compound clause. " :PAR
    (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " "
    (:COMMENT NIL
     " The \\term{loop keyword} \\loopref{it} can be used to refer to the result of the"
     " test expression in a clause.  If multiple clauses are connected "
     " with \\loopref{and},"
     " the \\loopref{it} construct must be in the first clause in the block.  Since \\loopref{it}"
     " is a \\term{loop keyword}, \\loopref{it} cannot be used as a local variable within"
     " \\macref{loop}.")
    "The " (:TERM NIL "loop keyword") " " (:LOOPREF NIL "it")
    " can be used to refer to the result of the test expression in a clause. Use the "
    (:TERM NIL "loop keyword") " " (:LOOPREF NIL "it")
    " in place of the form in a " (:LOOPREF NIL "return") " clause or an "
    (:I NIL "accumulation")
    " clause that is inside a conditional execution clause. If multiple clauses are connected with "
    (:LOOPREF NIL "and") ", the " (:LOOPREF NIL "it")
    " construct must be in the first clause in the block. "
    (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " " :PAR "The optional "
    (:TERM NIL "loop keyword") " " (:LOOPREF NIL "end")
    " marks the end of the clause. If this keyword is not supplied, the next "
    (:TERM NIL "loop keyword") " marks the end. The construct "
    (:LOOPREF NIL "end")
    " can be used to distinguish the scoping of compound clauses. " :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of WHEN clause"))
     (:CODE NIL ";; Signal an exceptional condition.
 (loop for item in '(1 2 3 a 4 5)
       when (not (numberp item))
        return (cerror \"enter new value\" \"non-numeric value: ~s\" item))
Error: non-numeric value: A
 
;; The previous example is equivalent to the following one.
 (loop for item in '(1 2 3 a 4 5)
       when (not (numberp item))
        do (return 
            (cerror \"Enter new value\" \"non-numeric value: ~s\" item)))
Error: non-numeric value: A
")
     " " :PAR
     (:COMMENT NIL
      " Removed \";; The FINALLY clause prints the last value of I.\" per X3J13. -kmp 05-Oct-93")
     (:CODE NIL
      ";; This example parses a simple printed string representation from 
;; BUFFER (which is itself a string) and returns the index of the
;; closing double-quote character.
 (let ((buffer \"\\\"a\\\" \\\"b\\\"\"))
   (loop initially (unless (char= (char buffer 0) #\\\")
                     (loop-finish))
         for i of-type fixnum from 1 below (length (the string buffer))
         when (char= (char buffer i) #\\\")
          return i))
→ 2
 
;; The collected value is returned.
 (loop for i from 1 to 10
       when (> i 5)
         collect i
       finally (prin1 'got-here))
⊳ GOT-HERE
→ (6 7 8 9 10) 

;; Return both the count of collected numbers and the numbers.
 (loop for i from 1 to 10
       when (> i 5)
         collect i into number-list
         and count i into number-count
       finally (return (values number-count number-list)))
→ 5, (6 7 8 9 10)
")
     " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Miscellaneous Clauses") :TAGS (:LOOP-MISC)) " " :PAR
    (:SUBSUBSECTION (:TITLE ("Control Transfer Clauses")) "The "
     (:LOOPREF NIL "named") " construct establishes a name for an "
     (:TERM NIL "implicit block") " surrounding the "
     (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " entire "
     (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " " (:MACREF NIL "loop")
     " so that the " (:SPECREF NIL "return-from") " "
     (:TERM NIL "special operator")
     " can be used to return values from or to exit " (:MACREF NIL "loop")
     ". Only one name per " (:MACREF NIL "loop") " " (:TERM NIL "form")
     " can be assigned. If used, the " (:LOOPREF NIL "named")
     " construct must be the first clause in the loop expression. " :PAR
     (:COMMENT NIL
      "!!! This is said already above (twice). Consolidate? -kmp 29-Apr-93")
     (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " The "
     (:LOOPREF NIL "return") " construct takes one " (:TERM NIL "form")
     ". Any " (:TERM NIL "values") " returned by the " (:TERM NIL "form")
     " are immediately returned by the " (:MACREF NIL "loop") " form. "
     (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX")
     " This construct is similar to the " (:SPECREF NIL "return-from") " "
     (:TERM NIL "special operator") " and the " (:FUNREF NIL "return") " "
     (:TERM NIL "macro") ". "
     (:COMMENT NIL
      " The Loop Facility supports the \\loopref{return} construct for backwards"
      "compatibility with older loop implementations.  ")
     "The " (:LOOPREF NIL "return") " construct "
     (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " "
     (:COMMENT NIL "returns immediately and")
     (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " does not execute any "
     (:LOOPREF NIL "finally") " clause that "
     (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " the " (:MACREF NIL "loop")
     " " (:TERM NIL "form") " "
     (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " is given. " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Examples of NAMED clause"))
      (:CODE NIL ";; Just name and return.
 (loop named max
       for i from 1 to 10
       do (print i)
       do (return-from max 'done))
⊳ 1 
→ DONE
")
      " " :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Initial and Final Execution")) "The "
     (:LOOPREF NIL "initially") " and " (:LOOPREF NIL "finally")
     " constructs evaluate forms that occur before and after the loop body. "
     :PAR "The " (:LOOPREF NIL "initially") " construct causes the supplied "
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93" " \\param{form}")
     (:PARAM NIL "compound-forms")
     " to be evaluated in the loop prologue, which precedes all loop code except for initial settings supplied by constructs "
     (:LOOPREF NIL "with") ", " (:LOOPREF NIL "for") ", or "
     (:LOOPREF NIL "as") ". The code for any " (:LOOPREF NIL "initially")
     " clauses is "
     (:COMMENT NIL
      "\"collected into one \\specref{progn}\" => \"executed\" per barmar:"
      "  They don't have to be collected into a real PROGN since the LOOP expands into a TAGBODY."
      " -kmp 31-Jul-91")
     "executed in the order in which the clauses appeared in the "
     (:MACREF NIL "loop") ". "
     (:COMMENT NIL "The collected code is executed once in the loop prologue"
      "  after any implicit variable initializations."
      "% Removed per X3J13. -kmp 05-Oct-93"
      "The \\param{form} argument can be any \\term{compound form}.")
     :PAR "The " (:LOOPREF NIL "finally") " construct causes the supplied "
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93" "\\param{form}")
     (:PARAM NIL "compound-forms")
     " to be evaluated in the loop epilogue after normal iteration terminates. The code for any "
     (:LOOPREF NIL "finally") " clauses is "
     (:COMMENT NIL "collected into one \\specref{progn}")
     "executed in the order in which the clauses appeared in the "
     (:MACREF NIL "loop")
     ". The collected code is executed once in the loop epilogue before any implicit values are returned from the accumulation clauses. "
     (:COMMENT NIL "  Explicit \\macref{return} \\term{forms} in ")
     "An explicit transfer of control (" (:I NIL "e.g.") ",  by "
     (:MACREF NIL "return") ", " (:SPECREF NIL "go") ", or "
     (:SPECREF NIL "throw") ") from the loop body, however, will exit the "
     (:MACREF NIL "loop") " without executing the epilogue code. "
     (:COMMENT NIL "% Removed per X3J13. -kmp 05-Oct-93"
      " The \\param{form} argument can be any \\term{compound form}.")
     :PAR "Clauses such as " (:LOOPREF NIL "return") ", "
     (:LOOPREF NIL "always") ", " (:LOOPREF NIL "never") ", and "
     (:LOOPREF NIL "thereis") " can bypass the " (:LOOPREF NIL "finally")
     " clause. " (:ISSUE NIL "LOOP-NAMED-BLOCK-NIL:OVERRIDE") " "
     (:MACREF NIL "return") " (or " (:SPECREF NIL "return-from") ", if the "
     (:LOOPREF NIL "named") " option was supplied) "
     (:ENDISSUE NIL "LOOP-NAMED-BLOCK-NIL:OVERRIDE") " can be used after "
     (:LOOPREF NIL "finally") " to return values from a " (:MACREF NIL "loop")
     ". " (:ISSUE NIL "LOOP-NAMED-BLOCK-NIL:OVERRIDE") " "
     (:COMMENT NIL "The evaluation of the \\macref{return} form ") "Such an "
     (:TERM NIL "explicit return") " "
     (:ENDISSUE NIL "LOOP-NAMED-BLOCK-NIL:OVERRIDE") " inside the "
     (:LOOPREF NIL "finally")
     " clause takes precedence over returning the accumulation from clauses supplied by such keywords as "
     (:LOOPREF NIL "collect") ", " (:LOOPREF NIL "nconc") ", "
     (:LOOPREF NIL "append") ", " (:LOOPREF NIL "sum") ", "
     (:LOOPREF NIL "count") ", " (:LOOPREF NIL "maximize") ", and "
     (:LOOPREF NIL "minimize")
     "; the accumulation values for these preempted clauses are not returned by "
     (:MACREF NIL "loop") " if " (:MACREF NIL "return") " or "
     (:SPECREF NIL "return-from") " is used. " :PAR
     (:COMMENT NIL
      "Clauses such as {\\tt return}, {\\tt always}, {\\tt never}, and {\\tt thereis}"
      "defeat the {\\tt finally} clause.")
     :PAR
     (:COMMENT NIL "% Removed per Barmar: Said much earlier. "
      " The constructs \\loopref{do}, \\loopref{initially}, and \\loopref{finally} are the"
      " only \\term{loop keywords} that take an arbitrary number of \\term{forms} and group"
      " them as if by using an \\term{implicit progn}.  ")
     :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Examples of Miscellaneous Loop Features"))
    (:CODE NIL " (let ((i 0))                     ; no loop keywords are used
    (loop (incf i) (if (= i 3) (return i)))) → 3
 (let ((i 0)(j 0))
    (tagbody
      (loop (incf j 3) (incf i) (if (= i 3) (go exit)))
      exit)
    j) → 9
")
    " " :PAR "In the following example, the variable " (:TT NIL "x")
    " is stepped before " (:TT NIL "y") " is stepped; thus, the value of "
    (:TT NIL "y") " reflects the updated value of " (:TT NIL "x") ": " :PAR
    (:CODE NIL " (loop for x from 1 to 10 
       for y = nil then x 
       collect (list x y))
→ ((1 NIL) (2 2) (3 3) (4 4) (5 5) (6 6) (7 7) (8 8) (9 9) (10 10))
")
    " " :PAR "In this example, " (:TT NIL "x") " and " (:TT NIL "y")
    " are stepped in " (:TERM NIL "parallel") ": " :PAR
    (:CODE NIL " (loop for x from 1 to 10 
       and y = nil then x 
       collect (list x y))
→ ((1 NIL) (2 1) (3 2) (4 3) (5 4) (6 5) (7 6) (8 7) (9 8) (10 9))
")
    " " :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of clause grouping"))
     (:CODE NIL ";; Group conditional clauses.
 (loop for i in '(1 324 2345 323 2 4 235 252)
       when (oddp i)
         do (print i)
         and collect i into odd-numbers
         and do (terpri)
       else                              ; I is even.
         collect i into even-numbers
       finally
         (return (values odd-numbers even-numbers)))
⊳ 1 
⊳ 
⊳ 2345 
⊳ 
⊳ 323 
⊳ 
⊳ 235 
→ (1 2345 323 235), (324 2 4 252)

;; Collect numbers larger than 3.
 (loop for i in '(1 2 3 4 5 6)
       when (and (> i 3) i)
       collect it)                      ; IT refers to (and (> i 3) i).
→ (4 5 6)
 
;; Find a number in a list.
 (loop for i in '(1 2 3 4 5 6)
       when (and (> i 3) i)
       return it)
→ 4
     
;; The above example is similar to the following one.
 (loop for i in '(1 2 3 4 5 6)
       thereis (and (> i 3) i))
→ 4


;; Nest conditional clauses.
 (let ((list '(0 3.0 apple 4 5 9.8 orange banana)))
   (loop for i in list
         when (numberp i)
           when (floatp i)
             collect i into float-numbers
           else                                  ; Not (floatp i)
             collect i into other-numbers
         else                                    ; Not (numberp i)
           when (symbolp i) 
             collect i into symbol-list
           else                                  ; Not (symbolp i)
             do (error \"found a funny value in list ~S, value ~S~%\" list i)
         finally (return (values float-numbers other-numbers symbol-list))))
→ (3.0 9.8), (0 4 5), (APPLE ORANGE BANANA)

;; Without the END preposition, the last AND would apply to the
;; inner IF rather than the outer one.
 (loop for x from 0 to 3 
       do (print x)
       if (zerop (mod x 2))
         do (princ \" a\")
          and if (zerop (floor x 2))
                do (princ \" b\")
                end
          and do (princ \" c\"))
⊳ 0  a b c
⊳ 1 
⊳ 2  a c
⊳ 3 
→ NIL
")
     " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Notes about Loop")) (:TERM NIL "Types")
    " can be supplied for loop variables. It is not necessary to supply a "
    (:TERM NIL "type") " for any variable, but supplying the "
    (:TERM NIL "type")
    " can ensure that the variable has a correctly typed initial value, and it can also enable compiler optimizations (depending on the "
    (:TERM NIL "implementation") "). " :PAR "The clause "
    (:LOOPREF NIL "repeat") " " (:I NIL "n")
    " ... is roughly equivalent to a clause such as " :PAR
    (:CODE NIL " (loop for " (:I NIL "internal-variable") " downfrom (- "
     (:I NIL "n") " 1) to 0 ...)
")
    " " :PAR "but in some " (:TERM NIL "implementations") ", the "
    (:LOOPREF NIL "repeat") " construct might be more efficient. " :PAR
    "Within the executable parts of the loop clauses and around the entire "
    (:MACREF NIL "loop") " form, variables can be bound by using "
    (:SPECREF NIL "let") ". " :PAR
    (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX")
    " Use caution when using a variable named " (:TT NIL " IT") " (in any "
    (:TERM NIL "package") ") in connection with " (:MACREF NIL "loop")
    ", since " (:LOOPREF NIL "it") " is a " (:TERM NIL "loop keyword")
    " that can be used in place of a " (:TERM NIL "form")
    " in certain contexts. " (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX")
    " " :PAR "There is " (:COMMENT NIL "currently no specified portable")
    (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " no "
    (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " "
    (:TERM NIL "standardized") " mechanism for users to add extensions to "
    (:MACREF NIL "loop") ". "
    (:COMMENT NIL " The names \\f{defloop} and \\f{define-loop-method} "
     " have been suggested as candidates for such a method.")
    :PAR))
  :PAR
  (:DICTIONARY NIL (:COMMENT NIL " -*- Mode: tex -*-") :PAR
   (:COMMENT NIL "  Iteration") :PAR
   (:COMMENT NIL "-------------------- Iteration --------------------") :PAR
   (:COMMENT NIL "%% ========== DO" "%% ========== DO*")
   (:COM (:NAME "do, do*" :FTYPE "Macro") (:ISSUE NIL "DECLS-AND-DOC") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "VARIABLE-LIST-ASYMMETRY:SYMMETRIZE") " "
     (:DEF (:KIND "macro") (:NAMES NIL "do")
      (:ARGLIST NIL
       (:PAREN NIL
        (:STAR NIL
         (:CURLY NIL (:PARAM NIL "var") " | "
          (:PAREN NIL (:PARAM NIL "var") " "
           (:BRAC NIL "init-form " (:BRAC NIL "step-form"))))))
       " "
       (:PAREN NIL "end-test-form "
        (:STAR NIL (:CURLY NIL (:PARAM NIL "result-form"))))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL "tag " (:MATH NIL (:MO NIL "|")) " statement")))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR (:COMMENT NIL "% 7.8.2 5")
     (:DEF (:KIND "macro") (:NAMES NIL "do*")
      (:ARGLIST NIL
       (:PAREN NIL
        (:STAR NIL
         (:CURLY NIL (:PARAM NIL "var") " | "
          (:PAREN NIL (:PARAM NIL "var") " "
           (:BRAC NIL "init-form " (:BRAC NIL "step-form"))))))
       " "
       (:PAREN NIL "end-test-form "
        (:STAR NIL (:CURLY NIL (:PARAM NIL "result-form"))))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL "tag " (:MATH NIL (:MO NIL "|")) " statement")))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " (:ENDISSUE NIL "VARIABLE-LIST-ASYMMETRY:SYMMETRIZE") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL "% 7.8.2 6" "% 7.8.2 7" "% 7.8.3 12") :PAR
     (:PARAM NIL "var") "—a " (:TERM NIL "symbol") ". " :PAR
     (:PARAM NIL "init-form") "—a " (:TERM NIL "form") ". " :PAR
     (:PARAM NIL "step-form") "—a " (:TERM NIL "form") ". " :PAR
     (:COMMENT NIL "% 7.8.2 9") (:PARAM NIL "end-test-form") "—a "
     (:TERM NIL "form") ". " :PAR (:PARAM NIL "result-forms") "—an "
     (:TERM NIL "implicit progn") ". " :PAR (:COMMENT NIL "% 7.8.2 14")
     (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR (:PARAM NIL "tag") "—a "
     (:TERM NIL "go tag") "; not evaluated. " :PAR (:PARAM NIL "statement")
     "—a " (:TERM NIL "compound form") "; evaluated as described below. " :PAR
     (:PARAM NIL "results") "—if a " (:MACREF NIL "return") " or "
     (:MACREF NIL "return-from") " form is executed, the " (:TERM NIL "values")
     " passed from that " (:TERM NIL "form") "; "
     (:COMMENT NIL "% 7.9.2 13            ") "otherwise, the "
     (:TERM NIL "values") " returned by the " (:PARAM NIL "result-forms") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "do")
     " iterates over a group of " (:PARAM NIL "statements")
     " while a test condition holds. " (:MACREF NIL "do")
     " accepts an arbitrary number of iteration " (:PARAM NIL "vars")
     " which are bound within the iteration and stepped in parallel. An initial value may be supplied for each iteration variable by use of an "
     (:PARAM NIL "init-form") ". " (:PARAM NIL "Step-forms")
     " may be used to specify how the " (:PARAM NIL "vars")
     " should be updated on succeeding iterations through the loop. "
     (:PARAM NIL "Step-forms")
     " may be used both to generate successive values or to accumulate results. If the "
     (:PARAM NIL "end-test-form")
     " condition is met prior to an execution of the body, the iteration terminates. "
     (:PARAM NIL "Tags") " label " (:PARAM NIL "statements") ". " :PAR
     (:MACREF NIL "do*") " is exactly like " (:MACREF NIL "do")
     " except that the " (:TERM NIL "bindings") " and steppings of the "
     (:PARAM NIL "vars")
     " are performed sequentially rather than in parallel. " :PAR
     (:COMMENT NIL "% 7.8.2 4") :PAR (:COMMENT NIL "% 7.8.2 8") :PAR
     "Before the first iteration, all the " (:PARAM NIL "init-forms")
     " are evaluated, and each " (:PARAM NIL "var")
     " is bound to the value of its respective " (:PARAM NIL "init-form")
     ", if supplied. This is a " (:TERM NIL "binding")
     ", not an assignment; when the loop terminates, the old values of those variables will be restored. For "
     (:MACREF NIL "do") ", all of the " (:PARAM NIL "init-forms")
     " are evaluated before any " (:PARAM NIL "var") " is bound. The "
     (:PARAM NIL "init-forms") " can refer to the " (:TERM NIL "bindings")
     " of the " (:PARAM NIL "vars") " visible before beginning execution of "
     (:MACREF NIL "do") ". For " (:MACREF NIL "do*") ", the first "
     (:PARAM NIL "init-form") " is evaluated, then the first "
     (:PARAM NIL "var") " is bound to that value, then the second "
     (:PARAM NIL "init-form") " is evaluated, then the second "
     (:PARAM NIL "var") " is bound, and so on; in general, the " (:I NIL "k")
     "th " (:PARAM NIL "init-form") " can refer to the new binding of the "
     (:I NIL "j") "th " (:PARAM NIL "var") " if " (:I NIL "j") " < "
     (:I NIL "k") ", and otherwise to the old binding of the " (:I NIL "j")
     "th " (:PARAM NIL "var") ". " :PAR
     "At the beginning of each iteration, after processing the variables, the "
     (:PARAM NIL "end-test-form") " is evaluated. If the result is "
     (:TERM NIL "false") ", execution proceeds with the body of the "
     (:MACREF NIL "do") " (or " (:MACREF NIL "do*") ") form. If the result is "
     (:TERM NIL "true") ", the " (:PARAM NIL "result-forms")
     " are evaluated in order as an " (:TERM NIL "implicit progn")
     ", and then " (:MACREF NIL "do") " or " (:MACREF NIL "do*") " returns. "
     :PAR (:COMMENT NIL "% 7.8.2 10")
     "At the beginning of each iteration other than the first, "
     (:PARAM NIL "vars") " are updated as follows. All the "
     (:PARAM NIL "step-forms")
     ", if supplied, are evaluated, from left to right, and the resulting values are assigned to the respective "
     (:PARAM NIL "vars") ". Any " (:PARAM NIL "var") " that has no associated "
     (:PARAM NIL "step-form") " is not assigned to. For " (:MACREF NIL "do")
     ", all the " (:PARAM NIL "step-forms") " are evaluated before any "
     (:PARAM NIL "var") " is updated; the assignment of values to "
     (:PARAM NIL "vars") " is done in parallel, as if by "
     (:MACREF NIL "psetq") ". Because all of the " (:PARAM NIL "step-forms")
     " are evaluated before any of the " (:PARAM NIL "vars") " are altered, a "
     (:PARAM NIL "step-form")
     " when evaluated always has access to the old values of all the "
     (:PARAM NIL "vars") ", even if other " (:PARAM NIL "step-forms")
     " precede it. For " (:MACREF NIL "do*") ", the first "
     (:PARAM NIL "step-form")
     " is evaluated, then the value is assigned to the first "
     (:PARAM NIL "var") ", then the second " (:PARAM NIL "step-form")
     " is evaluated, then the value is assigned to the second "
     (:PARAM NIL "var")
     ", and so on; the assignment of values to variables is done sequentially, as if by "
     (:SPECREF NIL "setq") ". For either " (:MACREF NIL "do") " or "
     (:MACREF NIL "do*") ", after the " (:PARAM NIL "vars")
     " have been updated, the " (:PARAM NIL "end-test-form")
     " is evaluated as described above, and the iteration continues. " :PAR
     (:COMMENT NIL "% 7.8.2 12") "The remainder of the " (:MACREF NIL "do")
     " (or " (:MACREF NIL "do*") ") form constitutes an "
     (:TERM NIL "implicit tagbody") ". " (:PARAM NIL "Tags")
     " may appear within the body of a " (:MACREF NIL "do") " loop for use by "
     (:SPECREF NIL "go") " statements appearing in the body (but such "
     (:SPECREF NIL "go")
     " statements may not appear in the variable specifiers, the "
     (:PARAM NIL "end-test-form") ", or the " (:PARAM NIL "result-forms")
     "). When the end of a " (:MACREF NIL "do")
     " body is reached, the next iteration cycle (beginning with the evaluation of "
     (:PARAM NIL "step-forms") ") occurs. " :PAR (:COMMENT NIL "% 7.8.2 13")
     "An " (:TERM NIL "implicit block") " named " (:MISC NIL "nil")
     " surrounds the entire " (:MACREF NIL "do") " (or " (:MACREF NIL "do*")
     ") form. A " (:MACREF NIL "return")
     " statement may be used at any point to exit the loop immediately. " :PAR
     (:PARAM NIL "Init-form") " is an initial value for the "
     (:PARAM NIL "var") " with which it is associated. If "
     (:PARAM NIL "init-form") " is omitted, the initial value of "
     (:PARAM NIL "var") " is " (:MISC NIL "nil") ". If a "
     (:PARAM NIL "declaration") " is supplied for a " (:PARAM NIL "var") ", "
     (:PARAM NIL "init-form") " must be consistent with the "
     (:PARAM NIL "declaration") ". " :PAR
     (:COMMENT NIL "% Barmar: Redundant. "
      " If \\param{step-form} is omitted, the \\param{var} "
      " with which it is associated is not changed by \\macref{do} "
      " between repetitions. ")
     :PAR (:PARAM NIL "Declarations") " can appear at the beginning of a "
     (:MACREF NIL "do") " (or " (:MACREF NIL "do*")
     ") body. They apply to code in the " (:MACREF NIL "do") " (or "
     (:MACREF NIL "do*") ") body, to the " (:TERM NIL "bindings") " of the "
     (:MACREF NIL "do") " (or " (:MACREF NIL "do*") ") " (:PARAM NIL "vars")
     ", "
     (:COMMENT NIL
      "% Barmar: The part about init forms was changed by NO-HOISTING."
      "% JonL: Agree" " to the \\param{init-forms},")
     "to the " (:PARAM NIL "step-forms") ", to the "
     (:PARAM NIL "end-test-form") ", and to the " (:PARAM NIL "result-forms")
     ". " :PAR
     (:COMMENT NIL "For \\macref{do}, the "
      "\\term{scope} of the name binding does not include any"
      "initial value form, but does include the stepper forms and optional result"
      "forms."
      "For \\macref{do*}, a variable's \\term{scope} also includes the "
      "     remaining initial value forms for subsequent variable bindings.")
     :PAR)
    (:PART (:NAME "Examples") " " (:COMMENT NIL "% 7.8.2 16")
     (:CODE NIL " (do ((temp-one 1 (1+ temp-one))
       (temp-two 0 (1- temp-two)))
      ((> (- temp-one temp-two) 5) temp-one)) → 4

 (do ((temp-one 1 (1+ temp-one))
       (temp-two 0 (1+ temp-one)))     
      ((= 3 temp-two) temp-one)) → 3

 (do* ((temp-one 1 (1+ temp-one))
        (temp-two 0 (1+ temp-one)))
       ((= 3 temp-two) temp-one)) → 2                     

 (do ((j 0 (+ j 1)))
     (nil)                       ;Do forever.
   (format t \"~%Input ~D:\" j)
   (let ((item (read)))
     (if (null item) (return)   ;Process items until NIL seen.
         (format t \"~&Output ~D: ~S\" j item))))
⊳ Input 0: "
      (:IN NIL "banana") "
⊳ Output 0: BANANA
⊳ Input 1: "
      (:IN NIL "(57 boxes)") "
⊳ Output 1: (57 BOXES)
⊳ Input 2: "
      (:IN NIL "NIL") "
→ NIL

 (setq a-vector (vector 1 nil 3 nil))
 (do ((i 0 (+ i 1))     ;Sets every null element of a-vector to zero.
      (n (array-dimension a-vector 0)))
     ((= i n))
   (when (null (aref a-vector i))
     (setf (aref a-vector i) 0))) → NIL
a-vector → #(1 0 3 0)
")
     " " :PAR
     (:CODE NIL " (do ((x e (cdr x))
      (oldx x x))
     ((null x))
   body)
")
     " is an example of parallel assignment to index variables. On the first iteration, the value of "
     (:TT NIL "oldx") " is whatever value " (:TT NIL "x") " had before the "
     (:MACREF NIL "do") " was entered. On succeeding iterations, "
     (:TT NIL "oldx") " contains the value that " (:TT NIL "x")
     " had on the previous iteration. " :PAR (:COMMENT NIL "% 7.8.2 17")
     (:CODE NIL " (do ((x foo (cdr x))
      (y bar (cdr y))
      (z '() (cons (f (car x) (car y)) z)))
     ((or (null x) (null y))
      (nreverse z)))
")
     " does the same thing as " (:TT NIL "(mapcar #'f foo bar)")
     ". The step computation for " (:TT NIL "z")
     " is an example of the fact that variables are stepped in parallel. Also, the body of the loop is empty. "
     :PAR
     (:CODE NIL " (defun list-reverse (list)
        (do ((x list (cdr x))
             (y '() (cons (car x) y)))
            ((endp x) y)))
")
     " " :PAR (:COMMENT NIL "% 7.8.2 18")
     "As an example of nested iterations, consider a data structure that is a "
     (:TERM NIL "list") " of " (:TERM NIL "conses") ". The " (:TERM NIL "car")
     " of each " (:TERM NIL "cons") " is a " (:TERM NIL "list") " of "
     (:TERM NIL "symbols") ", and the " (:TERM NIL "cdr") " of each "
     (:TERM NIL "cons") " is a " (:TERM NIL "list")
     " of equal length containing corresponding values. Such a data structure is similar to an association list, but is divided into “frames”; the overall structure resembles a rib-cage. A lookup function on such a data structure might be: "
     :PAR
     (:CODE NIL " (defun ribcage-lookup (sym ribcage)           
        (do ((r ribcage (cdr r)))
            ((null r) nil)
          (do ((s (caar r) (cdr s))
               (v (cdar r) (cdr v))) 
              ((null s))
            (when (eq (car s) sym)
              (return-from ribcage-lookup (car v)))))) → RIBCAGE-LOOKUP
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR "other iteration functions ("
     (:MACREF NIL "dolist") ", " (:MACREF NIL "dotimes") ", and "
     (:MACREF NIL "loop") ") and more primitive functionality ("
     (:SPECREF NIL "tagbody") ", " (:SPECREF NIL "go") ", "
     (:SPECREF NIL "block") ", " (:MACREF NIL "return") ", "
     (:SPECREF NIL "let") ", and " (:SPECREF NIL "setq") ") " :PAR)
    (:PART (:NAME "Notes") " " (:COMMENT NIL "% 7.8.2 11") "If "
     (:PARAM NIL "end-test-form") " is " (:MISC NIL "nil")
     ", the test will never succeed. This provides an idiom for “do forever”: the body of the "
     (:MACREF NIL "do") " or " (:MACREF NIL "do*")
     " is executed repeatedly. The infinite loop can be terminated by the use of "
     (:MACREF NIL "return") ", " (:SPECREF NIL "return-from") ", "
     (:SPECREF NIL "go") " to an outer level, or " (:SPECREF NIL "throw") ". "
     :PAR (:COMMENT NIL "% 7.8.2 19") "A " (:MACREF NIL "do") " "
     (:TERM NIL "form") " may be explained in terms of the more primitive "
     (:TERM NIL "forms") " " (:SPECREF NIL "block") ", " (:MACREF NIL "return")
     ", " (:SPECREF NIL "let") ", " (:MACREF NIL "loop") ", "
     (:SPECREF NIL "tagbody") ", and " (:MACREF NIL "psetq") " as follows: "
     :PAR
     (:CODE NIL " (block nil        
   (let ((var1 init1)
         (var2 init2)
         ...
         (varn initn))
     "
      (:I NIL "declarations") "
     (loop (when end-test (return (progn . result)))
           (tagbody . tagbody)
           (psetq var1 step1
                  var2 step2
                  ...
                  varn stepn))))
")
     " " :PAR (:MACREF NIL "do*") " is similar, except that "
     (:SPECREF NIL "let*") " and " (:SPECREF NIL "setq") " replace the "
     (:SPECREF NIL "let") " and " (:MACREF NIL "psetq") ", respectively. " :PAR
     (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DOTIMES")
   (:COM (:NAME "dotimes" :FTYPE "Macro") (:ISSUE NIL "DECLS-AND-DOC") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "dotimes")
      (:ARGLIST NIL (:PAREN NIL "var count-form " (:BRAC NIL "result-form"))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL "tag | statement")))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "var") "—a "
     (:TERM NIL "symbol") ". " :PAR (:PARAM NIL "count-form") "—a "
     (:TERM NIL "form") ". " :PAR (:PARAM NIL "result-form") "—a "
     (:TERM NIL "form") ". " :PAR (:PARAM NIL "declaration") "—a "
     (:MISC NIL "declare") " " (:TERM NIL "expression") "; not evaluated. "
     :PAR (:PARAM NIL "tag") "—a " (:TERM NIL "go tag") "; not evaluated. "
     :PAR (:PARAM NIL "statement") "—a " (:TERM NIL "compound form")
     "; evaluated as described below. " :PAR (:COMMENT NIL "% 7.8.3 4")
     (:PARAM NIL "results") "—if a " (:MACREF NIL "return") " or "
     (:MACREF NIL "return-from") " form is executed, the " (:TERM NIL "values")
     " passed from that " (:TERM NIL "form") "; otherwise, the "
     (:TERM NIL "values") " returned by the " (:PARAM NIL "result-form") " or "
     (:MISC NIL "nil") " if there is no " (:PARAM NIL "result-form") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.8.3 9")
     (:MACREF NIL "dotimes") " iterates over a series of "
     (:TERM NIL "integers") ". " :PAR (:MACREF NIL "dotimes") " evaluates "
     (:PARAM NIL "count-form") ", which should produce an "
     (:TERM NIL "integer") ". If " (:PARAM NIL "count-form")
     " is zero or negative, the body is not executed. " (:MACREF NIL "dotimes")
     " then executes the body once for each " (:TERM NIL "integer")
     " from 0 up to but not including the value of " (:PARAM NIL "count-form")
     ", in the order in which the " (:PARAM NIL "tags") " and "
     (:PARAM NIL "statements") " occur, with " (:PARAM NIL "var")
     " bound to each " (:TERM NIL "integer") ". Then "
     (:PARAM NIL "result-form") " is evaluated. At the time "
     (:PARAM NIL "result-form") " is processed, " (:PARAM NIL "var")
     " is bound to the number of times the body was executed. "
     (:PARAM NIL "Tags") " label " (:PARAM NIL "statements") ". " :PAR "An "
     (:TERM NIL "implicit block") " "
     (:COMMENT NIL "In effect, a \\specref{block} ") "named " (:MISC NIL "nil")
     " surrounds " (:MACREF NIL "dotimes") ". "
     (:COMMENT NIL "% 7.8.3 5" "% 7.8.3 10") (:MACREF NIL "return")
     " may be used to terminate the loop immediately without performing any further iterations, returning zero or more "
     (:TERM NIL "values") ". " :PAR "The body of the loop is an "
     (:TERM NIL "implicit tagbody")
     "; it may contain tags to serve as the targets of " (:SPECREF NIL "go")
     " statements. Declarations may appear before the body of the loop. " :PAR
     (:COMMENT NIL " Per Loosemore #28"
      " For \\macref{dotimes}, the \\term{scope} of the name binding "
      " does not include any initial value form,"
      " but the stepper and optional result forms are included.")
     "The " (:TERM NIL "scope") " of the binding of " (:PARAM NIL "var")
     " does not include the " (:PARAM NIL "count-form") ", but the "
     (:PARAM NIL "result-form") " is included. " :PAR
     (:COMMENT NIL " Added per Loosemore #27, first public review") "It is "
     (:TERM NIL "implementation-dependent") " whether " (:MACREF NIL "dotimes")
     " " (:TERM NIL "establishes") " a new " (:TERM NIL "binding") " of "
     (:PARAM NIL "var") " on each iteration or whether it "
     (:TERM NIL "establishes") " a binding for " (:PARAM NIL "var")
     " once at the beginning and then " (:PARAM NIL "assigns")
     " it on any subsequent iterations. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (dotimes (temp-one 10 temp-one)) → 10
 (setq temp-two 0) → 0
 (dotimes (temp-one 10 t) (incf temp-two)) → T
 temp-two → 10
")
     " " :PAR (:COMMENT NIL "% 7.8.3 11") :PAR
     "Here is an example of the use of " (:TT NIL "dotimes")
     " in processing strings: " :PAR
     (:CODE NIL ";;; True if the specified subsequence of the string is a
;;; palindrome (reads the same forwards and backwards).
 (defun palindromep (string "
      (:KEYWORD NIL " &optional") "
                           (start 0)
                           (end (length string)))
   (dotimes (k (floor (- end start) 2) t)
    (unless (char-equal (char string (+ start k))
                        (char string (- end k 1)))
      (return nil))))
 (palindromep \"Able was I ere I saw Elba\") → T
 (palindromep \"A man, a plan, a canal--Panama!\") → NIL
 (remove-if-not #'alpha-char-p          ;Remove punctuation.
               \"A man, a plan, a canal--Panama!\")
→ \"AmanaplanacanalPanama\"
 (palindromep
  (remove-if-not #'alpha-char-p
                \"A man, a plan, a canal--Panama!\")) → T
 (palindromep
  (remove-if-not
   #'alpha-char-p
   \"Unremarkable was I ere I saw Elba Kramer, nu?\")) → T
 (palindromep
  (remove-if-not
   #'alpha-char-p
   \"A man, a plan, a cat, a ham, a yak,
                  a yam, a hat, a canal--Panama!\")) → T
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "do") ", "
     (:MACREF NIL "dolist") ", " (:SPECREF NIL "tagbody") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:SPECREF NIL "go")
     " may be used within the body of " (:MACREF NIL "dotimes")
     " to transfer control to a statement labeled by a " (:PARAM NIL "tag")
     ". " :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DOLIST")
   (:COM (:NAME "dolist" :FTYPE "Macro") (:ISSUE NIL "DECLS-AND-DOC") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "dolist")
      (:ARGLIST NIL (:PAREN NIL "var list-form " (:BRAC NIL "result-form")) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL "tag | statement")))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "var") "—a "
     (:TERM NIL "symbol") ". " :PAR (:PARAM NIL "list-form") "—a "
     (:TERM NIL "form") ". " :PAR (:PARAM NIL "result-form") "—a "
     (:TERM NIL "form") ". " :PAR (:PARAM NIL "declaration") "—a "
     (:MISC NIL "declare") " " (:TERM NIL "expression") "; not evaluated. "
     :PAR (:PARAM NIL "tag") "—a " (:TERM NIL "go tag") "; not evaluated. "
     :PAR (:PARAM NIL "statement") "—a " (:TERM NIL "compound form")
     "; evaluated as described below. " :PAR (:COMMENT NIL "% 7.8.3 4")
     (:PARAM NIL "results") "—if a " (:MACREF NIL "return") " or "
     (:MACREF NIL "return-from") " form is executed, the " (:TERM NIL "values")
     " passed from that " (:TERM NIL "form") "; otherwise, the "
     (:TERM NIL "values") " returned by the " (:PARAM NIL "result-form") " or "
     (:MISC NIL "nil") " if there is no " (:PARAM NIL "result-form") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.8.3 6")
     (:MACREF NIL "dolist") " iterates over the elements of a "
     (:TERM NIL "list") ". The body of " (:MACREF NIL "dolist") " is like a "
     (:SPECREF NIL "tagbody") ". It consists of a series of "
     (:PARAM NIL "tags") " and " (:PARAM NIL "statements") ". " :PAR
     (:MACREF NIL "dolist") " evaluates " (:PARAM NIL "list-form")
     ", which should produce a " (:TERM NIL "list")
     ". It then executes the body once for each element in the "
     (:TERM NIL "list") ", in the order in which the " (:PARAM NIL "tags")
     " and " (:PARAM NIL "statements") " occur, with " (:PARAM NIL "var")
     " bound to the element. Then " (:PARAM NIL "result-form")
     " is evaluated. " (:PARAM NIL "tags") " label " (:PARAM NIL "statements")
     ". " :PAR "At the time " (:PARAM NIL "result-form") " is processed, "
     (:PARAM NIL "var") " is bound to " (:MISC NIL "nil") ". " :PAR "An "
     (:TERM NIL "implicit block") " "
     (:COMMENT NIL "In effect, a \\specref{block}") "named " (:MISC NIL "nil")
     " surrounds " (:MACREF NIL "dolist") ". "
     (:COMMENT NIL
      "% Made symmetric with the wording in DOTIMES. -kmp 26-May-93"
      " %% 7.8.3 5" " %% 7.8.3 8"
      " \\macref{return} may be used to terminate the loop"
      " and return a specified value.")
     (:MACREF NIL "return")
     " may be used to terminate the loop immediately without performing any further iterations, returning zero or more "
     (:TERM NIL "values") ". " :PAR
     (:COMMENT NIL "% Changed per Loosemore #28, first public review"
      " For \\macref{dolist}, the "
      " \\term{scope} of the name binding does not include any"
      " initial value form, but the stepper and optional result forms are included.")
     "The " (:TERM NIL "scope") " of the binding of " (:PARAM NIL "var")
     " does not include the " (:PARAM NIL "list-form") ", but the "
     (:PARAM NIL "result-form") " is included. " :PAR
     (:COMMENT NIL "% Added per Loosemore #27, first public review") "It is "
     (:TERM NIL "implementation-dependent") " whether " (:MACREF NIL "dolist")
     " " (:TERM NIL "establishes") " a new " (:TERM NIL "binding") " of "
     (:PARAM NIL "var") " on each iteration or whether it "
     (:TERM NIL "establishes") " a binding for " (:PARAM NIL "var")
     " once at the beginning and then " (:PARAM NIL "assigns")
     " it on any subsequent iterations. " :PAR)
    (:PART (:NAME "Examples") " " (:COMMENT NIL "% 7.8.3 7")
     (:CODE NIL " (setq temp-two '()) → NIL
 (dolist (temp-one '(1 2 3 4) temp-two) (push temp-one temp-two)) → (4 3 2 1)

 (setq temp-two 0) → 0
 (dolist (temp-one '(1 2 3 4)) (incf temp-two)) → NIL
 temp-two → 4

 (dolist (x '(a b c d)) (prin1 x) (princ \" \")) 
⊳ A B C D 
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "do") ", "
     (:MACREF NIL "dotimes") ", " (:SPECREF NIL "tagbody") ", "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:SPECREF NIL "go")
     " may be used within the body of " (:MACREF NIL "dolist")
     " to transfer control to a statement labeled by a " (:PARAM NIL "tag")
     ". " :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LOOP")
   (:COM (:NAME "loop" :FTYPE "Macro")
    (:ISSUE NIL "LOOP-SYNTAX-OVERHAUL:REPAIR") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR "The “simple” " (:MACREF NIL "loop") " "
     (:TERM NIL "form") ": " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "loop")
      (:ARGLIST NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "compound-form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR "The “extended” " (:MACREF NIL "loop") " " (:TERM NIL "form")
     ": " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "loop")
      (:ARGLIST NIL (:BRAC NIL (:DOWN NIL "name-clause")) " "
       (:STAR NIL (:CURLY NIL (:DOWN NIL "variable-clause"))) " "
       (:STAR NIL (:CURLY NIL (:DOWN NIL "main-clause"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR
     (:BNF (:NAME "name-clause") (:LOOPREF NIL "named") " "
      (:PARAM NIL "name"))
     " "
     (:BNF (:NAME "variable-clause") (:DOWN NIL "with-clause") " | "
      (:DOWN NIL "initial-final") " | " (:DOWN NIL "for-as-clause"))
     " "
     (:BNF (:NAME "with-clause") (:LOOPREF NIL "with") " " (:PARAM NIL "var1")
      " " (:BRAC NIL (:PARAM NIL "type-spec")) " "
      (:BRAC NIL (:MATH NIL (:MO NIL "=")) " " (:PARAM NIL "form1")) " "
      (:STAR NIL
       (:CURLY NIL (:LOOPREF NIL "and") " " (:PARAM NIL "var2") " "
        (:BRAC NIL (:PARAM NIL "type-spec")) " "
        (:BRAC NIL (:MATH NIL (:MO NIL "=")) " " (:PARAM NIL "form2")))))
     " "
     (:BNF (:NAME "main-clause") (:DOWN NIL "unconditional") " | "
      (:DOWN NIL "accumulation") " | " (:DOWN NIL "conditional") " | "
      (:DOWN NIL "termination-test") " | " (:DOWN NIL "initial-final"))
     " "
     (:BNF (:NAME "initial-final") (:LOOPREF NIL "initially") " "
      (:PLUS NIL (:CURLY NIL (:PARAM NIL "compound-form"))) " | "
      (:LOOPREF NIL "finally") " "
      (:PLUS NIL (:CURLY NIL (:PARAM NIL "compound-form"))))
     " "
     (:BNF (:NAME "unconditional")
      (:CURLY NIL (:LOOPREF NIL "do") " | " (:LOOPREF NIL "doing")) " "
      (:PLUS NIL (:CURLY NIL (:PARAM NIL "compound-form"))) " | "
      (:LOOPREF NIL "return") " "
      (:CURLY NIL (:PARAM NIL "form") " | " (:LOOPREF NIL "it")))
     " "
     (:BNF (:NAME "accumulation") (:DOWN NIL "list-accumulation") " | "
      (:DOWN NIL "numeric-accumulation"))
     " "
     (:BNF (:NAME "list-accumulation")
      (:CURLY NIL (:LOOPREF NIL "collect") " | " (:LOOPREF NIL "collecting")
       " | " (:LOOPREF NIL "append") " | " (:LOOPREF NIL "appending") " | "
       (:LOOPREF NIL "nconc") " | " (:LOOPREF NIL "nconcing"))
      " " (:CURLY NIL (:PARAM NIL "form") " | " (:LOOPREF NIL "it")) " "
      (:BR NIL) " "
      (:BRAC NIL (:LOOPREF NIL "into") " " (:PARAM NIL "simple-var")))
     " "
     (:BNF (:NAME "numeric-accumulation")
      (:CURLY NIL (:LOOPREF NIL "count") " | " (:LOOPREF NIL "counting") " | "
       (:LOOPREF NIL "sum") " | " (:LOOPREF NIL "summing") " | " (:BR NIL) " "
       (:LOOPREF NIL "maximize") " | " (:LOOPREF NIL "maximizing") " | "
       (:LOOPREF NIL "minimize") " | " (:LOOPREF NIL "minimizing"))
      " " (:CURLY NIL (:PARAM NIL "form") " | " (:LOOPREF NIL "it")) " "
      (:BR NIL) " "
      (:BRAC NIL (:LOOPREF NIL "into") " " (:PARAM NIL "simple-var")) " "
      (:BRAC NIL (:PARAM NIL "type-spec")))
     " "
     (:BNF (:NAME "conditional")
      (:CURLY NIL (:LOOPREF NIL "if") " | " (:LOOPREF NIL "when") " | "
       (:LOOPREF NIL "unless"))
      " " (:PARAM NIL "form") " " (:DOWN NIL "selectable-clause") " "
      (:STAR NIL
       (:CURLY NIL (:LOOPREF NIL "and") " " (:DOWN NIL "selectable-clause")))
      " " (:BR NIL) " "
      (:BRAC NIL (:LOOPREF NIL "else") " " (:DOWN NIL "selectable-clause") " "
       (:STAR NIL
        (:CURLY NIL (:LOOPREF NIL "and") " " (:DOWN NIL "selectable-clause"))))
      " " (:BR NIL) " " (:BRAC NIL (:LOOPREF NIL "end")))
     " "
     (:COMMENT NIL
      "% I flushed the clause/clause1/clause2 distinction in the next thing, since it's not used"
      "% anywhere for reference, and it's not appropriate to the bnf style."
      "% However, I'm concerned about the loss of IT here due to LOOP-MISCELLANEOUS-REPAIRS."
      "%  -kmp 4-May-93")
     (:BNF (:NAME "selectable-clause") (:DOWN NIL "unconditional") " | "
      (:DOWN NIL "accumulation") " | " (:DOWN NIL "conditional"))
     " "
     (:BNF (:NAME "termination-test") (:LOOPREF NIL "while") " "
      (:PARAM NIL "form") " | " (:LOOPREF NIL "until") " " (:PARAM NIL "form")
      " | " (:LOOPREF NIL "repeat") " " (:PARAM NIL "form") " | "
      (:LOOPREF NIL "always") " " (:PARAM NIL "form") " | "
      (:LOOPREF NIL "never") " " (:PARAM NIL "form") " | "
      (:LOOPREF NIL "thereis") " " (:PARAM NIL "form"))
     " "
     (:BNF (:NAME "for-as-clause")
      (:CURLY NIL (:LOOPREF NIL "for") " | " (:LOOPREF NIL "as")) " "
      (:DOWN NIL "for-as-subclause") " "
      (:STAR NIL
       (:CURLY NIL (:LOOPREF NIL "and") " " (:DOWN NIL "for-as-subclause"))))
     " "
     (:BNF (:NAME "for-as-subclause") (:DOWN NIL "for-as-arithmetic") " | "
      (:DOWN NIL "for-as-in-list") " | " (:DOWN NIL "for-as-on-list") " | "
      (:DOWN NIL "for-as-equals-then") " |" (:BR NIL) " "
      (:DOWN NIL "for-as-across") " | " (:DOWN NIL "for-as-hash") " | "
      (:DOWN NIL "for-as-package"))
     " "
     (:BNF (:NAME "for-as-arithmetic") (:PARAM NIL "var") " "
      (:BRAC NIL (:PARAM NIL "type-spec")) " "
      (:DOWN NIL "for-as-arithmetic-subclause"))
     " "
     (:BNF (:NAME "for-as-arithmetic-subclause") (:DOWN NIL "arithmetic-up")
      " | " (:DOWN NIL "arithmetic-downto") " | "
      (:DOWN NIL "arithmetic-downfrom"))
     " "
     (:BNF (:NAME "arithmetic-up") "⟦"
      (:CURLY NIL (:LOOPREF NIL "from") " | " (:LOOPREF NIL "upfrom")) " "
      (:PARAM NIL "form1") " | "
      (:CURLY NIL (:LOOPREF NIL "to") " | " (:LOOPREF NIL "upto") " | "
       (:LOOPREF NIL "below"))
      " " (:PARAM NIL "form2") " | " (:LOOPREF NIL "by") " "
      (:PARAM NIL "form3") "⟧⁺")
     " "
     (:BNF (:NAME "arithmetic-downto") "⟦"
      (:ONE NIL (:CURLY NIL (:LOOPREF NIL "from") " " (:PARAM NIL "form1")))
      " | "
      (:ONE NIL
       (:CURLY NIL
        (:CURLY NIL (:LOOPREF NIL "downto") " | " (:LOOPREF NIL "above")) " "
        (:PARAM NIL "form2")))
      " | " (:LOOPREF NIL "by") " " (:PARAM NIL "form3") "⟧")
     " "
     (:BNF (:NAME "arithmetic-downfrom") "⟦"
      (:ONE NIL
       (:CURLY NIL (:LOOPREF NIL "downfrom") " " (:PARAM NIL "form1")))
      " | "
      (:CURLY NIL (:LOOPREF NIL "to") " | " (:LOOPREF NIL "downto") " | "
       (:LOOPREF NIL "above"))
      " " (:PARAM NIL "form2") " | " (:LOOPREF NIL "by") " "
      (:PARAM NIL "form3") "⟧")
     " "
     (:BNF (:NAME "for-as-in-list") (:PARAM NIL "var") " "
      (:BRAC NIL (:PARAM NIL "type-spec")) " " (:LOOPREF NIL "in") " "
      (:PARAM NIL "form1") " "
      (:BRAC NIL (:LOOPREF NIL "by") " " (:PARAM NIL "step-fun")))
     " "
     (:BNF (:NAME "for-as-on-list") (:PARAM NIL "var") " "
      (:BRAC NIL (:PARAM NIL "type-spec")) " " (:LOOPREF NIL "on") " "
      (:PARAM NIL "form1") " "
      (:BRAC NIL (:LOOPREF NIL "by") " " (:PARAM NIL "step-fun")))
     " "
     (:BNF (:NAME "for-as-equals-then") (:PARAM NIL "var") " "
      (:BRAC NIL (:PARAM NIL "type-spec")) " " (:MATH NIL (:MO NIL "=")) " "
      (:PARAM NIL "form1") " "
      (:BRAC NIL (:LOOPREF NIL "then") " " (:PARAM NIL "form2")))
     " "
     (:BNF (:NAME "for-as-across") (:PARAM NIL "var") " "
      (:BRAC NIL (:PARAM NIL "type-spec")) " " (:LOOPREF NIL "across") " "
      (:PARAM NIL "vector"))
     " "
     (:BNF (:NAME "for-as-hash") (:PARAM NIL "var") " "
      (:BRAC NIL (:PARAM NIL "type-spec")) " " (:LOOPREF NIL "being") " "
      (:CURLY NIL (:LOOPREF NIL "each") " | " (:LOOPREF NIL "the")) " "
      (:BR NIL) " {"
      (:CURLY NIL (:LOOPREF NIL "hash-key") " | " (:LOOPREF NIL "hash-keys"))
      " " (:CURLY NIL (:LOOPREF NIL "in") " | " (:LOOPREF NIL "of")) " "
      (:PARAM NIL "hash-table") " " (:BR NIL) " "
      (:BRAC NIL (:LOOPREF NIL "using") " "
       (:PAREN NIL (:LOOPREF NIL "hash-value") " " (:PARAM NIL "other-var")))
      " | " (:BR NIL) " "
      (:CURLY NIL (:LOOPREF NIL "hash-value") " | "
       (:LOOPREF NIL "hash-values"))
      " " (:CURLY NIL (:LOOPREF NIL "in") " | " (:LOOPREF NIL "of")) " "
      (:PARAM NIL "hash-table") " " (:BR NIL) " "
      (:BRAC NIL (:LOOPREF NIL "using") " "
       (:PAREN NIL (:LOOPREF NIL "hash-key") " " (:PARAM NIL "other-var")))
      "}")
     " "
     (:BNF (:NAME "for-as-package") (:PARAM NIL "var") " "
      (:BRAC NIL (:PARAM NIL "type-spec")) " " (:LOOPREF NIL "being") " "
      (:CURLY NIL (:LOOPREF NIL "each") " | " (:LOOPREF NIL "the")) " "
      (:BR NIL) " {" (:LOOPREF NIL "symbol") " | " (:LOOPREF NIL "symbols")
      " |" (:BR NIL) " " (:LOOPREF NIL "present-symbol") " | "
      (:LOOPREF NIL "present-symbols") " |" (:BR NIL) " "
      (:LOOPREF NIL "external-symbol") " | " (:LOOPREF NIL "external-symbols")
      "} " (:BR NIL) " "
      (:BRAC NIL (:CURLY NIL (:LOOPREF NIL "in") " | " (:LOOPREF NIL "of")) " "
       (:PARAM NIL "package")))
     " "
     (:BNF (:NAME "type-spec") (:DOWN NIL "simple-type-spec") " | "
      (:DOWN NIL "destructured-type-spec"))
     " "
     (:BNF (:NAME "simple-type-spec") (:DECLREF NIL "fixnum") " | "
      (:DECLREF NIL "float") " | " (:DECLREF NIL "t") " | "
      (:DECLREF NIL "nil"))
     " "
     (:BNF (:NAME "destructured-type-spec") (:LOOPREF NIL "of-type") " "
      (:PARAM NIL "d-type-spec"))
     " "
     (:BNF (:NAME "d-type-spec") (:PARAM NIL "type-specifier") " | "
      (:TT NIL "(" (:PARAM NIL "d-type-spec") " . " (:PARAM NIL "d-type-spec")
       ")"))
     " " (:BNF (:NAME "var") (:DOWN NIL "d-var-spec")) " "
     (:BNF (:NAME "var1") (:DOWN NIL "d-var-spec")) " "
     (:BNF (:NAME "var2") (:DOWN NIL "d-var-spec")) " "
     (:BNF (:NAME "other-var") (:DOWN NIL "d-var-spec")) " "
     (:BNF (:NAME "d-var-spec") (:PARAM NIL "simple-var") " | "
      (:MISC NIL "nil") " | "
      (:PAREN NIL (:DOWN NIL "d-var-spec") " " (:TT NIL ".") " "
       (:DOWN NIL "d-var-spec")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "compound-form")
     "—a " (:TERM NIL "compound form") ". " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "symbol") ". " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"
      " \\param{var}, \\param{var1}, \\param{var2}, \\param{other-var}---a \\term{symbol}"
      "   (a \\term{variable} \\term{name}).")
     (:PARAM NIL "simple-var") "—a " (:TERM NIL "symbol") " (a "
     (:TERM NIL "variable") " name). " :PAR (:PARAM NIL "form") ", "
     (:PARAM NIL "form1") ", " (:PARAM NIL "form2") ", " (:PARAM NIL "form3")
     "—a " (:TERM NIL "form") ". " :PAR
     (:ISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " " (:PARAM NIL "step-fun")
     "—a " (:TERM NIL "form") " that evaluates to a " (:TERM NIL "function")
     " of one " (:TERM NIL "argument") ". "
     (:ENDISSUE NIL "LOOP-MISCELLANEOUS-REPAIRS:FIX") " " :PAR
     (:PARAM NIL "vector") "—a " (:TERM NIL "form") " that evaluates to a "
     (:TERM NIL "vector") ". " :PAR (:PARAM NIL "hash-table") "—a "
     (:TERM NIL "form") " that evaluates to a " (:TERM NIL "hash table") ". "
     :PAR (:PARAM NIL "package") "—a " (:TERM NIL "form")
     " that evaluates to a " (:TERM NIL "package designator") ". " :PAR
     (:PARAM NIL "type-specifier") "—a " (:TERM NIL "type specifier")
     ". This might be either an " (:TERM NIL "atomic type specifier") " or a "
     (:TERM NIL "compound type specifier")
     ", which introduces some additional complications to proper parsing in the face of destructuring; for further information, see "
     (:SECREF NIL :DESTRUCTURING-LOOP-VARS) ". " :PAR (:PARAM NIL "result")
     "—an " (:TERM NIL "object") ". " :PAR
     (:ENDISSUE NIL "LOOP-SYNTAX-OVERHAUL:REPAIR") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "!!! This should be elaborated slightly here.")
     "For details, see " (:SECREF NIL :LOOP-FACILITY) ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL ";; An example of the simple form of LOOP.
 (defun sqrt-advisor ()
   (loop (format t \"~&Number: \")
         (let ((n (parse-integer (read-line) :junk-allowed t)))
           (when (not n) (return))
           (format t \"~&The square root of ~D is ~D.~%\" n (sqrt n)))))
→ SQRT-ADVISOR
 (sqrt-advisor)
⊳ Number: "
      (:IN NIL "5↩") "
⊳ The square root of 5 is 2.236068.
⊳ Number: "
      (:IN NIL "4↩") "
⊳ The square root of 4 is 2.
⊳ Number: "
      (:IN NIL "done↩") "
→ NIL

;; An example of the extended form of LOOP.
 (defun square-advisor ()
   (loop as n = (progn (format t \"~&Number: \")
                       (parse-integer (read-line) :junk-allowed t))
         while n
         do (format t \"~&The square of ~D is ~D.~%\" n (* n n))))
→ SQUARE-ADVISOR
 (square-advisor)
⊳ Number: "
      (:IN NIL "4↩") "
⊳ The square of 4 is 16.
⊳ Number: "
      (:IN NIL "23↩") "
⊳ The square of 23 is 529.
⊳ Number: "
      (:IN NIL "done↩") "
→ NIL

;; Another example of the extended form of LOOP.
 (loop for n from 1 to 10
       when (oddp n)
         collect n)
→ (1 3 5 7 9)
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR
     (:COMMENT NIL
      "!!! Barmar: The description mentions several places where PROGRAM-ERROR is signaled.")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "do") ", "
     (:MACREF NIL "dolist") ", " (:MACREF NIL "dotimes") ", "
     (:MACREF NIL "return") ", " (:SPECREF NIL "go") ", "
     (:SPECREF NIL "throw") ", " (:SECREF NIL :DESTRUCTURING-LOOP-VARS) " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"
      " The simple form of \\macref{loop} is related to the extended form"
      " in the following way:")
     "Except that " (:MACREF NIL "loop-finish")
     " cannot be used within a simple " (:FUNREF NIL "loop") " "
     (:TERM NIL "form") ", a simple " (:MACREF NIL "loop") " "
     (:TERM NIL "form") " is related to an extended " (:MACREF NIL "loop") " "
     (:TERM NIL "form") " in the following way: " :PAR
     (:CODE NIL " (loop " (:STAR NIL (:CURLY NIL (:PARAM NIL "compound-form")))
      ") ≡ (loop do " (:STAR NIL (:CURLY NIL (:PARAM NIL "compound-form"))) ")
")
     " " :PAR))
   :PAR (:COMMENT NIL "%% ========== LOOP-FINISH")
   (:COM (:NAME "loop-finish" :FTYPE "Local Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro" :NO-RETURN T) (:NAMES NIL "loop-finish")
      (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments"))))
     " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:FUNREF NIL "loop-finish")
     " " (:TERM NIL "macro") " can be used lexically within "
     (:COMMENT NIL "% KMP changed it to say extended" "a") "an extended "
     (:MACREF NIL "loop") " " (:TERM NIL "form") " to terminate that "
     (:TERM NIL "form")
     " “normally.” That is, it transfers control to the loop epilogue "
     (:COMMENT NIL "% Added per X3J13 -kmp 05-Oct-93")
     "of the lexically innermost extended " (:MACREF NIL "loop") " "
     (:TERM NIL "form") ". This permits execution of any "
     (:LOOPREF NIL "finally") " clause (for effect) and "
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93" "then returns")
     "the return of any accumulated result. " :PAR
     (:COMMENT NIL "% Clarified above per X3J13. -kmp 05-Oct-93"
      " %% KMP added this because it was implicitly vague and portable programs"
      " %% must know this fact to avoid utter lossage.  It affects nesting behavior,"
      " %% as explained in a note farther down. -kmp 1-Aug-93"
      " It is \\term{implementation-defined} whether \\macref{loop-finish}"
      " can be used in a simple \\macref{loop} form.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL ";; Terminate the loop, but return the accumulated count.
 (loop for i in '(1 2 3 stop-here 4 5 6)
       when (symbolp i) do (loop-finish)
       count i)
→ 3
 
;; The preceding loop is equivalent to:
 (loop for i in '(1 2 3 stop-here 4 5 6)
       until (symbolp i)
       count i)
→ 3

;; While LOOP-FINISH can be used can be used in a variety of 
;; situations it is really most needed in a situation where a need
;; to exit is detected at other than the loop's `top level'
;; (where UNTIL or WHEN often work just as well), or where some 
;; computation must occur between the point where a need to exit is
;; detected and the point where the exit actually occurs.  For example:
 (defun tokenize-sentence (string)
   (macrolet ((add-word (wvar svar)
                `(when ,wvar
                   (push (coerce (nreverse ,wvar) 'string) ,svar)
                   (setq ,wvar nil))))
     (loop with word = '() and sentence = '() and endpos = nil
           for i below (length string)
           do (let ((char (aref string i)))
                (case char
                  (#\\Space (add-word word sentence))
                  (#\\. (setq endpos (1+ i)) (loop-finish))
                  (otherwise (push char word))))
           finally (add-word word sentence)
                   (return (values (nreverse sentence) endpos)))))
→ TOKENIZE-SENTENCE
 
 (tokenize-sentence \"this is a sentence. this is another sentence.\")
→ (\"this\" \"is\" \"a\" \"sentence\"), 19
 
 (tokenize-sentence \"this is a sentence\")
→ (\"this\" \"is\" \"a\" \"sentence\"), NIL

")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "Transfers control. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "LEXICAL-CONSTRUCT-GLOBAL-DEFINITION:UNDEFINED")
     " Whether or not " (:MACREF NIL "loop-finish") " is " (:TERM NIL "fbound")
     " in the " (:TERM NIL "global environment") " is "
     (:TERM NIL "implementation-dependent")
     "; however, the restrictions on redefinition and " (:TERM NIL "shadowing")
     " of " (:MACREF NIL "loop-finish") " are the same as for "
     (:TERM NIL "symbols") " in the " (:PACKREF NIL "common-lisp") " "
     (:TERM NIL "package") " which are " (:TERM NIL "fbound") " in the "
     (:TERM NIL "global environment")
     ". The consequences of attempting to use " (:MACREF NIL "loop-finish")
     " outside of " (:MACREF NIL "loop") " are undefined. "
     (:ENDISSUE NIL "LEXICAL-CONSTRUCT-GLOBAL-DEFINITION:UNDEFINED") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "loop") ", "
     (:SECREF NIL :LOOP-FACILITY) " " :PAR
     (:COMMENT NIL "% Semantics clarified per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL
      " %% This part added to make it clear to users that this is a portability pitfall."
      " "
      " Because it is \\term{implementation-defined} whether \\macref{loop-finish} "
      " will work in a simple \\macref{loop} form, it follows an obvious consequence "
      " that a form such as the following is not portable:" " " " \\code"
      "  (loop (loop-finish))" " \\endcode" " "
      " However, what may be less obvious is that there are"
      " implications on nesting behavior as well.  In particular, it is recommended"
      " that user code not mix styles (simple and extended) of \\macref{loop} forms"
      " when \\macref{loop-finish} will be involved.  For example, the following form"
      " is also not portable:" " " " \\code" "  (loop do (loop (loop-finish)))"
      " \\endcode")
     :PAR)))
  " " :PAR)
 (:CHAPTER (:NUM "7" :TITLE ("Objects") :NUMTAG :CHAP-SEVEN :NAMETAG :OBJECTS)
  (:SECTION
   (:TITLE ("Object Creation and Initialization") :TAGS
    (:OBJECT-CREATION-AND-INIT))
   " " :PAR (:COMMENT NIL "%2.5 objects") :PAR "The "
   (:TERM NIL "generic function") " " (:FUNREF NIL "make-instance")
   " creates and returns a new " (:TERM NIL "instance") " of a "
   (:TERM NIL "class") ". The first argument is a " (:TERM NIL "class")
   " or the " (:TERM NIL "name") " of a " (:TERM NIL "class")
   ", and the remaining arguments form an "
   (:NEWTERM NIL "initialization argument list") ". " :PAR
   "The initialization of a new " (:TERM NIL "instance")
   " consists of several distinct steps, including the following: combining the explicitly supplied initialization arguments with default values for the unsupplied initialization arguments, checking the validity of the initialization arguments, allocating storage for the "
   (:TERM NIL "instance") ", filling " (:TERM NIL "slots")
   " with values, and executing user-supplied " (:TERM NIL "methods")
   " that perform additional initialization. Each step of "
   (:FUNREF NIL "make-instance") " is implemented by a "
   (:TERM NIL "generic function")
   " to provide a mechanism for customizing that step. In addition, "
   (:FUNREF NIL "make-instance") " is itself a " (:TERM NIL "generic function")
   " and thus also can be customized. " :PAR
   "The object system specifies system-supplied primary " (:TERM NIL "methods")
   " for each step and thus specifies a well-defined standard behavior for the entire initialization process. The standard behavior provides four simple mechanisms for controlling initialization: "
   :PAR
   (:LIST NIL
    (:ITEM NIL " Declaring a " (:TERM NIL "symbol")
     " to be an initialization argument for a " (:TERM NIL "slot")
     ". An initialization argument is declared by using the "
     (:KWD NIL "initarg") " slot option to " (:MACREF NIL "defclass")
     ". This provides a mechanism for supplying a value for a "
     (:TERM NIL "slot") " in a call to " (:FUNREF NIL "make-instance") ". "
     :PAR)
    (:ITEM NIL
     " Supplying a default value form for an initialization argument. Default value forms for initialization arguments are defined by using the "
     (:KWD NIL "default-initargs") " class option to " (:MACREF NIL "defclass")
     ". If an initialization argument is not explicitly provided as an argument to "
     (:FUNREF NIL "make-instance")
     ", the default value form is evaluated in the lexical environment of the "
     (:MACREF NIL "defclass")
     " form that defined it, and the resulting value is used as the value of the initialization argument. "
     :PAR)
    (:ITEM NIL " Supplying a default initial value form for a "
     (:TERM NIL "slot") ". A default initial value form for a "
     (:TERM NIL "slot") " is defined by using the " (:KWD NIL "initform")
     " slot option to " (:MACREF NIL "defclass")
     ". If no initialization argument associated with that " (:TERM NIL "slot")
     " is given as an argument to " (:FUNREF NIL "make-instance")
     " or is defaulted by " (:KWD NIL "default-initargs")
     ", this default initial value form is evaluated in the lexical environment of the "
     (:MACREF NIL "defclass")
     " form that defined it, and the resulting value is stored in the "
     (:TERM NIL "slot") ". The " (:KWD NIL "initform") " form for a "
     (:TERM NIL "local slot") " may be used when creating an "
     (:TERM NIL "instance") ", when updating an " (:TERM NIL "instance")
     " to conform to a redefined " (:TERM NIL "class") ", or when updating an "
     (:TERM NIL "instance") " to conform to the definition of a different "
     (:TERM NIL "class") ". The " (:KWD NIL "initform") " form for a "
     (:TERM NIL "shared slot") " may be used when defining or re-defining the "
     (:TERM NIL "class") ". " :PAR)
    (:ITEM NIL " Defining " (:TERM NIL "methods") " for "
     (:FUNREF NIL "initialize-instance") " and "
     (:FUNREF NIL "shared-initialize")
     ". The slot-filling behavior described above is implemented by a system-supplied primary "
     (:TERM NIL "method") " for " (:FUNREF NIL "initialize-instance")
     " which invokes " (:FUNREF NIL "shared-initialize") ". The "
     (:TERM NIL "generic function") " " (:FUNREF NIL "shared-initialize")
     " implements the parts of initialization shared by these four situations: when making an "
     (:TERM NIL "instance") ", when re-initializing an " (:TERM NIL "instance")
     ", when updating an " (:TERM NIL "instance") " to conform to a redefined "
     (:TERM NIL "class") ", and when updating an " (:TERM NIL "instance")
     " to conform to the definition of a different " (:TERM NIL "class")
     ". The system-supplied primary " (:TERM NIL "method") " for "
     (:FUNREF NIL "shared-initialize")
     " directly implements the slot-filling behavior described above, and "
     (:FUNREF NIL "initialize-instance") " simply invokes "
     (:FUNREF NIL "shared-initialize") ". " :PAR))
   " " :PAR
   (:SUBSECTION (:TITLE ("Initialization Arguments"))
    "An initialization argument controls " (:TERM NIL "object")
    " creation and initialization. It is often convenient to use keyword "
    (:TERM NIL "symbols") " to name initialization arguments, but the "
    (:TERM NIL "name") " of an initialization argument can be any "
    (:TERM NIL "symbol") ", including " (:MISC NIL "nil")
    ". An initialization argument can be used in two ways: to fill a "
    (:TERM NIL "slot")
    " with a value or to provide an argument for an initialization "
    (:TERM NIL "method")
    ". A single initialization argument can be used for both purposes. " :PAR
    (:ISSUE NIL "PLIST-DUPLICATES:ALLOW") " An "
    (:TERM NIL "initialization argument list") " is a "
    (:COMMENT NIL "list of alternating of") (:TERM NIL "property list")
    " of initialization argument names and values. Its structure is identical to a "
    (:TERM NIL "property list")
    " and also to the portion of an argument list processed for "
    (:KEYREF NIL "key")
    " parameters. As in those lists, if an initialization argument name appears more than once in an initialization argument list, the leftmost occurrence supplies the value and the remaining occurrences are ignored. The arguments to "
    (:FUNREF NIL "make-instance") " (after the first argument) form an "
    (:TERM NIL "initialization argument list") ". "
    (:ISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " "
    (:COMMENT NIL " Error-checking"
     " of initialization argument names is disabled if the keyword argument"
     " pair whose keyword is \\kwd{allow-other-keys} and whose value is"
     " \\term{non-nil} appears in the \\term{initialization argument list}.")
    (:ENDISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " "
    (:ENDISSUE NIL "PLIST-DUPLICATES:ALLOW") " " :PAR
    "An initialization argument can be associated with a " (:TERM NIL "slot")
    ". If the initialization argument has a value in the "
    (:TERM NIL "initialization argument list")
    ", the value is stored into the " (:TERM NIL "slot")
    " of the newly created " (:TERM NIL "object") ", overriding any "
    (:KWD NIL "initform") " form associated with the " (:TERM NIL "slot")
    ". A single initialization argument can initialize more than one "
    (:TERM NIL "slot") ". An initialization argument that initializes a "
    (:TERM NIL "shared slot") " stores its value into the "
    (:TERM NIL "shared slot") ", replacing any previous value. " :PAR
    "An initialization argument can be associated with a " (:TERM NIL "method")
    ". When an " (:TERM NIL "object")
    " is created and a particular initialization argument is supplied, the "
    (:TERM NIL "generic functions") " " (:FUNREF NIL "initialize-instance")
    ", " (:FUNREF NIL "shared-initialize") ", and "
    (:FUNREF NIL "allocate-instance")
    " are called with that initialization argument's name and value as a keyword argument pair. If a value for the initialization argument is not supplied in the "
    (:TERM NIL "initialization argument list") ", the " (:TERM NIL "method")
    "'s " (:TERM NIL "lambda list") " supplies a default value. " :PAR
    "Initialization arguments are used in four situations: when making an "
    (:TERM NIL "instance") ", when re-initializing an " (:TERM NIL "instance")
    ", when updating an " (:TERM NIL "instance") " to conform to a redefined "
    (:TERM NIL "class") ", and when updating an " (:TERM NIL "instance")
    " to conform to the definition of a different " (:TERM NIL "class") ". "
    :PAR
    "Because initialization arguments are used to control the creation and initialization of an "
    (:TERM NIL "instance") " of some particular " (:TERM NIL "class")
    ", we say that an initialization argument is “an initialization argument for” that "
    (:TERM NIL "class") ". " :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Declaring the Validity of Initialization Arguments") :TAGS
     (:DECLARING-INITARG-VALIDITY))
    " " :PAR
    "Initialization arguments are checked for validity in each of the four situations that use them. An initialization argument may be valid in one situation and not another. For example, the system-supplied primary "
    (:TERM NIL "method") " for " (:FUNREF NIL "make-instance")
    " defined for the " (:TERM NIL "class") " " (:TYPEREF NIL "standard-class")
    " checks the validity of its initialization arguments and signals an error if an initialization argument is supplied that is not declared as valid in that situation. "
    :PAR "There are two means for declaring initialization arguments valid. "
    :PAR
    (:LIST NIL
     (:ITEM NIL " Initialization arguments that fill " (:TERM NIL "slots")
      " are declared as valid by the " (:KWD NIL "initarg") " slot option to "
      (:MACREF NIL "defclass") ". The " (:KWD NIL "initarg")
      " slot option is inherited from " (:TERM NIL "superclasses")
      ". Thus the set of valid initialization arguments that fill "
      (:TERM NIL "slots") " for a " (:TERM NIL "class")
      " is the union of the initialization arguments that fill "
      (:TERM NIL "slots") " declared as valid by that " (:TERM NIL "class")
      " and its " (:TERM NIL "superclasses")
      ". Initialization arguments that fill " (:TERM NIL "slots")
      " are valid in all four contexts. " :PAR)
     (:ITEM NIL " Initialization arguments that supply arguments to "
      (:TERM NIL "methods") " are declared as valid by defining those "
      (:TERM NIL "methods")
      ". The keyword name of each keyword parameter specified in the "
      (:TERM NIL "method") "'s " (:TERM NIL "lambda list")
      " becomes an initialization argument for all " (:TERM NIL "classes")
      " for which the " (:TERM NIL "method") " is applicable. "
      (:ISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING")
      " The presence of " (:KEYWORD NIL " &allow-other-keys") " in the "
      (:TERM NIL "lambda list")
      " of an applicable method disables validity checking of initialization arguments. "
      (:ENDISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " Thus "
      (:TERM NIL "method")
      " inheritance controls the set of valid initialization arguments that supply arguments to "
      (:TERM NIL "methods") ". The " (:TERM NIL "generic functions")
      " for which " (:TERM NIL "method")
      " definitions serve to declare initialization arguments valid are as follows: "
      (:LIST NIL
       (:ITEM NIL "– Making an " (:TERM NIL "instance") " of a "
        (:TERM NIL "class") ": " (:FUNREF NIL "allocate-instance") ", "
        (:FUNREF NIL "initialize-instance") ", and "
        (:FUNREF NIL "shared-initialize")
        ". Initialization arguments declared as valid by these "
        (:TERM NIL "methods") " are valid when making an "
        (:TERM NIL "instance") " of a " (:TERM NIL "class") ". " :PAR)
       (:ITEM NIL "– Re-initializing an " (:TERM NIL "instance") ": "
        (:FUNREF NIL "reinitialize-instance") " and "
        (:FUNREF NIL "shared-initialize")
        ". Initialization arguments declared as valid by these "
        (:TERM NIL "methods") " are valid when re-initializing an "
        (:TERM NIL "instance") ". " :PAR)
       (:ITEM NIL "– Updating an " (:TERM NIL "instance")
        " to conform to a redefined " (:TERM NIL "class") ": "
        (:FUNREF NIL "update-instance-for-redefined-class") " and "
        (:FUNREF NIL "shared-initialize")
        ". Initialization arguments declared as valid by these "
        (:TERM NIL "methods") " are valid when updating an "
        (:TERM NIL "instance") " to conform to a redefined "
        (:TERM NIL "class") ". " :PAR)
       (:ITEM NIL "– Updating an " (:TERM NIL "instance")
        " to conform to the definition of a different " (:TERM NIL "class")
        ": " (:FUNREF NIL "update-instance-for-different-class") " and "
        (:FUNREF NIL "shared-initialize")
        ". Initialization arguments declared as valid by these "
        (:TERM NIL "methods") " are valid when updating an "
        (:TERM NIL "instance") " to conform to the definition of a different "
        (:TERM NIL "class") ". " :PAR))
      " "))
    " " :PAR "The set of valid initialization arguments for a "
    (:TERM NIL "class")
    " is the set of valid initialization arguments that either fill "
    (:TERM NIL "slots") " or supply arguments to " (:TERM NIL "methods")
    ", along with the predefined initialization argument "
    (:KWD NIL "allow-other-keys") ". The default value for "
    (:KWD NIL "allow-other-keys") " is " (:MISC NIL "nil") ". "
    (:ISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " "
    (:COMMENT NIL " The meaning of "
     " \\kwd{allow-other-keys} is the same as when it is passed to an ordinary"
     " \\term{function}.")
    "Validity checking of initialization arguments is disabled if the value of the initialization argument "
    (:KWD NIL "allow-other-keys") " is " (:TERM NIL "true") ". "
    (:ENDISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Defaulting of Initialization Arguments"))
    "A default value " (:TERM NIL "form")
    " can be supplied for an initialization argument by using the "
    (:KWD NIL "default-initargs") " " (:TERM NIL "class")
    " option. If an initialization argument is declared valid by some particular "
    (:TERM NIL "class")
    ", its default value form might be specified by a different "
    (:TERM NIL "class") ". In this case " (:KWD NIL "default-initargs")
    " is used to supply a default value for an inherited initialization argument. "
    :PAR "The " (:KWD NIL "default-initargs")
    " option is used only to provide default values for initialization arguments; it does not declare a "
    (:TERM NIL "symbol")
    " as a valid initialization argument name. Furthermore, the "
    (:KWD NIL "default-initargs")
    " option is used only to provide default values for initialization arguments when making an "
    (:TERM NIL "instance") ". " :PAR "The argument to the "
    (:KWD NIL "default-initargs")
    " class option is a list of alternating initialization argument names and "
    (:TERM NIL "forms") ". Each " (:TERM NIL "form")
    " is the default value form for the corresponding initialization argument. The default value "
    (:TERM NIL "form")
    " of an initialization argument is used and evaluated only if that initialization argument does not appear in the arguments to "
    (:FUNREF NIL "make-instance") " and is not defaulted by a more specific "
    (:TERM NIL "class") ". The default value " (:TERM NIL "form")
    " is evaluated in the lexical environment of the " (:MACREF NIL "defclass")
    " form that supplied it; the resulting value is used as the initialization argument's value. "
    :PAR "The initialization arguments supplied to "
    (:FUNREF NIL "make-instance")
    " are combined with defaulted initialization arguments to produce a "
    (:TERM NIL "defaulted initialization argument list") ". A "
    (:TERM NIL "defaulted initialization argument list")
    " is a list of alternating initialization argument names and values in which unsupplied initialization arguments are defaulted and in which the explicitly supplied initialization arguments appear earlier in the list than the defaulted initialization arguments. Defaulted initialization arguments are ordered according to the order in the "
    (:TERM NIL "class precedence list") " of the " (:TERM NIL "classes")
    " that supplied the default values. " :PAR
    "There is a distinction between the purposes of the "
    (:KWD NIL "default-initargs") " and the " (:KWD NIL "initform")
    " options with respect to the initialization of " (:TERM NIL "slots")
    ". The " (:KWD NIL "default-initargs")
    " class option provides a mechanism for the user to give a default value "
    (:TERM NIL "form")
    " for an initialization argument without knowing whether the initialization argument initializes a "
    (:TERM NIL "slot") " or is passed to a " (:TERM NIL "method")
    ". If that initialization argument is not explicitly supplied in a call to "
    (:FUNREF NIL "make-instance") ", the default value " (:TERM NIL "form")
    " is used, just as if it had been supplied in the call. In contrast, the "
    (:KWD NIL "initform")
    " slot option provides a mechanism for the user to give a default initial value form for a "
    (:TERM NIL "slot") ". An " (:KWD NIL "initform")
    " form is used to initialize a " (:TERM NIL "slot")
    " only if no initialization argument associated with that "
    (:TERM NIL "slot") " is given as an argument to "
    (:FUNREF NIL "make-instance") " or is defaulted by "
    (:KWD NIL "default-initargs") ". " :PAR
    (:IDXTEXT NIL "order of evaluation") (:IDXTEXT NIL "evaluation order")
    " The order of evaluation of default value " (:TERM NIL "forms")
    " for initialization arguments and the order of evaluation of "
    (:KWD NIL "initform")
    " forms are undefined. If the order of evaluation is important, "
    (:FUNREF NIL "initialize-instance") " or "
    (:FUNREF NIL "shared-initialize") " " (:TERM NIL "methods")
    " should be used instead. " :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Rules for Initialization Arguments") :TAGS (:INITARG-RULES)) " "
    :PAR "The " (:KWD NIL "initarg")
    " slot option may be specified more than once for a given "
    (:TERM NIL "slot") ". " :PAR
    "The following rules specify when initialization arguments may be multiply defined: "
    :PAR
    (:LIST NIL
     (:ITEM NIL
      " A given initialization argument can be used to initialize more than one "
      (:TERM NIL "slot")
      " if the same initialization argument name appears in more than one "
      (:KWD NIL "initarg") " slot option. " :PAR)
     (:ITEM NIL " A given initialization argument name can appear in the "
      (:TERM NIL "lambda list") " of more than one initialization "
      (:TERM NIL "method") ". " :PAR)
     (:ITEM NIL " A given initialization argument name can appear both in an "
      (:KWD NIL "initarg") " slot option and in the " (:TERM NIL "lambda list")
      " of an initialization " (:TERM NIL "method") ". " :PAR))
    " " :PAR
    (:REVIEWER NIL
     "The next three paragraphs could be replaced by “If two or more initialization arguments that initialize the same slot appear in the "
     (:TERM NIL "defaulted initialization argument list")
     ", the leftmost of these supplies the value, even if they have different names.” And the rest would follow from the rules above.")
    " " :PAR
    "If two or more initialization arguments that initialize the same "
    (:TERM NIL "slot") " are given in the arguments to "
    (:FUNREF NIL "make-instance")
    ", the leftmost of these initialization arguments in the "
    (:TERM NIL "initialization argument list")
    " supplies the value, even if the initialization arguments have different names. "
    :PAR
    "If two or more different initialization arguments that initialize the same "
    (:TERM NIL "slot")
    " have default values and none is given explicitly in the arguments to "
    (:FUNREF NIL "make-instance")
    ", the initialization argument that appears in a "
    (:KWD NIL "default-initargs") " class option in the most specific of the "
    (:TERM NIL "classes") " supplies the value. If a single "
    (:KWD NIL "default-initargs")
    " class option specifies two or more initialization arguments that initialize the same "
    (:TERM NIL "slot") " and none is given explicitly in the arguments to "
    (:FUNREF NIL "make-instance") ", the leftmost in the "
    (:KWD NIL "default-initargs")
    " class option supplies the value, and the values of the remaining default value "
    (:TERM NIL "forms") " are ignored. " :PAR
    "Initialization arguments given explicitly in the arguments to "
    (:FUNREF NIL "make-instance")
    " appear to the left of defaulted initialization arguments. Suppose that the classes "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) " and "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2")))
    " supply the values of defaulted initialization arguments for different "
    (:TERM NIL "slots") ", and suppose that "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1")))
    " is more specific than "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2")))
    "; then the defaulted initialization argument whose value is supplied by "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1")))
    " is to the left of the defaulted initialization argument whose value is supplied by "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) " in the "
    (:TERM NIL "defaulted initialization argument list") ". If a single "
    (:KWD NIL "default-initargs")
    " class option supplies the values of initialization arguments for two different "
    (:TERM NIL "slots")
    ", the initialization argument whose value is specified farther to the left in the "
    (:KWD NIL "default-initargs")
    " class option appears farther to the left in the "
    (:TERM NIL "defaulted initialization argument list") ". " :PAR
    (:REVIEWER NIL "Barmar: End of claim made three paragraphs back.") " " :PAR
    "If a " (:TERM NIL "slot") " has both an " (:KWD NIL "initform")
    " form and an " (:KWD NIL "initarg")
    " slot option, and the initialization argument is defaulted using "
    (:KWD NIL "default-initargs") " or is supplied to "
    (:FUNREF NIL "make-instance") ", the captured " (:KWD NIL "initform")
    " form is neither used nor evaluated. " :PAR
    "The following is an example of the above rules: " :PAR
    (:CODE NIL " (defclass q () ((x :initarg a)))
 (defclass r (q) ((x :initarg b))
   (:default-initargs a 1 b 2))
")
    " " :PAR
    (:DISPLAYMATH NIL
     (:MTABLE NIL
      (:MTR NIL (:MTD NIL) (:MTD NIL (:MTEXT (:FONT :B) " Defaulted"))
       (:MTD NIL))
      (:MTR NIL (:MTD NIL (:MTEXT (:FONT :B) " Form"))
       (:MTD NIL (:MTEXT (:FONT :B) " Initialization Argument List"))
       (:MTD NIL (:MTEXT (:FONT :B) " Contents of Slot X")))
      (:MTR NIL (:MTD NIL (:MTEXT (:FONT :TT) " (make-instance 'r)"))
       (:MTD NIL (:MTEXT (:FONT :TT) " (a 1 b 2)"))
       (:MTD NIL (:MTEXT (:FONT :TT) " 1")))
      (:MTR NIL (:MTD NIL (:MTEXT (:FONT :TT) " (make-instance 'r 'a 3)"))
       (:MTD NIL (:MTEXT (:FONT :TT) " (a 3 b 2)"))
       (:MTD NIL (:MTEXT (:FONT :TT) " 3")))
      (:MTR NIL (:MTD NIL (:MTEXT (:FONT :TT) " (make-instance 'r 'b 4)"))
       (:MTD NIL (:MTEXT (:FONT :TT) " (b 4 a 1)"))
       (:MTD NIL (:MTEXT (:FONT :TT) " 4")))
      (:MTR NIL (:MTD NIL (:MTEXT (:FONT :TT) " (make-instance 'r 'a 1 'a 2)"))
       (:MTD NIL (:MTEXT (:FONT :TT) " (a 1 a 2 b 2)"))
       (:MTD NIL (:MTEXT (:FONT :TT) " 1")))))
    " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Shared-Initialize") :TAGS (:SHARED-INITIALIZE)) " "
    :PAR "The " (:TERM NIL "generic function") " "
    (:FUNREF NIL "shared-initialize") " is used to fill the "
    (:TERM NIL "slots") " of an " (:TERM NIL "instance")
    " using initialization arguments and " (:KWD NIL "initform")
    " forms when an " (:TERM NIL "instance") " is created, when an "
    (:TERM NIL "instance") " is re-initialized, when an "
    (:TERM NIL "instance") " is updated to conform to a redefined "
    (:TERM NIL "class") ", and when an " (:TERM NIL "instance")
    " is updated to conform to a different " (:TERM NIL "class")
    ". It uses standard " (:TERM NIL "method")
    " combination. It takes the following arguments: the "
    (:TERM NIL "instance") " to be initialized, a specification of a set of "
    (:TERM NIL "names") " of " (:TERM NIL "slots") " " (:TERM NIL "accessible")
    " in that " (:TERM NIL "instance")
    ", and any number of initialization arguments. The arguments after the first two must form an "
    (:TERM NIL "initialization argument list") ". " :PAR
    "The second argument to " (:FUNREF NIL "shared-initialize")
    " may be one of the following: " :PAR
    (:LIST NIL
     (:ITEM NIL " It can be a (possibly empty) " (:TERM NIL "list") " of "
      (:TERM NIL "slot") " names, which specifies the set of those "
      (:TERM NIL "slot") " names. " :PAR
      (:COMMENT NIL
       " \\reviewer{Barmar: This next bullet item is redundant with the previous, "
       " since NIL -is- a LIST.  If there was some confusion, we could say ``(possibly empty)''"
       " in the previous item.}" " "
       " \\itemitem{\\bull} It can be \\nil, which specifies the empty set of"
       " \\term{slot} names.")
      :PAR)
     (:ITEM NIL " It can be the symbol " (:MISC NIL "t")
      ", which specifies the set of all of the " (:TERM NIL "slots") ". "
      :PAR))
    " " :PAR "There is a system-supplied primary " (:TERM NIL "method") " for "
    (:FUNREF NIL "shared-initialize") " whose first "
    (:TERM NIL "parameter specializer") " is the " (:TERM NIL "class") " "
    (:TYPEREF NIL "standard-object") ". This " (:TERM NIL "method")
    " behaves as follows on each " (:TERM NIL "slot")
    ", whether shared or local: " :PAR
    (:LIST NIL
     (:ITEM NIL " If an initialization argument in the "
      (:TERM NIL "initialization argument list") " specifies a value for that "
      (:TERM NIL "slot") ", that value is stored into the " (:TERM NIL "slot")
      ", even if a value has already been stored in the " (:TERM NIL "slot")
      " before the " (:TERM NIL "method") " is run. The affected "
      (:TERM NIL "slots") " are independent of which " (:TERM NIL "slots")
      " are indicated by the second argument to "
      (:FUNREF NIL "shared-initialize") ". " :PAR)
     (:ITEM NIL " Any " (:TERM NIL "slots")
      " indicated by the second argument that are still unbound at this point are initialized according to their "
      (:KWD NIL "initform") " forms. For any such " (:TERM NIL "slot")
      " that has an " (:KWD NIL "initform") " form, that " (:TERM NIL "form")
      " is evaluated in the lexical environment of its defining "
      (:MACREF NIL "defclass") " form and the result is stored into the "
      (:TERM NIL "slot") ". For example, if a " (:TERM NIL "before method")
      " stores a value in the " (:TERM NIL "slot") ", the "
      (:KWD NIL "initform") " form will not be used to supply a value for the "
      (:TERM NIL "slot") ". If the second argument specifies a "
      (:TERM NIL "name") " that does not correspond to any "
      (:TERM NIL "slots") " " (:TERM NIL "accessible") " in the "
      (:TERM NIL "instance") ", the results are unspecified. " :PAR)
     (:ITEM NIL " The rules mentioned in " (:SECREF NIL :INITARG-RULES)
      " are obeyed. " :PAR))
    " " :PAR "The generic function " (:FUNREF NIL "shared-initialize")
    " is called by the system-supplied primary " (:TERM NIL "methods") " for "
    (:FUNREF NIL "reinitialize-instance") ", "
    (:FUNREF NIL "update-instance-for-different-class") ", "
    (:FUNREF NIL "update-instance-for-redefined-class") ", and "
    (:FUNREF NIL "initialize-instance") ". Thus, " (:TERM NIL "methods")
    " can be written for " (:FUNREF NIL "shared-initialize")
    " to specify actions that should be taken in all of these contexts. " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Initialize-Instance")) "The "
    (:TERM NIL "generic function") " " (:FUNREF NIL "initialize-instance")
    " is called by " (:FUNREF NIL "make-instance")
    " to initialize a newly created " (:TERM NIL "instance") ". It uses "
    (:TERM NIL "standard method combination") ". " (:TERM NIL "Methods")
    " for " (:FUNREF NIL "initialize-instance")
    " can be defined in order to perform any initialization that cannot be achieved "
    (:COMMENT NIL
     "%This was the only case of a half-glossary-term in the entire spec. -kmp 1-Jan-91"
     "with the simple \\term{slot}-filling mechanisms.")
    "simply by supplying initial values for " (:TERM NIL "slots") ". " :PAR
    "During initialization, " (:FUNREF NIL "initialize-instance")
    " is invoked after the following actions have been taken: " :PAR
    (:LIST NIL
     (:ITEM NIL " The " (:TERM NIL "defaulted initialization argument list")
      " has been computed by combining the supplied "
      (:TERM NIL "initialization argument list")
      " with any default initialization arguments for the " (:TERM NIL "class")
      ". " :PAR)
     (:ITEM NIL " The validity of the "
      (:TERM NIL "defaulted initialization argument list")
      " has been checked. If any of the initialization arguments has not been declared as valid, an error is signaled. "
      :PAR)
     (:ITEM NIL " A new " (:TERM NIL "instance") " whose " (:TERM NIL "slots")
      " are unbound has been created. " :PAR))
    " " :PAR "The generic function " (:FUNREF NIL "initialize-instance")
    " is called with the new " (:TERM NIL "instance")
    " and the defaulted initialization arguments. There is a system-supplied primary "
    (:TERM NIL "method") " for " (:FUNREF NIL "initialize-instance") " whose "
    (:TERM NIL "parameter specializer") " is the " (:TERM NIL "class") " "
    (:TYPEREF NIL "standard-object") ". This " (:TERM NIL "method")
    " calls the generic function " (:FUNREF NIL "shared-initialize")
    " to fill in the " (:TERM NIL "slots")
    " according to the initialization arguments and the " (:KWD NIL "initform")
    " forms for the " (:TERM NIL "slots") "; the generic function "
    (:FUNREF NIL "shared-initialize")
    " is called with the following arguments: the " (:TERM NIL "instance") ", "
    (:MISC NIL "t") ", and the defaulted initialization arguments. " :PAR
    "Note that " (:FUNREF NIL "initialize-instance") " provides the "
    (:TERM NIL "defaulted initialization argument list") " in its call to "
    (:FUNREF NIL "shared-initialize")
    ", so the first step performed by the system-supplied primary "
    (:TERM NIL "method") " for " (:FUNREF NIL "shared-initialize")
    " takes into account both the initialization arguments provided in the call to "
    (:FUNREF NIL "make-instance") " and the "
    (:TERM NIL "defaulted initialization argument list") ". " :PAR
    (:TERM NIL "Methods") " for " (:FUNREF NIL "initialize-instance")
    " can be defined to specify actions to be taken when an "
    (:TERM NIL "instance") " is initialized. If only "
    (:TERM NIL "after methods") " for " (:FUNREF NIL "initialize-instance")
    " are defined, they will be run after the system-supplied primary "
    (:TERM NIL "method")
    " for initialization and therefore will not interfere with the default behavior of "
    (:FUNREF NIL "initialize-instance") ". " :PAR
    "The object system provides two " (:TERM NIL "functions")
    " that are useful in the bodies of " (:FUNREF NIL "initialize-instance")
    " methods. The " (:TERM NIL "function") " " (:FUNREF NIL "slot-boundp")
    " returns a " (:TERM NIL "generic boolean")
    " value that indicates whether a specified " (:TERM NIL "slot")
    " has a value; this provides a mechanism for writing "
    (:TERM NIL "after methods") " for " (:FUNREF NIL "initialize-instance")
    " that initialize " (:TERM NIL "slots")
    " only if they have not already been initialized. The "
    (:TERM NIL "function") " " (:FUNREF NIL "slot-makunbound") " causes the "
    (:TERM NIL "slot") " to have no value. " :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Definitions of Make-Instance and Initialize-Instance"))
    "The generic function " (:FUNREF NIL "make-instance")
    " behaves as if it were defined as follows, except that certain optimizations are permitted: "
    :PAR
    (:CODE NIL
     " (defmethod make-instance ((class standard-class) &rest initargs)
   ...
   (let ((instance (apply #'allocate-instance class initargs)))
     (apply #'initialize-instance instance initargs)
     instance))

 (defmethod make-instance ((class-name symbol) &rest initargs)
   (apply #'make-instance (find-class class-name) initargs))
")
    " " :PAR
    (:COMMENT NIL "This is the code:"
     "(defmethod make-instance ((class standard-class) &rest initargs)"
     "  (setq initargs (default-initargs class initargs))"
     "  (let* ((proto (class-prototype class))" "         (methods "
     "           (append"
     "	      (compute-applicable-methods #'allocate-instance `(,class))"
     "	      (compute-applicable-methods #'initialize-instance `(,proto))"
     "	      (compute-applicable-methods #'shared-initialize `(,proto nil)))))"
     "	 (unless" "	   (subsetp" "	     (let ((keys '()))"
     "	       (do ((plist initargs (cddr plist)))" "		   ((null plist) keys)"
     "	 	 (push (car plist) keys)))" "	     (union "
     "	       (class-slot-initargs class)"
     "	       (reduce #'union (mapcar #'function-keywords methods))))"
     "	   (error ...)))"
     "  (let ((instance (apply #'allocate-instance class initargs)))"
     "    (apply #'initialize-instance instance initargs)" "    instance))")
    :PAR "The elided code in the definition of " (:FUNREF NIL "make-instance")
    " " (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93 ") "augments the "
    (:TT NIL "initargs") " with any "
    (:TERM NIL "defaulted initialization arguments") " and checks the "
    (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93 " "supplied")
    "resulting initialization arguments to determine whether an initialization argument was supplied that neither filled a "
    (:TERM NIL "slot") " nor supplied an argument to an applicable "
    (:TERM NIL "method") ". "
    (:COMMENT NIL "This check could be implemented using the generic functions"
     " ???\\funref{class-prototype},??? \\funref{compute-applicable-methods},"
     "\\funref{function-keywords}, and ???\\funref{class-slot-initargs}. ???"
     "See Chapter~3 for a"
     "description of this initialization argument check.")
    :PAR "The generic function " (:FUNREF NIL "initialize-instance")
    " behaves as if it were defined as follows, except that certain optimizations are permitted: "
    :PAR
    (:CODE NIL
     " (defmethod initialize-instance ((instance standard-object) &rest initargs)
   (apply #'shared-initialize instance t initargs)))
")
    " " :PAR
    (:COMMENT NIL
     " Barmar complains that \"Programmer Interface level\" is not defined."
     "    Presumably it means \"this specification\"."
     "    Ditto \"the meta-object level\" is not defined."
     "    Presumably it should just be omitted as beyond the scope of this standard,"
     "    or else we should define the term somewhere (e.g., the glossary)."
     " I decided to just trim it down to where glossary words weren't needed. -kmp 6-Jan-91")
    "These procedures can be customized. "
    (:COMMENT NIL " at either the Programmer Interface level,"
     " the meta-object level, or both.  ")
    :PAR "Customizing at the Programmer Interface level includes using the "
    (:KWD NIL "initform") ", " (:KWD NIL "initarg") ", and "
    (:KWD NIL "default-initargs") " options to " (:MACREF NIL "defclass")
    ", as well as defining " (:TERM NIL "methods") " for "
    (:FUNREF NIL "make-instance") ", "
    (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93")
    (:FUNREF NIL "allocate-instance") ", and "
    (:FUNREF NIL "initialize-instance") ". It is also possible to define "
    (:TERM NIL "methods") " for " (:FUNREF NIL "shared-initialize")
    ", which would be invoked by the generic functions "
    (:FUNREF NIL "reinitialize-instance") ", "
    (:FUNREF NIL "update-instance-for-redefined-class") ", "
    (:FUNREF NIL "update-instance-for-different-class") ", and "
    (:FUNREF NIL "initialize-instance")
    ". The meta-object level supports additional customization. "
    (:COMMENT NIL
     "by allowing methods to be defined on \\funref{make-instance},                       "
     "???\\b{default-initargs}???, and \\funref{allocate-instance}.  "
     "Chapters~2 and~3 document each of these generic"
     "functions and the system-supplied primary methods.")
    :PAR "Implementations are permitted to make certain optimizations to "
    (:FUNREF NIL "initialize-instance") " and "
    (:FUNREF NIL "shared-initialize") ". The description of "
    (:FUNREF NIL "shared-initialize")
    " in Chapter 7 mentions the possible optimizations. " :PAR
    (:COMMENT NIL
     "Because of optimization, the check for valid initialization arguments"
     "might not be implemented using the generic functions "
     "???\\funref{class-prototype},??? "
     "\\funref{compute-applicable-methods}, \\funref{function-keywords}, and "
     "???\\funref{class-slot-initargs}???. In addition,"
     "methods for the generic function "
     "???\\funref{default-initargs},??? and the"
     "system-supplied primary methods for "
     "???\\funref{allocate-instance}???, "
     "\\funref{initialize-instance}, and \\funref{shared-initialize} might not be called on"
     "every call to \\funref{make-instance} or might not receive exactly the"
     "arguments that would be expected.")
    :PAR)
   :PAR)
  :PAR
  (:SECTION
   (:TITLE ("Changing the Class of an Instance") :TAGS
    (:CHANGING-INSTANCE-CLASS))
   " " :PAR "The " (:TERM NIL "function") " " (:FUNREF NIL "change-class")
   " can be used to change the " (:TERM NIL "class") " of an "
   (:TERM NIL "instance") " from its current class, "
   (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "from")))
   ", to a different class, "
   (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "to")))
   "; it changes the structure of the " (:TERM NIL "instance")
   " to conform to the definition of the class "
   (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "to"))) ". " :PAR
   "Note that changing the " (:TERM NIL "class") " of an "
   (:TERM NIL "instance") " may cause " (:TERM NIL "slots")
   " to be added or deleted. Changing the " (:TERM NIL "class") " of an "
   (:TERM NIL "instance") " does not change its identity as defined by the "
   (:FUNREF NIL "eq") " function. " :PAR "When " (:FUNREF NIL "change-class")
   " is invoked on an " (:TERM NIL "instance")
   ", a two-step updating process takes place. The first step modifies the structure of the "
   (:TERM NIL "instance") " by adding new " (:TERM NIL "local slots")
   " and discarding " (:TERM NIL "local slots")
   " that are not specified in the new version of the " (:TERM NIL "instance")
   ". The second step initializes the newly added " (:TERM NIL "local slots")
   " and performs any other user-defined actions. These two steps are further described in the two following sections. "
   :PAR
   (:SUBSECTION (:TITLE ("Modifying the Structure of the Instance"))
    "In order to make the " (:TERM NIL "instance") " conform to the class "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "to"))) ", "
    (:TERM NIL "local slots") " specified by the class "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "to")))
    " that are not specified by the class "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "from"))) " are added, and "
    (:TERM NIL "local slots") " not specified by the class "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "to")))
    " that are specified by the class "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "from"))) " are discarded. "
    :PAR "The values of " (:TERM NIL "local slots")
    " specified by both the class "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "to"))) " and the class "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "from")))
    " are retained. If such a " (:TERM NIL "local slot")
    " was unbound, it remains unbound. " :PAR "The values of "
    (:TERM NIL "slots") " specified as shared in the class "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "from")))
    " and as local in the class "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "to"))) " are retained. " :PAR
    "This first step of the update does not affect the values of any "
    (:TERM NIL "shared slots") ". " :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Initializing Newly Added Local Slots") :TAGS
     (:INIT-NEW-LOCAL-SLOTS))
    " " :PAR "The second step of the update initializes the newly added "
    (:TERM NIL "slots")
    " and performs any other user-defined actions. This step is implemented by the generic function "
    (:FUNREF NIL "update-instance-for-different-class")
    ". The generic function "
    (:FUNREF NIL "update-instance-for-different-class") " is invoked by "
    (:FUNREF NIL "change-class")
    " after the first step of the update has been completed. " :PAR
    (:ISSUE NIL "CHANGE-CLASS-INITARGS:PERMIT") " The generic function "
    (:FUNREF NIL "update-instance-for-different-class")
    " is invoked on arguments computed by " (:FUNREF NIL "change-class")
    ". The first argument passed is a copy of the " (:TERM NIL "instance")
    " being updated and is an " (:TERM NIL "instance") " of the class "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "from"))) "; this copy has "
    (:TERM NIL "dynamic extent") " within the generic function "
    (:FUNREF NIL "change-class") ". The second argument is the "
    (:TERM NIL "instance") " as updated so far by "
    (:FUNREF NIL "change-class") " and is an " (:TERM NIL "instance")
    " of the class " (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MI NIL "to")))
    ". The remaining arguments are an "
    (:TERM NIL "initialization argument list") ". " :PAR
    (:COMMENT NIL
     " The generic function \\funref{update-instance-for-different-class} also"
     " takes any number of initialization arguments.  When it is called by"
     " \\funref{change-class}, no initialization arguments are provided.")
    (:ENDISSUE NIL "CHANGE-CLASS-INITARGS:PERMIT") " " :PAR
    "There is a system-supplied primary " (:TERM NIL "method") " for "
    (:FUNREF NIL "update-instance-for-different-class")
    " that has two parameter specializers, each of which is the "
    (:TERM NIL "class") " " (:TYPEREF NIL "standard-object") ". First this "
    (:TERM NIL "method")
    " checks the validity of initialization arguments and signals an error if an initialization argument is supplied that is not declared as valid. (For more information, see "
    (:SECREF NIL :DECLARING-INITARG-VALIDITY)
    ".) Then it calls the generic function " (:FUNREF NIL "shared-initialize")
    " with the following arguments: the "
    (:COMMENT NIL "Barmar suggested we insert the word \"new\" here.") "new "
    (:TERM NIL "instance") ", a list of " (:TERM NIL "names")
    " of the newly added " (:TERM NIL "slots")
    ", and the initialization arguments it received. " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Customizing the Change of Class of an Instance"))
    (:TERM NIL "Methods") " for "
    (:FUNREF NIL "update-instance-for-different-class")
    " may be defined to specify actions to be taken when an "
    (:TERM NIL "instance") " is updated. If only " (:TERM NIL "after methods")
    " for " (:FUNREF NIL "update-instance-for-different-class")
    " are defined, they will be run after the system-supplied primary "
    (:TERM NIL "method")
    " for initialization and will not interfere with the default behavior of "
    (:FUNREF NIL "update-instance-for-different-class") ". "
    (:COMMENT NIL "% Removed per X3J13. -kmp 05-Oct-93"
     " Because no initialization"
     " arguments are passed to \\funref{update-instance-for-different-class} when"
     " it is called by \\funref{change-class}, "
     " the \\kwd{initform} forms for \\term{slots}"
     " that are filled by \\term{before methods} for "
     " \\funref{update-instance-for-different-class} will not be evaluated by"
     " \\funref{shared-initialize}.")
    :PAR (:TERM NIL "Methods") " for " (:FUNREF NIL "shared-initialize")
    " may be defined to customize " (:TERM NIL "class")
    " redefinition. For more information, see "
    (:SECREF NIL :SHARED-INITIALIZE) ". " :PAR)
   :PAR)
  :PAR
  (:SECTION (:TITLE ("Reinitializing an Instance") :TAGS (:INSTANCE-RE-INIT))
   " " :PAR "The generic function " (:FUNREF NIL "reinitialize-instance")
   " may be used to change the values of " (:TERM NIL "slots")
   " according to initialization arguments. " :PAR
   "The process of reinitialization changes the values of some "
   (:TERM NIL "slots")
   " and performs any user-defined actions. It does not modify the structure of an "
   (:TERM NIL "instance") " to add or delete " (:TERM NIL "slots")
   ", and it does not use any " (:KWD NIL "initform") " forms to initialize "
   (:TERM NIL "slots") ". " :PAR "The generic function "
   (:FUNREF NIL "reinitialize-instance")
   " may be called directly. It takes one required argument, the "
   (:TERM NIL "instance")
   ". It also takes any number of initialization arguments to be used by "
   (:TERM NIL "methods") " for " (:FUNREF NIL "reinitialize-instance")
   " or for " (:FUNREF NIL "shared-initialize")
   ". The arguments after the required " (:TERM NIL "instance")
   " must form an " (:TERM NIL "initialization argument list") ". " :PAR
   "There is a system-supplied primary " (:TERM NIL "method") " for "
   (:FUNREF NIL "reinitialize-instance") " whose "
   (:TERM NIL "parameter specializer") " is the " (:TERM NIL "class") " "
   (:TYPEREF NIL "standard-object") ". First this " (:TERM NIL "method")
   " checks the validity of initialization arguments and signals an error if an initialization argument is supplied that is not declared as valid. (For more information, see "
   (:SECREF NIL :DECLARING-INITARG-VALIDITY)
   ".) Then it calls the generic function " (:FUNREF NIL "shared-initialize")
   " with the following arguments: the " (:TERM NIL "instance") ", "
   (:MISC NIL "nil") ", and the initialization arguments it received. " :PAR
   (:SUBSECTION (:TITLE ("Customizing Reinitialization")) (:TERM NIL "Methods")
    " for " (:FUNREF NIL "reinitialize-instance")
    " may be defined to specify actions to be taken when an "
    (:TERM NIL "instance") " is updated. If only " (:TERM NIL "after methods")
    " for " (:FUNREF NIL "reinitialize-instance")
    " are defined, they will be run after the system-supplied primary "
    (:TERM NIL "method")
    " for initialization and therefore will not interfere with the default behavior of "
    (:FUNREF NIL "reinitialize-instance") ". " :PAR (:TERM NIL "Methods")
    " for " (:FUNREF NIL "shared-initialize") " may be defined to customize "
    (:TERM NIL "class") " redefinition. For more information, see "
    (:SECREF NIL :SHARED-INITIALIZE) ". " :PAR)
   :PAR)
  :PAR
  (:SECTION (:TITLE ("Meta-Objects") :TAGS (:META-OBJECTS)) " "
   (:COMMENT NIL " Meta-Objects") :PAR
   "The implementation of the object system manipulates " (:TERM NIL "classes")
   ", " (:TERM NIL "methods") ", and " (:TERM NIL "generic functions")
   ". The object system contains a set of " (:TERM NIL "generic functions")
   " defined by " (:TERM NIL "methods") " on " (:TERM NIL "classes")
   "; the behavior of those " (:TERM NIL "generic functions")
   " defines the behavior of the object system. The " (:TERM NIL "instances")
   " of the " (:TERM NIL "classes") " on which those " (:TERM NIL "methods")
   " are defined are called meta-objects. "
   (:COMMENT NIL "Programming"
    "at the meta-object protocol level involves defining new classes of"
    "meta-objects along with methods specialized on these classes.")
   :PAR
   (:SUBSECTION (:TITLE ("Standard Meta-objects"))
    "The object system supplies a set of meta-objects, called standard meta-objects. These include the "
    (:TERM NIL "class") " " (:TYPEREF NIL "standard-object") " and "
    (:TERM NIL "instances") " of the classes " (:TYPEREF NIL "standard-method")
    ", " (:TYPEREF NIL "standard-generic-function") ", and "
    (:TYPEREF NIL "method-combination") ". " :PAR
    (:LIST NIL
     (:ITEM NIL " The " (:TERM NIL "class") " "
      (:TYPEREF NIL "standard-method") " is the default " (:TERM NIL "class")
      " of " (:TERM NIL "methods") " defined by the " (:MACREF NIL "defmethod")
      " and " (:MACREF NIL "defgeneric") " " (:TERM NIL "forms") ". "
      (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
      (:COMMENT NIL " \\macref{generic-function},")
      (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
      (:ISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
      (:COMMENT NIL "\\specref{with-added-methods},")
      (:ENDISSUE NIL "WITH-ADDED-METHODS:DELETE")
      (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
      (:COMMENT NIL "  \\specref{generic-flet}, " " and"
       "  \\specref{generic-labels}.")
      (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " " :PAR)
     (:ITEM NIL " The " (:TERM NIL "class") " "
      (:TYPEREF NIL "standard-generic-function") " is the default "
      (:TERM NIL "class") " of " (:TERM NIL "generic functions")
      " defined by the forms " (:MACREF NIL "defmethod") ", "
      (:MACREF NIL "defgeneric") ", "
      (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
      (:COMMENT NIL " \\macref{generic-function}," " \\specref{generic-flet},"
       " \\specref{generic-labels},")
      (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
      (:ISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
      (:COMMENT NIL " \\specref{with-added-methods},")
      (:ENDISSUE NIL "WITH-ADDED-METHODS:DELETE") "and "
      (:MACREF NIL "defclass") ". " :PAR)
     (:ITEM NIL " The " (:TERM NIL "class") " named "
      (:TYPEREF NIL "standard-object") " is an " (:TERM NIL "instance")
      " of the " (:TERM NIL "class") " " (:TYPEREF NIL "standard-class")
      " and is a " (:TERM NIL "superclass") " of every " (:TERM NIL "class")
      " that is an " (:TERM NIL "instance") " of "
      (:TYPEREF NIL "standard-class") " except itself and "
      (:TYPEREF NIL "structure-class") ". " :PAR)
     (:ITEM NIL " Every " (:TERM NIL "method") " combination object is an "
      (:TERM NIL "instance") " of a " (:TERM NIL "subclass") " of "
      (:TERM NIL "class") " " (:TYPEREF NIL "method-combination") ". " :PAR))
    " " :PAR)
   :PAR)
  :PAR
  (:SECTION (:TITLE ("Slots") :TAGS (:SLOTS)) " " :PAR
   (:SUBSECTION (:TITLE ("Introduction to Slots")) "An " (:TERM NIL "object")
    " of " (:TERM NIL "metaclass") " " (:TYPEREF NIL "standard-class")
    " has zero or more named " (:TERM NIL "slots") ". The " (:TERM NIL "slots")
    " of an " (:TERM NIL "object") " are determined by the "
    (:TERM NIL "class") " of the " (:TERM NIL "object") ". Each "
    (:TERM NIL "slot") " can hold one value. "
    (:REVIEWER NIL
     "Barmar: All symbols are valid variable names. Perhaps this means to preclude the use of named constants? We have a terminology problem to solve.")
    (:COMMENT NIL "!!!") "The " (:TERM NIL "name") " of a " (:TERM NIL "slot")
    " is a " (:TERM NIL "symbol")
    " that is syntactically valid for use as a variable name. " :PAR "When a "
    (:TERM NIL "slot") " does not have a value, the " (:TERM NIL "slot")
    " is said to be " (:TERM NIL "unbound") ". When an unbound "
    (:TERM NIL "slot") " is read, "
    (:REVIEWER NIL "Barmar: from an object whose metaclass is standard-class?")
    " the " (:TERM NIL "generic function") " " (:FUNREF NIL "slot-unbound")
    " is invoked. The system-supplied primary " (:TERM NIL "method") " for "
    (:FUNREF NIL "slot-unbound") " "
    (:COMMENT NIL "Barmar: on STANDARD-CLASS or T?"
     "KMP: It said T in the signature info for SLOT-UNBOUND so I copied that to here.")
    "on " (:TERM NIL "class") " " (:TYPEREF NIL "t") " signals an error. "
    (:ISSUE NIL "SLOT-MISSING-VALUES:SPECIFY") " If "
    (:FUNREF NIL "slot-unbound") " returns, its " (:TERM NIL "primary value")
    " is used that time as the " (:TERM NIL "value") " of the "
    (:TERM NIL "slot") ". " (:ENDISSUE NIL "SLOT-MISSING-VALUES:SPECIFY") " "
    :PAR "The default initial value form for a " (:TERM NIL "slot")
    " is defined by the " (:KWD NIL "initform") " slot option. When the "
    (:KWD NIL "initform")
    " form is used to supply a value, it is evaluated in the lexical environment in which the "
    (:MACREF NIL "defclass") " form was evaluated. The " (:KWD NIL "initform")
    " along with the lexical environment in which the "
    (:MACREF NIL "defclass") " form was evaluated is called a "
    (:TERM NIL "captured initialization form") ". For more details, see "
    (:SECREF NIL :OBJECT-CREATION-AND-INIT) ". " :PAR "A "
    (:TERM NIL "local slot") " is defined to be a " (:TERM NIL "slot")
    " that is "
    (:COMMENT NIL
     "Barmar says: ``Poor wording.  It's \"visible\" to anyone calling SLOT-VALUE.''"
     "    Perhaps we mean to be saying \"accessible in\"? -kmp 11-Oct-90"
     "%Ok. I'll substitute accessible. -kmp 6-Jan-91" "visible")
    (:TERM NIL "accessible") " to exactly one " (:TERM NIL "instance")
    ", namely the one in which the " (:TERM NIL "slot") " is allocated. A "
    (:TERM NIL "shared slot") " is defined to be a " (:TERM NIL "slot")
    " that is visible to more than one " (:TERM NIL "instance") " of a given "
    (:TERM NIL "class") " and its " (:TERM NIL "subclasses") ". " :PAR "A "
    (:TERM NIL "class") " is said to define a " (:TERM NIL "slot")
    " with a given " (:TERM NIL "name") " when the " (:MACREF NIL "defclass")
    " form for that " (:TERM NIL "class") " contains a "
    (:TERM NIL "slot specifier") " with that " (:TERM NIL "name")
    ". Defining a " (:TERM NIL "local slot") " does not immediately create a "
    (:TERM NIL "slot") "; it causes a " (:TERM NIL "slot")
    " to be created each time an " (:TERM NIL "instance") " of the "
    (:TERM NIL "class") " is created. Defining a " (:TERM NIL "shared slot")
    " immediately creates a " (:TERM NIL "slot") ". " :PAR "The "
    (:KWD NIL "allocation") " slot option to " (:MACREF NIL "defclass")
    " controls the kind of " (:TERM NIL "slot")
    " that is defined. If the value of the " (:KWD NIL "allocation")
    " slot option is " (:KWD NIL "instance") ", a " (:TERM NIL "local slot")
    " is created. If the value of " (:KWD NIL "allocation") " is "
    (:KWD NIL "class") ", a " (:TERM NIL "shared slot") " is created. " :PAR
    "A " (:TERM NIL "slot") " is said to be " (:TERM NIL "accessible")
    " in an " (:TERM NIL "instance") " of a " (:TERM NIL "class") " if the "
    (:TERM NIL "slot") " is defined by the " (:TERM NIL "class") " of the "
    (:TERM NIL "instance") " or is inherited from a " (:TERM NIL "superclass")
    " of that " (:TERM NIL "class") ". At most one " (:TERM NIL "slot")
    " of a given " (:TERM NIL "name") " can be " (:TERM NIL "accessible")
    " in an " (:TERM NIL "instance") ". A " (:TERM NIL "shared slot")
    " defined by a " (:TERM NIL "class") " is " (:TERM NIL "accessible")
    " in all " (:TERM NIL "instances") " of that " (:TERM NIL "class")
    ". A detailed explanation of the inheritance of " (:TERM NIL "slots")
    " is given in " (:SECREF NIL :SLOT-INHERITANCE) ". " :PAR)
   (:SUBSECTION (:TITLE ("Accessing Slots")) (:TERM NIL "Slots") " can be "
    (:TERM NIL "accessed") " in two ways: by use of the primitive function "
    (:FUNREF NIL "slot-value") " and by use of "
    (:TERM NIL "generic functions") " generated by the "
    (:MACREF NIL "defclass") " form. " :PAR "The " (:TERM NIL "function") " "
    (:FUNREF NIL "slot-value") " can be used with any of the "
    (:TERM NIL "slot") " names specified in the " (:MACREF NIL "defclass")
    " form to " (:TERM NIL "access") " a specific " (:TERM NIL "slot") " "
    (:TERM NIL "accessible") " in an " (:TERM NIL "instance") " of the given "
    (:TERM NIL "class") ". " :PAR "The macro " (:MACREF NIL "defclass")
    " provides syntax for generating " (:TERM NIL "methods")
    " to read and write " (:TERM NIL "slots") ". If a reader "
    (:TERM NIL "method") " is requested, a " (:TERM NIL "method")
    " is automatically generated for reading the value of the "
    (:TERM NIL "slot") ", but no " (:TERM NIL "method")
    " for storing a value into it is generated. If a writer "
    (:TERM NIL "method") " is requested, a " (:TERM NIL "method")
    " is automatically generated for storing a value into the "
    (:TERM NIL "slot") ", but no " (:TERM NIL "method")
    " for reading its value is generated. If an accessor " (:TERM NIL "method")
    " is requested, a " (:TERM NIL "method") " for reading the value of the "
    (:TERM NIL "slot") " and a " (:TERM NIL "method")
    " for storing a value into the " (:TERM NIL "slot")
    " are automatically generated. Reader and writer " (:TERM NIL "methods")
    " are implemented using " (:FUNREF NIL "slot-value") ". " :PAR
    "When a reader or writer " (:TERM NIL "method") " is specified for a "
    (:TERM NIL "slot") ", the name of the " (:TERM NIL "generic function")
    " to which the generated " (:TERM NIL "method")
    " belongs is directly specified. If the " (:TERM NIL "name")
    " specified for the writer " (:TERM NIL "method") " is the symbol "
    (:TT NIL "name") ", the " (:TERM NIL "name") " of the "
    (:TERM NIL "generic function") " for writing the " (:TERM NIL "slot")
    " is the symbol " (:TT NIL "name") ", and the "
    (:TERM NIL "generic function")
    " takes two arguments: the new value and the " (:TERM NIL "instance")
    ", in that order. If the " (:TERM NIL "name")
    " specified for the accessor " (:TERM NIL "method") " is the symbol "
    (:TT NIL "name") ", the " (:TERM NIL "name") " of the "
    (:TERM NIL "generic function") " for reading the " (:TERM NIL "slot")
    " is the symbol " (:TT NIL "name") ", and the " (:TERM NIL "name")
    " of the " (:TERM NIL "generic function") " for writing the "
    (:TERM NIL "slot") " is the list " (:TT NIL "(setf name)") ". " :PAR "A "
    (:TERM NIL "generic function") " created or modified by supplying "
    (:KWD NIL "reader") ", " (:KWD NIL "writer") ", or " (:KWD NIL "accessor")
    " " (:TERM NIL "slot") " options can be treated exactly as an ordinary "
    (:TERM NIL "generic function") ". " :PAR "Note that "
    (:FUNREF NIL "slot-value") " can be used to read or write the value of a "
    (:TERM NIL "slot") " whether or not reader or writer "
    (:TERM NIL "methods") " exist for that " (:TERM NIL "slot") ". When "
    (:FUNREF NIL "slot-value") " is used, no reader or writer "
    (:TERM NIL "methods") " are invoked. " :PAR "The macro "
    (:MACREF NIL "with-slots") " can be used to establish a "
    (:TERM NIL "lexical environment") " in which specified "
    (:TERM NIL "slots")
    " are lexically available as if they were variables. The macro "
    (:MACREF NIL "with-slots") " invokes the " (:TERM NIL "function") " "
    (:FUNREF NIL "slot-value") " to " (:TERM NIL "access") " the specified "
    (:TERM NIL "slots") ". " :PAR "The macro " (:MACREF NIL "with-accessors")
    " can be used to establish a lexical environment in which specified "
    (:TERM NIL "slots")
    " are lexically available through their accessors as if they were variables. The macro "
    (:MACREF NIL "with-accessors") " invokes the appropriate accessors to "
    (:TERM NIL "access") " the specified " (:TERM NIL "slots") ". "
    (:COMMENT NIL "Symbolics thinks this sentence is not meaningful:"
     "Any accessors specified by \\macref{with-accessors} must"
     "already have been defined before they are used.")
    :PAR)
   (:SUBSECTION
    (:TITLE ("Inheritance of Slots and Slot Options") :TAGS
     (:SLOT-INHERITANCE))
    " " :PAR "The set of the " (:TERM NIL "names") " of all "
    (:TERM NIL "slots") " " (:TERM NIL "accessible") " in an "
    (:TERM NIL "instance") " of a " (:TERM NIL "class") " "
    (:MATH NIL (:MI NIL "C")) " is the union of the sets of "
    (:TERM NIL "names") " of " (:TERM NIL "slots") " defined by "
    (:MATH NIL (:MI NIL "C")) " and its " (:TERM NIL "superclasses")
    ". The structure of an " (:TERM NIL "instance") " is the set of "
    (:TERM NIL "names") " of " (:TERM NIL "local slots") " in that "
    (:TERM NIL "instance") ". " :PAR "In the simplest case, only one "
    (:TERM NIL "class") " among " (:MATH NIL (:MI NIL "C")) " and its "
    (:TERM NIL "superclasses") " defines a " (:TERM NIL "slot")
    " with a given " (:TERM NIL "slot") " name. If a " (:TERM NIL "slot")
    " is defined by a " (:TERM NIL "superclass") " of "
    (:MATH NIL (:MI NIL "C")) ", the " (:TERM NIL "slot")
    " is said to be inherited. The characteristics of the " (:TERM NIL "slot")
    " are determined by the " (:TERM NIL "slot specifier") " of the defining "
    (:TERM NIL "class") ". Consider the defining " (:TERM NIL "class")
    " for a slot " (:MATH NIL (:MI NIL "S")) ". If the value of the "
    (:KWD NIL "allocation") " slot option is " (:KWD NIL "instance") ", then "
    (:MATH NIL (:MI NIL "S")) " is a " (:TERM NIL "local slot") " and each "
    (:TERM NIL "instance") " of " (:MATH NIL (:MI NIL "C")) " has its own "
    (:TERM NIL "slot") " named " (:MATH NIL (:MI NIL "S"))
    " that stores its own value. If the value of the " (:KWD NIL "allocation")
    " slot option is " (:KWD NIL "class") ", then " (:MATH NIL (:MI NIL "S"))
    " is a " (:TERM NIL "shared slot") ", the " (:TERM NIL "class")
    " that defined " (:MATH NIL (:MI NIL "S")) " stores the value, and all "
    (:TERM NIL "instances") " of " (:MATH NIL (:MI NIL "C")) " can "
    (:TERM NIL "access") " that single " (:TERM NIL "slot") ". If the "
    (:KWD NIL "allocation") " slot option is omitted, " (:KWD NIL "instance")
    " is used. " :PAR "In general, more than one " (:TERM NIL "class")
    " among " (:MATH NIL (:MI NIL "C")) " and its " (:TERM NIL "superclasses")
    " can define a " (:TERM NIL "slot") " with a given " (:TERM NIL "name")
    ". In such cases, only one " (:TERM NIL "slot") " with the given name is "
    (:TERM NIL "accessible") " in an " (:TERM NIL "instance") " of "
    (:MATH NIL (:MI NIL "C")) ", and the characteristics of that "
    (:TERM NIL "slot") " are a combination of the several " (:TERM NIL "slot")
    " specifiers, computed as follows: " :PAR
    (:LIST NIL
     (:ITEM NIL " All the " (:TERM NIL "slot specifiers") " for a given "
      (:TERM NIL "slot")
      " name are ordered from most specific to least specific, according to the order in "
      (:MATH NIL (:MI NIL "C")) "'s " (:TERM NIL "class precedence list")
      " of the " (:TERM NIL "classes")
      " that define them. All references to the specificity of "
      (:TERM NIL "slot specifiers")
      " immediately below refers to this ordering. " :PAR)
     (:ITEM NIL " The allocation of a " (:TERM NIL "slot")
      " is controlled by the most specific " (:TERM NIL "slot specifier")
      ". If the most specific " (:TERM NIL "slot specifier")
      " does not contain an " (:KWD NIL "allocation") " slot option, "
      (:KWD NIL "instance") " is used. Less specific "
      (:TERM NIL "slot specifiers") " do not affect the allocation. " :PAR)
     (:ITEM NIL " The default initial value form for a " (:TERM NIL "slot")
      " is the value of the " (:KWD NIL "initform")
      " slot option in the most specific " (:TERM NIL "slot specifier")
      " that contains one. If no " (:TERM NIL "slot specifier") " contains an "
      (:KWD NIL "initform") " slot option, the " (:TERM NIL "slot")
      " has no default initial value form. " :PAR)
     (:ITEM NIL " The contents of a " (:TERM NIL "slot")
      " will always be of type "
      (:TT NIL "(and " (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "1"))) " "
       (:MATH NIL (:MO NIL "…")) " "
       (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MI NIL "n"))) ")")
      " where "
      (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "1")) (:MO NIL "…")
       (:MSUB NIL (:MI NIL "T") (:MI NIL "n")))
      " are the values of the " (:KWD NIL "type")
      " slot options contained in all of the " (:TERM NIL "slot specifiers")
      ". If no " (:TERM NIL "slot specifier") " contains the "
      (:KWD NIL "type") " slot option, the contents of the " (:TERM NIL "slot")
      " will always be of " (:TERM NIL "type") " " (:TYPEREF NIL "t")
      ". The consequences of attempting to store in a " (:TERM NIL "slot")
      " a value that does not satisfy the " (:TERM NIL "type") " of the "
      (:TERM NIL "slot") " are undefined. " :PAR)
     (:ITEM NIL " The set of initialization arguments that initialize a given "
      (:TERM NIL "slot")
      " is the union of the initialization arguments declared in the "
      (:KWD NIL "initarg") " slot options in all the "
      (:TERM NIL "slot specifiers") ". " :PAR)
     (:ITEM NIL " The " (:TERM NIL "documentation string") " for a "
      (:TERM NIL "slot") " is the value of the " (:KWD NIL "documentation")
      " slot option in the most specific " (:TERM NIL "slot")
      " specifier that contains one. If no " (:TERM NIL "slot specifier")
      " contains a " (:KWD NIL "documentation") " slot option, the "
      (:TERM NIL "slot") " has no " (:TERM NIL "documentation string") ". "
      :PAR))
    " " :PAR "A consequence of the allocation rule is that a "
    (:TERM NIL "shared slot") " can be " (:TERM NIL "shadowed")
    ". For example, if a class "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) " defines a "
    (:TERM NIL "slot") " named " (:MATH NIL (:MI NIL "S"))
    " whose value for the " (:KWD NIL "allocation") " slot option is "
    (:KWD NIL "class") ", that " (:TERM NIL "slot") " is "
    (:TERM NIL "accessible") " in " (:TERM NIL "instances") " of "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) " and all of its "
    (:TERM NIL "subclasses") ". However, if "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) " is a "
    (:TERM NIL "subclass") " of "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) " and also defines a "
    (:TERM NIL "slot") " named " (:MATH NIL (:MI NIL "S")) ", "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) "'s "
    (:TERM NIL "slot") " is not shared by " (:TERM NIL "instances") " of "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) " and its "
    (:TERM NIL "subclasses") ". When a class "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) " defines a "
    (:TERM NIL "shared slot") ", any subclass "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) " of "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1")))
    " will share this single " (:TERM NIL "slot") " unless the "
    (:MACREF NIL "defclass") " form for "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) " specifies a "
    (:TERM NIL "slot") " of the same " (:TERM NIL "name") " or there is a "
    (:TERM NIL "superclass") " of "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) " that precedes "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) " in the "
    (:TERM NIL "class precedence list") " of "
    (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) " that defines a "
    (:TERM NIL "slot") " of the same name. " :PAR
    "A consequence of the type rule is that the value of a " (:TERM NIL "slot")
    " satisfies the type constraint of each " (:TERM NIL "slot specifier")
    " that contributes to that " (:TERM NIL "slot")
    ". Because the result of attempting to store in a " (:TERM NIL "slot")
    " a value that does not satisfy the type constraint for the "
    (:TERM NIL "slot") " is undefined, the value in a " (:TERM NIL "slot")
    " might fail to satisfy its type constraint. " :PAR "The "
    (:KWD NIL "reader") ", " (:KWD NIL "writer") ", and " (:KWD NIL "accessor")
    " slot options create " (:TERM NIL "methods")
    " rather than define the characteristics of a " (:TERM NIL "slot")
    ". Reader and writer " (:TERM NIL "methods")
    " are inherited in the sense described in "
    (:SECREF NIL :METHOD-INHERITANCE) ". " :PAR (:TERM NIL "Methods") " that "
    (:TERM NIL "access") " " (:TERM NIL "slots") " use only the name of the "
    (:TERM NIL "slot") " and the " (:TERM NIL "type") " of the "
    (:TERM NIL "slot") "'s value. Suppose a " (:TERM NIL "superclass")
    " provides a " (:TERM NIL "method") " that expects to "
    (:TERM NIL "access") " a " (:TERM NIL "shared slot") " of a given "
    (:TERM NIL "name") ", and a " (:TERM NIL "subclass") " defines a "
    (:TERM NIL "local slot") " with the same " (:TERM NIL "name") ". If the "
    (:TERM NIL "method") " provided by the " (:TERM NIL "superclass")
    " is used on an " (:TERM NIL "instance") " of the " (:TERM NIL "subclass")
    ", the " (:TERM NIL "method") " " (:TERM NIL "accesses") " the "
    (:TERM NIL "local slot") ". " :PAR)
   :PAR)
  :PAR
  (:SECTION (:TITLE ("Generic Functions and Methods") :TAGS (:GFS-AND-METHODS))
   " " :PAR
   (:COMMENT NIL
    "!!! Uses of \"built-in\" could be \"\\term{standardized}\" here.")
   :PAR
   (:SUBSECTION
    (:TITLE ("Introduction to Generic Functions") :TAGS (:INTRO-TO-GFS)) " "
    :PAR "A " (:NEWTERM NIL "generic function")
    " is a function whose behavior depends on the " (:TERM NIL "classes")
    " or identities of the " (:TERM NIL "arguments") " supplied to it. A "
    (:TERM NIL "generic function") " " (:TERM NIL "object") " "
    (:COMMENT NIL "contains") "is associated with a set of "
    (:TERM NIL "methods") ", a " (:TERM NIL "lambda list") ", a "
    (:TERM NIL "method combination") (:SUB NIL "2") ", and other information. "
    :PAR "Like an " (:TERM NIL "ordinary function") ", a "
    (:TERM NIL "generic function") " takes " (:TERM NIL "arguments")
    ", performs a series of operations, and perhaps returns useful "
    (:TERM NIL "values") ". An " (:TERM NIL "ordinary function")
    " has a single body of " (:TERM NIL "code") " that is always "
    (:TERM NIL "executed") " when the " (:TERM NIL "function") " is called. A "
    (:TERM NIL "generic function") " has a set of bodies of "
    (:TERM NIL "code") " of which a subset is selected for "
    (:TERM NIL "execution") ". The selected bodies of " (:TERM NIL "code")
    " and the manner of their combination are determined by the "
    (:TERM NIL "classes") " or identities of one or more of the "
    (:TERM NIL "arguments") " to the " (:TERM NIL "generic function")
    " and by its " (:TERM NIL "method combination") ". " :PAR
    (:TERM NIL "Ordinary functions") " and " (:TERM NIL "generic functions")
    " are called with identical syntax. " :PAR (:TERM NIL "Generic functions")
    " are true " (:TERM NIL "functions") " that can be passed as "
    (:TERM NIL "arguments") " and used as the first " (:TERM NIL "argument")
    " to " (:FUNREF NIL "funcall") " and " (:FUNREF NIL "apply") ". " :PAR "A "
    (:TERM NIL "binding") " of a " (:TERM NIL "function name") " to a "
    (:TERM NIL "generic function") " can be " (:TERM NIL "established")
    " in one of several ways. It can be " (:TERM NIL "established") " in the "
    (:TERM NIL "global environment") " by "
    (:FUNREF NIL "ensure-generic-function") ", " (:MACREF NIL "defmethod")
    " (implicitly, due to " (:FUNREF NIL "ensure-generic-function") ") or "
    (:MACREF NIL "defgeneric") " (also implicitly, due to "
    (:FUNREF NIL "ensure-generic-function") "). "
    (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " No "
    (:TERM NIL "standardized") " mechanism is provided for "
    (:TERM NIL "establishing") " a " (:TERM NIL "binding") " of a "
    (:TERM NIL "function name") " to a " (:TERM NIL "generic function")
    " in the " (:TERM NIL "lexical environment") ". "
    (:COMMENT NIL
     " It can be \\term{established} in the \\term{lexical environment} by ")
    (:ISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
    (:COMMENT NIL " \\specref{with-added-methods},")
    (:ENDISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
    (:COMMENT NIL "  \\specref{generic-flet}" " or"
     "  \\specref{generic-labels}."
     " The \\term{name} part of such a \\term{binding}, like the name of an ordinary"
     " \\term{function}, can be either a \\term{symbol} or a two-element"
     " \\term{list} whose first element is \\misc{setf} and whose second element"
     " is a \\term{symbol}.  This is true for both \\term{lexical bindings} and"
     " \\term{global bindings}." " "
     " The \\specref{generic-flet} special form creates new local generic"
     " functions using the set of methods specified by the method definitions"
     " in the \\specref{generic-flet} form.  The scoping of generic function names"
     " within a \\specref{generic-flet} form is the same as for \\specref{flet}."
     " "
     " The \\specref{generic-labels} special form creates a set of new mutually"
     " recursive local generic functions using the set of methods specified"
     " by the method definitions in the \\specref{generic-labels} form.  The"
     " scoping of generic function names within a \\specref{generic-labels} form"
     " is the same as for \\specref{labels}.")
    (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " " :PAR
    (:ISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
    (:COMMENT NIL
     " The \\specref{with-added-methods} special form creates new local generic"
     " functions by adding the set of methods specified by the method"
     " definitions with a given name in the \\specref{with-added-methods} form to"
     " copies of the methods of the lexically visible generic function of the"
     " same name. If there is a lexically visible ordinary function of the"
     " same name as one of specified generic functions, that function"
     " becomes the method function of the default method for the new generic"
     " function of that name.")
    (:ENDISSUE NIL "WITH-ADDED-METHODS:DELETE") " " :PAR
    (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
    (:COMMENT NIL
     " The \\macref{generic-function} macro creates an anonymous generic"
     " function with the set of methods specified by the method definitions"
     " in the \\macref{generic-function} form.")
    (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " " :PAR "When a "
    (:MACREF NIL "defgeneric")
    " form is evaluated, one of three actions is taken (due to "
    (:FUNREF NIL "ensure-generic-function") "): " :PAR
    (:COMMENT NIL
     "!!! Barrett observes that GENERIC-FLET and GENERIC-LABELS are not correctly"
     "    spoken for here because they are classified as method-defining."
     "    But since they've been flushed, I guess it doesn't matter. -kmp 12-Feb-92")
    (:LIST NIL
     (:ITEM NIL
      " If a generic function of the given name already exists, the existing generic function object is modified. Methods specified by the current "
      (:MACREF NIL "defgeneric")
      " form are added, and any methods in the existing generic function that were defined by a previous "
      (:MACREF NIL "defgeneric")
      " form are removed. Methods added by the current "
      (:MACREF NIL "defgeneric") " form might replace methods defined by "
      (:MACREF NIL "defmethod") ", " (:MACREF NIL "defclass") ", "
      (:MACREF NIL "define-condition") ", or " (:MACREF NIL "defstruct")
      ". No other methods in the generic function are affected or replaced. "
      :PAR)
     (:ITEM NIL " If the given name names an " (:TERM NIL "ordinary function")
      ", a " (:TERM NIL "macro") ", or a " (:TERM NIL "special operator")
      ", an error is signaled. " :PAR)
     (:ITEM NIL
      " Otherwise a generic function is created with the methods specified by the method definitions in the "
      (:MACREF NIL "defgeneric") " form. " :PAR))
    " " :PAR "Some " (:TERM NIL "operators")
    " permit specification of the options of a " (:TERM NIL "generic function")
    ", such as the " (:TERM NIL "type") " of " (:TERM NIL "method combination")
    " it uses or its " (:TERM NIL "argument precedence order") ". These "
    (:TERM NIL "operators")
    " will be referred to as “operators that specify generic function options.” "
    (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
    (:COMMENT NIL " These \\term{operators} are:" "  \\macref{defgeneric},"
     "% Reworded since there's only one.")
    "The only " (:TERM NIL "standardized") " " (:TERM NIL "operator")
    " in this category is " (:MACREF NIL "defgeneric") ". "
    (:COMMENT NIL "\\macref{generic-function},")
    (:ISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
    (:COMMENT NIL "\\specref{with-added-methods},")
    (:ENDISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
    (:COMMENT NIL "  \\specref{generic-flet}, " " and"
     "  \\specref{generic-labels}.")
    (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " " :PAR "Some "
    (:TERM NIL "operators") " define " (:TERM NIL "methods") " for a "
    (:TERM NIL "generic function") ". These " (:TERM NIL "operators")
    " will be referred to as "
    (:NEWTERM (:IDX "method-defining operator") "method-defining operators")
    "; their associated " (:TERM NIL "forms") " are called "
    (:TERM NIL "method-defining forms") ". The " (:TERM NIL "standardized") " "
    (:TERM NIL "method-defining operators") " are listed in " (:NEXTFIGURE NIL)
    ". "
    (:COMMENT NIL
     " The \\term{standardized} \\term{operators} in this category are:"
     "  \\macref{defgeneric}," "  \\macref{defmethod},"
     " \\issue{GENERIC-FLET-POORLY-DESIGNED:DELETE}"
     " %\\macref{generic-function}," " % \\specref{generic-flet},"
     " % \\specref{generic-labels},"
     " \\endissue{GENERIC-FLET-POORLY-DESIGNED:DELETE}"
     " \\issue{WITH-ADDED-METHODS:DELETE}" " %\\specref{with-added-methods}, "
     " \\endissue{WITH-ADDED-METHODS:DELETE}%" "  \\macref{defclass},"
     "  \\macref{define-condition}," " and " "  \\macref{defstruct}.")
    " " (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
    (:ISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
    (:COMMENT NIL "Removed GENERIC-FUNCTION, GENERIC-FLET, and GENERIC-LABELS."
     "Removed WITH-ADDED-METHODS.")
    (:TABLE
     (:NAME ("Standardized Method-Defining Operators") :TAGS
      (:STD-METH-DEF-OPS))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " defgeneric"))
      (:CELL NIL (:FUNREF NIL "defmethod"))
      (:CELL NIL (:FUNREF NIL "defclass")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " define-condition"))
      (:CELL NIL (:FUNREF NIL "defstruct")) (:CELL NIL)))
    " " (:ENDISSUE NIL "WITH-ADDED-METHODS:DELETE") " "
    (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " Note that of the "
    (:TERM NIL "standardized") " " (:TERM NIL "method-defining operators") " "
    (:COMMENT NIL " all of the method-defining operators except"
     "  \\macref{defclass}," "  \\macref{defmethod},"
     "  \\macref{define-condition}," " and " "  \\macref{defstruct} ")
    "only " (:MACREF NIL "defgeneric") " can specify "
    (:TERM NIL "generic function") " options. " (:MACREF NIL "defgeneric")
    " and any " (:TERM NIL "implementation-defined") " "
    (:TERM NIL "operators") " that can specify " (:TERM NIL "generic function")
    " options are also referred to as “operators that specify generic function options.” "
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Introduction to Methods") :TAGS (:INTRO-TO-METHODS))
    " " :PAR (:TERM NIL "Methods")
    " define the class-specific or identity-specific behavior and operations of a "
    (:TERM NIL "generic function") ". " :PAR
    (:COMMENT NIL "KAB was a bit unhappy with \"contains\" here."
     "He also didn't like the term \"method function\".")
    "A " (:TERM NIL "method") " " (:TERM NIL "object") " "
    (:COMMENT NIL "contains") "is associated with "
    (:COMMENT NIL "     a method function,") (:TERM NIL "code")
    " that implements the method's behavior, a sequence of "
    (:TERM NIL "parameter specializers") " that specify when the given "
    (:TERM NIL "method") " is applicable, a " (:TERM NIL "lambda list")
    ", and a sequence of " (:TERM NIL "qualifiers")
    " that are used by the method combination facility to distinguish among "
    (:TERM NIL "methods") ". " :PAR
    "A method object is not a function and cannot be invoked as a function. Various mechanisms in the object system take a method object and invoke its method function, as is the case when a generic function is invoked. When this occurs it is said that the method is invoked or called. "
    :PAR "A method-defining form contains the " (:TERM NIL "code")
    " that is to be run when the arguments to the generic function cause the method that it defines to be invoked. When a method-defining form is evaluated, a method object is created and one of four actions is taken: "
    :PAR
    (:LIST NIL
     (:ITEM NIL " If a " (:TERM NIL "generic function")
      " of the given name already exists and if a " (:TERM NIL "method object")
      " already exists that agrees with the new one on "
      (:TERM NIL "parameter specializers") " and " (:TERM NIL "qualifiers")
      ", the new " (:TERM NIL "method object")
      " replaces the old one. For a definition of one method agreeing with another on "
      (:TERM NIL "parameter specializers") " and " (:TERM NIL "qualifiers")
      ", see " (:SECREF NIL :SPECIALIZER-QUALIFIER-AGREEMENT) ". " :PAR)
     (:ITEM NIL " If a " (:TERM NIL "generic function")
      " of the given name already exists and if there is no "
      (:TERM NIL "method object") " that agrees with the new one on "
      (:TERM NIL "parameter specializers") " and " (:TERM NIL "qualifiers")
      ", the existing " (:TERM NIL "generic function") " " (:TERM NIL "object")
      " is modified to contain the new " (:TERM NIL "method") " "
      (:TERM NIL "object") ". " :PAR)
     (:ITEM NIL " If the given " (:TERM NIL "name") " names an "
      (:TERM NIL "ordinary function") ", a " (:TERM NIL "macro") ", or a "
      (:TERM NIL "special operator") ", an error is signaled. " :PAR)
     (:ITEM NIL " Otherwise a " (:TERM NIL "generic function")
      " is created with the " (:TERM NIL "method") " specified by the "
      (:TERM NIL "method-defining form") ". " :PAR))
    " " :PAR "If the " (:TERM NIL "lambda list") " of a new "
    (:TERM NIL "method") " is not " (:TERM NIL "congruent") " with the "
    (:TERM NIL "lambda list") " of the " (:TERM NIL "generic function")
    ", an error is signaled. If a " (:TERM NIL "method-defining operator")
    " that cannot specify " (:TERM NIL "generic function")
    " options creates a new " (:TERM NIL "generic function") ", a "
    (:TERM NIL "lambda list") " for that " (:TERM NIL "generic function")
    " is derived from the " (:TERM NIL "lambda list") " of the "
    (:TERM NIL "method") " in the " (:TERM NIL "method-defining form")
    " in such a way as to be " (:TERM NIL "congruent")
    " with it. For a discussion of " (:NEWTERM NIL "congruence") ", see "
    (:SECREF NIL :GF-METHOD-LAMBDA-LIST-CONGRUENCY) ". " :PAR
    "Each method has a " (:TERM NIL "specialized lambda list")
    ", which determines when that method can be applied. A "
    (:TERM NIL "specialized lambda list") " is like an "
    (:TERM NIL "ordinary lambda list")
    " except that a specialized parameter may occur instead of the name of a required parameter. A specialized parameter is a list "
    (:TT NIL "(" (:I NIL "variable-name") " "
     (:I NIL "parameter-specializer-name") ")")
    ", where " (:I NIL "parameter-specializer-name")
    " is one of the following: " :PAR
    (:LIST NIL
     (:ITEM NIL "a " (:TERM NIL "symbol") " " :PAR "denotes a "
      (:TERM NIL "parameter specializer") " which is the " (:TERM NIL "class")
      " named by that " (:TERM NIL "symbol") ". " :PAR
      (:ISSUE NIL "CLASS-OBJECT-SPECIALIZER:AFFIRM") " "
      (:COMMENT NIL
       "This was apparently introduced accidentally, but has been confirmed by X3J13 vote."
       " -kmp 08-Apr-91"))
     (:ITEM NIL "a " (:TERM NIL "class") " " :PAR "denotes a "
      (:TERM NIL "parameter specializer") " which is the " (:TERM NIL "class")
      " itself. " (:ENDISSUE NIL "CLASS-OBJECT-SPECIALIZER:AFFIRM") " " :PAR)
     (:ITEM NIL (:TT NIL "(eql " (:I NIL "form") ")") " " :PAR "denotes a "
      (:TERM NIL "parameter specializer") " which satisfies the "
      (:TERM NIL "type specifier") " " (:TT NIL "(eql " (:I NIL "object") ")")
      ", where " (:I NIL "object") " is the result of evaluating "
      (:I NIL "form") ". The form " (:I NIL "form")
      " is evaluated in the lexical environment in which the method-defining form is evaluated. Note that "
      (:I NIL "form")
      " is evaluated only once, at the time the method is defined, not each time the generic function is called. "))
    " " :PAR (:TERM NIL "Parameter specializer names")
    " are used in macros intended as the user-level interface ("
    (:MACREF NIL "defmethod") "), while " (:TERM NIL "parameter specializers")
    " are used in the functional interface. " :PAR
    "Only required parameters may be specialized, and there must be a "
    (:TERM NIL "parameter specializer")
    " for each required parameter. For notational simplicity, if some required parameter in a "
    (:TERM NIL "specialized lambda list")
    " in a method-defining form is simply a variable name, its "
    (:TERM NIL "parameter specializer") " defaults to the " (:TERM NIL "class")
    " " (:TYPEREF NIL "t") ". " :PAR
    "Given a generic function and a set of arguments, an applicable method is a method for that generic function whose parameter specializers are satisfied by their corresponding arguments. The following definition specifies what it means for a method to be applicable and for an argument to satisfy a "
    (:TERM NIL "parameter specializer") ". " :PAR
    (:COMMENT NIL "Barmar: Review use of ``instance'' here.  Also, instead of"
     "  ``$C=P\\sub i$ or ...'' we should refer just to ``(TYPEP Ai Pi) is true.''"
     "Since this is a hot topic on the mail right now, I'll leave this "
     " until the dust settles. -kmp 22-Oct-90"
     "KMP: I think this is finally fixed.")
    "Let "
    (:MATH NIL (:MO NIL "⟨") (:MSUB NIL (:MI NIL "A") (:MN NIL "1"))
     (:MO NIL ",") (:MO NIL "…") (:MO NIL ",")
     (:MSUB NIL (:MI NIL "A") (:MI NIL "n")) (:MO NIL "⟩"))
    " be the required arguments to a generic function in order. Let "
    (:MATH NIL (:MO NIL "⟨") (:MSUB NIL (:MI NIL "P") (:MN NIL "1"))
     (:MO NIL ",") (:MO NIL "…") (:MO NIL ",")
     (:MSUB NIL (:MI NIL "P") (:MI NIL "n")) (:MO NIL "⟩"))
    " be the " (:TERM NIL "parameter specializers")
    " corresponding to the required parameters of the method "
    (:MATH NIL (:MI NIL "M")) " in order. The method "
    (:MATH NIL (:MI NIL "M")) " is "
    (:COMMENT NIL " applicable when each $A\\sub i$ satisfies $P\\sub i$."
     " If $P\\sub i$ is a class, and if $A\\sub i$ is a \\term{direct instance} of a class"
     " $C$\\negthinspace, then it is said that $A\\sub i$ satisfies"
     " $P\\sub i$ when $C=P\\sub i$ or when $C$ is a subclass of $P\\sub i$.  If"
     " $P\\sub i$ is {\\tt (eql \\i{object})}, then it is said that"
     " $A\\sub i$ satisfies $P\\sub i$ when"
     " %\\thefunction{eql} applied to $A\\sub i$ and \\i{object} \\term{yields} \\term{true}."
     " $A\\sub i$ is the \\term{same} as \\i{object} (\\ie under \\funref{eql}).")
    "applicable when each " (:MATH NIL (:MSUB NIL (:MI NIL "A") (:MI NIL "i")))
    " is of the " (:TERM NIL "type") " specified by the "
    (:TERM NIL "type specifier") " "
    (:MATH NIL (:MSUB NIL (:MI NIL "P") (:MI NIL "i"))) ". "
    (:COMMENT NIL
     " Because a \\term{parameter specializer} is a \\term{type specifier}, "
     " \\thefunction{typep} can be used during method selection "
     " to determine whether an"
     " argument satisfies a \\term{parameter specializer}.  " " %% For Moon"
     " %In general" " A" " %arbitrary"
     " \\term{parameter specializer} cannot be a \\term{compound type specifier}."
     " %Example moved to the glossary."
     " %such as {\\tt (vector single-float)}."
     " The only \\term{list} that can be a \\term{parameter specializer} is \\f{(eql \\i{object})}."
     " %This requires that"
     " %Common Lisp be modified to include the \\term{type specifier} \\funref{eql} to be"
     " %defined as if the following were evaluated:" " %"
     " %$$\\hbox{\\f{(deftype eql (object) `(member ,object))}}$$"
     " %                                                                  "
     "% Rewritten by KMP:"
     "% This part isn't really needed because it's said just a few paragraphs before."
     " A \\term{parameter specializer} can be a \\term{class}, a \\term{class} \\term{name},"
     " or \\f{(eql \\i{object})}.  " "% I think this can stand on its own.")
    "Because every valid " (:TERM NIL "parameter specializer")
    " is also a valid " (:TERM NIL "type specifier") ", the "
    (:TERM NIL "function") " " (:FUNREF NIL "typep")
    " can be used during method selection to determine whether an argument satisfies a "
    (:TERM NIL "parameter specializer") ". " :PAR "A method all of whose "
    (:TERM NIL "parameter specializers") " are the " (:TERM NIL "class") " "
    (:TYPEREF NIL "t") " is called a " (:NEWTERM NIL "default method")
    "; it is always applicable but may be shadowed by a more specific method. "
    :PAR "Methods can have " (:TERM NIL "qualifiers")
    ", which give the method combination procedure a way to distinguish among methods. A method that has one or more "
    (:TERM NIL "qualifiers") " is called a " (:TERM NIL "qualified method")
    ". A method with no " (:TERM NIL "qualifiers") " is called an "
    (:TERM NIL "unqualified method") ". A " (:TERM NIL "qualifier") " is any "
    (:TERM NIL "non-list") ". "
    (:COMMENT NIL
     " The \\term{qualifiers} defined by standard method combination "
     " and by the built-in method combination types are \\term{symbols}."
     "% Simplification per Barrett:")
    "The " (:TERM NIL "qualifiers") " defined by the "
    (:TERM NIL "standardized") " method combination types are "
    (:TERM NIL "symbols") ". " :PAR "In this specification, the terms “"
    (:TERM NIL "primary method") "” and “" (:TERM NIL "auxiliary method")
    "” are used to partition " (:TERM NIL "methods")
    " within a method combination type according to their intended use. In standard method combination, "
    (:TERM NIL "primary methods") " are " (:TERM NIL "unqualified methods")
    " and " (:TERM NIL "auxiliary methods") " are methods with a single "
    (:TERM NIL "qualifier") " that is one of " (:KWD NIL "around") ", "
    (:KWD NIL "before") ", or " (:KWD NIL "after") ". " (:TERM NIL "Methods")
    " with these " (:TERM NIL "qualifiers") " are called "
    (:TERM NIL "around methods") ", " (:TERM NIL "before methods") ", and "
    (:TERM NIL "after methods")
    ", respectively. When a method combination type is defined using the short form of "
    (:MACREF NIL "define-method-combination") ", "
    (:TERM NIL "primary methods")
    " are methods qualified with the name of the type of method combination, and auxiliary methods have the "
    (:TERM NIL "qualifier") " " (:KWD NIL "around") ". Thus the terms “"
    (:TERM NIL "primary method") "” and “" (:TERM NIL "auxiliary method")
    "” have only a relative definition within a given method combination type. "
    :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Agreement on Parameter Specializers and Qualifiers") :TAGS
     (:SPECIALIZER-QUALIFIER-AGREEMENT))
    " " :PAR "Two " (:TERM NIL "methods")
    " are said to agree with each other on "
    (:TERM NIL "parameter specializers") " and " (:TERM NIL "qualifiers")
    " if the following conditions hold: " :PAR
    (:LIST NIL
     (:ITEM NIL
      "1. Both methods have the same number of required parameters. Suppose the "
      (:TERM NIL "parameter specializers") " of the two methods are "
      (:MATH NIL
       (:MSUB NIL (:MI NIL "P")
        (:MROW NIL (:MN NIL "1") (:MO NIL ",") (:MN NIL "1")))
       (:MO NIL "…")
       (:MSUB NIL (:MI NIL "P")
        (:MROW NIL (:MN NIL "1") (:MO NIL ",") (:MI NIL "n"))))
      " and "
      (:MATH NIL
       (:MSUB NIL (:MI NIL "P")
        (:MROW NIL (:MN NIL "2") (:MO NIL ",") (:MN NIL "1")))
       (:MO NIL "…")
       (:MSUB NIL (:MI NIL "P")
        (:MROW NIL (:MN NIL "2") (:MO NIL ",") (:MI NIL "n"))))
      ". " :PAR)
     (:ITEM NIL "2. For each "
      (:MATH NIL (:MN NIL "1") (:MO NIL "≤") (:MI NIL "i") (:MO NIL "≤")
       (:MI NIL "n"))
      ", "
      (:MATH NIL
       (:MSUB NIL (:MI NIL "P")
        (:MROW NIL (:MN NIL "1") (:MO NIL ",") (:MI NIL "i"))))
      " agrees with "
      (:MATH NIL
       (:MSUB NIL (:MI NIL "P")
        (:MROW NIL (:MN NIL "2") (:MO NIL ",") (:MI NIL "i"))))
      ". The " (:TERM NIL "parameter specializer") " "
      (:MATH NIL
       (:MSUB NIL (:MI NIL "P")
        (:MROW NIL (:MN NIL "1") (:MO NIL ",") (:MI NIL "i"))))
      " agrees with "
      (:MATH NIL
       (:MSUB NIL (:MI NIL "P")
        (:MROW NIL (:MN NIL "2") (:MO NIL ",") (:MI NIL "i"))))
      " if "
      (:MATH NIL
       (:MSUB NIL (:MI NIL "P")
        (:MROW NIL (:MN NIL "1") (:MO NIL ",") (:MI NIL "i"))))
      " and "
      (:MATH NIL
       (:MSUB NIL (:MI NIL "P")
        (:MROW NIL (:MN NIL "2") (:MO NIL ",") (:MI NIL "i"))))
      " are the same class or if "
      (:MATH NIL
       (:MSUB NIL (:MI NIL "P")
        (:MROW NIL (:MN NIL "1") (:MO NIL ",") (:MI NIL "i")))
       (:MO NIL "=") (:MTEXT (:FONT :TT) "(eql object1)"))
      ", "
      (:MATH NIL
       (:MSUB NIL (:MI NIL "P")
        (:MROW NIL (:MN NIL "2") (:MO NIL ",") (:MI NIL "i")))
       (:MO NIL "=") (:MTEXT (:FONT :TT) "(eql object2)"))
      ", and "
      (:TT NIL " (" (:B NIL "eql") " "
       (:MATH NIL (:MSUB NIL (:MI (:FONT :I) "object") (:MN NIL "1"))) " "
       (:MATH NIL (:MSUB NIL (:MI (:FONT :I) "object") (:MN NIL "2"))) ")")
      ". Otherwise "
      (:MATH NIL
       (:MSUB NIL (:MI NIL "P")
        (:MROW NIL (:MN NIL "1") (:MO NIL ",") (:MI NIL "i"))))
      " and "
      (:MATH NIL
       (:MSUB NIL (:MI NIL "P")
        (:MROW NIL (:MN NIL "2") (:MO NIL ",") (:MI NIL "i"))))
      " do not agree. " :PAR)
     (:ITEM NIL "3. The two " (:TERM NIL "lists") " of "
      (:TERM NIL "qualifiers") " are the " (:TERM NIL "same") " under "
      (:FUNREF NIL "equal") ". " :PAR
      (:COMMENT NIL
       " \\itemitem{3.} The lists of \\term{qualifiers} of both methods contain the same   "
       " \\term{non-nil} atoms in the same order. That is, the lists are \\funref{equal}.")
      :PAR))
    " " :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Congruent Lambda-lists for all Methods of a Generic Function")
     :TAGS (:GF-METHOD-LAMBDA-LIST-CONGRUENCY))
    " " :PAR "These rules define the congruence of a set of "
    (:TERM NIL "lambda lists") ", including the " (:TERM NIL "lambda list")
    " of each method for a given generic function and the "
    (:TERM NIL "lambda list")
    " specified for the generic function itself, if given. " :PAR
    (:LIST NIL
     (:ITEM NIL "1. Each " (:TERM NIL "lambda list")
      " must have the same number of required parameters. " :PAR)
     (:ITEM NIL "2. Each " (:TERM NIL "lambda list")
      " must have the same number of optional parameters. Each method can supply its own default for an optional parameter. "
      :PAR)
     (:ITEM NIL "3. If any " (:TERM NIL "lambda list") " mentions "
      (:KEYREF NIL "rest") " or " (:KEYREF NIL "key") ", each "
      (:TERM NIL "lambda list") " must mention one or both of them. " :PAR)
     (:ITEM NIL "4. If the " (:TERM NIL "generic function") " "
      (:TERM NIL "lambda list") " mentions " (:KEYREF NIL "key")
      ", each method must accept all of the keyword names mentioned after "
      (:KEYREF NIL "key")
      ", either by accepting them explicitly, by specifying "
      (:KEYREF NIL "allow-other-keys") ", or by specifying "
      (:KEYREF NIL "rest") " but not " (:KEYREF NIL "key")
      ". Each method can accept additional keyword arguments of its own. The checking of the validity of keyword names is done in the generic function, not in each method. "
      (:COMMENT NIL "!!! \"Leftmost\". Sigh.")
      "A method is invoked as if the keyword argument pair whose name is "
      (:KWD NIL "allow-other-keys") " and whose value is " (:TERM NIL "true")
      " were supplied, though no such argument pair will be passed. "
      (:COMMENT NIL
       "!!! KAB: Alternatively, as if the lambda list of the method specified &allow-other-keys.")
      :PAR)
     (:ITEM NIL "5. The use of " (:KEYREF NIL "allow-other-keys")
      " need not be consistent across " (:TERM NIL "lambda lists") ". If "
      (:KEYREF NIL "allow-other-keys") " is mentioned in the "
      (:TERM NIL "lambda list") " of any applicable " (:TERM NIL "method")
      " or of the " (:TERM NIL "generic function")
      ", any keyword arguments may be mentioned in the call to the "
      (:TERM NIL "generic function") ". " :PAR)
     (:ITEM NIL "6. The use of " (:KEYREF NIL "aux")
      " need not be consistent across methods. " :PAR "If a "
      (:TERM NIL "method-defining operator") " that cannot specify "
      (:TERM NIL "generic function") " options creates a "
      (:TERM NIL "generic function") ", and if the " (:TERM NIL "lambda list")
      " for the method mentions keyword arguments, the "
      (:TERM NIL "lambda list") " of the generic function will mention "
      (:KEYREF NIL "key") " (but no keyword arguments). " :PAR))
    " " :PAR)
   :PAR (:COMMENT NIL "\\newpage") :PAR
   (:SUBSECTION
    (:TITLE ("Keyword Arguments in Generic Functions and Methods") :TAGS
     (:KWD-ARGS-IN-GFS-AND-METHS))
    " " :PAR "When a generic function or any of its methods mentions "
    (:KEYREF NIL "key") " in a " (:TERM NIL "lambda list")
    ", the specific set of keyword arguments accepted by the generic function varies according to the applicable methods. The set of keyword arguments accepted by the generic function for a particular call is the union of the keyword arguments accepted by all applicable methods and the keyword arguments mentioned after "
    (:KEYREF NIL "key")
    " in the generic function definition, if any. A method that has "
    (:KEYREF NIL "rest") " but not " (:KEYREF NIL "key")
    " does not affect the set of acceptable keyword arguments. If the "
    (:TERM NIL "lambda list")
    " of any applicable method or of the generic function definition contains "
    (:KEYREF NIL "allow-other-keys")
    ", all keyword arguments are accepted by the generic function. " :PAR
    "The " (:TERM NIL "lambda list")
    " congruence rules require that each method accept all of the keyword arguments mentioned after "
    (:KEYREF NIL "key")
    " in the generic function definition, by accepting them explicitly, by specifying "
    (:KEYREF NIL "allow-other-keys") ", or by specifying " (:KEYREF NIL "rest")
    " but not " (:KEYREF NIL "key")
    ". Each method can accept additional keyword arguments of its own, in addition to the keyword arguments mentioned in the generic function definition. "
    :PAR "If a " (:TERM NIL "generic function")
    " is passed a keyword argument that no applicable method accepts, an error should be signaled; see "
    (:SECREF NIL :FUNCALL-ERROR-CHECKING) ". " :PAR
    (:SUBSUBSECTION
     (:TITLE
      ("Examples of Keyword Arguments in Generic Functions and Methods"))
     "For example, suppose there are two methods defined for "
     (:TT NIL " width") " as follows: " :PAR
     (:CODE NIL " (defmethod width ((c character-class) &key font) ...)
 
 (defmethod width ((p picture-class) &key pixel-size) ...)
")
     " " :PAR
     " Assume that there are no other methods and no generic function definition for "
     (:TT NIL " width")
     ". The evaluation of the following form should signal an error because the keyword argument "
     (:KWD NIL "pixel-size") " is not accepted by the applicable method. " :PAR
     (:CODE NIL " (width (make-instance `character-class :char #\\Q) 
        :font 'baskerville :pixel-size 10)
")
     " " :PAR "The evaluation of the following form should signal an error. "
     :PAR
     (:CODE NIL " (width (make-instance `picture-class :glyph (glyph #\\Q)) 
        :font 'baskerville :pixel-size 10)
")
     " " :PAR
     "The evaluation of the following form will not signal an error if the class named "
     (:TT NIL " character-picture-class") " is a subclass of both "
     (:TT NIL " picture-class") " and " (:TT NIL " character-class") ". " :PAR
     (:CODE NIL " (width (make-instance `character-picture-class :char #\\Q)
        :font 'baskerville :pixel-size 10)
")
     " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Method Selection and Combination") :TAGS
     (:METHOD-SELECTION-AND-COMBINATION))
    " " :PAR "When a " (:TERM NIL "generic function")
    " is called with particular arguments, it must determine the code to execute. This code is called the "
    (:NEWTERM NIL "effective method") " for those " (:TERM NIL "arguments")
    ". The " (:TERM NIL "effective method") " is a combination of the "
    (:TERM NIL "applicable methods") " in the " (:TERM NIL "generic function")
    " that " (:TERM NIL "calls") " some or all of the " (:TERM NIL "methods")
    ". " :PAR
    (:ISSUE NIL "CLOS-ERROR-CHECKING-ORDER:NO-APPLICABLE-METHOD-FIRST") " "
    (:COMMENT NIL " If a \\term{generic function} is      "
     " called and no \\term{methods} are \\term{applicable},"
     " the \\term{generic function} \\funref{no-applicable-method} is invoked.")
    "If a " (:TERM NIL "generic function") " is called and no "
    (:TERM NIL "methods") " are " (:TERM NIL "applicable") ", the "
    (:TERM NIL "generic function") " " (:FUNREF NIL "no-applicable-method")
    " is invoked, with the " (:TERM NIL "results")
    " from that call being used as the " (:TERM NIL "results")
    " of the call to the original " (:TERM NIL "generic function") ". Calling "
    (:FUNREF NIL "no-applicable-method")
    " takes precedence over checking for acceptable keyword arguments; see "
    (:SECREF NIL :KWD-ARGS-IN-GFS-AND-METHS) ". "
    (:ENDISSUE NIL "CLOS-ERROR-CHECKING-ORDER:NO-APPLICABLE-METHOD-FIRST") " "
    :PAR "When the " (:TERM NIL "effective method")
    " has been determined, it is invoked with the same "
    (:TERM NIL "arguments") " as were passed to the "
    (:TERM NIL "generic function") ". Whatever " (:TERM NIL "values")
    " it returns are returned as the " (:TERM NIL "values") " of the "
    (:TERM NIL "generic function") ". " :PAR
    (:SUBSUBSECTION
     (:TITLE ("Determining the Effective Method") :TAGS
      (:DETERMINING-THE-EFFECTIVE-METHOD))
     " " :PAR
     "The effective method is determined by the following three-step procedure: "
     :PAR
     (:LIST NIL (:ITEM NIL "1.Select the applicable methods. " :PAR)
      (:ITEM NIL
       "2.Sort the applicable methods by precedence order, putting the most specific method first. "
       :PAR)
      (:ITEM NIL
       "3.Apply method combination to the sorted list of applicable methods, producing the effective method. "
       :PAR))
     " " :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Selecting the Applicable Methods") :TAGS (:SEL-APPL-METH)) " "
      :PAR "This step is described in " (:SECREF NIL :INTRO-TO-METHODS) ". "
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Sorting the Applicable Methods by Precedence Order"))
      "To compare the precedence of two methods, their "
      (:TERM NIL "parameter specializers")
      " are examined in order. The default examination order is from left to right, but an alternative order may be specified by the "
      (:KWD NIL "argument-precedence-order") " option to "
      (:MACREF NIL "defgeneric")
      " or to any of the other operators that specify generic function options. "
      :PAR "The corresponding " (:TERM NIL "parameter specializers")
      " from each method are compared. When a pair of "
      (:TERM NIL "parameter specializers")
      " agree, the next pair are compared for agreement. If all corresponding parameter specializers agree, the two methods must have different "
      (:TERM NIL "qualifiers")
      "; in this case, either method can be selected to precede the other. For information about agreement, see "
      (:SECREF NIL :SPECIALIZER-QUALIFIER-AGREEMENT) ". " :PAR
      "If some corresponding " (:TERM NIL "parameter specializers")
      " do not agree, the first pair of " (:TERM NIL "parameter specializers")
      " that do not agree determines the precedence. If both "
      (:TERM NIL "parameter specializers")
      " are classes, the more specific of the two methods is the method whose "
      (:TERM NIL "parameter specializer") " appears earlier in the "
      (:TERM NIL "class precedence list")
      " of the corresponding argument. Because of the way in which the set of applicable methods is chosen, the "
      (:TERM NIL "parameter specializers")
      " are guaranteed to be present in the class precedence list of the class of the argument. "
      :PAR "If just one of a pair of corresponding "
      (:TERM NIL "parameter specializers") " is "
      (:TT NIL " (eql " (:I NIL "object") ")") ", the " (:TERM NIL "method")
      " with that " (:TERM NIL "parameter specializer") " precedes the other "
      (:TERM NIL "method") ". If both " (:TERM NIL "parameter specializers")
      " are " (:FUNREF NIL "eql") " " (:TERM NIL "expressions")
      ", the specializers must agree (otherwise the two " (:TERM NIL "methods")
      " would not both have been applicable to this argument). " :PAR
      "The resulting list of " (:TERM NIL "applicable methods")
      " has the most specific " (:TERM NIL "method")
      " first and the least specific " (:TERM NIL "method") " last. " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE
       ("Applying method combination to the sorted list of applicable methods")
       :TAGS (:APPLY-METH-COMB-TO-SORTED-METHODS))
      " " :PAR
      "In the simple case—if standard method combination is used and all applicable methods are primary methods—the "
      (:COMMENT NIL
       "!!! Barrett suggests that this is not the normal meaning of \"effective method\"")
      "effective method is the most specific method. That method can call the next most specific method by using the "
      (:TERM NIL "function") " " (:FUNREF NIL "call-next-method")
      ". The method that " (:FUNREF NIL "call-next-method")
      " will call is referred to as the " (:NEWTERM NIL "next method")
      ". The predicate " (:FUNREF NIL "next-method-p")
      " tests whether a next method exists. If "
      (:FUNREF NIL "call-next-method")
      " is called and there is no next most specific method, the generic function "
      (:FUNREF NIL "no-next-method") " is invoked. " :PAR
      "In general, the effective method is some combination of the applicable methods. It is described by a "
      (:TERM NIL "form")
      " that contains calls to some or all of the applicable methods, returns the value or values that will be returned as the value or values of the generic function, and optionally makes some of the methods accessible by means of "
      (:FUNREF NIL "call-next-method") ". "
      (:COMMENT NIL
       "% Moon wanted this removed.  Barrett agrees. -kmp 9-Feb-92"
       " This Lisp form is the body of the effective"
       " method; it is augmented with an appropriate \\term{lambda list} to"
       " make it a function.")
      :PAR
      "The role of each method in the effective method is determined by its "
      (:COMMENT NIL "\\term{method}") (:TERM NIL "qualifiers")
      " and the specificity of the method. A " (:TERM NIL "qualifier")
      " serves to mark a method, and the meaning of a " (:TERM NIL "qualifier")
      " is determined by the way that these marks are used by this step of the procedure. If an applicable method has an unrecognized "
      (:TERM NIL "qualifier")
      ", this step signals an error and does not include that method in the effective method. "
      :PAR
      "When standard method combination is used together with qualified methods, the effective method is produced as described in "
      (:SECREF NIL :STD-METH-COMB) ". " :PAR
      "Another type of method combination can be specified by using the "
      (:KWD NIL "method-combination") " option of " (:MACREF NIL "defgeneric")
      " or of any of the other operators that specify generic function options. In this way this step of the procedure can be customized. "
      :PAR "New types of method combination can be defined by using the "
      (:FUNREF NIL "define-method-combination") " " (:TERM NIL "macro") ". "
      :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Standard Method Combination") :TAGS (:STD-METH-COMB)) " "
     (:IDXREF NIL "standard") " " :PAR
     (:COMMENT NIL "!!! Barrett: \"supported\" ?")
     "Standard method combination is supported by the " (:TERM NIL "class") " "
     (:TYPEREF NIL "standard-generic-function")
     ". It is used if no other type of method combination is specified or if the built-in method combination type "
     (:MISC NIL "standard") " is specified. " :PAR
     "Primary methods define the main action of the effective method, while auxiliary methods modify that action in one of three ways. A primary method has no method "
     (:TERM NIL "qualifiers") ". " :PAR
     "An auxiliary method is a method whose " (:COMMENT NIL "\\term{method}")
     (:TERM NIL "qualifier") " is " (:KWD NIL "before") ", " (:KWD NIL "after")
     ", or " (:KWD NIL "around")
     ". Standard method combination allows no more than one "
     (:TERM NIL "qualifier")
     " per method; if a method definition specifies more than one "
     (:TERM NIL "qualifier") " per method, an error is signaled. " :PAR
     (:LIST NIL
      (:ITEM NIL " A " (:TERM NIL "before method") " has the keyword "
       (:KWD NIL "before") " as its only " (:TERM NIL "qualifier") ". A "
       (:TERM NIL "before method") " specifies " (:TERM NIL "code")
       " that is to be run before any " (:TERM NIL "primary methods") ". "
       :PAR)
      (:ITEM NIL " An " (:TERM NIL "after method") " has the keyword "
       (:KWD NIL "after") " as its only " (:TERM NIL "qualifier") ". An "
       (:TERM NIL "after method") " specifies " (:TERM NIL "code")
       " that is to be run after " (:TERM NIL "primary methods") ". " :PAR)
      (:ITEM NIL " An " (:TERM NIL "around method") " has the keyword "
       (:KWD NIL "around") " as its only " (:TERM NIL "qualifier") ". An "
       (:TERM NIL "around method") " specifies " (:TERM NIL "code")
       " that is to be run instead of other " (:TERM NIL "applicable methods")
       ", "
       (:COMMENT NIL "%I found this to be too vague. -kmp 9-Jan-91"
        "but which is able to cause some of them to be run.")
       "but which might contain explicit " (:TERM NIL "code")
       " which calls some of those " (:TERM NIL "shadowed") " "
       (:TERM NIL "methods") " (via " (:FUNREF NIL "call-next-method") "). "
       :PAR))
     " " :PAR "The semantics of standard method combination is as follows: "
     :PAR
     (:LIST NIL
      (:ITEM NIL " If there are any " (:TERM NIL "around methods")
       ", the most specific " (:TERM NIL "around method")
       " is called. It supplies the value or values of the generic function. "
       :PAR)
      (:ITEM NIL " Inside the body of an " (:TERM NIL "around method") ", "
       (:FUNREF NIL "call-next-method") " can be used to call the "
       (:TERM NIL "next method") ". When the next method returns, the "
       (:TERM NIL "around method")
       " can execute more code, perhaps based on the returned value or values. "
       (:COMMENT NIL " !!!"
        " Moon: Can't happen, `next page' says signals an error if there are no primaries."
        " Barrett: This is a bone of contention. (e.g., no-next-method might -do- the signaling)")
       "The " (:TERM NIL "generic function") " " (:FUNREF NIL "no-next-method")
       " is invoked if " (:FUNREF NIL "call-next-method")
       " is used and there is no " (:TERM NIL "applicable method")
       " to call. The " (:TERM NIL "function") " "
       (:FUNREF NIL "next-method-p") " may be used to determine whether a "
       (:TERM NIL "next method") " exists. " :PAR)
      (:ITEM NIL " If an " (:TERM NIL "around method") " invokes "
       (:FUNREF NIL "call-next-method") ", the next most specific "
       (:TERM NIL "around method")
       " is called, if one is applicable. If there are no "
       (:TERM NIL "around methods") " or if " (:FUNREF NIL "call-next-method")
       " is called by the least specific " (:TERM NIL "around method")
       ", the other methods are called as follows: "
       (:LIST NIL
        (:ITEM NIL "– All the " (:TERM NIL "before methods")
         " are called, in most-specific-first order. Their values are ignored. An error is signaled if "
         (:FUNREF NIL "call-next-method") " is used in a "
         (:TERM NIL "before method") ". " :PAR)
        (:ITEM NIL
         "– The most specific primary method is called. Inside the body of a primary method, "
         (:FUNREF NIL "call-next-method")
         " may be used to call the next most specific primary method. When that method returns, the previous primary method can execute more code, perhaps based on the returned value or values. The generic function "
         (:FUNREF NIL "no-next-method") " is invoked if "
         (:FUNREF NIL "call-next-method")
         " is used and there are no more applicable primary methods. The "
         (:TERM NIL "function") " " (:FUNREF NIL "next-method-p")
         " may be used to determine whether a " (:TERM NIL "next method")
         " exists. If " (:FUNREF NIL "call-next-method")
         " is not used, only the most specific " (:TERM NIL "primary method")
         " is called. " :PAR)
        (:ITEM NIL "– All the " (:TERM NIL "after methods")
         " are called in most-specific-last order. Their values are ignored. An error is signaled if "
         (:FUNREF NIL "call-next-method") " is used in an "
         (:TERM NIL "after method") ". "))
       " ")
      (:ITEM NIL " If no " (:TERM NIL "around methods")
       " were invoked, the most specific primary method supplies the value or values returned by the generic function. The value or values returned by the invocation of "
       (:FUNREF NIL "call-next-method") " in the least specific "
       (:TERM NIL "around method")
       " are those returned by the most specific primary method. " :PAR))
     " " :PAR
     "In standard method combination, if there is an applicable method but no applicable primary method, an error is signaled. "
     :PAR "The " (:TERM NIL "before methods")
     " are run in most-specific-first order while the "
     (:TERM NIL "after methods")
     " are run in least-specific-first order. The design rationale for this difference can be illustrated with an example. Suppose class "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1")))
     " modifies the behavior of its superclass, "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) ", by adding "
     (:TERM NIL "before methods") " and " (:TERM NIL "after methods")
     ". Whether the behavior of the class "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2")))
     " is defined directly by methods on "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2")))
     " or is inherited from its superclasses does not affect the relative order of invocation of methods on instances of the class "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) ". Class "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) "'s "
     (:TERM NIL "before method") " runs before all of class "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) "'s methods. Class "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) "'s "
     (:TERM NIL "after method") " runs after all of class "
     (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) "'s methods. " :PAR
     "By contrast, all " (:TERM NIL "around methods")
     " run before any other methods run. Thus a less specific "
     (:TERM NIL "around method")
     " runs before a more specific primary method. " :PAR
     "If only primary methods are used and if "
     (:FUNREF NIL "call-next-method")
     " is not used, only the most specific method is invoked; that is, more specific methods shadow more general ones. "
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Declarative Method Combination")) "The macro "
     (:MACREF NIL "define-method-combination")
     " defines new forms of method combination. It provides a mechanism for customizing the production of the effective method. The default procedure for producing an effective method is described in "
     (:SECREF NIL :DETERMINING-THE-EFFECTIVE-METHOD)
     ". There are two forms of " (:MACREF NIL "define-method-combination")
     ". The short form is a simple facility while the long form is more powerful and more verbose. The long form resembles "
     (:MACREF NIL "defmacro")
     " in that the body is an expression that computes a Lisp form; it provides mechanisms for implementing arbitrary control structures within method combination and for arbitrary processing of method "
     (:TERM NIL "qualifiers") ". " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Built-in Method Combination Types") :TAGS
      (:BUILT-IN-METH-COMB-TYPES))
     " " :PAR
     "The object system provides a set of built-in method combination types. To specify that a generic function is to use one of these method combination types, the name of the method combination type is given as the argument to the "
     (:KWD NIL "method-combination") " option to " (:MACREF NIL "defgeneric")
     " or to the " (:KWD NIL "method-combination")
     " option to any of the other operators that specify generic function options. "
     :PAR "The names of the built-in method combination types are listed in "
     (:NEXTFIGURE NIL) ". " (:IDXREF NIL "+") (:IDXREF NIL "and")
     (:IDXREF NIL "append") (:IDXREF NIL "list") (:IDXREF NIL "max")
     (:IDXREF NIL "min") (:IDXREF NIL "nconc") (:IDXREF NIL "or")
     (:IDXREF NIL "progn") (:IDXREF NIL "standard") " " :PAR
     (:TABLE (:NAME ("Built-in Method Combination Types"))
      (:ROW NIL (:CELL NIL (:MISC NIL " +")) (:CELL NIL (:MISC NIL "append"))
       (:CELL NIL (:MISC NIL "max")) (:CELL NIL (:MISC NIL "nconc"))
       (:CELL NIL (:MISC NIL "progn")))
      (:ROW NIL (:CELL NIL (:MISC NIL " and")) (:CELL NIL (:MISC NIL "list"))
       (:CELL NIL (:MISC NIL "min")) (:CELL NIL (:MISC NIL "or"))
       (:CELL NIL (:MISC NIL "standard"))))
     " " :PAR "The semantics of the " (:MISC NIL "standard")
     " built-in method combination type is described in "
     (:SECREF NIL :STD-METH-COMB)
     ". The other built-in method combination types are called simple built-in method combination types. "
     :PAR
     "The simple built-in method combination types act as though they were defined by the short form of "
     (:MACREF NIL "define-method-combination")
     ". They recognize two roles for " (:TERM NIL "methods") ": " :PAR
     (:LIST NIL
      (:ITEM NIL " An " (:TERM NIL "around method") " has the keyword symbol "
       (:KWD NIL "around") " as its sole " (:TERM NIL "qualifier")
       ". The meaning of " (:KWD NIL "around") " " (:TERM NIL "methods")
       " is the same as in standard method combination. Use of the functions "
       (:FUNREF NIL "call-next-method") " and " (:FUNREF NIL "next-method-p")
       " is supported in " (:TERM NIL "around methods") ". " :PAR)
      (:ITEM NIL
       " A primary method has the name of the method combination type as its sole "
       (:TERM NIL "qualifier")
       ". For example, the built-in method combination type " (:TT NIL " and")
       " recognizes methods whose sole " (:TERM NIL "qualifier") " is "
       (:TT NIL " and") "; these are primary methods. Use of the functions "
       (:FUNREF NIL "call-next-method") " and " (:FUNREF NIL "next-method-p")
       " is not supported in " (:TERM NIL "primary methods") ". " :PAR))
     " " :PAR
     "The semantics of the simple built-in method combination types is as follows: "
     :PAR
     (:LIST NIL
      (:ITEM NIL " If there are any " (:TERM NIL "around methods")
       ", the most specific " (:TERM NIL "around method")
       " is called. It supplies the value or values of the "
       (:TERM NIL "generic function") ". " :PAR)
      (:ITEM NIL " Inside the body of an " (:TERM NIL "around method")
       ", the function " (:FUNREF NIL "call-next-method")
       " can be used to call the " (:TERM NIL "next method") ". "
       (:COMMENT NIL " !!!"
        " Moon: Can't happen, `next page' says signals an error if there are no primaries."
        " Barrett: This is a bone of contention. (e.g., no-next-method might -do- the signaling)")
       "The " (:TERM NIL "generic function") " " (:FUNREF NIL "no-next-method")
       " is invoked if " (:FUNREF NIL "call-next-method")
       " is used and there is no applicable method to call. The "
       (:TERM NIL "function") " " (:FUNREF NIL "next-method-p")
       " may be used to determine whether a " (:TERM NIL "next method")
       " exists. When the " (:TERM NIL "next method") " returns, the "
       (:TERM NIL "around method")
       " can execute more code, perhaps based on the returned value or values. "
       :PAR)
      (:ITEM NIL " If an " (:TERM NIL "around method") " invokes "
       (:FUNREF NIL "call-next-method") ", the next most specific "
       (:TERM NIL "around method")
       " is called, if one is applicable. If there are no "
       (:TERM NIL "around methods") " or if " (:FUNREF NIL "call-next-method")
       " is called by the least specific " (:TERM NIL "around method")
       ", a Lisp form derived from the name of the built-in method combination type and from the list of applicable primary methods is evaluated to produce the value of the generic function. Suppose the name of the method combination type is "
       (:I NIL "operator")
       " and the call to the generic function is of the form " :PAR
       (:DISPLAYMATH NIL (:MO NIL "(") (:MI (:FONT :I) "generic-function")
        (:MSPACE NIL) (:MSUB NIL (:MI NIL "a") (:MN NIL "1")) (:MO NIL "…")
        (:MSUB NIL (:MI NIL "a") (:MI NIL "n")) (:MO NIL ")"))
       " " :PAR)
      (:ITEM NIL " Let "
       (:MATH NIL (:MSUB NIL (:MI NIL "M") (:MN NIL "1")) (:MO NIL ",")
        (:MO NIL "…") (:MO NIL ",") (:MSUB NIL (:MI NIL "M") (:MI NIL "k")))
       " be the applicable primary methods in order; then the derived Lisp form is "
       :PAR
       (:DISPLAYMATH NIL (:MO NIL "(") (:MI (:FONT :I) "operator")
        (:MO NIL "⟨") (:MSUB NIL (:MI NIL "M") (:MN NIL "1")) (:MSPACE NIL)
        (:MSUB NIL (:MI NIL "a") (:MN NIL "1")) (:MO NIL "…")
        (:MSUB NIL (:MI NIL "a") (:MI NIL "n")) (:MO NIL "⟩") (:MO NIL "…")
        (:MO NIL "⟨") (:MSUB NIL (:MI NIL "M") (:MI NIL "k")) (:MSPACE NIL)
        (:MSUB NIL (:MI NIL "a") (:MN NIL "1")) (:MO NIL "…")
        (:MSUB NIL (:MI NIL "a") (:MI NIL "n")) (:MO NIL "⟩") (:MO NIL ")"))
       " " :PAR)
      (:ITEM NIL " If the expression "
       (:MATH NIL (:MO NIL "⟨") (:MSUB NIL (:MI NIL "M") (:MI NIL "i"))
        (:MSPACE NIL) (:MSUB NIL (:MI NIL "a") (:MN NIL "1")) (:MO NIL "…")
        (:MSUB NIL (:MI NIL "a") (:MI NIL "n")) (:MO NIL "⟩"))
       " is evaluated, the method "
       (:MATH NIL (:MSUB NIL (:MI NIL "M") (:MI NIL "i")))
       " will be applied to the arguments "
       (:MATH NIL (:MSUB NIL (:MI NIL "a") (:MN NIL "1")) (:MO NIL "…")
        (:MSUB NIL (:MI NIL "a") (:MI NIL "n")))
       ". For example, if " (:I NIL "operator") " is " (:TT NIL " or")
       ", the expression "
       (:MATH NIL (:MO NIL "⟨") (:MSUB NIL (:MI NIL "M") (:MI NIL "i"))
        (:MSPACE NIL) (:MSUB NIL (:MI NIL "a") (:MN NIL "1")) (:MO NIL "…")
        (:MSUB NIL (:MI NIL "a") (:MI NIL "n")) (:MO NIL "⟩"))
       " is evaluated only if "
       (:MATH NIL (:MO NIL "⟨") (:MSUB NIL (:MI NIL "M") (:MI NIL "j"))
        (:MSPACE NIL) (:MSUB NIL (:MI NIL "a") (:MN NIL "1")) (:MO NIL "…")
        (:MSUB NIL (:MI NIL "a") (:MI NIL "n")) (:MO NIL "⟩"))
       ", "
       (:MATH NIL (:MN NIL "1") (:MO NIL "≤") (:MI NIL "j") (:MO NIL "<")
        (:MI NIL "i"))
       ", returned " (:TT NIL " nil") ". " :PAR)
      (:ITEM NIL " The default order for the primary methods is "
       (:KWD NIL "most-specific-first")
       ". However, the order can be reversed by supplying "
       (:KWD NIL "most-specific-last") " as the second argument to the "
       (:KWD NIL "method-combination") " option. "))
     " " :PAR
     "The simple built-in method combination types require exactly one "
     (:TERM NIL "qualifier")
     " per method. An error is signaled if there are applicable methods with no "
     (:TERM NIL "qualifiers") " or with " (:TERM NIL "qualifiers")
     " that are not supported by the method combination type. An error is signaled if there are applicable "
     (:TERM NIL "around methods") " and no applicable primary methods. " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Inheritance of Methods") :TAGS (:METHOD-INHERITANCE))
    " " :PAR
    "A subclass inherits methods in the sense that any method applicable to all instances of a class is also applicable to all instances of any subclass of that class. "
    :PAR
    "The inheritance of methods acts the same way regardless of which of the "
    (:TERM NIL "method-defining operators") " created the methods. "
    (:COMMENT NIL " whether the"
     " method was created by using one of the method-defining operators or by"
     " using one of the \\macref{defclass} options that causes methods to be"
     " generated automatically.")
    :PAR "The inheritance of methods is described in detail in "
    (:SECREF NIL :METHOD-SELECTION-AND-COMBINATION) ". " :PAR))
  :PAR
  (:DICTIONARY NIL :PAR " " :PAR
   (:COMMENT NIL "%% ========== FUNCTION-KEYWORDS")
   (:COM (:NAME "function-keywords" :FTYPE "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "generic-function") (:NAMES NIL "function-keywords")
      (:ARGLIST NIL "method") (:VALUES NIL "keys, allow-other-keys-p"))
     " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "function-keywords")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "method") " "
        (:TYPEREF NIL "standard-method"))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "method") "—a "
     (:TERM NIL "method") ". " :PAR (:PARAM NIL "keys") "—a "
     (:TERM NIL "list") ". " :PAR (:PARAM NIL "allow-other-keys-p") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "Returns the keyword parameter specifiers for a " (:PARAM NIL "method")
     ". " :PAR "Two values are returned: a " (:TERM NIL "list")
     " of the explicitly named keywords and a "
     (:TERM NIL "generalized boolean") " that states whether "
     (:KEYREF NIL "allow-other-keys") " had been specified in the "
     (:PARAM NIL "method") " definition. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defmethod gf1 ((a integer) &optional (b 2)
                 &key (c 3) ((:dee d) 4) e ((eff f)))
   (list a b c d e f))
→ #<STANDARD-METHOD GF1 (INTEGER) 36324653>
 (find-method #'gf1 '() (list (find-class 'integer))) 
→ #<STANDARD-METHOD GF1 (INTEGER) 36324653>
 (function-keywords *)
→ (:C :DEE :E EFF), "
      (:TERM NIL "false") "
 (defmethod gf2 ((a integer))
   (list a b c d e f))
→ #<STANDARD-METHOD GF2 (INTEGER) 42701775>
 (function-keywords (find-method #'gf1 '() (list (find-class 'integer))))
→ (), "
      (:TERM NIL "false") "
 (defmethod gf3 ((a integer) &key b c d &allow-other-keys)
   (list a b c d e f))
 (function-keywords *)
→ (:B :C :D), "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:MACREF NIL "defmethod") " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defmethod") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ENSURE-GENERIC-FUNCTION")
   (:COM (:NAME "ensure-generic-function" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "ensure-generic-function")
      (:ARGLIST NIL "function-name " (:KEYWORD NIL " &key")
       " argument-precedence-order declare documentation environment generic-function-class lambda-list method-class method-combination")
      (:VALUES NIL "generic-function"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "function-name")
     "—a " (:TERM NIL "function name") ". " :PAR
     "The keyword arguments correspond to the " (:PARAM NIL "option")
     " arguments of " (:MACREF NIL "defgeneric") ", except that the "
     (:KWD NIL "method-class") " and " (:KWD NIL "generic-function-class")
     " arguments can be " (:TERM NIL "class") " " (:TERM NIL "object")
     "s as well as names. " :PAR
     (:COMMENT NIL "!!! What's a method combination object??")
     (:PARAM NIL "method-combination") "—method combination object. " :PAR
     (:PARAM NIL "environment") "—the same as the " (:KEYREF NIL "environment")
     " argument to macro expansion functions and is used to distinguish between compile-time and run-time environments. "
     (:COMMENT NIL
      "Barmar said (and I agree) that this just doesn't belong here."
      " \\issue{MACRO-ENVIRONMENT-EXTENT:DYNAMIC}"
      " The \\keyref{environment} argument has "
      " \\term{dynamic extent}; the consequences are undefined if "
      " the \\keyref{environment} argument is "
      " referred to outside the \\term{dynamic extent} "
      " of the macro expansion function."
      " \\endissue{MACRO-ENVIRONMENT-EXTENT:DYNAMIC}")
     :PAR
     (:EDITORNOTE NIL
      "KMP: What about documentation. Missing from this arguments enumeration, and confusing in description below.")
     (:COMMENT NIL "!!!") :PAR (:PARAM NIL "generic-function") "—a "
     (:TERM NIL "generic function") " " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "ensure-generic-function")
     " is used to define a globally named " (:TERM NIL "generic function")
     " with no " (:TERM NIL "methods")
     " or to specify or modify options and declarations that pertain to a globally named "
     (:TERM NIL "generic function") " as a whole. " :PAR
     (:COMMENT NIL
      "!!! This used to refer to FBOUNDP but I changed it to use \"fbound\"."
      "    The question is, why is it looking in the global env if an environment"
      "    argument was passed.")
     "If " (:PARAM NIL "function-name") " is not " (:TERM NIL "fbound")
     " in the " (:TERM NIL "global environment") ", a new "
     (:TERM NIL "generic function") " is created. "
     (:COMMENT NIL "!!! Rewrite in terms of function cell contents?") "If "
     (:ISSUE NIL "FUNCTION-NAME:LARGE") " "
     (:TT NIL "(fdefinition " (:PARAM NIL "function-name") ")") " "
     (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " is an "
     (:TERM NIL "ordinary function") ", a " (:TERM NIL "macro") ", or a "
     (:TERM NIL "special operator") ", an error is signaled. " :PAR "If "
     (:PARAM NIL "function-name") " is a " (:TERM NIL "list")
     ", it must be of the form " (:TT NIL "(setf " (:PARAM NIL "symbol") ")")
     ". If " (:PARAM NIL "function-name") " specifies a "
     (:TERM NIL "generic function")
     " that has a different value for any of the following arguments, the "
     (:TERM NIL "generic function") " is modified to have the new value: "
     (:KWD NIL "argument-precedence-order") ", " (:KWD NIL "declare") ", "
     (:KWD NIL "documentation") ", " (:KWD NIL "method-combination") ". " :PAR
     "If " (:PARAM NIL "function-name") " specifies a "
     (:TERM NIL "generic function") " that has a different value for the "
     (:KWD NIL "lambda-list")
     " argument, and the new value is congruent with the "
     (:TERM NIL "lambda lists") " of all existing " (:TERM NIL "methods")
     " or there are no " (:TERM NIL "methods")
     ", the value is changed; otherwise an error is signaled. " :PAR
     (:COMMENT NIL "!!! Barmar: What does this part about"
      "     \"new generic function class is compatible with the old\" mean?")
     "If " (:PARAM NIL "function-name") " specifies a "
     (:TERM NIL "generic function") " that has a different value for the "
     (:KWD NIL "generic-function-class")
     " argument and if the new generic function class is compatible with the old, "
     (:FUNREF NIL "change-class") " is called to change the "
     (:TERM NIL "class") " of the " (:TERM NIL "generic function")
     "; otherwise an error is signaled. " :PAR "If "
     (:PARAM NIL "function-name") " specifies a "
     (:TERM NIL "generic function") " that has a different value for the "
     (:KWD NIL "method-class")
     " argument, the value is changed, but any existing " (:TERM NIL "methods")
     " are not changed. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "Existing function binding of "
     (:PARAM NIL "function-name") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If "
     (:ISSUE NIL "FUNCTION-NAME:LARGE") " "
     (:TT NIL "(fdefinition " (:PARAM NIL "function-name") ")") " "
     (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " is an "
     (:TERM NIL "ordinary function") ", a " (:TERM NIL "macro") ", or a "
     (:TERM NIL "special operator") ", an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") " is signaled. " :PAR "If "
     (:PARAM NIL "function-name") " specifies a "
     (:TERM NIL "generic function") " that has a different value for the "
     (:KWD NIL "lambda-list")
     " argument, and the new value is not congruent with the "
     (:TERM NIL "lambda list") " of any existing " (:TERM NIL "method")
     ", an error of " (:TERM NIL "type") " " (:TYPEREF NIL "error")
     " is signaled. " :PAR "If " (:PARAM NIL "function-name") " specifies a "
     (:TERM NIL "generic function") " that has a different value for the "
     (:KWD NIL "generic-function-class")
     " argument and if the new generic function class not is compatible with the old, an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error") " is signaled. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defgeneric") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ALLOCATE-INSTANCE")
   (:COM (:NAME "allocate-instance" :FTYPE "Standard Generic Function")
    (:ISSUE NIL "ALLOCATE-INSTANCE:ADD") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " "
     (:DEF (:KIND "generic-function") (:NAMES NIL "allocate-instance")
      (:ARGLIST NIL "class " (:KEYWORD NIL " &rest") " initargs "
       (:KEYWORD NIL " &key") " " (:KEYWORD NIL " &allow-other-keys"))
      (:VALUES NIL "new-instance"))
     " " (:ENDISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "allocate-instance")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "class") " " (:TYPEREF NIL "standard-class"))
       " " (:KEYWORD NIL " &rest") " initargs"))
     " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "allocate-instance")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "class") " " (:TYPEREF NIL "structure-class"))
       " " (:KEYWORD NIL " &rest") " initargs"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "class") "—a "
     (:TERM NIL "class") ". " :PAR (:PARAM NIL "initargs") "—a "
     (:TERM NIL "list") " of " (:TERM NIL "keyword/value pairs")
     " (initialization argument " (:TERM NIL "names") " and "
     (:TERM NIL "values") "). " :PAR (:PARAM NIL "new-instance") "—an "
     (:TERM NIL "object") " whose " (:TERM NIL "class") " is "
     (:PARAM NIL "class") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The generic function "
     (:FUNREF NIL "allocate-instance")
     " creates and returns a new instance of the " (:PARAM NIL "class")
     ", without initializing it. When the " (:PARAM NIL "class") " is a "
     (:TERM NIL "standard class") ", this means that the " (:TERM NIL "slots")
     " are " (:TERM NIL "unbound") "; when the " (:TERM NIL "class") " is a "
     (:TERM NIL "structure class") ", this means the " (:TERM NIL "slots") "' "
     (:TERM NIL "values") " are unspecified. " :PAR "The caller of "
     (:FUNREF NIL "allocate-instance")
     " is expected to have already checked the initialization arguments. " :PAR
     "The " (:TERM NIL "generic function") " "
     (:FUNREF NIL "allocate-instance") " is called by "
     (:FUNREF NIL "make-instance") ", as described in "
     (:SECREF NIL :OBJECT-CREATION-AND-INIT) ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " (:COMMENT NIL " ????") :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " (:COMMENT NIL " ????")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defclass") ", "
     (:FUNREF NIL "make-instance") ", " (:FUNREF NIL "class-of") ", "
     (:SECREF NIL :OBJECT-CREATION-AND-INIT) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The consequences of adding "
     (:TERM NIL "methods") " to " (:FUNREF NIL "allocate-instance")
     " is unspecified. This capability might be added by the "
     (:TERM NIL "Metaobject Protocol") ". " :PAR
     (:COMMENT NIL " kmp: This section was copied with minor changes from"
      "  \\funref{make-instance}, and then reviewed by Moon.")
     :PAR (:ENDISSUE NIL "ALLOCATE-INSTANCE:ADD") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== REINITIALIZE-INSTANCE")
   (:COM (:NAME "reinitialize-instance" :FTYPE "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " "
     (:DEF (:KIND "generic-function") (:NAMES NIL "reinitialize-instance")
      (:ARGLIST NIL "instance " (:KEYWORD NIL " &rest") " initargs "
       (:KEYWORD NIL " &key") " " (:KEYWORD NIL " &allow-other-keys"))
      (:VALUES NIL "instance"))
     " " (:ENDISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "reinitialize-instance")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "instance") " "
        (:TYPEREF NIL "standard-object"))
       " " (:KEYWORD NIL " &rest") " initargs"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "instance")
     "—an " (:TERM NIL "object") ". " :PAR (:PARAM NIL "initargs") "—an "
     (:TERM NIL "initialization argument list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "generic function")
     " " (:FUNREF NIL "reinitialize-instance")
     " can be used to change the values of " (:TERM NIL "local slots")
     " of an " (:PARAM NIL "instance") " according to " (:PARAM NIL "initargs")
     ". "
     (:COMMENT NIL "This generic function is called by the Meta-Object"
      "Protocol.  ")
     "This " (:TERM NIL "generic function") " can be called by users. " :PAR
     "The system-supplied primary " (:TERM NIL "method") " for "
     (:FUNREF NIL "reinitialize-instance") " checks the validity of "
     (:PARAM NIL "initargs") " and signals an error if an "
     (:PARAM NIL "initarg") " is supplied that is not declared as valid. The "
     (:TERM NIL "method") " then calls the generic function "
     (:FUNREF NIL "shared-initialize") " with the following arguments: the "
     (:PARAM NIL "instance") ", " (:MISC NIL "nil") " (which means no "
     (:TERM NIL "slots")
     " should be initialized according to their initforms), and the "
     (:PARAM NIL "initargs") " it received. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The "
     (:TERM NIL "generic function") " " (:FUNREF NIL "reinitialize-instance")
     " changes the values of " (:TERM NIL "local slots") ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "The system-supplied primary " (:TERM NIL "method") " for "
     (:FUNREF NIL "reinitialize-instance") " signals an error if an "
     (:PARAM NIL "initarg") " is supplied that is not declared as valid. "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "initialize-instance") ", "
     (:FUNREF NIL "shared-initialize") ", "
     (:FUNREF NIL "update-instance-for-redefined-class") ", "
     (:FUNREF NIL "update-instance-for-different-class") ", "
     (:FUNREF NIL "slot-boundp") ", " (:FUNREF NIL "slot-makunbound") ", "
     (:SECREF NIL :INSTANCE-RE-INIT) ", " (:SECREF NIL :INITARG-RULES) ", "
     (:SECREF NIL :DECLARING-INITARG-VALIDITY) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:PARAM NIL "Initargs")
     " are declared as valid by using the " (:KWD NIL "initarg") " option to "
     (:MACREF NIL "defclass") ", or by defining " (:TERM NIL "methods") " for "
     (:FUNREF NIL "reinitialize-instance") " or "
     (:FUNREF NIL "shared-initialize")
     ". The keyword name of each keyword parameter specifier in the "
     (:TERM NIL "lambda list") " of any " (:TERM NIL "method") " defined on "
     (:FUNREF NIL "reinitialize-instance") " or "
     (:FUNREF NIL "shared-initialize")
     " is declared as a valid initialization argument name for all "
     (:TERM NIL "classes") " for which that " (:TERM NIL "method")
     " is applicable. " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SHARED-INITIALIZE")
   (:COM (:NAME "shared-initialize" :FTYPE "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " "
     (:DEF (:KIND "generic-function") (:NAMES NIL "shared-initialize")
      (:ARGLIST NIL "instance slot-names " (:KEYWORD NIL " &rest") " initargs "
       (:KEYWORD NIL " &key") " " (:KEYWORD NIL " &allow-other-keys"))
      (:VALUES NIL "instance"))
     " " (:ENDISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "shared-initialize")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "instance") " "
        (:TYPEREF NIL "standard-object"))
       " slot-names " (:KEYWORD NIL " &rest") " initargs"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "instance")
     "—an " (:TERM NIL "object") ". " :PAR (:PARAM NIL "slot-names") "—a "
     (:TERM NIL "list") " or " (:MISC NIL "t") ". " :PAR
     (:PARAM NIL "initargs") "—a " (:TERM NIL "list") " of "
     (:TERM NIL "keyword/value pairs") " (of initialization argument "
     (:TERM NIL "names") " and " (:TERM NIL "values") "). " :PAR)
    (:PART (:NAME "Description") " " :PAR "The generic function "
     (:FUNREF NIL "shared-initialize") " is used to fill the "
     (:TERM NIL "slots") " of an " (:PARAM NIL "instance") " using "
     (:PARAM NIL "initargs") " and " (:KWD NIL "initform")
     " forms. It is called when an instance is created, when an instance is re-initialized, when an instance is updated to conform to a redefined "
     (:TERM NIL "class")
     ", and when an instance is updated to conform to a different "
     (:TERM NIL "class") ". The generic function "
     (:FUNREF NIL "shared-initialize")
     " is called by the system-supplied primary " (:TERM NIL "method") " for "
     (:FUNREF NIL "initialize-instance") ", "
     (:FUNREF NIL "reinitialize-instance") ", "
     (:FUNREF NIL "update-instance-for-redefined-class") ", and "
     (:FUNREF NIL "update-instance-for-different-class") ". " :PAR
     "The generic function " (:FUNREF NIL "shared-initialize")
     " takes the following arguments: the " (:PARAM NIL "instance")
     " to be initialized, a specification of a set of "
     (:PARAM NIL "slot-names") " " (:TERM NIL "accessible") " in that "
     (:PARAM NIL "instance") ", and any number of " (:PARAM NIL "initargs")
     ". The arguments after the first two must form an "
     (:TERM NIL "initialization argument list")
     ". The system-supplied primary " (:TERM NIL "method") " on "
     (:FUNREF NIL "shared-initialize") " initializes the " (:TERM NIL "slots")
     " with values according to the " (:PARAM NIL "initargs") " and supplied "
     (:KWD NIL "initform") " forms. " (:PARAM NIL "Slot-names")
     " indicates which " (:TERM NIL "slots")
     " should be initialized according to their " (:KWD NIL "initform")
     " forms if no " (:PARAM NIL "initargs") " are provided for those "
     (:TERM NIL "slots") ". " :PAR "The system-supplied primary "
     (:TERM NIL "method") " behaves as follows, regardless of whether the "
     (:TERM NIL "slots") " are local or shared: " :PAR
     (:LIST NIL
      (:ITEM NIL " If an " (:PARAM NIL "initarg") " in the "
       (:TERM NIL "initialization argument list")
       " specifies a value for that " (:TERM NIL "slot")
       ", that value is stored into the " (:TERM NIL "slot")
       ", even if a value has already been stored in the " (:TERM NIL "slot")
       " before the " (:TERM NIL "method") " is run. " :PAR)
      (:ITEM NIL " Any " (:TERM NIL "slots") " indicated by "
       (:PARAM NIL "slot-names")
       " that are still unbound at this point are initialized according to their "
       (:KWD NIL "initform") " forms. For any such " (:TERM NIL "slot")
       " that has an " (:KWD NIL "initform") " form, that " (:TERM NIL "form")
       " is evaluated in the lexical environment of its defining "
       (:MACREF NIL "defclass") " " (:TERM NIL "form")
       " and the result is stored into the " (:TERM NIL "slot")
       ". For example, if a " (:TERM NIL "before method")
       " stores a value in the " (:TERM NIL "slot") ", the "
       (:KWD NIL "initform")
       " form will not be used to supply a value for the " (:TERM NIL "slot")
       ". " :PAR)
      (:ITEM NIL " The rules mentioned in " (:SECREF NIL :INITARG-RULES)
       " are obeyed. " :PAR))
     " " :PAR "The " (:PARAM NIL "slots-names") " argument specifies the "
     (:TERM NIL "slots") " that are to be initialized according to their "
     (:KWD NIL "initform")
     " forms if no initialization arguments apply. It can be a "
     (:TERM NIL "list") " of slot " (:TERM NIL "names")
     ", which specifies the set of those slot " (:TERM NIL "names")
     "; or it can be the " (:TERM NIL "symbol") " " (:MISC NIL "t")
     ", which specifies the set of all of the " (:TERM NIL "slots") ". " :PAR
     (:COMMENT NIL
      "The generic function \\funref{shared-initialize} fills the \\term{slots}"
      "of \\param{instance}.")
     :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR
     (:COMMENT NIL "% Removed per X3J13. -kmp 5-Oct-93"
      " An error \\oftype{error} is signaled if an \\param{initarg} "
      " is supplied that is not declared as valid.")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "initialize-instance") ", "
     (:FUNREF NIL "reinitialize-instance") ", "
     (:FUNREF NIL "update-instance-for-redefined-class") ", "
     (:FUNREF NIL "update-instance-for-different-class") ", "
     (:FUNREF NIL "slot-boundp") ", " (:FUNREF NIL "slot-makunbound") ", "
     (:SECREF NIL :OBJECT-CREATION-AND-INIT) ", " (:SECREF NIL :INITARG-RULES)
     ", " (:SECREF NIL :DECLARING-INITARG-VALIDITY) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:PARAM NIL "Initargs")
     " are declared as valid by using the " (:KWD NIL "initarg") " option to "
     (:MACREF NIL "defclass") ", or by defining " (:TERM NIL "methods") " for "
     (:FUNREF NIL "shared-initialize")
     ". The keyword name of each keyword parameter specifier in the "
     (:TERM NIL "lambda list") " of any " (:TERM NIL "method") " defined on "
     (:FUNREF NIL "shared-initialize") " is declared as a valid "
     (:PARAM NIL "initarg") " name for all " (:TERM NIL "classes")
     " for which that " (:TERM NIL "method") " is applicable. " :PAR
     "Implementations are permitted to optimize " (:KWD NIL "initform")
     " forms that neither produce nor depend on side effects, by evaluating these "
     (:TERM NIL "forms") " and storing them into slots before running any "
     (:FUNREF NIL "initialize-instance")
     " methods, rather than by handling them in the primary "
     (:FUNREF NIL "initialize-instance")
     " method. (This optimization might be implemented by having the "
     (:FUNREF NIL "allocate-instance") " method copy a prototype instance.) "
     :PAR
     "Implementations are permitted to optimize default initial value forms for "
     (:PARAM NIL "initargs")
     " associated with slots by not actually creating the complete initialization argument "
     (:TERM NIL "list") " when the only " (:TERM NIL "method")
     " that would receive the complete " (:TERM NIL "list") " is the "
     (:TERM NIL "method") " on " (:TYPEREF NIL "standard-object")
     ". In this case default initial value forms can be treated like "
     (:KWD NIL "initform")
     " forms. This optimization has no visible effects other than a performance improvement. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== UPDATE-INSTANCE-FOR-DIFFERENT-CLASS")
   (:COM
    (:NAME "update-instance-for-different-class" :FTYPE
     "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " "
     (:DEF (:KIND "generic-function")
      (:NAMES NIL "update-instance-for-different-class")
      (:ARGLIST NIL "previous current " (:KEYWORD NIL " &rest") " initargs "
       (:KEYWORD NIL " &key") " " (:KEYWORD NIL " &allow-other-keys"))
      (:VALUES NIL (:TERM NIL "implementation-dependent")))
     " " (:ENDISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "update-instance-for-different-class")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "previous") " "
        (:TYPEREF NIL "standard-object"))
       " "
       (:PAREN NIL (:PARAM NIL "current") " " (:TYPEREF NIL "standard-object"))
       " " (:KEYWORD NIL " &rest") " initargs"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "previous")
     "—a copy of the original " (:TERM NIL "instance") ". " :PAR
     (:PARAM NIL "current") "—the original " (:TERM NIL "instance")
     " (altered). " :PAR (:PARAM NIL "initargs") "—an "
     (:TERM NIL "initialization argument list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The generic function "
     (:FUNREF NIL "update-instance-for-different-class")
     " is not intended to be called by programmers. Programmers may write "
     (:TERM NIL "methods") " for it. The " (:TERM NIL "function") " "
     (:FUNREF NIL "update-instance-for-different-class")
     " is called only by the " (:TERM NIL "function") " "
     (:FUNREF NIL "change-class") ". " :PAR "The system-supplied primary "
     (:TERM NIL "method") " on "
     (:FUNREF NIL "update-instance-for-different-class")
     " checks the validity of " (:PARAM NIL "initargs")
     " and signals an error if an " (:PARAM NIL "initarg")
     " is supplied that is not declared as valid. This " (:TERM NIL "method")
     " then initializes " (:TERM NIL "slots") " with values according to the "
     (:PARAM NIL "initargs") ", and initializes the newly added "
     (:TERM NIL "slots") " with values according to their "
     (:KWD NIL "initform")
     " forms. It does this by calling the generic function "
     (:FUNREF NIL "shared-initialize")
     " with the following arguments: the instance (" (:PARAM NIL "current")
     "), a list of " (:TERM NIL "names") " of the newly added "
     (:TERM NIL "slots") ", and the " (:PARAM NIL "initargs")
     " it received. Newly added " (:TERM NIL "slots") " are those "
     (:TERM NIL "local slots") " for which no " (:TERM NIL "slot")
     " of the same name exists in the " (:PARAM NIL "previous") " class. " :PAR
     (:TERM NIL "Methods") " for "
     (:FUNREF NIL "update-instance-for-different-class")
     " can be defined to specify actions to be taken when an "
     (:TERM NIL "instance") " is updated. If only " (:TERM NIL "after methods")
     " for " (:FUNREF NIL "update-instance-for-different-class")
     " are defined, they will be run after the system-supplied primary "
     (:TERM NIL "method")
     " for initialization and therefore will not interfere with the default behavior of "
     (:FUNREF NIL "update-instance-for-different-class") ". " :PAR
     (:TERM NIL "Methods") " on "
     (:FUNREF NIL "update-instance-for-different-class")
     " can be defined to initialize " (:TERM NIL "slots") " differently from "
     (:FUNREF NIL "change-class") ". The default behavior of "
     (:FUNREF NIL "change-class") " is described in "
     (:SECREF NIL :CHANGING-INSTANCE-CLASS) ". " :PAR "The arguments to "
     (:FUNREF NIL "update-instance-for-different-class") " are computed by "
     (:FUNREF NIL "change-class") ". When " (:FUNREF NIL "change-class")
     " is invoked on an " (:TERM NIL "instance") ", a copy of that "
     (:TERM NIL "instance") " is made; " (:FUNREF NIL "change-class")
     " then destructively alters the original " (:TERM NIL "instance")
     ". The first argument to "
     (:FUNREF NIL "update-instance-for-different-class") ", "
     (:PARAM NIL "previous") ", is that copy; it holds the old "
     (:TERM NIL "slot")
     " values temporarily. This argument has dynamic extent within "
     (:FUNREF NIL "change-class") "; if it is referenced in any way once "
     (:FUNREF NIL "update-instance-for-different-class")
     " returns, the results are undefined. The second argument to "
     (:FUNREF NIL "update-instance-for-different-class") ", "
     (:PARAM NIL "current") ", is the altered original " (:TERM NIL "instance")
     ". The intended use of " (:PARAM NIL "previous") " is to extract old "
     (:TERM NIL "slot") " values by using " (:FUNREF NIL "slot-value") " or "
     (:MACREF NIL "with-slots")
     " or by invoking a reader generic function, or to run other "
     (:TERM NIL "methods") " that were applicable to " (:TERM NIL "instances")
     " of the original " (:TERM NIL "class") ". " :PAR
     (:COMMENT NIL "The system-supplied primary \\term{method} on"
      "\\funref{update-instance-for-different-class}"
      "initializes \\term{slots} with values according to the initialization"
      "arguments, and initializes the newly added \\term{slots} with values according"
      "to their \\kwd{initform} forms.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR "See the example for the "
     (:TERM NIL "function") " " (:FUNREF NIL "change-class") ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " The system-supplied primary "
     (:TERM NIL "method") " on "
     (:FUNREF NIL "update-instance-for-different-class")
     " signals an error if an initialization argument is supplied that is not declared as valid. "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "change-class") ", "
     (:FUNREF NIL "shared-initialize") ", "
     (:SECREF NIL :CHANGING-INSTANCE-CLASS) ", " (:SECREF NIL :INITARG-RULES)
     ", " (:SECREF NIL :DECLARING-INITARG-VALIDITY) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:PARAM NIL "Initargs")
     " are declared as valid by using the " (:KWD NIL "initarg") " option to "
     (:MACREF NIL "defclass") ", or by defining " (:TERM NIL "methods") " for "
     (:FUNREF NIL "update-instance-for-different-class") " or "
     (:FUNREF NIL "shared-initialize")
     ". The keyword name of each keyword parameter specifier in the "
     (:TERM NIL "lambda list") " of any " (:TERM NIL "method") " defined on "
     (:FUNREF NIL "update-instance-for-different-class") " or "
     (:FUNREF NIL "shared-initialize") " is declared as a valid "
     (:PARAM NIL "initarg") " name for all " (:TERM NIL "classes")
     " for which that " (:TERM NIL "method") " is applicable. " :PAR
     "The value returned by "
     (:FUNREF NIL "update-instance-for-different-class") " is ignored by "
     (:FUNREF NIL "change-class") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== UPDATE-INSTANCE-FOR-REDEFINED-CLASS")
   (:COM
    (:NAME "update-instance-for-redefined-class" :FTYPE
     "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " "
     (:DEF (:KIND "generic-function")
      (:NAMES NIL "update-instance-for-redefined-class")
      (:ARGLIST NIL "instance added-slots discarded-slots property-list "
       (:KEYWORD NIL " &rest") " initargs " (:KEYWORD NIL " &key") " "
       (:KEYWORD NIL " &allow-other-keys"))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " (:ENDISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "update-instance-for-redefined-class")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "instance") " "
        (:TYPEREF NIL "standard-object"))
       " added-slots discarded-slots property-list " (:KEYWORD NIL " &rest")
       " initargs"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "instance")
     "—an " (:TERM NIL "object") ". " :PAR (:PARAM NIL "added-slots") "—a "
     (:TERM NIL "list") ". " :PAR (:PARAM NIL "discarded-slots") "—a "
     (:TERM NIL "list") ". " :PAR (:PARAM NIL "property-list") "—a "
     (:TERM NIL "list") ". " :PAR (:PARAM NIL "initargs") "—an "
     (:TERM NIL "initialization argument list") ". " :PAR (:PARAM NIL "result")
     "—an " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "generic function")
     " " (:FUNREF NIL "update-instance-for-redefined-class")
     " is not intended to be called by programmers. Programmers may write "
     (:TERM NIL "methods") " for it. The " (:TERM NIL "generic function") " "
     (:FUNREF NIL "update-instance-for-redefined-class")
     " is called by the mechanism activated by "
     (:FUNREF NIL "make-instances-obsolete") ". " :PAR
     "The system-supplied primary " (:TERM NIL "method") " on "
     (:FUNREF NIL "update-instance-for-redefined-class")
     " checks the validity of " (:PARAM NIL "initargs")
     " and signals an error if an " (:PARAM NIL "initarg")
     " is supplied that is not declared as valid. This " (:TERM NIL "method")
     " then initializes " (:TERM NIL "slots") " with values according to the "
     (:PARAM NIL "initargs") ", and initializes the newly "
     (:PARAM NIL "added-slots") " with values according to their "
     (:KWD NIL "initform")
     " forms. It does this by calling the generic function "
     (:FUNREF NIL "shared-initialize") " with the following arguments: the "
     (:PARAM NIL "instance") ", a list of names of the newly "
     (:PARAM NIL "added-slots") " to " (:PARAM NIL "instance") ", and the "
     (:PARAM NIL "initargs") " it received. Newly " (:PARAM NIL "added-slots")
     " are those " (:TERM NIL "local slots") " for which no "
     (:TERM NIL "slot") " of the same name exists in the old version of the "
     (:TERM NIL "class") ". " :PAR "When "
     (:FUNREF NIL "make-instances-obsolete") " is invoked or when a "
     (:TERM NIL "class") " has been redefined and an " (:TERM NIL "instance")
     " is being updated, a " (:PARAM NIL "property-list")
     " is created that captures the slot names and values of all the "
     (:PARAM NIL "discarded-slots") " with values in the original "
     (:PARAM NIL "instance") ". The structure of the " (:PARAM NIL "instance")
     " is transformed so that it conforms to the current class definition. The arguments to "
     (:FUNREF NIL "update-instance-for-redefined-class")
     " are this transformed " (:PARAM NIL "instance") ", a list of "
     (:PARAM NIL "added-slots") " to the " (:PARAM NIL "instance") ", a list "
     (:PARAM NIL "discarded-slots") " from the " (:PARAM NIL "instance")
     ", and the " (:PARAM NIL "property-list")
     " containing the slot names and values for " (:TERM NIL "slots")
     " that were discarded and had values. Included in this list of discarded "
     (:TERM NIL "slots") " are " (:TERM NIL "slots")
     " that were local in the old " (:TERM NIL "class")
     " and are shared in the new " (:TERM NIL "class") ". " :PAR
     (:COMMENT NIL "The system-supplied primary \\term{method} on "
      "\\funref{update-instance-for-redefined-class} "
      "initializes \\term{slots} with values according to the \\param{initargs},"
      "and initializes the newly \\param{added-slots} with values according"
      "to their \\kwd{initform} forms.  It does this by calling the generic"
      "function \\funref{shared-initialize}. ")
     :PAR (:COMMENT NIL "!!! So?") "The value returned by "
     (:FUNREF NIL "update-instance-for-redefined-class") " is ignored. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL "  
 (defclass position () ())
 
 (defclass x-y-position (position)
     ((x :initform 0 :accessor position-x)
      (y :initform 0 :accessor position-y)))
 
;;; It turns out polar coordinates are used more than Cartesian 
;;; coordinates, so the representation is altered and some new
;;; accessor methods are added.
 
 (defmethod update-instance-for-redefined-class :before
    ((pos x-y-position) added deleted plist &key)
   ;; Transform the x-y coordinates to polar coordinates
   ;; and store into the new slots.
   (let ((x (getf plist 'x))
         (y (getf plist 'y)))
     (setf (position-rho pos) (sqrt (+ (* x x) (* y y)))
           (position-theta pos) (atan y x))))
  
 (defclass x-y-position (position)
     ((rho :initform 0 :accessor position-rho)
      (theta :initform 0 :accessor position-theta)))
  
;;; All instances of the old x-y-position class will be updated
;;; automatically.
 
;;; The new representation is given the look and feel of the old one.
 
 (defmethod position-x ((pos x-y-position))  
    (with-slots (rho theta) pos (* rho (cos theta))))
 
 (defmethod (setf position-x) (new-x (pos x-y-position))
    (with-slots (rho theta) pos
      (let ((y (position-y pos)))
        (setq rho (sqrt (+ (* new-x new-x) (* y y)))
              theta (atan y new-x))
        new-x)))
 
 (defmethod position-y ((pos x-y-position))
    (with-slots (rho theta) pos (* rho (sin theta))))
 
 (defmethod (setf position-y) (new-y (pos x-y-position))
    (with-slots (rho theta) pos
      (let ((x (position-x pos)))
        (setq rho (sqrt (+ (* x x) (* new-y new-y)))
              theta (atan new-y x))
        new-y)))
 
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " The system-supplied primary "
     (:TERM NIL "method") " on "
     (:FUNREF NIL "update-instance-for-redefined-class")
     " signals an error if an " (:PARAM NIL "initarg")
     " is supplied that is not declared as valid. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-instances-obsolete")
     ", " (:FUNREF NIL "shared-initialize") ", " (:SECREF NIL :CLASS-RE-DEF)
     ", " (:SECREF NIL :INITARG-RULES) ", "
     (:SECREF NIL :DECLARING-INITARG-VALIDITY) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:PARAM NIL "Initargs")
     " are declared as valid by using the " (:KWD NIL "initarg") " option to "
     (:MACREF NIL "defclass") ", or by defining " (:TERM NIL "methods") " for "
     (:FUNREF NIL "update-instance-for-redefined-class") " or "
     (:FUNREF NIL "shared-initialize")
     ". The keyword name of each keyword parameter specifier in the "
     (:TERM NIL "lambda list") " of any " (:TERM NIL "method") " defined on "
     (:FUNREF NIL "update-instance-for-redefined-class") " or "
     (:FUNREF NIL "shared-initialize") " is declared as a valid "
     (:PARAM NIL "initarg") " name for all " (:TERM NIL "classes")
     " for which that " (:TERM NIL "method") " is applicable. " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== CHANGE-CLASS")
   (:COM (:NAME "change-class" :FTYPE "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "CHANGE-CLASS-INITARGS:PERMIT") " "
     (:DEF (:KIND "generic-function") (:NAMES NIL "change-class")
      (:ARGLIST NIL "instance new-class " (:KEYWORD NIL " &key") " "
       (:KEYWORD NIL " &allow-other-keys"))
      (:VALUES NIL "instance"))
     " " (:ENDISSUE NIL "CHANGE-CLASS-INITARGS:PERMIT") " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:ISSUE NIL "CHANGE-CLASS-INITARGS:PERMIT") " "
     (:DEF (:KIND "method") (:NAMES NIL "change-class")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "instance") " "
        (:TYPEREF NIL "standard-object"))
       " "
       (:PAREN NIL (:PARAM NIL "new-class") " "
        (:TYPEREF NIL "standard-class"))
       " " (:KEYWORD NIL " &rest") " initargs"))
     " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "change-class")
      (:ARGLIST NIL (:PAREN NIL (:PARAM NIL "instance") " " (:TYPEREF NIL "t"))
       " " (:PAREN NIL (:PARAM NIL "new-class") " " (:TYPEREF NIL "symbol"))
       " " (:KEYWORD NIL " &rest") " initargs"))
     " " (:ENDISSUE NIL "CHANGE-CLASS-INITARGS:PERMIT") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "instance")
     "—an " (:TERM NIL "object") ". " :PAR (:PARAM NIL "new-class") "—a "
     (:TERM NIL "class designator") ". " :PAR
     (:ISSUE NIL "CHANGE-CLASS-INITARGS:PERMIT") " " (:PARAM NIL "initargs")
     "—an " (:TERM NIL "initialization argument list") ". "
     (:ENDISSUE NIL "CHANGE-CLASS-INITARGS:PERMIT") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "generic function")
     " " (:FUNREF NIL "change-class") " changes the " (:TERM NIL "class")
     " of an " (:PARAM NIL "instance") " to " (:PARAM NIL "new-class")
     ". It destructively modifies and returns the " (:PARAM NIL "instance")
     ". " :PAR "If in the old " (:TERM NIL "class") " there is any "
     (:TERM NIL "slot") " of the same name as a local " (:TERM NIL "slot")
     " in the " (:PARAM NIL "new-class") ", the value of that "
     (:TERM NIL "slot") " is retained. This means that if the "
     (:TERM NIL "slot") " has a value, the value returned by "
     (:FUNREF NIL "slot-value") " after " (:FUNREF NIL "change-class")
     " is invoked is " (:FUNREF NIL "eql") " to the value returned by "
     (:FUNREF NIL "slot-value") " before " (:FUNREF NIL "change-class")
     " is invoked. Similarly, if the " (:TERM NIL "slot")
     " was unbound, it remains unbound. The other " (:TERM NIL "slots")
     " are initialized as described in " (:SECREF NIL :CHANGING-INSTANCE-CLASS)
     ". " :PAR "After completing all other actions, "
     (:FUNREF NIL "change-class") " invokes "
     (:FUNREF NIL "update-instance-for-different-class")
     ". The generic function "
     (:FUNREF NIL "update-instance-for-different-class")
     " can be used to assign values to slots in the transformed instance. "
     (:ISSUE NIL "CHANGE-CLASS-INITARGS:PERMIT") " See "
     (:SECREF NIL :INIT-NEW-LOCAL-SLOTS) ". "
     (:ENDISSUE NIL "CHANGE-CLASS-INITARGS:PERMIT") " " :PAR
     (:ISSUE NIL "CHANGE-CLASS-INITARGS:PERMIT") " If the second of the above "
     (:TERM NIL "methods") " is selected, that " (:TERM NIL "method")
     " invokes " (:FUNREF NIL "change-class") " on " (:PARAM NIL "instance")
     ", " (:TT NIL "(find-class " (:PARAM NIL "new-class") ")") ", and the "
     (:PARAM NIL "initargs") ". "
     (:ENDISSUE NIL "CHANGE-CLASS-INITARGS:PERMIT") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " 
 (defclass position () ())
  
 (defclass x-y-position (position)
     ((x :initform 0 :initarg :x)
      (y :initform 0 :initarg :y)))
  
 (defclass rho-theta-position (position)
     ((rho :initform 0)
      (theta :initform 0)))
  
 (defmethod update-instance-for-different-class :before ((old x-y-position) 
                                                         (new rho-theta-position)
                                                         &key)
   ;; Copy the position information from old to new to make new
   ;; be a rho-theta-position at the same position as old.
   (let ((x (slot-value old 'x))
         (y (slot-value old 'y)))
     (setf (slot-value new 'rho) (sqrt (+ (* x x) (* y y)))
           (slot-value new 'theta) (atan y x))))
  
;;; At this point an instance of the class x-y-position can be
;;; changed to be an instance of the class rho-theta-position using
;;; change-class:
 
 (setq p1 (make-instance 'x-y-position :x 2 :y 0))
  
 (change-class p1 'rho-theta-position)
  
;;; The result is that the instance bound to p1 is now an instance of
;;; the class rho-theta-position.   The update-instance-for-different-class
;;; method performed the initialization of the rho and theta slots based
;;; on the value of the x and y slots, which were maintained by
;;; the old instance.
 
")
     " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:FUNREF NIL "update-instance-for-different-class") ", "
     (:SECREF NIL :CHANGING-INSTANCE-CLASS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The generic function "
     (:FUNREF NIL "change-class")
     " has several semantic difficulties. First, it performs a destructive operation that can be invoked within a "
     (:TERM NIL "method") " on an " (:TERM NIL "instance")
     " that was used to select that " (:TERM NIL "method") ". When multiple "
     (:TERM NIL "methods") " are involved because " (:TERM NIL "methods")
     " are being combined, the " (:TERM NIL "methods")
     " currently executing or about to be executed may no longer be applicable. Second, some implementations might use compiler optimizations of slot "
     (:TERM NIL "access") ", and when the " (:TERM NIL "class") " of an "
     (:TERM NIL "instance")
     " is changed the assumptions the compiler made might be violated. This implies that a programmer must not use "
     (:FUNREF NIL "change-class") " inside a " (:TERM NIL "method") " if any "
     (:TERM NIL "methods") " for that " (:TERM NIL "generic function") " "
     (:TERM NIL "access") " any " (:TERM NIL "slots")
     ", or the results are undefined. " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SLOT-BOUNDP")
   (:COM (:NAME "slot-boundp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "slot-boundp")
      (:ARGLIST NIL "instance slot-name") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "instance")
     "—an " (:TERM NIL "object") ". " :PAR (:PARAM NIL "slot-name") "—a "
     (:TERM NIL "symbol") " naming a " (:TERM NIL "slot") " of "
     (:PARAM NIL "instance") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns " (:TERM NIL "true")
     " if the " (:TERM NIL "slot") " named " (:PARAM NIL "slot-name") " in "
     (:PARAM NIL "instance") " is bound; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If no "
     (:TERM NIL "slot") " of the " (:TERM NIL "name") " "
     (:PARAM NIL "slot-name") " exists in the " (:PARAM NIL "instance") ", "
     (:FUNREF NIL "slot-missing") " is called as follows: " :PAR
     (:CODE NIL " (slot-missing (class-of " (:I NIL "instance") ")
               "
      (:I NIL "instance") "
               "
      (:I NIL "slot-name") "
               'slot-boundp)
")
     " " :PAR (:ISSUE NIL "SLOT-MISSING-VALUES:SPECIFY") " (If "
     (:FUNREF NIL "slot-missing") " is invoked and returns a value, a "
     (:TERM NIL "boolean equivalent") " to its " (:TERM NIL "primary value")
     " is returned by " (:FUNREF NIL "slot-boundp") ".) "
     (:ENDISSUE NIL "SLOT-MISSING-VALUES:SPECIFY") " " :PAR
     (:ISSUE NIL "SLOT-VALUE-METACLASSES:LESS-MINIMAL")
     " The specific behavior depends on " (:PARAM NIL "instance") "'s "
     (:TERM NIL "metaclass") ". An error is never signaled if "
     (:PARAM NIL "instance") " has " (:TERM NIL "metaclass") " "
     (:TYPEREF NIL "standard-class") ". An error is always signaled if "
     (:PARAM NIL "instance") " has " (:TERM NIL "metaclass") " "
     (:TYPEREF NIL "built-in-class") ". The consequences are undefined if "
     (:PARAM NIL "instance") " has any other " (:TERM NIL "metaclass")
     "–an error might or might not be signaled in this situation. Note in particular that the behavior for "
     (:TERM NIL "conditions") " and " (:TERM NIL "structures")
     " is not specified. "
     (:ENDISSUE NIL "SLOT-VALUE-METACLASSES:LESS-MINIMAL") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "slot-makunbound") ", "
     (:FUNREF NIL "slot-missing") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "slot-boundp") " allows for writing "
     (:TERM NIL "after methods") " on " (:FUNREF NIL "initialize-instance")
     " in order to initialize only those " (:TERM NIL "slots")
     " that have not already been bound. " :PAR
     (:ISSUE NIL "SLOT-VALUE-METACLASSES:LESS-MINIMAL") " Although no "
     (:TERM NIL "implementation")
     " is required to do so, implementors are strongly encouraged to implement the "
     (:TERM NIL "function") " " (:FUNREF NIL "slot-boundp") " using the "
     (:TERM NIL "function") " " (:TT NIL "slot-boundp-using-class")
     " described in the " (:TERM NIL "Metaobject Protocol") ". "
     (:ENDISSUE NIL "SLOT-VALUE-METACLASSES:LESS-MINIMAL") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SLOT-EXISTS-P")
   (:COM (:NAME "slot-exists-p" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "slot-exists-p")
      (:ARGLIST NIL "object slot-name") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "SLOT-VALUE-METACLASSES:LESS-MINIMAL") " "
     (:PARAM NIL "object") "—an " (:TERM NIL "object") ". "
     (:ENDISSUE NIL "SLOT-VALUE-METACLASSES:LESS-MINIMAL") " " :PAR
     (:PARAM NIL "slot-name") "—a " (:TERM NIL "symbol") ". " :PAR
     (:PARAM NIL "generalized-boolean") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL
      " \\Thefunction{slot-exists-p} tests whether the \\param{object} has"
      " a \\term{slot} of the given \\term{name}.")
     :PAR "Returns " (:TERM NIL "true") " if the " (:PARAM NIL "object")
     " has a " (:TERM NIL "slot") " named " (:PARAM NIL "slot-name") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:MACREF NIL "defclass") ", "
     (:MACREF NIL "defstruct") " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defclass") ", "
     (:FUNREF NIL "slot-missing") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:ISSUE NIL "SLOT-VALUE-METACLASSES:LESS-MINIMAL") " Although no "
     (:TERM NIL "implementation")
     " is required to do so, implementors are strongly encouraged to implement the "
     (:TERM NIL "function") " " (:FUNREF NIL "slot-exists-p") " using the "
     (:TERM NIL "function") " " (:TT NIL "slot-exists-p-using-class")
     " described in the " (:TERM NIL "Metaobject Protocol") ". "
     (:ENDISSUE NIL "SLOT-VALUE-METACLASSES:LESS-MINIMAL") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SLOT-MAKUNBOUND")
   (:COM (:NAME "slot-makunbound" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "slot-makunbound")
      (:ARGLIST NIL "instance slot-name") (:VALUES NIL "instance"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "instance")
     "—instance. " :PAR (:PARAM NIL "slot-name") "—a " (:TERM NIL "symbol")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "slot-makunbound") " restores a " (:TERM NIL "slot")
     " of the name " (:PARAM NIL "slot-name") " in an " (:PARAM NIL "instance")
     " to the unbound state. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If no "
     (:TERM NIL "slot") " of the name " (:PARAM NIL "slot-name")
     " exists in the " (:PARAM NIL "instance") ", "
     (:FUNREF NIL "slot-missing") " is called as follows: " :PAR
     (:CODE NIL "(slot-missing (class-of " (:I NIL "instance") ")
              "
      (:I NIL "instance") "
              "
      (:I NIL "slot-name") "
              'slot-makunbound)
")
     " " :PAR (:ISSUE NIL "SLOT-MISSING-VALUES:SPECIFY")
     " (Any values returned by " (:FUNREF NIL "slot-missing")
     " in this case are ignored by " (:FUNREF NIL "slot-makunbound") ".) "
     (:ENDISSUE NIL "SLOT-MISSING-VALUES:SPECIFY") " " :PAR
     (:ISSUE NIL "SLOT-VALUE-METACLASSES:LESS-MINIMAL")
     " The specific behavior depends on " (:PARAM NIL "instance") "'s "
     (:TERM NIL "metaclass") ". An error is never signaled if "
     (:PARAM NIL "instance") " has " (:TERM NIL "metaclass") " "
     (:TYPEREF NIL "standard-class") ". An error is always signaled if "
     (:PARAM NIL "instance") " has " (:TERM NIL "metaclass") " "
     (:TYPEREF NIL "built-in-class") ". The consequences are undefined if "
     (:PARAM NIL "instance") " has any other " (:TERM NIL "metaclass")
     "–an error might or might not be signaled in this situation. Note in particular that the behavior for "
     (:TERM NIL "conditions") " and " (:TERM NIL "structures")
     " is not specified. "
     (:ENDISSUE NIL "SLOT-VALUE-METACLASSES:LESS-MINIMAL") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "slot-boundp") ", "
     (:FUNREF NIL "slot-missing") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:ISSUE NIL "SLOT-VALUE-METACLASSES:LESS-MINIMAL") " Although no "
     (:TERM NIL "implementation")
     " is required to do so, implementors are strongly encouraged to implement the "
     (:TERM NIL "function") " " (:FUNREF NIL "slot-makunbound") " using the "
     (:TERM NIL "function") " " (:TT NIL "slot-makunbound-using-class")
     " described in the " (:TERM NIL "Metaobject Protocol") ". "
     (:ENDISSUE NIL "SLOT-VALUE-METACLASSES:LESS-MINIMAL") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SLOT-MISSING")
   (:COM (:NAME "slot-missing" :FTYPE "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "generic-function") (:NAMES NIL "slot-missing")
      (:ARGLIST NIL "class object slot-name operation "
       (:KEYWORD NIL " &optional") " new-value")
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "slot-missing")
      (:ARGLIST NIL (:PAREN NIL (:PARAM NIL "class") " " (:TYPEREF NIL "t"))
       " object slot-name operation " (:KEYWORD NIL " &optional")
       " new-value"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "class") "—the "
     (:TERM NIL "class") " of " (:PARAM NIL "object") ". " :PAR
     (:PARAM NIL "object") "—an " (:TERM NIL "object") ". " :PAR
     (:PARAM NIL "slot-name") "—a " (:TERM NIL "symbol") " (the "
     (:TERM NIL "name") " of a would-be " (:TERM NIL "slot") "). " :PAR
     (:PARAM NIL "operation") "—one of the " (:TERM NIL "symbols") " "
     (:FUNREF NIL "setf") ", " (:FUNREF NIL "slot-boundp") ", "
     (:FUNREF NIL "slot-makunbound") ", or " (:FUNREF NIL "slot-value") ". "
     :PAR (:PARAM NIL "new-value") "—an " (:TERM NIL "object") ". " :PAR
     (:PARAM NIL "result") "—an " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The generic function "
     (:FUNREF NIL "slot-missing") " is invoked when an attempt is made to "
     (:TERM NIL "access") " a " (:TERM NIL "slot") " in an "
     (:PARAM NIL "object") " whose " (:TERM NIL "metaclass") " is "
     (:TYPEREF NIL "standard-class") " and the " (:TERM NIL "slot")
     " of the name " (:PARAM NIL "slot-name") " is not a " (:TERM NIL "name")
     " of a " (:TERM NIL "slot") " in that " (:TERM NIL "class")
     ". The default " (:TERM NIL "method") " signals an error. " :PAR
     "The generic function " (:FUNREF NIL "slot-missing")
     " is not intended to be called by programmers. Programmers may write "
     (:TERM NIL "methods") " for it. " :PAR "The generic function "
     (:FUNREF NIL "slot-missing") " may be called during evaluation of "
     (:FUNREF NIL "slot-value") ", " (:TT NIL "(setf slot-value)") ", "
     (:FUNREF NIL "slot-boundp") ", and " (:FUNREF NIL "slot-makunbound")
     ". For each of these operations the corresponding " (:TERM NIL "symbol")
     " for the " (:PARAM NIL "operation") " argument is "
     (:MISC NIL "slot-value") ", " (:MISC NIL "setf") ", "
     (:MISC NIL "slot-boundp") ", and " (:MISC NIL "slot-makunbound")
     " respectively. " :PAR "The optional " (:PARAM NIL "new-value")
     " argument to " (:FUNREF NIL "slot-missing")
     " is used when the operation is attempting to set the value of the "
     (:TERM NIL "slot") ". " :PAR (:ISSUE NIL "SLOT-MISSING-VALUES:SPECIFY")
     " If " (:FUNREF NIL "slot-missing")
     " returns, its values will be treated as follows: " :PAR
     (:LIST NIL
      (:ITEM NIL " If the " (:PARAM NIL "operation") " is " (:MISC NIL "setf")
       " or " (:MISC NIL "slot-makunbound") ", any " (:TERM NIL "values")
       " will be ignored by the caller. " :PAR)
      (:ITEM NIL " If the " (:PARAM NIL "operation") " is "
       (:MISC NIL "slot-value") ", only the " (:TERM NIL "primary value")
       " will be used by the caller, and all other values will be ignored. "
       :PAR)
      (:ITEM NIL " If the " (:PARAM NIL "operation") " is "
       (:MISC NIL "slot-boundp") ", any " (:TERM NIL "boolean equivalent")
       " of the " (:TERM NIL "primary value") " of the " (:TERM NIL "method")
       " might be is used, and all other values will be ignored. "))
     " " (:ENDISSUE NIL "SLOT-MISSING-VALUES:SPECIFY") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "The default "
     (:TERM NIL "method") " on " (:FUNREF NIL "slot-missing")
     " signals an error of " (:TERM NIL "type") " " (:TYPEREF NIL "error") ". "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defclass") ", "
     (:FUNREF NIL "slot-exists-p") ", " (:FUNREF NIL "slot-value") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The set of arguments (including the "
     (:TERM NIL "class")
     " of the instance) facilitates defining methods on the metaclass for "
     (:FUNREF NIL "slot-missing") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SLOT-UNBOUND")
   (:COM (:NAME "slot-unbound" :FTYPE "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "generic-function") (:NAMES NIL "slot-unbound")
      (:ARGLIST NIL "class instance slot-name")
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "slot-unbound")
      (:ARGLIST NIL (:PAREN NIL (:PARAM NIL "class") " " (:TYPEREF NIL "t"))
       " instance slot-name"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "class") "—the "
     (:TERM NIL "class") " of the " (:PARAM NIL "instance") ". " :PAR
     (:PARAM NIL "instance") "—the " (:PARAM NIL "instance")
     " in which an attempt was made to " (:TERM NIL "read") " the "
     (:TERM NIL "unbound") " " (:TERM NIL "slot") ". " :PAR
     (:PARAM NIL "slot-name") "—the " (:TERM NIL "name") " of the "
     (:TERM NIL "unbound") " " (:TERM NIL "slot") ". " :PAR
     (:PARAM NIL "result") "—an " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The generic function "
     (:FUNREF NIL "slot-unbound") " is called when an unbound "
     (:TERM NIL "slot") " is read in an " (:PARAM NIL "instance")
     " whose metaclass is " (:TYPEREF NIL "standard-class") ". The default "
     (:TERM NIL "method") " signals an error "
     (:ISSUE NIL "UNDEFINED-VARIABLES-AND-FUNCTIONS:COMPROMISE") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "unbound-slot")
     ". The name slot of the " (:TYPEREF NIL "unbound-slot") " "
     (:TERM NIL "condition")
     " is initialized to the name of the offending variable, and the instance slot of the "
     (:TYPEREF NIL "unbound-slot") " " (:TERM NIL "condition")
     " is initialized to the offending instance. "
     (:ENDISSUE NIL "UNDEFINED-VARIABLES-AND-FUNCTIONS:COMPROMISE") " " :PAR
     "The generic function " (:FUNREF NIL "slot-unbound")
     " is not intended to be called by programmers. Programmers may write "
     (:TERM NIL "methods") " for it. The " (:TERM NIL "function") " "
     (:FUNREF NIL "slot-unbound") " is called only "
     (:COMMENT NIL "%Looks like metaobjects to me. -kmp 15-Jan-91"
      "by \\thefunction{slot-value-using-class} and thus ")
     "indirectly by " (:FUNREF NIL "slot-value") ". " :PAR
     (:ISSUE NIL "SLOT-MISSING-VALUES:SPECIFY") " "
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"
      " If \\funref{slot-unbound} returns, its values will be treated as follows:"
      " " " \\beginlist" " \\item{\\bull}"
      " If the \\param{operation} is \\misc{setf} or \\misc{slot-makunbound},"
      " any \\term{values} will be ignored by the caller." " "
      " \\item{\\bull}" " If the \\param{operation} is \\misc{slot-value},"
      " only the \\term{primary value} will be used by the caller,"
      " and all other values will be ignored." " " " \\item{\\bull}"
      " If the \\param{operation} is \\misc{slot-boundp},"
      " any \\term{boolean equivalent} of the \\term{primary value}"
      " of the \\term{method} might be is used,"
      " and all other values will be ignored." " \\endlist")
     "If " (:FUNREF NIL "slot-unbound") " returns, only the "
     (:TERM NIL "primary value")
     " will be used by the caller, and all other values will be ignored. "
     (:ENDISSUE NIL "SLOT-MISSING-VALUES:SPECIFY") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " "
     (:ISSUE NIL "UNDEFINED-VARIABLES-AND-FUNCTIONS:COMPROMISE")
     " The default " (:TERM NIL "method") " on " (:FUNREF NIL "slot-unbound")
     " signals an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "unbound-slot") ". "
     (:ENDISSUE NIL "UNDEFINED-VARIABLES-AND-FUNCTIONS:COMPROMISE") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "slot-makunbound") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR "An unbound " (:TERM NIL "slot")
     " may occur if no " (:KWD NIL "initform") " form was specified for the "
     (:TERM NIL "slot") " and the " (:TERM NIL "slot")
     " value has not been set, or if " (:FUNREF NIL "slot-makunbound")
     " has been called on the " (:TERM NIL "slot") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SLOT-VALUE")
   (:COM (:NAME "slot-value" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "slot-value")
      (:ARGLIST NIL "object slot-name") (:VALUES NIL "value"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "slot-name") "—a "
     (:TERM NIL "symbol") ". " :PAR (:PARAM NIL "value") "—an "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "slot-value") " returns the " (:TERM NIL "value") " of the "
     (:TERM NIL "slot") " named " (:PARAM NIL "slot-name") " in the "
     (:PARAM NIL "object") ". If there is no " (:TERM NIL "slot") " named "
     (:PARAM NIL "slot-name") ", " (:FUNREF NIL "slot-missing")
     " is called. If the " (:TERM NIL "slot") " is unbound, "
     (:FUNREF NIL "slot-unbound") " is called. " :PAR
     (:COMMENT NIL
      "!!! Reflect this in the Syntax above? Or is (SETF SLOT-VALUE) described somewhere?")
     "The macro " (:MACREF NIL "setf") " can be used with "
     (:FUNREF NIL "slot-value") " to change the value of a " (:TERM NIL "slot")
     ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defclass foo () 
   ((a :accessor foo-a :initarg :a :initform 1)
    (b :accessor foo-b :initarg :b)
    (c :accessor foo-c :initform 3)))
→ #<STANDARD-CLASS FOO 244020371>
 (setq foo1 (make-instance 'foo :a 'one :b 'two))
→ #<FOO 36325624>
 (slot-value foo1 'a) → ONE
 (slot-value foo1 'b) → TWO
 (slot-value foo1 'c) → 3
 (setf (slot-value foo1 'a) 'uno) → UNO
 (slot-value foo1 'a) → UNO
 (defmethod foo-method ((x foo))
   (slot-value x 'a))
→ #<STANDARD-METHOD FOO-METHOD (FOO) 42720573>
 (foo-method foo1) → UNO
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "If an attempt is made to read a " (:TERM NIL "slot") " and no "
     (:TERM NIL "slot") " of the name " (:PARAM NIL "slot-name")
     " exists in the " (:PARAM NIL "object") ", " (:FUNREF NIL "slot-missing")
     " is called as follows: " :PAR
     (:CODE NIL " (slot-missing (class-of " (:I NIL "instance") ")
               "
      (:I NIL "instance") "
               "
      (:I NIL "slot-name") "
               'slot-value)
")
     " " :PAR (:ISSUE NIL "SLOT-MISSING-VALUES:SPECIFY") " (If "
     (:FUNREF NIL "slot-missing") " is invoked, its "
     (:TERM NIL "primary value") " is returned by " (:FUNREF NIL "slot-value")
     ".) " (:ENDISSUE NIL "SLOT-MISSING-VALUES:SPECIFY") " " :PAR
     "If an attempt is made to write a " (:TERM NIL "slot") " and no "
     (:TERM NIL "slot") " of the name " (:PARAM NIL "slot-name")
     " exists in the " (:PARAM NIL "object") ", " (:FUNREF NIL "slot-missing")
     " is called as follows: " :PAR
     (:CODE NIL " (slot-missing (class-of " (:I NIL "instance") ")
               "
      (:I NIL "instance") "
               "
      (:I NIL "slot-name") "
               'setf
               "
      (:I NIL "new-value") ")
")
     " " :PAR (:ISSUE NIL "SLOT-MISSING-VALUES:SPECIFY") " (If "
     (:FUNREF NIL "slot-missing") " returns in this case, any "
     (:TERM NIL "values") " are ignored.) "
     (:ENDISSUE NIL "SLOT-MISSING-VALUES:SPECIFY") " " :PAR
     (:ISSUE NIL "SLOT-VALUE-METACLASSES:LESS-MINIMAL")
     " The specific behavior depends on " (:PARAM NIL "object") "'s "
     (:TERM NIL "metaclass") ". An error is never signaled if "
     (:PARAM NIL "object") " has " (:TERM NIL "metaclass") " "
     (:TYPEREF NIL "standard-class") ". An error is always signaled if "
     (:PARAM NIL "object") " has " (:TERM NIL "metaclass") " "
     (:TYPEREF NIL "built-in-class") ". The consequences are "
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93" "undefined") "unspecified if "
     (:PARAM NIL "object") " has any other " (:TERM NIL "metaclass")
     "–an error might or might not be signaled in this situation. Note in particular that the behavior for "
     (:TERM NIL "conditions") " and " (:TERM NIL "structures")
     " is not specified. "
     (:ENDISSUE NIL "SLOT-VALUE-METACLASSES:LESS-MINIMAL") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "slot-missing") ", "
     (:FUNREF NIL "slot-unbound") ", " (:MACREF NIL "with-slots") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:ISSUE NIL "SLOT-VALUE-METACLASSES:LESS-MINIMAL") " Although no "
     (:TERM NIL "implementation")
     " is required to do so, implementors are strongly encouraged to implement the "
     (:TERM NIL "function") " " (:FUNREF NIL "slot-value") " using the "
     (:TERM NIL "function") " " (:TT NIL "slot-value-using-class")
     " described in the " (:TERM NIL "Metaobject Protocol") ". "
     (:ENDISSUE NIL "SLOT-VALUE-METACLASSES:LESS-MINIMAL") " " :PAR
     "Implementations may optimize " (:FUNREF NIL "slot-value")
     " by compiling it inline. " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== METHOD-QUALIFIERS")
   (:COM (:NAME "method-qualifiers" :FTYPE "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "generic-function") (:NAMES NIL "method-qualifiers")
      (:ARGLIST NIL "method") (:VALUES NIL "qualifiers"))
     " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "method-qualifiers")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "method") " "
        (:TYPEREF NIL "standard-method"))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "method") "—a "
     (:TERM NIL "method") ". " :PAR (:PARAM NIL "qualifiers") "—a "
     (:TERM NIL "proper list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns a " (:TERM NIL "list")
     " of the " (:TERM NIL "qualifiers") " of the " (:PARAM NIL "method") ". "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defmethod some-gf :before ((a integer)) a)
→ #<STANDARD-METHOD SOME-GF (:BEFORE) (INTEGER) 42736540>
 (method-qualifiers *) → (:BEFORE)
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:MACREF NIL "define-method-combination") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== NO-APPLICABLE-METHOD")
   (:COM (:NAME "no-applicable-method" :FTYPE "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "generic-function") (:NAMES NIL "no-applicable-method")
      (:ARGLIST NIL "generic-function " (:KEYWORD NIL " &rest")
       " function-arguments")
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "no-applicable-method")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "generic-function") " " (:TYPEREF NIL "t")) " "
       (:KEYWORD NIL " &rest") " function-arguments"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL
      "!!! But the signature above says T, not STANDARD-GENERIC-FUNCTION ...? -kmp 9-May-91")
     (:PARAM NIL "generic-function") "—a " (:TERM NIL "generic function") " "
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"
      "			   of the class \\typeref{standard-generic-function}")
     "on which no " (:TERM NIL "applicable method") " was found. " :PAR
     (:PARAM NIL "function-arguments") "—" (:TERM NIL "arguments") " to the "
     (:PARAM NIL "generic-function") ". " :PAR (:PARAM NIL "result") "—an "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The generic function "
     (:FUNREF NIL "no-applicable-method") " is called when a "
     (:TERM NIL "generic function") " "
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"
      "of \\theclass{standard-generic-function} ")
     "is invoked and no " (:TERM NIL "method") " on that "
     (:TERM NIL "generic function") " is applicable. "
     (:COMMENT NIL
      " \"default \\term{method}\" => \"\\term{default method}\" per X3J13. -kmp 05-Oct-93")
     "The " (:TERM NIL "default method") " signals an error. " :PAR
     "The generic function " (:FUNREF NIL "no-applicable-method")
     " is not intended to be called by programmers. Programmers may write "
     (:TERM NIL "methods") " for it. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "The default "
     (:TERM NIL "method") " signals an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== NO-NEXT-METHOD")
   (:COM (:NAME "no-next-method" :FTYPE "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "generic-function") (:NAMES NIL "no-next-method")
      (:ARGLIST NIL "generic-function method " (:KEYWORD NIL " &rest") " args")
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "no-next-method")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "generic-function") " "
        (:TYPEREF NIL "standard-generic-function"))
       " "
       (:PAREN NIL (:PARAM NIL "method") " " (:TYPEREF NIL "standard-method"))
       " " (:KEYWORD NIL " &rest") " args"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "generic-function") "—" (:TERM NIL "generic function")
     " to which " (:PARAM NIL "method") " belongs. " :PAR (:PARAM NIL "method")
     "—" (:TERM NIL "method") " that contained the call to "
     (:FUNREF NIL "call-next-method") " for which there is no next "
     (:TERM NIL "method") ". " :PAR (:PARAM NIL "args") "—arguments to "
     (:FUNREF NIL "call-next-method") ". " :PAR (:PARAM NIL "result") "—an "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "generic function")
     " " (:FUNREF NIL "no-next-method") " is called by "
     (:FUNREF NIL "call-next-method") " when there is no "
     (:TERM NIL "next method") ". " :PAR "The " (:TERM NIL "generic function")
     " " (:FUNREF NIL "no-next-method")
     " is not intended to be called by programmers. Programmers may write "
     (:TERM NIL "methods") " for it. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "The system-supplied "
     (:TERM NIL "method") " on " (:FUNREF NIL "no-next-method")
     " signals an error of " (:TERM NIL "type") " " (:TYPEREF NIL "error") ". "
     (:EDITORNOTE NIL "KMP: perhaps control-error??") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "call-next-method") " "
     :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== REMOVE-METHOD")
   (:COM (:NAME "remove-method" :FTYPE "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "generic-function") (:NAMES NIL "remove-method")
      (:ARGLIST NIL "generic-function method")
      (:VALUES NIL "generic-function"))
     " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "remove-method")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "generic-function") " "
        (:TYPEREF NIL "standard-generic-function"))
       " method"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "generic-function") "—a " (:TERM NIL "generic function") ". "
     :PAR (:PARAM NIL "method") "—a " (:TERM NIL "method") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "generic function")
     " " (:FUNREF NIL "remove-method") " removes a " (:TERM NIL "method")
     " from " (:PARAM NIL "generic-function") " by modifying the "
     (:PARAM NIL "generic-function") " (if necessary). " :PAR
     (:FUNREF NIL "remove-method") " must not signal an error if the "
     (:TERM NIL "method") " is not one of the " (:TERM NIL "methods")
     " on the " (:PARAM NIL "generic-function") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "find-method") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:ISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " "
   (:COMMENT NIL " %%% ========== GENERIC-FLET"
    " %%% ========== GENERIC-LABELS" " "
    " \\begincom{generic-flet, generic-labels}\\ftype{Special Operator}" "  "
    " \\label Syntax::" "  " " \\DefspecWithValuesNewline generic-flet"
    "        {\\vtop{\\hbox{\\paren{\\starparen{function-name "
    " 			   	      lambda-list"
    "                                       \\interleave{\\down{option} |"
    "                                                   \\stardown{method-description}}}}}"
    "               \\hbox{\\starparam{form}}}}"
    "        {\\starparam{result}}" " "
    " \\DefspecWithValuesNewline generic-labels"
    "        {\\vtop{\\hbox{\\paren{\\starparen{function-name "
    " 			   	      lambda-list"
    "                                       \\interleave{\\down{option} |"
    "                                                   \\stardown{method-description}}}}}"
    "               \\hbox{\\starparam{form}}}}"
    "        {\\starparam{result}}" " " " {\\GFauxOptionsAndMethDesc}" "  "
    " \\label Arguments and Values::" "  "
    " \\editornote{KMP: Treatment of documentation?}%!!!" " "
    " \\param{function-name}, \\param{lambda-list}, \\param{option}, \\param{method-qualifier},"
    " \\param{specialized-lambda-list}---the same as for \\macref{defgeneric}."
    " " " \\param{method-definition}---the same as for \\macref{defmethod}."
    "  " " \\param{forms}---an \\term{implicit progn}." " "
    " \\param{results}---the \\term{values} returned by the \\param{forms}."
    "  " " \\label Description::" "  "
    " \\Thespecop{generic-flet} is analogous to \\thespecop{flet}, and"
    " \\thespecop{generic-labels} is analogous to \\thespecop{labels}." " "
    " The \\term{forms} are \\term{evaluated} in a \\term{lexical environment}"
    " in which \\term{function} \\term{bindings} for the \\param{function-names} have"
    " been \\term{established}."
    " The \\term{value} of each \\term{binding} is a \\term{fresh} \\term{generic function},"
    " with \\term{methods} as specified by the corresponding \\param{method-description}."
    " The \\term{bindings} of the \\term{function-names} have \\term{lexical scope}, "
    " and the \\term{generic functions} (and their \\term{methods}) have \\term{indefinite extent}."
    " " " For \\specref{generic-flet},"
    " the \\term{scope} of the \\term{bindings} for the \\param{function-names}"
    " includes only the \\param{forms},"
    " not the bodies of the local definitions of the \\term{methods}."
    " Within the method bodies, references to any of the \\param{function-names}"
    " refer to global \\term{functions} with coincidentally similar names,"
    " not to the \\term{generic functions} established for use by the \\param{forms}."
    " It is thus not possible to define recursive \\term{functions} "
    " with \\specref{generic-flet}." "  " " For \\specref{generic-labels},"
    " the \\term{scope} of the \\term{bindings} for the \\param{function-names}"
    " includes the entire \\specref{generic-labels} \\term{form},"
    " including not only the \\param{forms}, "
    " but also the bodies of the local definitions of the \\term{methods}."
    " It is thus possible to define recursive \\term{functions} "
    " with \\specref{generic-labels}." " "
    " The body of each \\term{method} is enclosed in an \\term{implicit block}.  "
    " If \\param{function-name} is a \\term{symbol}, "
    " the \\term{implicit block} has that \\term{name}."
    " If \\param{function-name} is a \\term{list} of the form \\f{(setf \\param{sym})},"
    " the \\term{name} of the \\term{implicit block} is \\param{sym}." "  "
    " \\label Examples:\\None." " " " \\label Affected By:\\None." "  "
    " \\label Exceptional Situations:\\None." "  " " \\label See Also::" " "
    " \\specref{flet}, " " \\specref{labels}, " " \\macref{defmethod},"
    " \\macref{defgeneric}," " \\macref{generic-function}" "  "
    " \\label Notes:\\None." "  " " \\endcom" " " " "
    " %%% ========== GENERIC-FUNCTION"
    " \\begincom{generic-function}\\ftype{Macro}" "  " " \\label Syntax::" "  "
    " \\DefmacWithValues generic-function"
    " 		  {lambda-list \\interleave{\\down{option} | \\starparam{method-description}}}"
    " 		  {generic-function}" " " " {\\GFauxOptionsAndMethDesc}" " "
    " \\label Arguments and Values::" "  "
    " \\editornote{KMP: Treatment of documentation?}%!!!" " "
    " \\param{Option}, \\param{method-qualifier}, "
    " and \\param{specialized-lambda-list} are the same as for"
    " \\macref{defgeneric}." "  "
    " \\param{generic-function}---a \\term{generic function} \\term{object}."
    "  " " \\label Description::" "  "
    " Creates an \\term{anonymous} \\term{generic function} with the"
    " set of \\term{methods} specified by its \\param{method-descriptions}."
    "  " " %%I don't think this is really needed. -kmp 15-Jan-91"
    " % If no \\param{method-descriptions} are supplied,"
    " % an \\term{anonymous} \\term{generic function} with no \\term{methods} is created."
    "  " " \\label Examples:\\None." " " " \\label Affected By:\\None." "  "
    " \\label Exceptional Situations:\\None." "  " " \\label See Also::" "  "
    " \\macref{defgeneric}," " \\specref{generic-flet},"
    " \\specref{generic-labels}," " \\macref{defmethod}" "  "
    " \\label Notes:\\None." "  " " \\endcom")
   (:ENDISSUE NIL "GENERIC-FLET-POORLY-DESIGNED:DELETE") " " :PAR
   (:COMMENT NIL "%% ========== MAKE-INSTANCE")
   (:COM (:NAME "make-instance" :FTYPE "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " "
     (:DEF (:KIND "generic-function") (:NAMES NIL "make-instance")
      (:ARGLIST NIL "class " (:KEYWORD NIL " &rest") " initargs "
       (:KEYWORD NIL " &key") " " (:KEYWORD NIL " &allow-other-keys"))
      (:VALUES NIL "instance"))
     " " (:ENDISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "make-instance")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "class") " " (:TYPEREF NIL "standard-class"))
       " " (:KEYWORD NIL " &rest") " initargs"))
     " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "make-instance")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "class") " " (:TYPEREF NIL "symbol")) " "
       (:KEYWORD NIL " &rest") " initargs"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL "!!! I'd rather this were called class-name. -kmp 15-Jan-91"
      "!!! Or maybe class designator? -kmp 18-Feb-91")
     (:PARAM NIL "class") "—a " (:TERM NIL "class") ", or a "
     (:TERM NIL "symbol") " that names a " (:TERM NIL "class") ". " :PAR
     (:PARAM NIL "initargs") "—an " (:TERM NIL "initialization argument list")
     ". " :PAR (:PARAM NIL "instance") "—a " (:TERM NIL "fresh") " "
     (:TERM NIL "instance") " of " (:TERM NIL "class") " " (:PARAM NIL "class")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "generic function")
     " " (:FUNREF NIL "make-instance") " creates and returns a new "
     (:TERM NIL "instance") " of the given " (:PARAM NIL "class") ". " :PAR
     "If the second of the above " (:TERM NIL "methods") " is selected, that "
     (:TERM NIL "method") " invokes " (:FUNREF NIL "make-instance")
     " on the arguments " (:TT NIL "(find-class " (:PARAM NIL "class") ")")
     " and " (:PARAM NIL "initargs") ". " :PAR
     "The initialization arguments are checked within "
     (:FUNREF NIL "make-instance") ". " :PAR "The "
     (:TERM NIL "generic function") " " (:FUNREF NIL "make-instance")
     " may be used as described in " (:SECREF NIL :OBJECT-CREATION-AND-INIT)
     ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "If any of the initialization arguments has not been declared as valid, an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error") " is signaled. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defclass") ", "
     (:FUNREF NIL "class-of") ", " (:FUNREF NIL "allocate-instance") ", "
     (:FUNREF NIL "initialize-instance") ", "
     (:SECREF NIL :OBJECT-CREATION-AND-INIT) " " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL
      "The meta-object protocol can be used to define new methods on"
      "\\funref{make-instance} to replace the object-creation protocol.")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MAKE-INSTANCES-OBSOLETE")
   (:COM (:NAME "make-instances-obsolete" :FTYPE "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "generic-function") (:NAMES NIL "make-instances-obsolete")
      (:ARGLIST NIL "class") (:VALUES NIL "class"))
     " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "make-instances-obsolete")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "class") " " (:TYPEREF NIL "standard-class"))))
     " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "make-instances-obsolete")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "class") " " (:TYPEREF NIL "symbol"))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "class") "—a "
     (:TERM NIL "class designator") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "make-instances-obsolete")
     " has the effect of initiating the process of updating the instances of the "
     (:TERM NIL "class") ". During updating, the generic function "
     (:FUNREF NIL "update-instance-for-redefined-class") " will be invoked. "
     :PAR "The generic function " (:FUNREF NIL "make-instances-obsolete")
     " is invoked automatically by the system when " (:MACREF NIL "defclass")
     " has been used to redefine an existing standard class and the set of local "
     (:TERM NIL "slots") " " (:TERM NIL "accessible")
     " in an instance is changed or the order of " (:TERM NIL "slots")
     " in storage is changed. It can also be explicitly invoked by the user. "
     :PAR "If the second of the above " (:TERM NIL "methods")
     " is selected, that " (:TERM NIL "method") " invokes "
     (:FUNREF NIL "make-instances-obsolete") " on "
     (:TT NIL "(find-class " (:PARAM NIL "class") ")") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:FUNREF NIL "update-instance-for-redefined-class") ", "
     (:SECREF NIL :CLASS-RE-DEF) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MAKE-LOAD-FORM")
   (:COM (:NAME "make-load-form" :FTYPE "Standard Generic Function")
    (:ISSUE NIL "MAKE-LOAD-FORM-CONFUSION:REWRITE") " "
    (:ISSUE NIL "LOAD-OBJECTS:MAKE-LOAD-FORM") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "generic-function") (:NAMES NIL "make-load-form")
      (:ARGLIST NIL "object " (:KEYWORD NIL " &optional") " environment")
      (:VALUES NIL "creation-form" (:BRAC NIL ", initialization-form")))
     " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "make-load-form")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "object") " " (:TYPEREF NIL "standard-object"))
       " " (:KEYWORD NIL " &optional") " environment"))
     " "
     (:DEF (:KIND "method") (:NAMES NIL "make-load-form")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "object") " " (:TYPEREF NIL "structure-object"))
       " " (:KEYWORD NIL " &optional") " environment"))
     " "
     (:DEF (:KIND "method") (:NAMES NIL "make-load-form")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "object") " " (:TYPEREF NIL "condition")) " "
       (:KEYWORD NIL " &optional") " environment"))
     " "
     (:DEF (:KIND "method") (:NAMES NIL "make-load-form")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "object") " " (:TYPEREF NIL "class")) " "
       (:KEYWORD NIL " &optional") " environment"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR
     (:COMMENT NIL
      " Barrett: Moved up from end, so arguments first, then values.")
     (:PARAM NIL "environment") "—an " (:TERM NIL "environment object") ". "
     :PAR (:PARAM NIL "creation-form") "—a " (:TERM NIL "form") ". " :PAR
     (:PARAM NIL "initialization-form") "—a " (:TERM NIL "form") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "generic function")
     " " (:FUNREF NIL "make-load-form") " creates and returns one or two "
     (:TERM NIL "forms") ", a " (:PARAM NIL "creation-form") " and an "
     (:PARAM NIL "initialization-form") ", that enable " (:FUNREF NIL "load")
     " to construct an " (:TERM NIL "object") " equivalent to "
     (:PARAM NIL "object") ". "
     (:COMMENT NIL "% Added per item 1 of MAKE-LOAD-FORM-CONFUSION:")
     (:PARAM NIL "Environment") " is an " (:TERM NIL "environment object")
     " corresponding to the " (:TERM NIL "lexical environment")
     " in which the " (:TERM NIL "forms") " will be processed. " :PAR
     (:COMMENT NIL
      " %% Added with rewrites per item 1.1 of MAKE-LOAD-FORM-CONFUSION."
      " %% I had to do some minor fooling with the wording to make it read"
      " %% better using `modern' terminology. -kmp 11-Feb-92"
      " \\funref{make-load-form} is called by the \\term{file compiler} when"
      " \\param{object} is referenced as a \\term{literal object}"
      " in a \\term{file} being compiled" " %by \\funref{compile-file}"
      " if the \\term{object} is a \\term{generalized instance}"
      " of \\typeref{standard-object}, \\typeref{structure-object},"
      " \\typeref{condition}, or any of a (possibly empty) \\term{implementation-dependent}"
      " %list" " set of other \\term{classes}."
      " The \\term{file compiler} will only call \\funref{make-load-form} once for the \\term{same}"
      " \\term{object} within a single \\term{file}."
      " Barrett: Commented out the above, instead referencing the appropriate"
      "          section describing how the compiler performs constant processing.")
     "The " (:TERM NIL "file compiler") " calls "
     (:FUNREF NIL "make-load-form") " to process certain "
     (:TERM NIL "classes") " of " (:TERM NIL "literal objects") "; see "
     (:SECREF NIL :CALLING-MAKE-LOAD-FORM) ". " :PAR
     (:COMMENT NIL "% Added per item 1.2 of MAKE-LOAD-FORM-CONFUSION:")
     (:TERM NIL "Conforming programs") " may call "
     (:FUNREF NIL "make-load-form") " directly, providing "
     (:PARAM NIL "object") " is a " (:TERM NIL "generalized instance") " of "
     (:COMMENT NIL
      " Barrett: Fix dangling reference, now that list has been moved."
      " one of the" " explicitly named \\term{classes} mentioned previously.")
     (:TYPEREF NIL "standard-object") ", " (:TYPEREF NIL "structure-object")
     ", or " (:TYPEREF NIL "condition") ". " :PAR "The creation form is a "
     (:TERM NIL "form") " that, when evaluated at " (:FUNREF NIL "load")
     " time, should return an " (:TERM NIL "object") " that is equivalent to "
     (:PARAM NIL "object") ". The exact meaning of equivalent depends on the "
     (:TERM NIL "type") " of " (:TERM NIL "object")
     " and is up to the programmer who defines a " (:TERM NIL "method") " for "
     (:FUNREF NIL "make-load-form") "; see "
     (:SECREF NIL :LITERALS-IN-COMPILED-FILES) ". "
     (:COMMENT NIL "This is the same type of equivalence discussed"
      "  in issue CONSTANT-COMPILABLE-TYPES.")
     :PAR "The initialization form is a " (:TERM NIL "form")
     " that, when evaluated at " (:FUNREF NIL "load")
     " time, should perform further initialization of the "
     (:TERM NIL "object")
     ". The value returned by the initialization form is ignored. "
     (:COMMENT NIL
      " Barrett: Flush \"method\" -- its the value returned by the function that's"
      "          being talked about." "If the \\funref{make-load-form} method")
     "If " (:FUNREF NIL "make-load-form")
     " returns only one value, the initialization form is " (:MISC NIL "nil")
     ", which has no effect. If " (:PARAM NIL "object")
     " appears as a constant in the initialization form, at "
     (:FUNREF NIL "load") " time it will be replaced by the equivalent "
     (:TERM NIL "object")
     " constructed by the creation form; this is how the further initialization gains access to the "
     (:TERM NIL "object") ". " :PAR
     (:COMMENT NIL
      " Both the creation and initialization forms can contain references to \\term{objects} "
      " of user-defined \\term{types} (defined precisely below)."
      "% Rewritten per item 1.4 of MAKE-LOAD-FORM-CONFUSION:")
     "Both the " (:PARAM NIL "creation-form") " and the "
     (:PARAM NIL "initialization-form") " may contain references to any "
     (:TERM NIL "externalizable object")
     ". However, there must not be any circular dependencies in creation forms. An example of a circular dependency is when the creation form for the object "
     (:TT NIL "X") " contains a reference to the object " (:TT NIL "Y")
     ", and the creation form for the object " (:TT NIL "Y")
     " contains a reference to the object " (:TT NIL "X") ". "
     (:COMMENT NIL "A simpler"
      "  example would be when the creation form for the object X contains"
      "  a reference to X itself.  ")
     "Initialization forms are not subject to any restriction against circular dependencies, which is the reason that initialization forms exist; see the example of circular data structures below. "
     :PAR
     (:COMMENT NIL
      "   The creation form for an \\term{object} is always evaluated before the"
      "   initialization form for that \\term{object}.  "
      " When either the creation form or"
      "   the initialization form references other \\term{objects} "
      " of user-defined \\term{types}"
      "   that have not been referenced earlier in the "
      " \\funref{compile-file}, the"
      "   compiler collects all of the creation and initialization forms.  Each"
      "   initialization form is evaluated as soon as possible after its"
      "   creation form, as determined by data flow.  If the initialization form"
      "   for an \\term{object} does not reference any other "
      " \\term{objects} of user-defined" "   \\term{types} "
      " that have not been referenced earlier in the \\funref{compile-file}, the"
      "   initialization form is evaluated immediately after the creation form."
      "   If a creation or initialization form \\f{F} references other "
      " \\term{objects} of"
      "   user-defined \\term{types} that have not been referenced earlier in the"
      "   \\funref{compile-file}, "
      " the creation forms for those other \\term{objects} are evaluated"
      "   before \\f{F}, and the initialization forms for those other "
      " \\term{objects} are"
      "   also evaluated before \\f{F} whenever they do not depend on the "
      " \\term{object}" "   created or initialized by "
      " \\f{F}.  Where the above rules do not uniquely"
      "   determine an order of evaluation, which of the possible orders of"
      "   evaluation is chosen is \\term{implementation-dependent}."
      "   \\idxtext{order of evaluation}\\idxtext{evaluation order}"
      "% Rewritten per item 1.5 of MAKE-LOAD-FORM-CONFUSION:")
     :PAR "The creation form for an " (:TERM NIL "object") " is always "
     (:TERM NIL "evaluated") " before the initialization form for that "
     (:TERM NIL "object")
     ". When either the creation form or the initialization form references other "
     (:TERM NIL "objects") " that have not been referenced earlier in the "
     (:TERM NIL "file") " being " (:TERM NIL "compiled") ", the "
     (:TERM NIL "compiler") " ensures that all of the referenced "
     (:TERM NIL "objects") " have been created before "
     (:TERM NIL "evaluating") " the referencing " (:TERM NIL "form")
     ". When the referenced " (:TERM NIL "object") " is of a "
     (:TERM NIL "type") " which " (:COMMENT NIL "\\funref{compile-file}")
     "the " (:TERM NIL "file compiler") " processes using "
     (:FUNREF NIL "make-load-form") ", this involves " (:TERM NIL "evaluating")
     " the creation form returned for it. (This is the reason for the prohibition against circular references among creation forms). "
     :PAR "Each initialization form is " (:TERM NIL "evaluated")
     " as soon as possible after its associated creation form, as determined by data flow. If the initialization form for an "
     (:TERM NIL "object") " does not reference any other "
     (:TERM NIL "objects") " not referenced earlier in the " (:TERM NIL "file")
     " and processed by " (:COMMENT NIL "\\funref{compile-file} ") "the "
     (:TERM NIL "file compiler") " using " (:FUNREF NIL "make-load-form")
     ", the initialization form is evaluated immediately after the creation form. If a creation or initialization form "
     (:MATH NIL (:MI NIL "F")) " does contain references to such "
     (:TERM NIL "objects")
     ", the creation forms for those other objects are evaluated before "
     (:MATH NIL (:MI NIL "F"))
     ", and the initialization forms for those other " (:TERM NIL "objects")
     " are also evaluated before " (:MATH NIL (:MI NIL "F"))
     " whenever they do not depend on the " (:TERM NIL "object")
     " created or initialized by " (:MATH NIL (:MI NIL "F"))
     ". Where these rules do not uniquely determine an order of "
     (:TERM NIL "evaluation")
     " between two creation/initialization forms, the order of "
     (:TERM NIL "evaluation") " is unspecified. " :PAR
     "While these creation and initialization forms are being evaluated, the "
     (:TERM NIL "objects")
     " are possibly in an uninitialized state, analogous to the state of an "
     (:TERM NIL "object") " between the time it has been created by "
     (:FUNREF NIL "allocate-instance") " and it has been processed fully by "
     (:FUNREF NIL "initialize-instance") ". Programmers writing "
     (:TERM NIL "methods") " for " (:FUNREF NIL "make-load-form")
     " must take care in manipulating " (:TERM NIL "objects")
     " not to depend on " (:TERM NIL "slots")
     " that have not yet been initialized. " :PAR "It is "
     (:TERM NIL "implementation-dependent") " whether " (:FUNREF NIL "load")
     " calls " (:FUNREF NIL "eval") " on the " (:TERM NIL "forms")
     " or does some other operation that has an equivalent effect. For example, the "
     (:TERM NIL "forms") " might be translated into different but equivalent "
     (:TERM NIL "forms")
     " and then evaluated, they might be compiled and the resulting functions called by "
     (:FUNREF NIL "load")
     ", or they might be interpreted by a special-purpose function different from "
     (:FUNREF NIL "eval")
     ". All that is required is that the effect be equivalent to evaluating the "
     (:TERM NIL "forms") ". " :PAR
     (:COMMENT NIL
      " Barrett: Add method descriptions, per make-load-form-confusion.")
     "The " (:TERM NIL "method") " " (:TERM NIL "specialized") " on "
     (:TYPEREF NIL "class") " returns a creation " (:TERM NIL "form")
     " using the " (:TERM NIL "name") " of the " (:TERM NIL "class") " if the "
     (:TERM NIL "class") " has a " (:TERM NIL "proper name") " in "
     (:PARAM NIL "environment") ", signaling an error of " (:TERM NIL "type")
     " " (:TYPEREF NIL "error") " if it does not have a "
     (:TERM NIL "proper name") ". " (:TERM NIL "Evaluation")
     " of the creation " (:TERM NIL "form") " uses the " (:TERM NIL "name")
     " to find the " (:TERM NIL "class") " with that " (:TERM NIL "name")
     ", as if by " (:TERM NIL "calling") " " (:FUNREF NIL "find-class")
     ". If a " (:TERM NIL "class") " with that " (:TERM NIL "name")
     " has not been defined, then a " (:TERM NIL "class")
     " may be computed in an " (:TERM NIL "implementation-defined")
     " manner. If a " (:TERM NIL "class")
     " cannot be returned as the result of " (:TERM NIL "evaluating")
     " the creation " (:TERM NIL "form") ", then an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error") " is signaled. " :PAR
     (:COMMENT NIL
      "!!! Barrett: MAKE-LOAD-FORM-CONFUSION sayed \"... may define additional"
      "             \\term{conforming methods} ...\", but we never actually came up"
      "             with a definition for that term.  That whole issue is not"
      "             currently addressed by the standard, so I'm not going to try"
      "             to fix it just here.")
     "Both " (:TERM NIL "conforming implementations") " and "
     (:TERM NIL "conforming programs") " may further " (:TERM NIL "specialize")
     " " (:FUNREF NIL "make-load-form") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defclass obj ()
    ((x :initarg :x :reader obj-x)
     (y :initarg :y :reader obj-y)
     (dist :accessor obj-dist)))
→ #<STANDARD-CLASS OBJ 250020030>
 (defmethod shared-initialize :after ((self obj) slot-names &rest keys)
   (declare (ignore slot-names keys))
   (unless (slot-boundp self 'dist)
     (setf (obj-dist self)
           (sqrt (+ (expt (obj-x self) 2) (expt (obj-y self) 2))))))
→ #<STANDARD-METHOD SHARED-INITIALIZE (:AFTER) (OBJ T) 26266714>
 (defmethod make-load-form ((self obj) &optional environment)
   (declare (ignore environment))
   ;; Note that this definition only works because X and Y do not
   ;; contain information which refers back to the object itself.
   ;; For a more general solution to this problem, see revised example below.
   `(make-instance ',(class-of self)
                   :x ',(obj-x self) :y ',(obj-y self)))
→ #<STANDARD-METHOD MAKE-LOAD-FORM (OBJ) 26267532>
 (setq obj1 (make-instance 'obj :x 3.0 :y 4.0)) → #<OBJ 26274136>
 (obj-dist obj1) → 5.0
 (make-load-form obj1) → (MAKE-INSTANCE 'OBJ :X '3.0 :Y '4.0)
")
     " " :PAR "In the above example, an equivalent " (:TERM NIL "instance")
     " of " (:TT NIL "obj")
     " is reconstructed by using the values of two of its " (:TERM NIL "slots")
     ". The value of the third " (:TERM NIL "slot")
     " is derived from those two values. " :PAR " Another way to write the "
     (:FUNREF NIL "make-load-form") " " (:TERM NIL "method")
     " in that example is to use " (:FUNREF NIL "make-load-form-saving-slots")
     ". The code it generates might yield a slightly different result from the "
     (:FUNREF NIL "make-load-form") " " (:TERM NIL "method")
     " shown above, but the operational effect will be the same. For example: "
     :PAR " "
     (:CODE NIL " ;; Redefine method defined above.
 (defmethod make-load-form ((self obj) &optional environment)
    (make-load-form-saving-slots self
                                 :slot-names '(x y)
                                 :environment environment))
→ #<STANDARD-METHOD MAKE-LOAD-FORM (OBJ) 42755655>
 ;; Try MAKE-LOAD-FORM on object created above.
 (make-load-form obj1)
→ (ALLOCATE-INSTANCE '#<STANDARD-CLASS OBJ 250020030>),
    (PROGN
      (SETF (SLOT-VALUE '#<OBJ 26274136> 'X) '3.0)
      (SETF (SLOT-VALUE '#<OBJ 26274136> 'Y) '4.0)
      (INITIALIZE-INSTANCE '#<OBJ 26274136>))
")
     " " :PAR " In the following example, " (:TERM NIL "instances") " of "
     (:TT NIL "my-frob") " are “interned” in some way. An equivalent "
     (:TERM NIL "instance")
     " is reconstructed by using the value of the name slot as a key for searching existing "
     (:TERM NIL "objects")
     ". In this case the programmer has chosen to create a new "
     (:TERM NIL "object") " if no existing " (:TERM NIL "object")
     " is found; alternatively an error could have been signaled in that case. "
     :PAR " "
     (:CODE NIL " (defclass my-frob ()
    ((name :initarg :name :reader my-name)))
 (defmethod make-load-form ((self my-frob) &optional environment)
   (declare (ignore environment))
   `(find-my-frob ',(my-name self) :if-does-not-exist :create))
")
     " " :PAR
     " In the following example, the data structure to be dumped is circular, because each parent has a list of its children and each child has a reference back to its parent. If "
     (:FUNREF NIL "make-load-form") " is called on one " (:TERM NIL "object")
     " in such a structure, the creation form creates an equivalent "
     (:TERM NIL "object")
     " and fills in the children slot, which forces creation of equivalent "
     (:TERM NIL "objects")
     " for all of its children, grandchildren, etc. At this point none of the parent "
     (:TERM NIL "slots")
     " have been filled in. The initialization form fills in the parent "
     (:TERM NIL "slot") ", which forces creation of an equivalent "
     (:TERM NIL "object")
     " for the parent if it was not already created. Thus the entire tree is recreated at "
     (:FUNREF NIL "load") " time. At compile time, "
     (:FUNREF NIL "make-load-form") " is called once for each "
     (:TERM NIL "object")
     " in the tree. All of the creation forms are evaluated, in "
     (:TERM NIL "implementation-dependent")
     " order, and then all of the initialization forms are evaluated, also in "
     (:TERM NIL "implementation-dependent") " order. " :PAR " "
     (:CODE NIL " (defclass tree-with-parent () ((parent :accessor tree-parent)
                                (children :initarg :children)))
 (defmethod make-load-form ((x tree-with-parent) &optional environment)
   (declare (ignore environment))
   (values
     ;; creation form
     `(make-instance ',(class-of x) :children ',(slot-value x 'children))
     ;; initialization form
     `(setf (tree-parent ',x) ',(slot-value x 'parent))))
")
     " " :PAR
     " In the following example, the data structure to be dumped has no special properties and an equivalent structure can be reconstructed simply by reconstructing the "
     (:TERM NIL "slots") "' contents. " :PAR " "
     (:CODE NIL " (defstruct my-struct a b c)
 (defmethod make-load-form ((s my-struct) &optional environment)
    (make-load-form-saving-slots s :environment environment))
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL " \\funref{make-load-form} of an \\term{object}"
      " of \\term{metaclass} \\typeref{standard-class} or \\typeref{structure-class}"
      " for which no user-defined \\term{method} is applicable"
      " signals an error \\oftype{error}.  "
      " It is valid to implement this either by defining default"
      " methods on \\typeref{standard-object} and \\typeref{structure-object}"
      " that signal an error \\oftype{error}"
      " or by having no \\term{applicable method} for those \\term{classes}."
      "% Rewritten per item 1.3 of MAKE-LOAD-FORM-CONFUSION:")
     "The " (:TERM NIL "methods") " " (:TERM NIL "specialized") " on "
     (:TYPEREF NIL "standard-object") ", " (:TYPEREF NIL "structure-object")
     ", and " (:TYPEREF NIL "condition") " all signal an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error") ". " :PAR
     (:COMMENT NIL " Barrett: Add per make-load-form-confusion.") "It is "
     (:TERM NIL "implementation-dependent") " whether " (:TERM NIL "calling")
     " " (:FUNREF NIL "make-load-form") " on a "
     (:TERM NIL "generalized instance") " of a " (:TERM NIL "system class")
     " signals an error or returns creation and initialization "
     (:TERM NIL "forms") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "compile-file") ", "
     (:FUNREF NIL "make-load-form-saving-slots") ", "
     (:SECREF NIL :CALLING-MAKE-LOAD-FORM) " " (:SECREF NIL :EVALUATION) ", "
     (:SECREF NIL :COMPILATION) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The " (:TERM NIL "file compiler") " "
     (:COMMENT NIL "\\funref{compile-file}") "calls "
     (:FUNREF NIL "make-load-form") " in specific circumstances detailed in "
     (:SECREF NIL :CALLING-MAKE-LOAD-FORM) ". "
     (:COMMENT NIL "% Removed per item 1.2 of MAKE-LOAD-FORM-CONFUSION:"
      " It is valid for user programs to "
      " call \\funref{make-load-form} in other circumstances, providing \\param{object}'s"
      " \\term{metaclass} is neither \\typeref{built-in-class} "
      " nor a \\term{subclass} of \\typeref{built-in-class}.")
     :PAR (:COMMENT NIL " Barrett: Add per make-load-form-confusion.") "Some "
     (:TERM NIL "implementations") " may provide facilities for defining new "
     (:TERM NIL "subclasses") " of " (:TERM NIL "classes")
     " which are specified as " (:TERM NIL "system classes")
     ". (Some likely candidates include " (:TYPEREF NIL "generic-function")
     ", " (:TYPEREF NIL "method") ", and " (:TYPEREF NIL "stream") "). Such "
     (:TERM NIL "implementations") " should document how the "
     (:TERM NIL "file compiler") " processes " (:TERM NIL "instances")
     " of such " (:TERM NIL "classes") " when encountered as "
     (:TERM NIL "literal objects") ", and should document any relevant "
     (:TERM NIL "methods") " for " (:FUNREF NIL "make-load-form") ". " :PAR
     (:ENDISSUE NIL "LOAD-OBJECTS:MAKE-LOAD-FORM") " "
     (:ENDISSUE NIL "MAKE-LOAD-FORM-CONFUSION:REWRITE") " "))
   " " :PAR (:COMMENT NIL "%% ========== MAKE-LOAD-FORM-SAVING-SLOTS")
   (:COM (:NAME "make-load-form-saving-slots" :FTYPE "Function")
    (:ISSUE NIL "MAKE-LOAD-FORM-CONFUSION:REWRITE") " "
    (:COMMENT NIL " Barrett: Issue reference for LOAD-OBJECTS was missing.")
    (:ISSUE NIL "LOAD-OBJECTS:MAKE-LOAD-FORM") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-load-form-saving-slots")
      (:ARGLIST NIL "object " (:KEYWORD NIL " &key") " slot-names environment")
      (:VALUES NIL "creation-form, initialization-form"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "slot-names") "—a "
     (:TERM NIL "list") ". " :PAR (:PARAM NIL "environment") "—an "
     (:TERM NIL "environment object") ". " :PAR (:PARAM NIL "creation-form")
     "—a " (:TERM NIL "form") ". " :PAR (:PARAM NIL "initialization-form")
     "—a " (:TERM NIL "form") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:ISSUE NIL "MAKE-LOAD-FORM-SAVING-SLOTS:NO-INITFORMS") " "
     (:COMMENT NIL
      " Returns \\term{forms} that, when \\term{evaluated}, will construct an"
      " \\term{object} equivalent to \\param{object} using \\funref{make-instance}"
      " and \\macref{setf} of \\funref{slot-value} for \\term{slots} with values, "
      " or \\funref{slot-makunbound} for \\term{slots} without values, "
      " or using other \\term{functions} of equivalent effect."
      " \\funref{make-load-form-saving-slots} works for any \\term{object}"
      " of \\term{metaclass} \\typeref{standard-class} or \\typeref{structure-class}.  ")
     "Returns " (:TERM NIL "forms") " that, when " (:TERM NIL "evaluated")
     ", will construct an " (:TERM NIL "object") " equivalent to "
     (:PARAM NIL "object") ", without " (:TERM NIL "executing") " "
     (:TERM NIL "initialization forms") ". The " (:TERM NIL "slots")
     " in the new " (:TERM NIL "object") " that correspond to initialized "
     (:TERM NIL "slots") " in " (:PARAM NIL "object")
     " are initialized using the values from " (:PARAM NIL "object")
     ". Uninitialized " (:TERM NIL "slots") " in " (:PARAM NIL "object")
     " are not initialized in the new " (:TERM NIL "object") ". "
     (:FUNREF NIL "make-load-form-saving-slots") " works for any "
     (:TERM NIL "instance") " of " (:TYPEREF NIL "standard-object") " or "
     (:TYPEREF NIL "structure-object") ". "
     (:ENDISSUE NIL "MAKE-LOAD-FORM-SAVING-SLOTS:NO-INITFORMS") " " :PAR
     (:COMMENT NIL "Barmar: What does it return if object is a structure?"
      "  MAKE-INSTANCE can't be used on structure classes, can it?"
      "KMP: I think that's what \"functions of equivalent effect\" is supposed to answer.")
     :PAR (:PARAM NIL "Slot-names") " is a " (:TERM NIL "list")
     " of the names of the " (:TERM NIL "slots") " to preserve. If "
     (:PARAM NIL "slot-names") " is not supplied, its value is all of the "
     (:TERM NIL "local slots") ". " :PAR
     (:FUNREF NIL "make-load-form-saving-slots")
     " returns two values, thus it can deal with circular structures. Whether the result is useful in an application depends on whether the "
     (:PARAM NIL "object") "'s " (:TERM NIL "type")
     " and slot contents fully capture the application's idea of the "
     (:PARAM NIL "object") "'s state. " :PAR (:PARAM NIL "Environment")
     " is the environment in which the forms will be processed. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-load-form") ", "
     (:FUNREF NIL "make-instance") ", " (:MACREF NIL "setf") ", "
     (:FUNREF NIL "slot-value") ", " (:FUNREF NIL "slot-makunbound") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "make-load-form-saving-slots")
     " can be useful in user-written " (:FUNREF NIL "make-load-form")
     " methods. " :PAR
     (:COMMENT NIL " Barrett: Remember to put in end marker.")
     (:ENDISSUE NIL "LOAD-OBJECTS:MAKE-LOAD-FORM") " "
     (:ENDISSUE NIL "MAKE-LOAD-FORM-CONFUSION:REWRITE") " " :PAR
     (:ISSUE NIL "MAKE-LOAD-FORM-SAVING-SLOTS:NO-INITFORMS") " When the "
     (:TERM NIL "object") " is an " (:TERM NIL "instance") " of "
     (:TYPEREF NIL "standard-object") ", "
     (:FUNREF NIL "make-load-form-saving-slots")
     " could return a creation form that " (:TERM NIL "calls") " "
     (:FUNREF NIL "allocate-instance")
     " and an initialization form that contains " (:TERM NIL "calls") " to "
     (:MACREF NIL "setf") " of " (:FUNREF NIL "slot-value") " and "
     (:FUNREF NIL "slot-makunbound") ", though other " (:TERM NIL "functions")
     " of similar effect might actually be used. "
     (:ENDISSUE NIL "MAKE-LOAD-FORM-SAVING-SLOTS:NO-INITFORMS") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== WITH-ACCESSORS")
   (:COM (:NAME "with-accessors" :FTYPE "Macro") (:ISSUE NIL "DECLS-AND-DOC")
    " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "with-accessors")
      (:ARGLIST NIL
       (:PAREN NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "slot-entry"))))
       " instance-form " (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration")))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR
     (:BNF (:NAME "slot-entry") (:PAREN NIL "variable-name accessor-name")) " "
     :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "variable-name")
     "—a " (:TERM NIL "variable name") "; not evaluated. " :PAR
     (:PARAM NIL "accessor-name") "—a " (:TERM NIL "function name")
     "; not evaluated. " :PAR (:PARAM NIL "instance-form") "—a "
     (:TERM NIL "form") "; evaluated. " :PAR (:PARAM NIL "declaration") "—a "
     (:MISC NIL "declare") " " (:TERM NIL "expression") "; not evaluated. "
     :PAR (:PARAM NIL "forms") "—an " (:TERM NIL "implicit progn") ". " :PAR
     (:PARAM NIL "results") "—the " (:TERM NIL "values") " returned by the "
     (:PARAM NIL "forms") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "Creates a lexical environment in which the slots specified by "
     (:PARAM NIL "slot-entry")
     " are lexically available through their accessors as if they were variables. The macro "
     (:MACREF NIL "with-accessors") " invokes the appropriate accessors to "
     (:PARAM NIL "access") " the " (:TERM NIL "slots") " specified by "
     (:PARAM NIL "slot-entry") ". Both " (:MACREF NIL "setf") " and "
     (:SPECREF NIL "setq") " can be used to set the value of the "
     (:TERM NIL "slot") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defclass thing ()
           ((x :initarg :x :accessor thing-x)
            (y :initarg :y :accessor thing-y)))
→ #<STANDARD-CLASS THING 250020173>
 (defmethod (setf thing-x) :before (new-x (thing thing))
   (format t \"~&Changing X from ~D to ~D in ~S.~%\"
           (thing-x thing) new-x thing))
 (setq thing1 (make-instance 'thing :x 1 :y 2)) → #<THING 43135676>
 (setq thing2 (make-instance 'thing :x 7 :y 8)) → #<THING 43147374>
 (with-accessors ((x1 thing-x) (y1 thing-y))
                 thing1
   (with-accessors ((x2 thing-x) (y2 thing-y))
                   thing2
     (list (list x1 (thing-x thing1) y1 (thing-y thing1)
                 x2 (thing-x thing2) y2 (thing-y thing2))
           (setq x1 (+ y1 x2))
           (list x1 (thing-x thing1) y1 (thing-y thing1)
                 x2 (thing-x thing2) y2 (thing-y thing2))
           (setf (thing-x thing2) (list x1))
           (list x1 (thing-x thing1) y1 (thing-y thing1)
                 x2 (thing-x thing2) y2 (thing-y thing2)))))
⊳ Changing X from 1 to 9 in #<THING 43135676>.
⊳ Changing X from 7 to (9) in #<THING 43147374>.
→ ((1 1 2 2 7 7 8 8)
     9
     (9 9 2 2 7 7 8 8) 
     (9)
     (9 9 2 2 (9) (9) 8 8))
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:MACREF NIL "defclass") " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "The consequences are undefined if any " (:PARAM NIL "accessor-name")
     " is not the name of an accessor for the " (:PARAM NIL "instance") ". "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "with-slots") ", "
     (:SPECREF NIL "symbol-macrolet") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "A " (:MACREF NIL "with-accessors")
     " expression of the form: " :PAR
     (:DISPLAYMATH NIL
      (:MTABLE (:COLUMNALIGN "left")
       (:MTR NIL
        (:MTD NIL (:MTEXT (:FONT :TT) " (with-accessors") (:MO NIL "(")
         (:MROW NIL (:MSUB NIL (:MI (:FONT :I) "slot-entry") (:MN NIL "1"))
          (:MO NIL "…")
          (:MSUB NIL (:MI (:FONT :I) "slot-entry") (:MI NIL "n")))
         (:MO NIL ")") (:MI (:FONT :I) "instance-form") (:MSPACE NIL)
         (:MROW NIL (:MSUB NIL (:MI (:FONT :I) "form") (:MN NIL "1"))
          (:MO NIL "…") (:MSUB NIL (:MI (:FONT :I) "form") (:MI NIL "k")))
         (:MO NIL ")")))))
     " " :PAR " expands into the equivalent of " :PAR
     (:DISPLAYMATH NIL
      (:MTABLE (:COLUMNALIGN "left")
       (:MTR NIL (:MTD NIL (:MTEXT (:FONT :TT) " ("))
        (:MTD NIL (:MTEXT (:FONT :TT) " let ((") (:MI NIL "in") (:MSPACE NIL)
         (:MI (:FONT :I) "instance-form") (:MTEXT (:FONT :TT) " ))")))
       (:MTR NIL (:MTD NIL)
        (:MTD NIL (:MTEXT (:FONT :TT) " (symbol-macrolet (")
         (:MROW NIL (:MSUB NIL (:MI (:FONT :I) "Q") (:MN NIL "1"))
          (:MO NIL "…") (:MSUB NIL (:MI (:FONT :I) "Q") (:MI NIL "n")))
         (:MTEXT (:FONT :TT) " )") (:MSPACE NIL)
         (:MROW NIL (:MSUB NIL (:MI (:FONT :I) "form") (:MN NIL "1"))
          (:MO NIL "…") (:MSUB NIL (:MI (:FONT :I) "form") (:MI NIL "k")))
         (:MTEXT (:FONT :TT) " ))")))))
     " " :PAR " where "
     (:MATH NIL (:MSUB NIL (:MI (:FONT :I) "Q") (:MI NIL "i"))) " is " :PAR
     (:DISPLAYMATH NIL
      (:MROW NIL (:MTEXT (:FONT :TT) " (")
       (:MSUB NIL (:MI (:FONT :I) "variable-name") (:MI NIL "i")) (:MO NIL "(")
       (:MO NIL ")") (:MTEXT (:FONT :TT) " (accessor-nameiin))")))
     " " :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== WITH-SLOTS")
   (:COM (:NAME "with-slots" :FTYPE "Macro") (:ISSUE NIL "DECLS-AND-DOC") " "
    :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "with-slots")
      (:ARGLIST NIL
       (:PAREN NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "slot-entry"))))
       " instance-form " (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration")))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR
     (:BNF (:NAME "slot-entry") "slot-name | "
      (:PAREN NIL "variable-name slot-name"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "slot-name")
     "—a " (:TERM NIL "slot") " " (:TERM NIL "name") "; not evaluated. " :PAR
     (:PARAM NIL "variable-name") "—a " (:TERM NIL "variable name")
     "; not evaluated. " :PAR (:PARAM NIL "instance-form") "—a "
     (:TERM NIL "form") "; evaluted to produce " (:PARAM NIL "instance") ". "
     :PAR (:PARAM NIL "instance") "—an " (:TERM NIL "object") ". " :PAR
     (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR (:PARAM NIL "forms")
     "—an " (:TERM NIL "implicit progn") ". " :PAR (:PARAM NIL "results")
     "—the " (:TERM NIL "values") " returned by the " (:PARAM NIL "forms") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR "The macro "
     (:MACREF NIL "with-slots") " " (:TERM NIL "establishes") " a "
     (:COMMENT NIL "lexical context") (:TERM NIL "lexical environment")
     " for referring to the " (:TERM NIL "slots") " in the "
     (:PARAM NIL "instance") " named by the given " (:PARAM NIL "slot-names")
     " as though they were " (:TERM NIL "variables")
     ". Within such a context the value of the " (:TERM NIL "slot")
     " can be specified by using its slot name, as if it were a lexically bound variable. Both "
     (:MACREF NIL "setf") " and " (:SPECREF NIL "setq")
     " can be used to set the value of the " (:TERM NIL "slot") ". " :PAR
     "The macro " (:MACREF NIL "with-slots")
     " translates an appearance of the slot name as a " (:TERM NIL "variable")
     " into a call to " (:FUNREF NIL "slot-value") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defclass thing ()
           ((x :initarg :x :accessor thing-x)
            (y :initarg :y :accessor thing-y)))
→ #<STANDARD-CLASS THING 250020173>
 (defmethod (setf thing-x) :before (new-x (thing thing))
   (format t \"~&Changing X from ~D to ~D in ~S.~%\"
           (thing-x thing) new-x thing))
 (setq thing (make-instance 'thing :x 0 :y 1)) → #<THING 62310540>
 (with-slots (x y) thing (incf x) (incf y)) → 2
 (values (thing-x thing) (thing-y thing)) → 1, 2
 (setq thing1 (make-instance 'thing :x 1 :y 2)) → #<THING 43135676>
 (setq thing2 (make-instance 'thing :x 7 :y 8)) → #<THING 43147374>
 (with-slots ((x1 x) (y1 y))
             thing1
   (with-slots ((x2 x) (y2 y))
               thing2
     (list (list x1 (thing-x thing1) y1 (thing-y thing1)
                 x2 (thing-x thing2) y2 (thing-y thing2))
           (setq x1 (+ y1 x2))
           (list x1 (thing-x thing1) y1 (thing-y thing1)
                 x2 (thing-x thing2) y2 (thing-y thing2))
           (setf (thing-x thing2) (list x1))
           (list x1 (thing-x thing1) y1 (thing-y thing1)
                 x2 (thing-x thing2) y2 (thing-y thing2)))))
⊳ Changing X from 7 to (9) in #<THING 43147374>.
→ ((1 1 2 2 7 7 8 8)
     9
     (9 9 2 2 7 7 8 8) 
     (9)
     (9 9 2 2 (9) (9) 8 8))
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:MACREF NIL "defclass") " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "The consequences are undefined if any " (:PARAM NIL "slot-name")
     " is not the name of a " (:TERM NIL "slot") " in the "
     (:PARAM NIL "instance") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "with-accessors") ", "
     (:FUNREF NIL "slot-value") ", " (:SPECREF NIL "symbol-macrolet") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "A " (:MACREF NIL "with-slots")
     " expression of the form: " :PAR
     (:DISPLAYMATH NIL
      (:MTABLE (:COLUMNALIGN "left")
       (:MTR NIL
        (:MTD NIL (:MTEXT (:FONT :TT) " (with-slots") (:MO NIL "(")
         (:MROW NIL (:MSUB NIL (:MI (:FONT :I) "slot-entry") (:MN NIL "1"))
          (:MO NIL "…")
          (:MSUB NIL (:MI (:FONT :I) "slot-entry") (:MI NIL "n")))
         (:MO NIL ")") (:MI (:FONT :I) "instance-form") (:MSPACE NIL)
         (:MROW NIL (:MSUB NIL (:MI (:FONT :I) "form") (:MN NIL "1"))
          (:MO NIL "…") (:MSUB NIL (:MI (:FONT :I) "form") (:MI NIL "k")))
         (:MO NIL ")")))))
     " " :PAR " expands into the equivalent of " :PAR
     (:DISPLAYMATH NIL
      (:MTABLE (:COLUMNALIGN "left")
       (:MTR NIL (:MTD NIL (:MTEXT (:FONT :TT) " ("))
        (:MTD NIL (:MTEXT (:FONT :TT) " let ((") (:MI NIL "in") (:MSPACE NIL)
         (:MI (:FONT :I) "instance-form") (:MTEXT (:FONT :TT) " ))")))
       (:MTR NIL (:MTD NIL)
        (:MTD NIL (:MTEXT (:FONT :TT) " (symbol-macrolet (")
         (:MROW NIL (:MSUB NIL (:MI (:FONT :I) "Q") (:MN NIL "1"))
          (:MO NIL "…") (:MSUB NIL (:MI (:FONT :I) "Q") (:MI NIL "n")))
         (:MTEXT (:FONT :TT) " )") (:MSPACE NIL)
         (:MROW NIL (:MSUB NIL (:MI (:FONT :I) "form") (:MN NIL "1"))
          (:MO NIL "…") (:MSUB NIL (:MI (:FONT :I) "form") (:MI NIL "k")))
         (:MTEXT (:FONT :TT) " ))")))))
     " " :PAR " where "
     (:MATH NIL (:MSUB NIL (:MI (:FONT :I) "Q") (:MI NIL "i"))) " is " :PAR
     (:DISPLAYMATH NIL
      (:MROW NIL (:MTEXT (:FONT :TT) " (")
       (:MSUB NIL (:MI (:FONT :I) "slot-entry") (:MI NIL "i")) (:MO NIL "(")
       (:MO NIL ")") (:MTEXT (:FONT :TT) " (slot-value ") (:MI NIL "in")
       (:MO NIL "'") (:MSUB NIL (:MI (:FONT :I) "slot-entry") (:MI NIL "i"))
       (:MTEXT (:FONT :TT) " ))")))
     " " :PAR " if "
     (:MATH NIL (:MSUB NIL (:MI (:FONT :I) "slot-entry") (:MI NIL "i")))
     " is a " (:TERM NIL "symbol") " and is " :PAR
     (:DISPLAYMATH NIL
      (:MROW NIL (:MTEXT (:FONT :TT) " (")
       (:MSUB NIL (:MI (:FONT :I) "variable-name") (:MI NIL "i")) (:MO NIL "(")
       (:MO NIL ")") (:MTEXT (:FONT :TT) " (slot-value ") (:MI NIL "in")
       (:MO NIL "'") (:MSUB NIL (:MI (:FONT :I) "slot-name") (:MI NIL "i"))
       (:MTEXT (:FONT :TT) " ))")))
     " " :PAR " if "
     (:MATH NIL (:MSUB NIL (:MI (:FONT :I) "slot-entry") (:MI NIL "i")))
     " is of the form " :PAR
     (:DISPLAYMATH NIL
      (:MROW NIL (:MTEXT (:FONT :TT) " (")
       (:MSUB NIL (:MI (:FONT :I) "variable-name") (:MI NIL "i")) (:MSPACE NIL)
       (:MSUB NIL (:MI (:FONT :I) "slot-name") (:MI NIL "i"))
       (:MTEXT (:FONT :TT) " )")))
     " " :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DEFCLASS")
   (:COM (:NAME "defclass" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:COMMENT NIL "%Syntax fixed per X3J13. -kmp 05-Oct-93")
     (:DEF (:KIND "macro") (:NAMES NIL "defclass")
      (:ARGLIST NIL (:PARAM NIL "class-name") " "
       (:PAREN NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "superclass-name")))) " "
       (:PAREN NIL (:STAR NIL (:CURLY NIL (:I NIL "slot-specifier")))) " "
       (:MATH NIL (:MO NIL "[") (:MO NIL "[") (:MO NIL "↓")
        (:MI (:FONT :I) "class-option") (:MO NIL ",") (:MO NIL "]")
        (:MO NIL "]")))
      (:VALUES NIL "new-class"))
     " " :PAR " "
     (:TABLE (:TABS T)
      (:ROW NIL (:CELL NIL)
       (:CELL NIL (:I NIL "slot-specifier") "::" (:MATH NIL (:MO NIL "=")))
       (:CELL NIL (:I NIL "slot-name") " " (:MATH NIL (:MO NIL "|")) " ("
        (:I NIL "slot-name") " "
        (:MATH NIL (:MO NIL "[") (:MO NIL "[") (:MO NIL "↓")
         (:MI (:FONT :I) "slot-option") (:MO NIL ",") (:MO NIL "]")
         (:MO NIL "]"))
        ")")))
     " " :PAR " "
     (:TABLE (:TABS T)
      (:ROW NIL (:CELL NIL)
       (:CELL NIL (:I NIL "slot-name") "::" (:MATH NIL (:MO NIL "=")) " "
        (:TERM NIL "symbol"))))
     " " :PAR " "
     (:TABLE (:TABS T)
      (:ROW NIL (:CELL NIL)
       (:CELL NIL (:I NIL "slot-option") "::" (:MATH NIL (:MO NIL "=")))
       (:CELL NIL
        (:STAR NIL
         (:CURLY NIL (:KWD NIL "reader") " "
          (:PARAM NIL "reader-function-name")))
        " " (:MATH NIL (:MO NIL "|"))))
      (:ROW NIL (:CELL NIL) (:CELL NIL)
       (:CELL NIL
        (:STAR NIL
         (:CURLY NIL (:KWD NIL "writer") " "
          (:PARAM NIL "writer-function-name")))
        " " (:MATH NIL (:MO NIL "|"))))
      (:ROW NIL (:CELL NIL) (:CELL NIL)
       (:CELL NIL
        (:STAR NIL
         (:CURLY NIL (:KWD NIL "accessor") " "
          (:PARAM NIL "reader-function-name")))
        " " (:MATH NIL (:MO NIL "|"))))
      (:ROW NIL (:CELL NIL) (:CELL NIL)
       (:CELL NIL
        (:CURLY NIL (:KWD NIL "allocation") " " (:PARAM NIL "allocation-type"))
        " " (:MATH NIL (:MO NIL "|"))))
      (:ROW NIL (:CELL NIL) (:CELL NIL)
       (:CELL NIL
        (:STAR NIL
         (:CURLY NIL (:KWD NIL "initarg") " " (:PARAM NIL "initarg-name")))
        " " (:MATH NIL (:MO NIL "|"))))
      (:ROW NIL (:CELL NIL) (:CELL NIL)
       (:CELL NIL (:CURLY NIL (:KWD NIL "initform") " " (:PARAM NIL "form"))
        " " (:MATH NIL (:MO NIL "|"))))
      (:ROW NIL (:CELL NIL) (:CELL NIL)
       (:CELL NIL
        (:CURLY NIL (:KWD NIL "type") " " (:PARAM NIL "type-specifier")) " "
        (:MATH NIL (:MO NIL "|"))))
      (:ROW NIL (:CELL NIL) (:CELL NIL)
       (:CELL NIL
        (:CURLY NIL (:KWD NIL "documentation") " " (:TERM NIL "string")))))
     " " :PAR " "
     (:TABLE (:TABS T)
      (:ROW NIL (:CELL NIL)
       (:CELL NIL (:I NIL "function-name") "::" (:MATH NIL (:MO NIL "=")) " "
        (:CURLY NIL (:TERM NIL "symbol") " " (:MATH NIL (:MO NIL "|")) " "
         (:TT NIL " (setf " (:TERM NIL "symbol") ")")))))
     " " :PAR " "
     (:TABLE (:TABS T)
      (:ROW NIL (:CELL NIL)
       (:CELL NIL (:PARAM NIL "class-option") "::" (:MATH NIL (:MO NIL "=")))
       (:CELL NIL "(" (:KWD NIL "default-initargs") " " (:TT NIL ".") " "
        (:PARAM NIL "initarg-list") ") " (:MATH NIL (:MO NIL "|"))))
      (:ROW NIL (:CELL NIL) (:CELL NIL)
       (:CELL NIL "(" (:KWD NIL "documentation") " " (:TERM NIL "string") ") "
        (:MATH NIL (:MO NIL "|"))))
      (:ROW NIL (:CELL NIL) (:CELL NIL)
       (:CELL NIL "(" (:KWD NIL "metaclass") " " (:PARAM NIL "class-name")
        ")")))
     " " :PAR " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL "!!! Treatment of documentation?") :PAR
     (:PARAM NIL "Class-name") "—a " (:TERM NIL "non-nil") " "
     (:TERM NIL "symbol") ". " :PAR (:PARAM NIL "Superclass-name") "–a "
     (:TERM NIL "non-nil") " " (:TERM NIL "symbol") ". " :PAR
     (:PARAM NIL "Slot-name") "–a " (:TERM NIL "symbol") ". The "
     (:PARAM NIL "slot-name") " argument is "
     (:COMMENT NIL "!!! Isn't there a more concise way to say this?") "a "
     (:TERM NIL "symbol")
     " that is syntactically valid for use as a variable name. " :PAR
     (:PARAM NIL "Reader-function-name") "—a " (:TERM NIL "non-nil") " "
     (:TERM NIL "symbol") ". " (:KWD NIL "reader")
     " can be supplied more than once for a given " (:TERM NIL "slot") ". "
     :PAR (:PARAM NIL "Writer-function-name") "—a "
     (:TERM NIL "generic function") " name. " (:KWD NIL "writer")
     " can be supplied more than once for a given " (:TERM NIL "slot") ". "
     :PAR (:PARAM NIL "Reader-function-name") "—a " (:TERM NIL "non-nil") " "
     (:TERM NIL "symbol") ". " (:KWD NIL "accessor")
     " can be supplied more than once for a given " (:TERM NIL "slot") ". "
     :PAR (:PARAM NIL "Allocation-type") "—(member " (:KWD NIL "instance") " "
     (:KWD NIL "class") "). " (:KWD NIL "allocation")
     " can be supplied once at most for a given " (:TERM NIL "slot") ". " :PAR
     (:PARAM NIL "Initarg-name") "—a " (:TERM NIL "symbol") ". "
     (:KWD NIL "initarg") " can be supplied more than once for a given "
     (:TERM NIL "slot") ". " :PAR (:PARAM NIL "Form") "—a " (:TERM NIL "form")
     ". " (:KWD NIL "initform") " can be supplied once at most for a given "
     (:TERM NIL "slot") ". " :PAR (:PARAM NIL "Type-specifier") "—a "
     (:TERM NIL "type specifier") ". " (:KWD NIL "type")
     " can be supplied once at most for a given " (:TERM NIL "slot") ". " :PAR
     (:PARAM NIL "Class-option") "— refers to the " (:TERM NIL "class")
     " as a whole or to all class " (:TERM NIL "slots") ". " :PAR
     (:PARAM NIL "Initarg-list") "—a " (:TERM NIL "list")
     " of alternating initialization argument " (:TERM NIL "names")
     " and default initial value " (:TERM NIL "forms") ". "
     (:KWD NIL "default-initargs") " can be supplied at most once. " :PAR
     (:PARAM NIL "Class-name") "—a " (:TERM NIL "non-nil") " "
     (:TERM NIL "symbol") ". " (:KWD NIL "metaclass")
     " can be supplied once at most. " :PAR
     (:COMMENT NIL "The \\i{class-name} argument is a \\term{non-nil} symbol.")
     :PAR
     (:COMMENT NIL
      "Each \\i{superclass-name} argument is a \\term{non-nil} symbol.  ")
     :PAR
     (:COMMENT NIL
      "Each \\i{slot-specifier} argument is the name of the slot or a list"
      "consisting of the slot name followed by zero or more slot options.")
     :PAR
     (:COMMENT NIL
      "The \\i{reader-function-name} argument is a \\term{non-nil} symbol.")
     :PAR
     (:COMMENT NIL
      "The \\i{writer-function-name} argument is a function specifier.")
     :PAR (:COMMENT NIL "The \\i{initarg-name} argument is a symbol.") :PAR
     (:COMMENT NIL "!!! Ugh. Surely this should not be so. -kmp 24-Apr-91")
     (:PARAM NIL "new-class") "—the new " (:TERM NIL "class") " "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The macro " (:MACREF NIL "defclass")
     " defines a new named " (:TERM NIL "class") ". It returns the new "
     (:TERM NIL "class") " " (:TERM NIL "object") " as its result. " :PAR
     "The syntax of " (:MACREF NIL "defclass")
     " provides options for specifying initialization arguments for "
     (:TERM NIL "slots") ", for specifying default initialization values for "
     (:TERM NIL "slots") ", and for requesting that " (:TERM NIL "methods")
     " on specified " (:TERM NIL "generic functions")
     " be automatically generated for reading and writing the values of "
     (:TERM NIL "slots")
     ". No reader or writer functions are defined by default; their generation must be explicitly requested. However, "
     (:TERM NIL "slots") " can always be " (:TERM NIL "accessed") " using "
     (:FUNREF NIL "slot-value") ". " :PAR "Defining a new " (:TERM NIL "class")
     " also causes a " (:TERM NIL "type")
     " of the same name to be defined. The predicate "
     (:TT NIL "(typep " (:PARAM NIL "object") " " (:PARAM NIL "class-name")
      ")")
     " returns true if the " (:TERM NIL "class") " of the given "
     (:PARAM NIL "object") " is the " (:TERM NIL "class") " named by "
     (:PARAM NIL "class-name") " itself or a subclass of the class "
     (:PARAM NIL "class-name") ". A " (:TERM NIL "class") " "
     (:TERM NIL "object") " can be used as a " (:TERM NIL "type specifier")
     ". Thus "
     (:TT NIL "(typep " (:PARAM NIL "object") " " (:PARAM NIL "class") ")")
     " returns " (:TERM NIL "true") " if the " (:TERM NIL "class") " of the "
     (:PARAM NIL "object") " is " (:PARAM NIL "class")
     " itself or a subclass of " (:PARAM NIL "class") ". " :PAR "The "
     (:PARAM NIL "class-name") " argument specifies the "
     (:TERM NIL "proper name") " of the new " (:TERM NIL "class") ". "
     (:COMMENT NIL "If a \\term{class} "
      "with the same proper name already exists and that"
      "\\term{class} is an \\term{instance} of \\typeref{standard-class}, and if the"
      "\\macref{defclass} form for the definition of the new \\term{class}"
      "specifies a \\term{class} of class \\typeref{standard-class}, the"
      "definition of the existing \\term{class} is replaced.")
     "If a " (:TERM NIL "class") " with the same " (:TERM NIL "proper name")
     " already exists and that " (:TERM NIL "class") " is an "
     (:TERM NIL "instance") " of " (:TYPEREF NIL "standard-class")
     ", and if the " (:MACREF NIL "defclass")
     " form for the definition of the new " (:TERM NIL "class") " specifies a "
     (:TERM NIL "class") " of " (:TERM NIL "class") " "
     (:TYPEREF NIL "standard-class") ", the existing " (:TERM NIL "class")
     " is redefined, and instances of it (and its " (:TERM NIL "subclasses")
     ") are updated to the new definition at the time that they are next "
     (:TERM NIL "accessed") ". For details, see " (:SECREF NIL :CLASS-RE-DEF)
     ". " :PAR
     (:COMMENT NIL " addressed in the packages chapter.  --sjl 5 Mar 92 "
      "\\issue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}"
      "The consequences are undefined if a \\term{symbol} in \\thepackage{common-lisp}"
      "is used as the \\param{class-name} argument."
      "\\endissue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}")
     :PAR "Each " (:PARAM NIL "superclass-name")
     " argument specifies a direct " (:TERM NIL "superclass") " of the new "
     (:TERM NIL "class") ". " (:COMMENT NIL "% gray addition") "If the "
     (:TERM NIL "superclass") " list is empty, then the "
     (:TERM NIL "superclass") " defaults depending on the "
     (:TERM NIL "metaclass") ", with " (:TYPEREF NIL "standard-object")
     " being the default for " (:TYPEREF NIL "standard-class") ". " :PAR
     "The new " (:TERM NIL "class") " will inherit " (:TERM NIL "slots")
     " and " (:TERM NIL "methods") " from each of its direct "
     (:TERM NIL "superclasses") ", from their direct "
     (:TERM NIL "superclasses") ", and so on. For a discussion of how "
     (:TERM NIL "slots") " and " (:TERM NIL "methods") " are inherited, see "
     (:SECREF NIL :INHERITANCE) ". " :PAR
     (:COMMENT NIL
      "Each \\i{slot-specifier} argument is the \\term{name} of the slot or a list"
      "consisting of the slot name followed by zero or more slot options."
      "The \\i{slot-name} argument is a symbol that is syntactically valid"
      "for use as a Common Lisp variable name.  If there are any duplicate"
      "slot names, an error is signaled.")
     :PAR "The following slot options are available: " :PAR
     (:LIST NIL
      (:ITEM NIL " The " (:KWD NIL "reader") " slot option specifies that an "
       (:TERM NIL "unqualified method") " is to be defined on the "
       (:TERM NIL "generic function") " named "
       (:PARAM NIL "reader-function-name") " to read the value of the given "
       (:TERM NIL "slot") ". " :PAR)
      (:ITEM NIL " The " (:KWD NIL "writer") " slot option specifies that an "
       (:TERM NIL "unqualified method") " is to be defined on the "
       (:TERM NIL "generic function") " named "
       (:PARAM NIL "writer-function-name") " to write the value of the "
       (:TERM NIL "slot") ". " :PAR)
      (:ITEM NIL " The " (:KWD NIL "accessor")
       " slot option specifies that an " (:TERM NIL "unqualified method")
       " is to be defined on the generic function named "
       (:PARAM NIL "reader-function-name") " to read the value of the given "
       (:TERM NIL "slot") " and that an " (:TERM NIL "unqualified method")
       " is to be defined on the " (:TERM NIL "generic function") " named "
       (:TT NIL "(setf " (:PARAM NIL "reader-function-name") ")")
       " to be used with " (:MACREF NIL "setf") " to modify the value of the "
       (:TERM NIL "slot") ". " :PAR)
      (:ITEM NIL " The " (:KWD NIL "allocation")
       " slot option is used to specify where storage is to be allocated for the given "
       (:TERM NIL "slot") ". Storage for a " (:TERM NIL "slot")
       " can be located in each instance or in the " (:TERM NIL "class") " "
       (:TERM NIL "object") " itself. The value of the "
       (:PARAM NIL "allocation-type") " argument can be either the keyword "
       (:KWD NIL "instance") " or the keyword " (:KWD NIL "class") ". If the "
       (:KWD NIL "allocation")
       " slot option is not specified, the effect is the same as specifying "
       (:TT NIL ":allocation :instance") ". "
       (:LIST NIL
        (:ITEM NIL "– If " (:PARAM NIL "allocation-type") " is "
         (:KWD NIL "instance") ", a " (:TERM NIL "local slot") " of the name "
         (:PARAM NIL "slot-name") " is allocated in each instance of the "
         (:TERM NIL "class") ". " :PAR)
        (:ITEM NIL "– If " (:PARAM NIL "allocation-type") " is "
         (:KWD NIL "class") ", a shared " (:TERM NIL "slot")
         " of the given name is allocated in the " (:TERM NIL "class") " "
         (:TERM NIL "object") " created by this " (:MACREF NIL "defclass")
         " form. The value of the " (:TERM NIL "slot") " is shared by all "
         (:TERM NIL "instances") " of the " (:TERM NIL "class") ". If a class "
         (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) " defines such a "
         (:TERM NIL "shared slot") ", any subclass "
         (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) " of "
         (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1")))
         " will share this single " (:TERM NIL "slot") " unless the "
         (:MACREF NIL "defclass") " form for "
         (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) " specifies a "
         (:TERM NIL "slot") " of the same " (:TERM NIL "name")
         " or there is a superclass of "
         (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) " that precedes "
         (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1")))
         " in the class precedence list of "
         (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2")))
         " and that defines a " (:TERM NIL "slot") " of the same "
         (:TERM NIL "name") ". "))
       " ")
      (:ITEM NIL " The " (:KWD NIL "initform")
       " slot option is used to provide a default initial value form to be used in the initialization of the "
       (:TERM NIL "slot") ". This " (:TERM NIL "form")
       " is evaluated every time it is used to initialize the "
       (:TERM NIL "slot") ". The lexical environment in which this "
       (:TERM NIL "form")
       " is evaluated is the lexical environment in which the "
       (:MACREF NIL "defclass")
       " form was evaluated. Note that the lexical environment refers both to variables and to functions. For "
       (:TERM NIL "local slots")
       ", the dynamic environment is the dynamic environment in which "
       (:FUNREF NIL "make-instance") " is called; for shared "
       (:TERM NIL "slots")
       ", the dynamic environment is the dynamic environment in which the "
       (:MACREF NIL "defclass") " form was evaluated. See "
       (:SECREF NIL :OBJECT-CREATION-AND-INIT) ". " :PAR
       "No implementation is permitted to extend the syntax of "
       (:MACREF NIL "defclass") " to allow "
       (:TT NIL "(" (:PARAM NIL "slot-name") " " (:PARAM NIL "form") ")")
       " as an abbreviation for "
       (:TT NIL "(" (:PARAM NIL "slot-name") " :initform " (:PARAM NIL "form")
        ")")
       ". "
       (:REVIEWER NIL "Barmar: Can you extend this to mean something else?")
       " " :PAR)
      (:ITEM NIL " The " (:KWD NIL "initarg")
       " slot option declares an initialization argument named "
       (:PARAM NIL "initarg-name")
       " and specifies that this initialization argument initializes the given "
       (:TERM NIL "slot")
       ". If the initialization argument has a value in the call to "
       (:FUNREF NIL "initialize-instance")
       ", the value will be stored into the given " (:TERM NIL "slot")
       ", and the slot's " (:KWD NIL "initform")
       " slot option, if any, is not evaluated. If none of the initialization arguments specified for a given "
       (:TERM NIL "slot") " has a value, the " (:TERM NIL "slot")
       " is initialized according to the " (:KWD NIL "initform")
       " slot option, if specified. " :PAR)
      (:ITEM NIL " The " (:KWD NIL "type")
       " slot option specifies that the contents of the " (:TERM NIL "slot")
       " will always be of the specified data type. It effectively declares the result type of the reader generic function when applied to an "
       (:TERM NIL "object") " of this " (:TERM NIL "class")
       ". The consequences of attempting to store in a " (:TERM NIL "slot")
       " a value that does not satisfy the type of the " (:TERM NIL "slot")
       " are undefined. The " (:KWD NIL "type")
       " slot option is further discussed in " (:SECREF NIL :SLOT-INHERITANCE)
       ". " :PAR)
      (:ITEM NIL " The " (:KWD NIL "documentation") " slot option provides a "
       (:TERM NIL "documentation string") " for the " (:TERM NIL "slot") ". "
       (:KWD NIL "documentation") " can be supplied once at most for a given "
       (:TERM NIL "slot") ". " (:REVIEWER NIL "Barmar: How is this retrieved?")
       " "))
     " " :PAR "Each class option is an option that refers to the "
     (:TERM NIL "class") " as a whole. "
     (:COMMENT NIL "!!! Barmar alleges that there are none of these:"
      "or to all class \\term{slots}.")
     "The following class options are available: " :PAR
     (:LIST NIL
      (:ITEM NIL " The " (:KWD NIL "default-initargs")
       " class option is followed by a list of alternating initialization argument "
       (:TERM NIL "names")
       " and default initial value forms. If any of these initialization arguments does not appear in the initialization argument list supplied to "
       (:FUNREF NIL "make-instance")
       ", the corresponding default initial value form is evaluated, and the initialization argument "
       (:TERM NIL "name") " and the " (:TERM NIL "form")
       "'s value are added to the end of the initialization argument list before the instance is created; see "
       (:SECREF NIL :OBJECT-CREATION-AND-INIT)
       ". The default initial value form is evaluated each time it is used. The lexical environment in which this "
       (:TERM NIL "form")
       " is evaluated is the lexical environment in which the "
       (:MACREF NIL "defclass")
       " form was evaluated. The dynamic environment is the dynamic environment in which "
       (:FUNREF NIL "make-instance")
       " was called. If an initialization argument " (:TERM NIL "name")
       " appears more than once in a " (:KWD NIL "default-initargs")
       " class option, an error is signaled. " :PAR)
      (:ITEM NIL " " (:ISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " The "
       (:KWD NIL "documentation") " class option causes a "
       (:TERM NIL "documentation string") " to be attached with the "
       (:TERM NIL "class") " " (:TERM NIL "object") ", and attached with kind "
       (:MISC NIL "type") " to the " (:PARAM NIL "class-name") ". "
       (:KWD NIL "documentation") " can be supplied once at most. "
       (:ENDISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " " :PAR)
      (:ITEM NIL " The " (:KWD NIL "metaclass")
       " class option is used to specify that instances of the "
       (:TERM NIL "class")
       " being defined are to have a different metaclass than the default provided by the system (the "
       (:TERM NIL "class") " " (:TYPEREF NIL "standard-class") "). " :PAR))
     " " :PAR "Note the following rules of " (:MACREF NIL "defclass") " for "
     (:TERM NIL "standard classes") ": " :PAR
     (:LIST NIL
      (:ITEM NIL " It is not required that the " (:TERM NIL "superclasses")
       " of a " (:TERM NIL "class") " be defined before the "
       (:MACREF NIL "defclass") " form for that " (:TERM NIL "class")
       " is evaluated. " :PAR)
      (:ITEM NIL " All the " (:TERM NIL "superclasses") " of a "
       (:TERM NIL "class") " must be defined before an " (:TERM NIL "instance")
       " of the " (:TERM NIL "class") " can be made. " :PAR)
      (:ITEM NIL " A " (:TERM NIL "class")
       " must be defined before it can be used as a parameter specializer in a "
       (:MACREF NIL "defmethod") " form. " :PAR))
     " " :PAR
     "The object system can be extended to cover situations where these rules are not obeyed. "
     :PAR "Some slot options are inherited by a " (:TERM NIL "class")
     " from its " (:TERM NIL "superclasses")
     ", and some can be shadowed or altered by providing a local slot description. No class options except "
     (:KWD NIL "default-initargs")
     " are inherited. For a detailed description of how " (:TERM NIL "slots")
     " and slot options are inherited, see " (:SECREF NIL :SLOT-INHERITANCE)
     ". " :PAR "The options to " (:MACREF NIL "defclass")
     " can be extended. It is required that all implementations signal an error if they observe a class option or a slot option that is not implemented locally. "
     :PAR
     "It is valid to specify more than one reader, writer, accessor, or initialization argument for a "
     (:TERM NIL "slot")
     ". No other slot option can appear more than once in a single slot description, or an error is signaled. "
     :PAR "If no reader, writer, or accessor is specified for a "
     (:TERM NIL "slot") ", the " (:TERM NIL "slot") " can only be "
     (:TERM NIL "accessed") " by the " (:TERM NIL "function") " "
     (:FUNREF NIL "slot-value") ". " :PAR
     (:COMMENT NIL
      "The macro \\macref{defclass} defines a new named \\term{class}.")
     :PAR
     (:COMMENT NIL "Defining a new \\term{class} also causes a "
      "\\term{type} of the same \\term{name} to be defined.")
     :PAR
     (:COMMENT NIL
      "The \\kwd{reader} slot option causes an \\term{unqualified method} "
      "to be defined on the \\term{generic function} named "
      "\\param{reader-function-name} to read the value of the given \\term{slot}.")
     :PAR
     (:COMMENT NIL
      "The \\kwd{writer} slot option causes an \\term{unqualified method}"
      "to be defined on the \\term{generic function} named "
      "\\param{writer-function-name} to write the value of the \\term{slot}. ")
     :PAR
     (:COMMENT NIL
      "The \\kwd{accessor} slot option causes an \\term{unqualified method}"
      "to be defined on the \\term{generic function} named "
      "\\param{reader-function-name} to read the value of the given \\term{slot}"
      "and an \\term{unqualified method} to be defined on the "
      "\\term{generic function} named {\\tt (setf \\param{reader-function-name})} to be"
      "used with \\macref{setf} to modify the value of the \\term{slot}.")
     :PAR
     (:COMMENT NIL
      "The \\kwd{initarg} slot option declares an initialization argument"
      "named \\param{initarg-name}.")
     :PAR (:ISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     (:COMMENT NIL " added qualification about top-level-ness  --sjl 5 Mar 92")
     "If a " (:MACREF NIL "defclass") " " (:TERM NIL "form") " appears as a "
     (:TERM NIL "top level form") ", the " (:TERM NIL "compiler")
     " must make the " (:TERM NIL "class") " " (:TERM NIL "name")
     " be recognized as a valid " (:TERM NIL "type") " " (:TERM NIL "name")
     " in subsequent declarations (as for " (:MACREF NIL "deftype")
     ") and be recognized as a valid " (:TERM NIL "class") " "
     (:TERM NIL "name") " for " (:MACREF NIL "defmethod") " "
     (:TERM NIL "parameter specializers") " and for use as the "
     (:KWD NIL "metaclass") " option of a subsequent " (:MACREF NIL "defclass")
     ". The " (:TERM NIL "compiler") " must make "
     (:COMMENT NIL
      "%!!! this doesn't look right. maybe \"a class object\"? -kmp 7-Jun-91")
     "the " (:TERM NIL "class") " definition available to be returned by "
     (:FUNREF NIL "find-class") " when its " (:PARAM NIL "environment") " "
     (:TERM NIL "argument") " is a value received as the "
     (:TERM NIL "environment parameter") " of a " (:TERM NIL "macro") ". "
     (:ENDISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "If there are any duplicate slot names, an error of " (:TERM NIL "type")
     " " (:TYPEREF NIL "program-error") " is signaled. " :PAR
     "If an initialization argument " (:TERM NIL "name")
     " appears more than once in " (:KWD NIL "default-initargs")
     " class option, an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "program-error") " is signaled. " :PAR
     "If any of the following slot options appears more than once in a single slot description, an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "program-error") " is signaled: "
     (:KWD NIL "allocation") ", " (:KWD NIL "initform") ", " (:KWD NIL "type")
     ", " (:KWD NIL "documentation") ". " :PAR
     "It is required that all implementations signal an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "program-error")
     " if they observe a class option or a slot option that is not implemented locally. "
     :PAR
     (:COMMENT NIL "%gray's annotation"
      ">Other possible errors are an undefined metaclass or attempting to"
      ">redefine the name of an existing type with an incompatible metaclass"
      ">{e.g.  DEFCLASS for a name previously defined by DEFSTRUCT or DEFTYPE}.")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "documentation") ", "
     (:FUNREF NIL "initialize-instance") ", " (:FUNREF NIL "make-instance")
     ", " (:FUNREF NIL "slot-value") ", " (:SECREF NIL :CLASSES) ", "
     (:SECREF NIL :INHERITANCE) ", " (:SECREF NIL :CLASS-RE-DEF) ", "
     (:SECREF NIL :DETERMINING-THE-CPL) ", "
     (:SECREF NIL :OBJECT-CREATION-AND-INIT) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DEFGENERIC")
   (:COM (:NAME "defgeneric" :FTYPE "Macro") (:ISSUE NIL "DECLS-AND-DOC") " "
    :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "defgeneric")
      (:ARGLIST NIL "function-name gf-lambda-list "
       (:INTERLEAVE NIL (:DOWN NIL "option") " | "
        (:STAR NIL (:CURLY NIL (:DOWN NIL "method-description")))))
      (:VALUES NIL "new-generic"))
     " " :PAR
     (:BNF (:NAME "option")
      (:PAREN NIL (:KWD NIL "argument-precedence-order") " "
       (:PLUS NIL (:CURLY NIL (:PARAM NIL "parameter-name"))))
      " |" (:BR NIL) " "
      (:PAREN NIL (:MISC NIL "declare") " "
       (:PLUS NIL (:CURLY NIL (:PARAM NIL "gf-declaration"))))
      " |" (:BR NIL) " "
      (:PAREN NIL (:KWD NIL "documentation") " "
       (:PARAM NIL "gf-documentation"))
      " |" (:BR NIL) " "
      (:PAREN NIL (:KWD NIL "method-combination") " "
       (:PARAM NIL "method-combination") " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "method-combination-argument"))))
      " |" (:BR NIL) " "
      (:PAREN NIL (:KWD NIL "generic-function-class") " "
       (:PARAM NIL "generic-function-class"))
      " |" (:BR NIL) " "
      (:PAREN NIL (:KWD NIL "method-class") " " (:PARAM NIL "method-class")))
     " "
     (:BNF (:NAME "method-description") "(" (:KWD NIL "method") " "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "method-qualifier"))) " "
      (:PARAM NIL "specialized-lambda-list") " "
      (:INTERLEAVE NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration")))
       " | " (:PARAM NIL "documentation"))
      " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))) ")")
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "function-name")
     "—a " (:TERM NIL "function name") ". " :PAR
     (:PARAM NIL "generic-function-class") "—a " (:TERM NIL "non-nil") " "
     (:TERM NIL "symbol") " naming a " (:TERM NIL "class") ". " :PAR
     (:PARAM NIL "gf-declaration") "—an " (:DECLREF NIL "optimize") " "
     (:TERM NIL "declaration specifier") "; other "
     (:TERM NIL "declaration specifiers") " are not permitted. "
     (:COMMENT NIL "% Barmar: What's the theory here?"
      "%         Are \\declref{ignore} and \\declref{dynamic-extent} in or out?}"
      "   \\declref{special}, \\declref{ftype}, \\declref{function}, "
      "   \\declref{inline}, \\declref{notinline}, and \\declref{declaration} "
      "  declarations are not permitted.")
     :PAR (:PARAM NIL "gf-documentation") "—a " (:TERM NIL "string")
     "; not evaluated. " :PAR (:PARAM NIL "gf-lambda-list") "—a "
     (:TERM NIL "generic function lambda list") ". " :PAR
     (:PARAM NIL "method-class") "—a " (:TERM NIL "non-nil") " "
     (:TERM NIL "symbol") " naming a " (:TERM NIL "class") ". " :PAR
     (:PARAM NIL "method-combination-argument") "—an " (:TERM NIL "object.")
     " "
     (:COMMENT NIL "% Barmar: Redundant with info to follow."
      "suitable as \\term{arguments} to the \\param{method-combination-name};"
      "the standard method combination type does not support"
      "any \\term{arguments}." "All types of method combination defined by the"
      "short form of \\macref{define-method-combination} accept"
      "\\kwd{order}, which defaults to \\kwd{most-specific-first}.")
     :PAR (:PARAM NIL "method-combination-name") "—a " (:TERM NIL "symbol")
     " naming a " (:TERM NIL "method combination") " " (:TERM NIL "type") ". "
     :PAR (:PARAM NIL "method-qualifiers") ", "
     (:PARAM NIL "specialized-lambda-list") ", " (:PARAM NIL "declarations")
     ", " (:PARAM NIL "documentation") ", " (:PARAM NIL "forms") "—as per "
     (:MACREF NIL "defmethod") ". " :PAR (:PARAM NIL "new-generic") "—the "
     (:TERM NIL "generic function") " " (:TERM NIL "object") ". " :PAR
     (:PARAM NIL "parameter-name") "—a " (:TERM NIL "symbol") " that names a "
     (:TERM NIL "required parameter") " in the " (:PARAM NIL "lambda-list")
     ". (If the " (:KWD NIL "argument-precedence-order")
     " option is specified, each " (:TERM NIL "required parameter") " in the "
     (:PARAM NIL "lambda-list") " must be used exactly once as a "
     (:PARAM NIL "parameter-name") ".) " :PAR)
    (:PART (:NAME "Description") " " :PAR "The macro "
     (:MACREF NIL "defgeneric") " is used to define a "
     (:TERM NIL "generic function")
     " or to specify options and declarations that pertain to a "
     (:TERM NIL "generic function") " as a whole. " :PAR
     (:COMMENT NIL
      "!!! Rewrite in terms of \"fboundp\" to avoid function calls?")
     "If " (:PARAM NIL "function-name") " is a " (:TERM NIL "list")
     " it must be of the form " (:TT NIL " (setf " (:I NIL "symbol") ")")
     ". If " (:TT NIL "(fboundp " (:PARAM NIL "function-name") ")") " is "
     (:TERM NIL "false") ", a new " (:TERM NIL "generic function")
     " is created. " (:ISSUE NIL "FUNCTION-NAME:LARGE") " If "
     (:TT NIL "(fdefinition " (:PARAM NIL "function-name") ")") " is a "
     (:TERM NIL "generic function") ", that "
     (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " " (:TERM NIL "generic function")
     " is modified. If " (:PARAM NIL "function-name") " names an "
     (:TERM NIL "ordinary function") ", a " (:TERM NIL "macro") ", or a "
     (:TERM NIL "special operator") ", an error is signaled. " :PAR
     "The effect of the " (:MACREF NIL "defgeneric")
     " macro is as if the following three steps were performed: first, "
     (:TERM NIL "methods") " defined by previous " (:MACREF NIL "defgeneric")
     " " (:TERM NIL "forms") " are removed; "
     (:REVIEWER NIL "Barmar: Shouldn't this (second) be first?") " second, "
     (:FUNREF NIL "ensure-generic-function") " is called; and finally, "
     (:TERM NIL "methods") " specified by the current "
     (:MACREF NIL "defgeneric") " " (:TERM NIL "form") " are added to the "
     (:TERM NIL "generic function") ". " :PAR "Each "
     (:PARAM NIL "method-description") " defines a " (:TERM NIL "method")
     " on the " (:TERM NIL "generic function") ". The "
     (:TERM NIL "lambda list") " of each " (:TERM NIL "method")
     " must be congruent with the " (:TERM NIL "lambda list")
     " specified by the " (:PARAM NIL "gf-lambda-list") " option. If no "
     (:TERM NIL "method") " descriptions are specified and a "
     (:TERM NIL "generic function")
     " of the same name does not already exist, a "
     (:TERM NIL "generic function") " with no " (:TERM NIL "methods")
     " is created. " :PAR "The " (:PARAM NIL "gf-lambda-list") " argument of "
     (:MACREF NIL "defgeneric") " specifies the shape of "
     (:TERM NIL "lambda lists") " for the " (:TERM NIL "methods") " on this "
     (:TERM NIL "generic function") ". All " (:TERM NIL "methods")
     " on the resulting " (:TERM NIL "generic function") " must have "
     (:TERM NIL "lambda lists") " that are congruent with this shape. If a "
     (:MACREF NIL "defgeneric") " form is evaluated and some "
     (:TERM NIL "methods") " for that " (:TERM NIL "generic function") " have "
     (:TERM NIL "lambda lists")
     " that are not congruent with that given in the "
     (:MACREF NIL "defgeneric")
     " form, an error is signaled. For further details on method congruence, see "
     (:SECREF NIL :GF-METHOD-LAMBDA-LIST-CONGRUENCY) ". " :PAR "The "
     (:TERM NIL "generic function") " passes to the " (:TERM NIL "method")
     " all the argument values passed to it, and only those; default values are not supported. Note that optional and keyword arguments in method definitions, however, can have default initial value forms and can use supplied-p parameters. "
     :PAR "The following options are provided. "
     (:ISSUE NIL "DEFGENERIC-DECLARE:ALLOW-MULTIPLE")
     " Except as otherwise noted, "
     (:ENDISSUE NIL "DEFGENERIC-DECLARE:ALLOW-MULTIPLE")
     " a given option may occur only once. " :PAR
     (:LIST NIL
      (:ITEM NIL " The " (:KWD NIL "argument-precedence-order")
       " option is used to specify the order in which the required arguments in a call to the "
       (:TERM NIL "generic function")
       " are tested for specificity when selecting a particular "
       (:TERM NIL "method") ". Each required argument, as specified in the "
       (:PARAM NIL "gf-lambda-list")
       " argument, must be included exactly once as a "
       (:PARAM NIL "parameter-name")
       " so that the full and unambiguous precedence order is supplied. If this condition is not met, an error is signaled. "
       (:REVIEWER NIL "Barmar: What is the default order?") " " :PAR)
      (:ITEM NIL " The " (:MISC NIL "declare")
       " option is used to specify declarations that pertain to the "
       (:TERM NIL "generic function") ". " :PAR "An " (:DECLREF NIL "optimize")
       " " (:TERM NIL "declaration specifier")
       " is allowed. It specifies whether method selection should be optimized for speed or space, but it has no effect on "
       (:TERM NIL "methods") ". To control how a " (:TERM NIL "method")
       " is optimized, an " (:DECLREF NIL "optimize")
       " declaration must be placed directly in the " (:MACREF NIL "defmethod")
       " " (:TERM NIL "form")
       " or method description. The optimization qualities "
       (:MISC NIL "speed") " and " (:MISC NIL "space")
       " are the only qualities this standard requires, but an implementation can extend the object system to recognize other qualities. A simple implementation that has only one method selection technique and ignores "
       (:DECLREF NIL "optimize") " " (:TERM NIL "declaration specifiers")
       " is valid. " :PAR "The " (:DECLREF NIL "special") ", "
       (:DECLREF NIL "ftype") ", " (:DECLREF NIL "function") ", "
       (:DECLREF NIL "inline") ", " (:DECLREF NIL "notinline") ", and "
       (:DECLREF NIL "declaration")
       " declarations are not permitted. Individual implementations can extend the "
       (:MISC NIL "declare") " option to support additional declarations. "
       (:EDITORNOTE NIL
        "KMP: Does “additional” mean including special, ftype, etc.? Or only other things that are not mentioned here?")
       " If an implementation notices a " (:TERM NIL "declaration specifier")
       " that it does not support and that has not been proclaimed as a non-standard "
       (:TERM NIL "declaration identifier") " name in a "
       (:DECLREF NIL "declaration") " " (:TERM NIL "proclamation")
       ", it should issue a warning. "
       (:EDITORNOTE NIL
        "KMP: The wording of this previous sentence, particularly the word “and” suggests to me that you can `proclaim declaration' of an unsupported declaration (e.g., ftype) in order to suppress the warning. That seems wrong. Perhaps it instead means to say “does not support or is both undefined and not proclaimed declaration.”")
       " " :PAR (:ISSUE NIL "DEFGENERIC-DECLARE:ALLOW-MULTIPLE") " The "
       (:MISC NIL "declare")
       " option may be specified more than once. The effect is the same as if the lists of "
       (:TERM NIL "declaration specifiers")
       " had been appended together into a single list and specified as a single "
       (:MISC NIL "declare") " option. "
       (:ENDISSUE NIL "DEFGENERIC-DECLARE:ALLOW-MULTIPLE") " " :PAR)
      (:ITEM NIL " The " (:KWD NIL "documentation") " argument is a "
       (:TERM NIL "documentation string") " to be attached to the "
       (:TERM NIL "generic function") " " (:TERM NIL "object")
       ", and to be attached with kind " (:MISC NIL "function") " to the "
       (:PARAM NIL "function-name") ". " :PAR)
      (:ITEM NIL " The " (:KWD NIL "generic-function-class")
       " option may be used to specify that the "
       (:TERM NIL "generic function") " is to have a different "
       (:TERM NIL "class") " than the default provided by the system (the "
       (:TERM NIL "class") " " (:TYPEREF NIL "standard-generic-function")
       "). The " (:PARAM NIL "class-name") " argument is the name of a "
       (:TERM NIL "class") " that can be the " (:TERM NIL "class") " of a "
       (:TERM NIL "generic function") ". If " (:PARAM NIL "function-name")
       " specifies an existing " (:TERM NIL "generic function")
       " that has a different value for the "
       (:KWD NIL "generic-function-class")
       " argument and the new generic function " (:TERM NIL "class")
       " is compatible with the old, " (:FUNREF NIL "change-class")
       " is called to change the " (:TERM NIL "class") " of the "
       (:TERM NIL "generic function") "; otherwise an error is signaled. "
       :PAR)
      (:ITEM NIL " The " (:KWD NIL "method-class")
       " option is used to specify that all " (:TERM NIL "methods") " on this "
       (:TERM NIL "generic function") " are to have a different "
       (:TERM NIL "class") " from the default provided by the system (the "
       (:TERM NIL "class") " " (:TYPEREF NIL "standard-method") "). The "
       (:PARAM NIL "class-name") " argument is the name of a "
       (:TERM NIL "class") " that is capable of being the " (:TERM NIL "class")
       " of a " (:TERM NIL "method") ". "
       (:REVIEWER NIL "Barmar: Is " (:FUNREF NIL "change-class")
        " called on existing methods?")
       " " :PAR)
      (:ITEM NIL " The " (:KWD NIL "method-combination")
       " option is followed by a symbol that names a type of method combination. The arguments (if any) that follow that symbol depend on the type of method combination. Note that the standard method combination type does not support any arguments. However, all types of method combination defined by the short form of "
       (:MACREF NIL "define-method-combination")
       " accept an optional argument named " (:PARAM NIL "order")
       ", defaulting to " (:KWD NIL "most-specific-first")
       ", where a value of " (:KWD NIL "most-specific-last")
       " reverses the order of the primary " (:TERM NIL "methods")
       " without affecting the order of the auxiliary " (:TERM NIL "methods")
       ". " :PAR))
     " " :PAR "The " (:PARAM NIL "method-description") " arguments define "
     (:TERM NIL "methods") " that will be associated with the "
     (:TERM NIL "generic function") ". The " (:PARAM NIL "method-qualifier")
     " and " (:PARAM NIL "specialized-lambda-list")
     " arguments in a method description are the same as for "
     (:MACREF NIL "defmethod") ". " :PAR "The " (:PARAM NIL "form")
     " arguments specify the method body. The body of the "
     (:TERM NIL "method") " is enclosed in an " (:TERM NIL "implicit block")
     ". If " (:PARAM NIL "function-name") " is a " (:TERM NIL "symbol")
     ", this block bears the same name as the " (:TERM NIL "generic function")
     ". If " (:PARAM NIL "function-name") " is a " (:TERM NIL "list")
     " of the form " (:TT NIL " (setf " (:PARAM NIL "symbol") ")")
     ", the name of the block is " (:PARAM NIL "symbol") ". " :PAR
     "Implementations can extend " (:MACREF NIL "defgeneric")
     " to include other options. It is required that an implementation signal an error if it observes an option that is not implemented locally. "
     :PAR (:ISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     (:MACREF NIL "defgeneric")
     " is not required to perform any compile-time side effects. In particular, the "
     (:TERM NIL "methods")
     " are not installed for invocation during compilation. An "
     (:TERM NIL "implementation") " may choose to store information about the "
     (:TERM NIL "generic function")
     " for the purposes of compile-time error-checking (such as checking the number of arguments on calls, or noting that a definition for the function name has been seen). "
     (:ENDISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If "
     (:PARAM NIL "function-name") " names an " (:TERM NIL "ordinary function")
     ", a " (:TERM NIL "macro") ", or a " (:TERM NIL "special operator")
     ", an error of " (:TERM NIL "type") " " (:TYPEREF NIL "program-error")
     " is signaled. " :PAR "Each required argument, as specified in the "
     (:PARAM NIL "gf-lambda-list")
     " argument, must be included exactly once as a "
     (:PARAM NIL "parameter-name") ", or an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "program-error") " is signaled. " :PAR "The "
     (:TERM NIL "lambda list") " of each " (:TERM NIL "method")
     " specified by a " (:PARAM NIL "method-description")
     " must be congruent with the " (:TERM NIL "lambda list")
     " specified by the " (:PARAM NIL "gf-lambda-list")
     " option, or an error of " (:TERM NIL "type") " " (:TYPEREF NIL "error")
     " is signaled. " :PAR "If a " (:MACREF NIL "defgeneric")
     " form is evaluated and some " (:TERM NIL "methods") " for that "
     (:TERM NIL "generic function") " have " (:TERM NIL "lambda lists")
     " that are not congruent with that given in the "
     (:MACREF NIL "defgeneric") " form, an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") " is signaled. " :PAR "A given "
     (:PARAM NIL "option") " may occur only once, or an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "program-error") " is signaled. "
     :PAR
     (:REVIEWER NIL
      "Barmar: This says that an error is signaled if you specify the same generic function class as it already has!")
     " If " (:PARAM NIL "function-name") " specifies an existing "
     (:TERM NIL "generic function") " that has a different value for the "
     (:KWD NIL "generic-function-class")
     " argument and the new generic function " (:TERM NIL "class")
     " is compatible with the old, " (:FUNREF NIL "change-class")
     " is called to change the " (:TERM NIL "class") " of the "
     (:TERM NIL "generic function") "; otherwise an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error") " is signaled. " :PAR
     "Implementations can extend " (:MACREF NIL "defgeneric")
     " to include other options. It is required that an implementation signal an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "program-error")
     " if it observes an option that is not implemented locally. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defmethod") ", "
     (:FUNREF NIL "documentation") ", " (:FUNREF NIL "ensure-generic-function")
     ", " (:ISSUE NIL "GENERIC-FUNCTION-POORLY-DESIGNED:DELETE") " "
     (:COMMENT NIL "\\macref{generic-function},")
     (:TYPEREF NIL "generic-function") ", "
     (:ENDISSUE NIL "GENERIC-FUNCTION-POORLY-DESIGNED:DELETE") " "
     (:SECREF NIL :GF-METHOD-LAMBDA-LIST-CONGRUENCY) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DEFMETHOD")
   (:COM (:NAME "defmethod" :FTYPE "Macro") (:ISSUE NIL "DECLS-AND-DOC") " "
    :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:COMMENT NIL
      "!!! Barmar: \\macref{defun} and \\macref{defmacro} don't bother to show this detail"
      "      for the specialized lambda list, so why does \\macref{defmethod}?")
     :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "defmethod")
      (:ARGLIST NIL (:I NIL "function-name") " "
       (:STAR NIL (:CURLY NIL (:I NIL "method-qualifier"))) " "
       (:I NIL "specialized-lambda-list") " "
       (:INTERLEAVE NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration")))
        " | " (:PARAM NIL "documentation"))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL "new-method"))
     " " :PAR :PAR " " (:I NIL "function-name") "::" (:MATH NIL (:MO NIL "="))
     " "
     (:CURLY NIL (:TERM NIL "symbol") " " (:MATH NIL (:MO NIL "|")) " "
      (:TT NIL " (setf " (:TERM NIL "symbol") ")"))
     " " :PAR " " (:I NIL "method-qualifier") "::" (:MATH NIL (:MO NIL "="))
     " " (:TERM NIL "non-list") " " :PAR "  "
     (:TABLE (:TABS T)
      (:ROW NIL (:CELL NIL)
       (:CELL NIL (:I NIL "specialized-lambda-list") "::"
        (:MATH NIL (:MO NIL "=")) " (")
       (:CELL (:SPAN 2)
        (:STAR NIL
         (:CURLY NIL (:PARAM NIL "var") " " (:MATH NIL (:MO NIL "|")) " "
          (:RM NIL " (") (:PARAM NIL "var") " "
          (:I NIL "parameter-specializer-name") (:RM NIL " )")))))
      (:ROW NIL (:CELL NIL) (:CELL NIL)
       (:CELL (:SPAN 2)
        (:BRAC NIL (:KEYWORD NIL " &optional") " "
         (:STAR NIL
          (:CURLY NIL (:PARAM NIL "var") " " (:MATH NIL (:MO NIL "|")) " "
           (:RM NIL " (") "var "
           (:BRAC NIL (:PARAM NIL "initform") " "
            (:BRAC NIL (:PARAM NIL "supplied-p-parameter")) " ")
           (:RM NIL " )"))))))
      (:ROW NIL (:CELL NIL) (:CELL NIL)
       (:CELL (:SPAN 2) (:BRAC NIL (:TT NIL "&rest") " " (:PARAM NIL "var"))))
      (:ROW NIL (:CELL NIL) (:CELL NIL)
       (:CELL NIL (:TT NIL " [") (:KEYWORD NIL " &key"))
       (:CELL NIL
        (:STAR NIL
         (:CURLY NIL (:PARAM NIL "var") " " (:MATH NIL (:MO NIL "|")) " "
          (:RM NIL " (")
          (:CURLY NIL (:PARAM NIL "var") " " (:MATH NIL (:MO NIL "|")) " "
           (:RM NIL " (") (:TERM NIL "keyword") (:PARAM NIL "var")
           (:RM NIL " )"))
          " "
          (:BRAC NIL (:PARAM NIL "initform") " "
           (:BRAC NIL (:PARAM NIL "supplied-p-parameter")) " ")
          (:RM NIL " )")))))
      (:ROW NIL (:CELL NIL) (:CELL NIL) (:CELL NIL)
       (:CELL NIL (:BRAC NIL (:KEYREF NIL "allow-other-keys")) " "
        (:TT NIL " ]")))
      (:ROW NIL (:CELL NIL) (:CELL NIL)
       (:CELL (:SPAN 2)
        (:BRAC NIL (:TT NIL "&aux") " "
         (:STAR NIL
          (:CURLY NIL (:PARAM NIL "var") " " (:MATH NIL (:MO NIL "|")) " "
           (:RM NIL " (") (:PARAM NIL "var") " "
           (:BRAC NIL (:PARAM NIL "initform")) " " (:RM NIL " )"))))
        " " (:RM NIL " )"))))
     " " :PAR " "
     (:TABLE (:TABS T)
      (:ROW NIL (:CELL NIL)
       (:CELL NIL (:I NIL "parameter-specializer-name") "::"
        (:MATH NIL (:MO NIL "=")) " " (:TERM NIL "symbol") " "
        (:MATH NIL (:MO NIL "|")) " " (:RM NIL " (") (:TT NIL " eql") " "
        (:PARAM NIL "eql-specializer-form") (:RM NIL " )"))))
     " " :PAR " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "declaration")
     "—a " (:MISC NIL "declare") " " (:TERM NIL "expression")
     "; not evaluated. " :PAR (:PARAM NIL "documentation") "—a "
     (:TERM NIL "string") "; not evaluated. " :PAR (:PARAM NIL "var") "—a "
     (:TERM NIL "variable") " " (:TERM NIL "name") ". " :PAR
     (:PARAM NIL "eql-specializer-form") "—a " (:TERM NIL "form") ". " :PAR
     (:PARAM NIL "Form") "—a " (:TERM NIL "form") ". " :PAR
     (:PARAM NIL "Initform") "—a " (:TERM NIL "form") ". " :PAR
     (:PARAM NIL "Supplied-p-parameter") "—variable name. " :PAR
     (:PARAM NIL "new-method") "—the new " (:TERM NIL "method") " "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The macro "
     (:MACREF NIL "defmethod") " defines a " (:TERM NIL "method") " on a "
     (:TERM NIL "generic function") ". " :PAR
     (:COMMENT NIL "!!! Rewrite to use \"fbound\" ?") "If "
     (:TT NIL " (fboundp " (:I NIL "function-name") ")") " is "
     (:MISC NIL "nil") ", a " (:TERM NIL "generic function")
     " is created with default values for the argument precedence order (each argument is more specific than the arguments to its right in the argument list), for the generic function class (the "
     (:TERM NIL "class") " " (:TYPEREF NIL "standard-generic-function")
     "), for the method class (the " (:TERM NIL "class") " "
     (:TYPEREF NIL "standard-method")
     "), and for the method combination type (the standard method combination type). The "
     (:TERM NIL "lambda list") " of the " (:TERM NIL "generic function")
     " is congruent with the " (:TERM NIL "lambda list") " of the "
     (:TERM NIL "method") " being defined; if the " (:MACREF NIL "defmethod")
     " form mentions keyword arguments, the " (:TERM NIL "lambda list")
     " of the " (:TERM NIL "generic function") " will mention " (:TT NIL " ")
     "&key (but no keyword arguments). If " (:I NIL "function-name")
     " names an " (:TERM NIL "ordinary function") ", a " (:TERM NIL "macro")
     ", or a " (:TERM NIL "special operator") ", an error is signaled. " :PAR
     "If a " (:TERM NIL "generic function") " is currently named by "
     (:I NIL " function-name") ", the " (:TERM NIL "lambda list") " of the "
     (:TERM NIL "method") " must be congruent with the "
     (:TERM NIL "lambda list") " of the " (:TERM NIL "generic function")
     ". If this condition does not hold, an error is signaled. For a definition of congruence in this context, see "
     (:SECREF NIL :GF-METHOD-LAMBDA-LIST-CONGRUENCY) ". " :PAR
     (:COMMENT NIL "% gray says redundant with syntax spec."
      "If \\i{function-name} is a \\term{list},"
      "it must be of the form {\\tt (setf \\i{symbol})}.  "
      "\\i{Function-name} names the \\term{generic function}"
      "on which the \\term{method} is defined.")
     :PAR "Each " (:I NIL "method-qualifier") " argument is an "
     (:TERM NIL "object")
     " that is used by method combination to identify the given "
     (:TERM NIL "method")
     ". The method combination type might further restrict what a method "
     (:TERM NIL "qualifier")
     " can be. The standard method combination type allows for "
     (:TERM NIL "unqualified methods") " and " (:TERM NIL "methods")
     " whose sole " (:TERM NIL "qualifier") " is one of the keywords "
     (:KWD NIL "before") ", " (:KWD NIL "after") ", or " (:KWD NIL "around")
     ". " :PAR "The " (:I NIL "specialized-lambda-list")
     " argument is like an ordinary " (:TERM NIL "lambda list")
     " except that the " (:TERM NIL "names")
     " of required parameters can be replaced by specialized parameters. A specialized parameter is a list of the form "
     (:TT NIL "(" (:PARAM NIL "var") " " (:I NIL "parameter-specializer-name")
      ")")
     ". Only required parameters can be specialized. If "
     (:I NIL "parameter-specializer-name") " is a " (:TERM NIL "symbol")
     " it names a " (:TERM NIL "class") "; if it is a " (:TERM NIL "list")
     ", it is of the form "
     (:TT NIL "(eql " (:PARAM NIL "eql-specializer-form") ")")
     ". The parameter specializer name "
     (:TT NIL "(eql " (:PARAM NIL "eql-specializer-form") ")")
     " indicates that the corresponding argument must be " (:FUNREF NIL "eql")
     " to the " (:TERM NIL "object") " that is the value of "
     (:PARAM NIL "eql-specializer-form") " for the " (:TERM NIL "method")
     " to be applicable. " (:COMMENT NIL "%gray/moon addition") "The "
     (:PARAM NIL "eql-specializer-form")
     " is evaluated at the time that the expansion of the "
     (:MACREF NIL "defmethod") " macro is evaluated. " (:COMMENT NIL "%")
     "If no " (:TERM NIL "parameter specializer name")
     " is specified for a given required parameter, the "
     (:TERM NIL "parameter specializer") " defaults to the "
     (:TERM NIL "class") " " (:TYPEREF NIL "t")
     ". For further discussion, see " (:SECREF NIL :INTRO-TO-METHODS) ". " :PAR
     "The " (:PARAM NIL "form")
     " arguments specify the method body. The body of the "
     (:TERM NIL "method") " is enclosed in an " (:TERM NIL "implicit block")
     ". If " (:I NIL "function-name") " is a " (:TERM NIL "symbol")
     ", this block bears the same " (:TERM NIL "name") " as the "
     (:TERM NIL "generic function") ". If " (:I NIL "function-name") " is a "
     (:TERM NIL "list") " of the form "
     (:TT NIL " (setf " (:I NIL "symbol") ")") ", the " (:TERM NIL "name")
     " of the block is " (:I NIL "symbol") ". " :PAR "The " (:TERM NIL "class")
     " of the " (:TERM NIL "method") " " (:TERM NIL "object")
     " that is created is that given by the method class option of the "
     (:TERM NIL "generic function") " on which the " (:TERM NIL "method")
     " is defined. " :PAR "If the " (:TERM NIL "generic function")
     " already has a " (:TERM NIL "method") " that agrees with the "
     (:TERM NIL "method") " being defined on "
     (:TERM NIL "parameter specializers") " and " (:TERM NIL "qualifiers") ", "
     (:MACREF NIL "defmethod") " replaces the existing " (:TERM NIL "method")
     " with the one now being defined. For a definition of agreement in this context. see "
     (:SECREF NIL :SPECIALIZER-QUALIFIER-AGREEMENT) ". " :PAR "The "
     (:TERM NIL "parameter specializers") " are derived from the "
     (:TERM NIL "parameter specializer names") " as described in "
     (:SECREF NIL :INTRO-TO-METHODS) ". " :PAR "The expansion of the "
     (:MACREF NIL "defmethod")
     " macro “refers to” each specialized parameter (see the description of "
     (:DECLREF NIL "ignore") " within the description of "
     (:MISC NIL "declare") "). This includes parameters that have an explicit "
     (:TERM NIL "parameter specializer name") " of " (:MISC NIL "t")
     ". This means that a compiler warning does not occur if the body of the "
     (:TERM NIL "method")
     " does not refer to a specialized parameter, while a warning might occur if the body of the "
     (:TERM NIL "method")
     " does not refer to an unspecialized parameter. For this reason, a parameter that specializes on "
     (:MISC NIL "t")
     " is not quite synonymous with an unspecialized parameter in this context. "
     :PAR (:ISSUE NIL "DEFMETHOD-DECLARATION-SCOPE:CORRESPONDS-TO-BINDINGS")
     " Declarations at the head of the method body that apply to the method's "
     (:TERM NIL "lambda variables") " are treated as "
     (:TERM NIL "bound declarations") " whose " (:TERM NIL "scope")
     " is the same as the corresponding " (:TERM NIL "bindings") ". " :PAR
     "Declarations at the head of the method body that apply to the functional bindings of "
     (:FUNREF NIL "call-next-method") " or " (:FUNREF NIL "next-method-p")
     " apply to references to those functions within the method body "
     (:PARAM NIL "forms") ". Any outer " (:TERM NIL "bindings") " of the "
     (:TERM NIL "function names") " " (:FUNREF NIL "call-next-method") " and "
     (:FUNREF NIL "next-method-p") ", and declarations associated with such "
     (:TERM NIL "bindings") " are " (:TERM NIL "shadowed") (:SUB NIL "2")
     " within the method body " (:PARAM NIL "forms") ". " :PAR "The "
     (:TERM NIL "scope") " of " (:TERM NIL "free declarations")
     " at the head of the method body is the entire method body, which includes any implicit local function definitions but excludes "
     (:TERM NIL "initialization forms") " for the "
     (:TERM NIL "lambda variables") ". "
     (:ENDISSUE NIL "DEFMETHOD-DECLARATION-SCOPE:CORRESPONDS-TO-BINDINGS") " "
     :PAR (:ISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     (:MACREF NIL "defmethod")
     " is not required to perform any compile-time side effects. In particular, the "
     (:TERM NIL "methods")
     " are not installed for invocation during compilation. An "
     (:TERM NIL "implementation") " may choose to store information about the "
     (:TERM NIL "generic function")
     " for the purposes of compile-time error-checking (such as checking the number of arguments on calls, or noting that a definition for the function name has been seen). "
     (:ENDISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     :PAR (:ISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " "
     (:PARAM NIL "Documentation") " is attached as a "
     (:TERM NIL "documentation string") " to the " (:TERM NIL "method") " "
     (:TERM NIL "object") ". "
     (:ENDISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The definition of the referenced "
     (:TERM NIL "generic function") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If "
     (:I NIL "function-name") " names an " (:TERM NIL "ordinary function")
     ", a " (:TERM NIL "macro") ", or a " (:TERM NIL "special operator")
     ", an error of " (:TERM NIL "type") " " (:TYPEREF NIL "error")
     " is signaled. " :PAR "If a " (:TERM NIL "generic function")
     " is currently named by " (:I NIL " function-name") ", the "
     (:TERM NIL "lambda list") " of the " (:TERM NIL "method")
     " must be congruent with the " (:TERM NIL "lambda list") " of the "
     (:TERM NIL "generic function") ", or an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") " is signaled. " :PAR
     (:COMMENT NIL "% gray addition"
      "Also get an error for an undefined specializer class.")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defgeneric") ", "
     (:FUNREF NIL "documentation") ", " (:SECREF NIL :INTRO-TO-METHODS) ", "
     (:SECREF NIL :GF-METHOD-LAMBDA-LIST-CONGRUENCY) ", "
     (:SECREF NIL :SPECIALIZER-QUALIFIER-AGREEMENT) ", "
     (:SECREF NIL :DOC-VS-DECLS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FIND-CLASS")
   (:COM (:NAME "find-class" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "find-class")
      (:ARGLIST NIL "symbol " (:KEYWORD NIL " &optional")
       " errorp environment")
      (:VALUES NIL "class"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "find-class")
      (:ARGLIST NIL "symbol " (:KEYWORD NIL " &optional")
       " errorp environment")
      (:NEW-VALUE NIL "new-class"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbol") "—a "
     (:TERM NIL "symbol") ". " :PAR (:PARAM NIL "errorp") "—a "
     (:TERM NIL "generalized boolean") ". The default is " (:TERM NIL "true")
     ". " :PAR (:PARAM NIL "environment") "—same as the "
     (:KEYREF NIL "environment")
     " argument to macro expansion functions and is used to distinguish between compile-time and run-time environments. "
     (:ISSUE NIL "MACRO-ENVIRONMENT-EXTENT:DYNAMIC") " The "
     (:KEYREF NIL "environment") " argument has " (:TERM NIL "dynamic extent")
     "; the consequences are undefined if the " (:KEYREF NIL "environment")
     " argument is referred to outside the " (:TERM NIL "dynamic extent")
     " of the macro expansion function. "
     (:ENDISSUE NIL "MACRO-ENVIRONMENT-EXTENT:DYNAMIC") " "
     (:COMMENT NIL "!!! Default?") :PAR (:PARAM NIL "class") "—a "
     (:TERM NIL "class") " " (:TERM NIL "object") ", or " (:MISC NIL "nil")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns the " (:TERM NIL "class")
     " " (:TERM NIL "object") " named by the " (:PARAM NIL "symbol") " in the "
     (:PARAM NIL "environment") ". If there is no such " (:TERM NIL "class")
     ", " (:MISC NIL "nil") " is returned if " (:PARAM NIL "errorp") " is "
     (:TERM NIL "false") "; otherwise, if " (:PARAM NIL "errorp") " is "
     (:TERM NIL "true") ", an error is signaled. " :PAR "The "
     (:TERM NIL "class") " associated with a particular " (:TERM NIL "symbol")
     " can be changed by using " (:MACREF NIL "setf") " with "
     (:FUNREF NIL "find-class") "; " (:ISSUE NIL "SETF-FIND-CLASS:ALLOW-NIL")
     " or, if the new " (:TERM NIL "class") " given to " (:MACREF NIL "setf")
     " is " (:MISC NIL "nil") ", the " (:TERM NIL "class")
     " association is removed (but the " (:TERM NIL "class") " "
     (:TERM NIL "object") " itself is not affected). "
     (:ENDISSUE NIL "SETF-FIND-CLASS:ALLOW-NIL")
     " The results are undefined if the user attempts to change "
     (:ISSUE NIL "SETF-FIND-CLASS:ALLOW-NIL") " or remove "
     (:ENDISSUE NIL "SETF-FIND-CLASS:ALLOW-NIL") " the " (:TERM NIL "class")
     " associated with a " (:TERM NIL "symbol") " that is defined as a "
     (:TERM NIL "type specifier") " in this standard. See "
     (:SECREF NIL :INTEGRATING-TYPES-AND-CLASSES) ". " :PAR "When using "
     (:MACREF NIL "setf") " of " (:MISC NIL "find-class") ", any "
     (:PARAM NIL "errorp") " argument is " (:TERM NIL "evaluated")
     " for effect, but any " (:TERM NIL "values")
     " it returns are ignored; the " (:PARAM NIL "errorp") " "
     (:TERM NIL "parameter") " is permitted primarily so that the "
     (:PARAM NIL "environment") " " (:TERM NIL "parameter") " can be used. "
     :PAR "The " (:PARAM NIL "environment")
     " might be used to distinguish between a compile-time and a run-time environment. "
     :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If there is no such "
     (:TERM NIL "class") " and " (:PARAM NIL "errorp") " is "
     (:TERM NIL "true") ", " (:FUNREF NIL "find-class") " signals an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defmacro") ", "
     (:SECREF NIL :INTEGRATING-TYPES-AND-CLASSES) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== NEXT-METHOD-P")
   (:COM (:NAME "next-method-p" :FTYPE "Local Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "next-method-p")
      (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments")))
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "generalized-boolean") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The locally defined function "
     (:FUNREF NIL "next-method-p") " can be used "
     (:ISSUE NIL "METHOD-INITFORM:FORBID-CALL-NEXT-METHOD") " within the body "
     (:TERM NIL "forms") " (but not the " (:TERM NIL "lambda list") ") "
     (:ENDISSUE NIL "METHOD-INITFORM:FORBID-CALL-NEXT-METHOD") " defined by a "
     (:TERM NIL "method-defining form") " to determine whether a next "
     (:TERM NIL "method") " exists. " :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "next-method-p") " has " (:TERM NIL "lexical scope") " and "
     (:TERM NIL "indefinite extent") ". " :PAR
     (:ISSUE NIL "LEXICAL-CONSTRUCT-GLOBAL-DEFINITION:UNDEFINED")
     " Whether or not " (:FUNREF NIL "next-method-p") " is "
     (:TERM NIL "fbound") " in the " (:TERM NIL "global environment") " is "
     (:TERM NIL "implementation-dependent")
     "; however, the restrictions on redefinition and " (:TERM NIL "shadowing")
     " of " (:FUNREF NIL "next-method-p") " are the same as for "
     (:TERM NIL "symbols") " in the " (:PACKREF NIL "common-lisp") " "
     (:TERM NIL "package") " which are " (:TERM NIL "fbound") " in the "
     (:TERM NIL "global environment")
     ". The consequences of attempting to use " (:FUNREF NIL "next-method-p")
     " outside of a " (:TERM NIL "method-defining form") " are undefined. "
     (:ENDISSUE NIL "LEXICAL-CONSTRUCT-GLOBAL-DEFINITION:UNDEFINED") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "call-next-method") ", "
     (:MACREF NIL "defmethod") ", " (:MACREF NIL "call-method") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== CALL-METHOD" "%% ========== MAKE-METHOD"
    "!!! ACW wonders if one of these is a Local Function.")
   (:COM (:NAME "call-method, make-method" :FTYPE "Local Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "call-method")
      (:ARGLIST NIL "method " (:KEYWORD NIL " &optional") " next-method-list")
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " "
     (:DEF (:KIND "macro") (:NAMES NIL "make-method") (:ARGLIST NIL "form")
      (:VALUES NIL "method-object"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL " Moon notes that arguments are not evaluated.") :PAR
     (:PARAM NIL "method") "—a " (:TERM NIL "method") " " (:TERM NIL "object")
     ", or a " (:TERM NIL "list") " (see below); not evaluated. " :PAR
     (:PARAM NIL "method-object") "—a " (:TERM NIL "method") " "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "next-method-list") "—a "
     (:TERM NIL "list") " of " (:PARAM NIL "method") " " (:TERM NIL "objects")
     "; not evaluated. " :PAR (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " returned by the " (:TERM NIL "method")
     " invocation. " :PAR)
    (:PART (:NAME "Description") " " :PAR "The macro "
     (:MACREF NIL "call-method")
     " is used in method combination. It hides the "
     (:TERM NIL "implementation-dependent") " details of how "
     (:TERM NIL "methods") " are called. The macro "
     (:MACREF NIL "call-method") " has " (:TERM NIL "lexical scope")
     " and can only be used within an " (:TERM NIL "effective method") " "
     (:TERM NIL "form") ". " :PAR
     (:EDITORNOTE NIL "KMP: This next paragraph still needs some work.")
     (:COMMENT NIL "!!!")
     (:ISSUE NIL "LEXICAL-CONSTRUCT-GLOBAL-DEFINITION:UNDEFINED")
     " Whether or not " (:MACREF NIL "call-method") " is " (:TERM NIL "fbound")
     " in the " (:TERM NIL "global environment") " is "
     (:TERM NIL "implementation-dependent")
     "; however, the restrictions on redefinition and " (:TERM NIL "shadowing")
     " of " (:MACREF NIL "call-method") " are the same as for "
     (:TERM NIL "symbols") " in the " (:PACKREF NIL "common-lisp") " "
     (:TERM NIL "package") " which are " (:TERM NIL "fbound") " in the "
     (:TERM NIL "global environment")
     ". The consequences of attempting to use " (:MACREF NIL "call-method")
     " outside of an " (:TERM NIL "effective method") " " (:TERM NIL "form")
     " are undefined. "
     (:ENDISSUE NIL "LEXICAL-CONSTRUCT-GLOBAL-DEFINITION:UNDEFINED") " " :PAR
     (:COMMENT NIL
      " Description of arguments in this paragraph changed by Moon:"
      " Description of next-methods in this paragraph shortened by Moon:")
     :PAR "The macro " (:MACREF NIL "call-method") " invokes the specified "
     (:TERM NIL "method")
     ", supplying it with arguments and with definitions for "
     (:FUNREF NIL "call-next-method") " and for " (:FUNREF NIL "next-method-p")
     ". If the invocation of " (:MACREF NIL "call-method")
     " is lexically inside of a " (:MACREF NIL "make-method")
     ", the arguments are those that were supplied to that method. Otherwise the arguments are those that were supplied to the generic function. The definitions of "
     (:FUNREF NIL "call-next-method") " and " (:FUNREF NIL "next-method-p")
     " rely on the specified " (:PARAM NIL "next-method-list") ". " :PAR "If "
     (:PARAM NIL "method") " is a " (:TERM NIL "list")
     ", the first element of the " (:TERM NIL "list") " must be the symbol "
     (:MACREF NIL "make-method") " and the second element must be a "
     (:TERM NIL "form") ". Such a " (:TERM NIL "list") " specifies a "
     (:TERM NIL "method") " " (:TERM NIL "object") " whose "
     (:TERM NIL "method") " function has a body that is the given "
     (:TERM NIL "form") ". " :PAR (:PARAM NIL "Next-method-list")
     " can contain " (:TERM NIL "method") " " (:TERM NIL "objects") " or "
     (:TERM NIL "lists") ", the first element of which must be the symbol "
     (:MACREF NIL "make-method") " and the second element of which must be a "
     (:TERM NIL "form") ". " :PAR (:COMMENT NIL " Added by Moon:") :PAR
     "Those are the only two places where " (:MACREF NIL "make-method")
     " can be used. The " (:TERM NIL "form") " used with "
     (:MACREF NIL "make-method") " is evaluated in the "
     (:TERM NIL "null lexical environment")
     " augmented with a local macro definition for "
     (:MACREF NIL "call-method") " and with bindings named by symbols not "
     (:TERM NIL "accessible") " from the " (:PACKREF NIL "common-lisp-user")
     " " (:TERM NIL "package") ". " :PAR "The "
     (:FUNREF NIL "call-next-method") " function available to "
     (:PARAM NIL "method") " will call the first " (:TERM NIL "method") " in "
     (:PARAM NIL "next-method-list") ". The " (:FUNREF NIL "call-next-method")
     " function available in that " (:TERM NIL "method")
     ", in turn, will call the second " (:TERM NIL "method") " in "
     (:PARAM NIL "next-method-list") ", and so on, until the list of next "
     (:TERM NIL "methods") " is exhausted. " :PAR
     (:COMMENT NIL "%--Changed in drafting committee by Moon") :PAR "If "
     (:PARAM NIL "next-method-list") " is not supplied, the "
     (:FUNREF NIL "call-next-method") " function available to "
     (:PARAM NIL "method") " signals an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "control-error") " and the " (:FUNREF NIL "next-method-p")
     " function available to " (:PARAM NIL "method") " returns "
     (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:COMMENT NIL "!!! Barmar: This desperately needs examples."
      "      I have a hard time understanding the use of MAKE-METHOD.")
     :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "call-next-method") ", "
     (:MACREF NIL "define-method-combination") ", "
     (:FUNREF NIL "next-method-p") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== CALL-NEXT-METHOD")
   (:COM (:NAME "call-next-method" :FTYPE "Local Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "call-next-method")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " args")
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "args") "—an "
     (:TERM NIL "object") ". "
     (:COMMENT NIL
      " These are objects that are appropriate as args to the methods.")
     :PAR (:PARAM NIL "results") "—the " (:TERM NIL "values")
     " returned by the " (:TERM NIL "method") " it calls. " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "call-next-method") " can be used "
     (:ISSUE NIL "METHOD-INITFORM:FORBID-CALL-NEXT-METHOD") " within the body "
     (:TERM NIL "forms") " (but not the " (:TERM NIL "lambda list") ") "
     (:ENDISSUE NIL "METHOD-INITFORM:FORBID-CALL-NEXT-METHOD") " of a "
     (:TERM NIL "method") " defined by a " (:TERM NIL "method-defining form")
     " to call the " (:TERM NIL "next method") ". " :PAR "If there is no next "
     (:TERM NIL "method") ", the generic function "
     (:FUNREF NIL "no-next-method") " is called. " :PAR
     "The type of method combination used determines which "
     (:TERM NIL "methods") " can invoke " (:FUNREF NIL "call-next-method")
     ". The standard " (:TERM NIL "method combination") " type allows "
     (:FUNREF NIL "call-next-method") " to be used within primary "
     (:TERM NIL "methods") " and " (:TERM NIL "around methods") ". "
     (:COMMENT NIL
      "%Barmar thinks this is not needed because it is said elsewhere (ch4.1). -kmp 22-Dec-90"
      " The standard " " \\term{method combination}"
      " type defines the next \\term{method} as follows:" "  " " \\beginlist"
      " \\itemitem{\\bull}"
      " If \\funref{call-next-method} is used in an \\term{around method},"
      " the next \\term{method} is the next most specific \\term{around method}, if one is"
      " applicable." "  " " \\itemitem{\\bull}"
      " If there are no \\term{around methods} at all or if "
      " \\funref{call-next-method} is called by the least specific \\term{around method},"
      " other \\term{methods} are called as follows:" " \\beginlist "
      " \\itemitem{--} All the \\term{before methods} are called, in"
      " most-specific-first order.  \\Thefunction{call-next-method}"
      " cannot be used in \\term{before methods}." "  " " \\itemitem{--} "
      " The most specific primary \\term{method} is called.  Inside the body of a"
      " primary \\term{method}, \\funref{call-next-method} can be used to pass control to"
      " the next most specific primary \\term{method}.  The generic function"
      " \\funref{no-next-method} is called if \\funref{call-next-method} is used and there"
      " are no more primary \\term{methods}."
      "                                                                    "
      " \\itemitem{--} All the \\term{after methods} are called in"
      " most-specific-last order.  \\Thefunction{call-next-method}"
      " cannot be used in \\term{after methods}." "  " " \\endlist"
      " \\endlist")
     "For generic functions using a type of method combination defined by the short form of "
     (:MACREF NIL "define-method-combination") ", "
     (:FUNREF NIL "call-next-method") " can be used in "
     (:TERM NIL "around methods") " only. " :PAR "When "
     (:FUNREF NIL "call-next-method")
     " is called with no arguments, it passes the current "
     (:TERM NIL "method") "'s original arguments to the next "
     (:TERM NIL "method") ". Neither argument defaulting, nor using "
     (:SPECREF NIL "setq") ", nor rebinding variables with the same "
     (:TERM NIL "names") " as parameters of the " (:TERM NIL "method")
     " affects the values " (:FUNREF NIL "call-next-method") " passes to the "
     (:TERM NIL "method") " it calls. " :PAR
     (:COMMENT NIL
      " A sentence was removed here by Moon since it was duplicated below, and another"
      " sentence was moved to be next to the duplicate:")
     :PAR "When " (:FUNREF NIL "call-next-method")
     " is called with arguments, the " (:TERM NIL "next method")
     " is called with those arguments. " :PAR "If "
     (:FUNREF NIL "call-next-method")
     " is called with arguments but omits optional arguments, the "
     (:TERM NIL "next method") " called defaults those arguments. " :PAR
     (:COMMENT NIL
      " Further computation is possible after \\funref{call-next-method} returns.")
     :PAR "The " (:TERM NIL "function") " " (:FUNREF NIL "call-next-method")
     " returns any " (:TERM NIL "values") " that are returned by the "
     (:TERM NIL "next method") ". " :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "call-next-method") " has " (:TERM NIL "lexical scope")
     " and " (:TERM NIL "indefinite extent")
     " and can only be used within the body of a " (:TERM NIL "method")
     " defined by a " (:TERM NIL "method-defining form") ". " :PAR
     (:ISSUE NIL "LEXICAL-CONSTRUCT-GLOBAL-DEFINITION:UNDEFINED")
     " Whether or not " (:FUNREF NIL "call-next-method") " is "
     (:TERM NIL "fbound") " in the " (:TERM NIL "global environment") " is "
     (:TERM NIL "implementation-dependent")
     "; however, the restrictions on redefinition and " (:TERM NIL "shadowing")
     " of " (:FUNREF NIL "call-next-method") " are the same as for "
     (:TERM NIL "symbols") " in the " (:PACKREF NIL "common-lisp") " "
     (:TERM NIL "package") " which are " (:TERM NIL "fbound") " in the "
     (:TERM NIL "global environment")
     ". The consequences of attempting to use "
     (:FUNREF NIL "call-next-method") " outside of a "
     (:TERM NIL "method-defining form") " are undefined. "
     (:ENDISSUE NIL "LEXICAL-CONSTRUCT-GLOBAL-DEFINITION:UNDEFINED") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:MACREF NIL "defmethod") ", "
     (:MACREF NIL "call-method") ", " (:MACREF NIL "define-method-combination")
     ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL " Grammar improved by Moon:") :PAR
     (:COMMENT NIL "% Removed per X3J13. -kmp 05-Oct-93"
      " If \\funref{call-next-method} is used in a \\term{method} whose "
      " \\term{method combination} does not support it, "
      " an error \\oftype{control-error} is \\term{signaled}.")
     :PAR "When providing arguments to " (:FUNREF NIL "call-next-method")
     ", the following rule must be satisfied or an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error") " "
     (:COMMENT NIL "% \"is\" => \"should be\" per X3J13. -kmp 05-Oct-93" "is")
     "should be signaled: the ordered set of " (:TERM NIL "applicable methods")
     " for a changed set of arguments for " (:FUNREF NIL "call-next-method")
     " must be the same as the ordered set of "
     (:TERM NIL "applicable methods") " for the original arguments to the "
     (:TERM NIL "generic function")
     ". Optimizations of the error checking are possible, but they must not change the semantics of "
     (:FUNREF NIL "call-next-method") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:MACREF NIL "define-method-combination") ", " (:MACREF NIL "defmethod")
     ", " (:FUNREF NIL "next-method-p") ", " (:FUNREF NIL "no-next-method")
     ", " (:MACREF NIL "call-method") ", "
     (:SECREF NIL :METHOD-SELECTION-AND-COMBINATION) ", "
     (:SECREF NIL :STD-METH-COMB) ", " (:SECREF NIL :BUILT-IN-METH-COMB-TYPES)
     " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== COMPUTE-APPLICABLE-METHODS")
   (:COM
    (:NAME "compute-applicable-methods" :FTYPE "Standard Generic Function")
    (:ISSUE NIL "COMPUTE-APPLICABLE-METHODS:GENERIC") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "generic-function") (:NAMES NIL "compute-applicable-methods")
      (:ARGLIST NIL "generic-function function-arguments")
      (:VALUES NIL "methods"))
     " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "compute-applicable-methods")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "generic-function") " "
        (:TYPEREF NIL "standard-generic-function"))))
     " " :PAR (:ENDISSUE NIL "COMPUTE-APPLICABLE-METHODS:GENERIC") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "generic-function") "—a " (:TERM NIL "generic function") ". "
     :PAR (:PARAM NIL "function-arguments") "—a " (:TERM NIL "list")
     " of arguments for the " (:PARAM NIL "generic-function") ". " :PAR
     (:PARAM NIL "methods") "—a " (:TERM NIL "list") " of "
     (:TERM NIL "method") " " (:TERM NIL "objects") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Given a "
     (:PARAM NIL "generic-function") " and a set of "
     (:PARAM NIL "function-arguments") ", the function "
     (:FUNREF NIL "compute-applicable-methods") " returns the set of "
     (:TERM NIL "methods")
     " that are applicable for those arguments sorted according to precedence order. See "
     (:SECREF NIL :METHOD-SELECTION-AND-COMBINATION) ". " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:MACREF NIL "defmethod") " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:SECREF NIL :METHOD-SELECTION-AND-COMBINATION) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DEFINE-METHOD-COMBINATION")
   (:COM (:NAME "define-method-combination" :FTYPE "Macro")
    (:ISSUE NIL "DECLS-AND-DOC") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:COMMENT NIL
      " 88-002R p.2-34 said \"new method combination object\" was returned, but it's wrong,"
      " method-combination objects are created by the defgeneric :method-combination option."
      " See 88-002R p.1-28. --Moon" " The \"name\" is returned."
      " Barrett didn't believe this at first, but now does."
      " Consensus comes slowly.")
     :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "define-method-combination")
      (:ARGLIST NIL "name " (:INTERLEAVE NIL (:DOWN NIL "short-form-option")))
      (:VALUES NIL "name"))
     " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "define-method-combination")
      (:ARGLIST NIL "name lambda-list "
       (:PAREN NIL
        (:STAR NIL (:CURLY NIL (:PARAM NIL "method-group-specifier"))))
       " "
       (:BRAC NIL (:PAREN NIL (:KWD NIL "arguments") " . args-lambda-list"))
       " "
       (:BRAC NIL
        (:PAREN NIL (:KWD NIL "generic-function") " generic-function-symbol"))
       " "
       (:INTERLEAVE NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration")))
        " | " (:PARAM NIL "documentation"))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL "name"))
     " " :PAR
     (:BNF (:NAME "short-form-option") (:KWD NIL "documentation") " "
      (:PARAM NIL "documentation") " | " (:BR NIL) " "
      (:KWD NIL "identity-with-one-argument") " "
      (:PARAM NIL "identity-with-one-argument") " |" (:BR NIL) " "
      (:KWD NIL "operator") " " (:PARAM NIL "operator"))
     " "
     (:BNF (:NAME "method-group-specifier")
      (:PAREN NIL "name "
       (:CURLY NIL (:PLUS NIL (:CURLY NIL (:PARAM NIL "qualifier-pattern")))
        " " (:MATH NIL (:MO NIL "|")) " predicate")
       " " (:INTERLEAVE NIL (:DOWN NIL "long-form-option"))))
     " "
     (:BNF (:NAME "long-form-option") (:KWD NIL "description") " "
      (:PARAM NIL "description") " |" (:BR NIL) " " (:KWD NIL "order") " "
      (:PARAM NIL "order") " |" (:BR NIL) " " (:KWD NIL "required") " "
      (:PARAM NIL "required-p"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "args-lambda-list") "—"
     (:COMMENT NIL
      "Moon thought :arguments for DEFINE-METHOD-COMBINATION took an ordinary lambda list,"
      "but Barrett (comment #3, first public review) observes that &whole is permissible."
      "Time to make a new kind of list.")
     "a " (:TERM NIL "define-method-combination arguments lambda list") ". "
     :PAR (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR
     (:PARAM NIL "description") "—a " (:TERM NIL "format control") ". " :PAR
     (:PARAM NIL "documentation") "—a " (:TERM NIL "string")
     "; not evaluated. " :PAR (:PARAM NIL "forms") "—an "
     (:TERM NIL "implicit progn") " that must compute and return the "
     (:TERM NIL "form") " that specifies how the " (:TERM NIL "methods")
     " are combined, that is, the " (:TERM NIL "effective method") ". " :PAR
     (:PARAM NIL "generic-function-symbol") "—a " (:TERM NIL "symbol") ". "
     :PAR (:PARAM NIL "identity-with-one-argument") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "lambda-list") "—"
     (:TERM NIL "ordinary lambda list") ". " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "symbol") ". Non-" (:TERM NIL "keyword") ", "
     (:TERM NIL "non-nil") " " (:TERM NIL "symbols") " are usually used. " :PAR
     (:PARAM NIL "operator") "—an " (:TERM NIL "operator") ". "
     (:PARAM NIL "Name") " and " (:PARAM NIL "operator") " are often the "
     (:TERM NIL "same") " " (:TERM NIL "symbol")
     ". This is the default, but it is not required. " :PAR
     (:PARAM NIL "order") "—" (:KWD NIL "most-specific-first") " or "
     (:KWD NIL "most-specific-last") "; evaluated. " :PAR
     (:COMMENT NIL "Not a function designator?") (:PARAM NIL "predicate") "—a "
     (:TERM NIL "symbol") " that names a " (:TERM NIL "function")
     " of one argument that returns a " (:TERM NIL "generalized boolean") ". "
     :PAR (:PARAM NIL "qualifier-pattern") "—a " (:TERM NIL "list") ", or the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". " :PAR
     (:PARAM NIL "required-p") "—a " (:TERM NIL "generalized boolean") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR "The macro "
     (:MACREF NIL "define-method-combination")
     " is used to define new types of method combination. " :PAR
     "There are two forms of " (:MACREF NIL "define-method-combination")
     ". The short form is a simple facility for the cases that are expected to be most commonly needed. The long form is more powerful but more verbose. It resembles "
     (:MACREF NIL "defmacro")
     " in that the body is an expression, usually using backquote, that computes a "
     (:TERM NIL "form")
     ". Thus arbitrary control structures can be implemented. The long form also allows arbitrary processing of method "
     (:TERM NIL "qualifiers") ". " :PAR
     (:COMMENT NIL
      "In both the short and long forms, \\param{name} is a symbol.  By convention,"
      "non-keyword, \\term{non-nil} symbols are usually used.")
     :PAR
     (:LIST NIL
      (:ITEM NIL (:B NIL " Short Form") " " :PAR "The short form syntax of "
       (:MACREF NIL "define-method-combination")
       " is recognized when the second " (:TERM NIL "subform") " is a "
       (:TERM NIL "non-nil")
       " symbol or is not present. When the short form is used, "
       (:PARAM NIL "name")
       " is defined as a type of method combination that produces a Lisp form "
       (:TT NIL "(" (:PARAM NIL "operator") " " (:PARAM NIL "method-call") " "
        (:PARAM NIL "method-call") " " (:MATH NIL (:MO NIL "…")) ")")
       ". The " (:PARAM NIL "operator") " is a " (:TERM NIL "symbol")
       " that can be the " (:TERM NIL "name") " of a " (:TERM NIL "function")
       ", " (:TERM NIL "macro") ", or " (:TERM NIL "special operator") ". The "
       (:PARAM NIL "operator")
       " can be supplied by a keyword option; it defaults to "
       (:PARAM NIL "name") ". " :PAR
       "Keyword options for the short form are the following: " :PAR
       (:LIST NIL
        (:ITEM NIL " The " (:KWD NIL "documentation")
         " option is used to document the method-combination type; see description of long form below. "
         :PAR)
        (:ITEM NIL " The " (:KWD NIL "identity-with-one-argument")
         " option enables an optimization when its value is "
         (:TERM NIL "true") " (the default is " (:TERM NIL "false")
         "). If there is exactly one applicable method and it is a primary method, that method serves as the effective method and "
         (:PARAM NIL "operator")
         " is not called. This optimization avoids the need to create a new effective method and avoids the overhead of a "
         (:TERM NIL "function")
         " call. This option is designed to be used with operators such as "
         (:SPECREF NIL "progn") ", " (:MACREF NIL "and") ", " (:FUNREF NIL "+")
         ", and " (:FUNREF NIL "max") ". " :PAR)
        (:ITEM NIL " The " (:KWD NIL "operator") " option specifies the "
         (:TERM NIL "name") " of the operator. The " (:PARAM NIL "operator")
         " argument is a " (:TERM NIL "symbol") " that can be the "
         (:TERM NIL "name") " of a " (:TERM NIL "function") ", "
         (:TERM NIL "macro") ", or " (:TERM NIL "special form") ". " :PAR
         (:COMMENT NIL "By convention, \\param{name} and"
          "\\param{operator} are often the same symbol.  This is the default,"
          "but it is not required.")))
       " " :PAR (:COMMENT NIL "None of the \\term{subforms} is evaluated.")
       :PAR "These types of method combination require exactly one "
       (:TERM NIL "qualifier")
       " per method. An error is signaled if there are applicable methods with no "
       (:TERM NIL "qualifiers") " or with " (:TERM NIL "qualifiers")
       " that are not supported by the method combination type. " :PAR
       "A method combination procedure defined in this way recognizes two roles for methods. A method whose one "
       (:TERM NIL "qualifier")
       " is the symbol naming this type of method combination is defined to be a primary method. At least one primary method must be applicable or an error is signaled. A method with "
       (:KWD NIL "around") " as its one " (:TERM NIL "qualifier")
       " is an auxiliary method that behaves the same as an "
       (:TERM NIL "around method") " in standard method combination. The "
       (:TERM NIL "function") " " (:FUNREF NIL "call-next-method")
       " can only be used in " (:TERM NIL "around methods")
       "; it cannot be used in primary methods defined by the short form of the "
       (:MACREF NIL "define-method-combination") " macro. " :PAR
       "A method combination procedure defined in this way accepts an optional argument named "
       (:PARAM NIL "order") ", which defaults to "
       (:KWD NIL "most-specific-first") ". A value of "
       (:KWD NIL "most-specific-last")
       " reverses the order of the primary methods without affecting the order of the auxiliary methods. "
       :PAR
       "The short form automatically includes error checking and support for "
       (:TERM NIL "around methods") ". " :PAR
       "For a discussion of built-in method combination types, see "
       (:SECREF NIL :BUILT-IN-METH-COMB-TYPES) ". " :PAR)
      (:ITEM NIL (:B NIL " Long Form") " " :PAR "The long form syntax of "
       (:MACREF NIL "define-method-combination")
       " is recognized when the second " (:TERM NIL "subform") " is a list. "
       :PAR "The " (:PARAM NIL "lambda-list")
       " receives any arguments provided after the " (:TERM NIL "name")
       " of the method combination type in the "
       (:KWD NIL "method-combination") " option to " (:MACREF NIL "defgeneric")
       ". " :PAR
       "A list of method group specifiers follows. Each specifier selects a subset of the applicable methods to play a particular role, either by matching their "
       (:TERM NIL "qualifiers") " against some patterns or by testing their "
       (:TERM NIL "qualifiers") " with a " (:PARAM NIL "predicate")
       ". These method group specifiers define all method "
       (:TERM NIL "qualifiers")
       " that can be used with this type of method combination. " :PAR
       (:COMMENT NIL
        " Removed by Moon as the same information is repeated below"
        "If an applicable "
        "method does not fall into any method group, the system signals the error"
        "that the method is invalid for the kind of method combination in use.")
       :PAR
       (:COMMENT NIL "%Rewritten per Barmar. -kmp 28-Dec-90"
        "Each method group specifier names a variable.")
       "The " (:TERM NIL "car") " of each "
       (:PARAM NIL "method-group-specifier") " is a " (:TERM NIL "symbol")
       " which " (:TERM NIL "names") " a " (:TERM NIL "variable")
       ". During the execution of the " (:TERM NIL "forms") " in the body of "
       (:MACREF NIL "define-method-combination") ", this "
       (:TERM NIL "variable") " is bound to a list of the "
       (:TERM NIL "methods") " in the method group. The " (:TERM NIL "methods")
       " in this list occur in the order specified by the " (:KWD NIL "order")
       " option. " :PAR "If " (:PARAM NIL "qualifier-pattern") " is a "
       (:TERM NIL "symbol") " it must be " (:MISC NIL "*")
       ". A method matches a " (:PARAM NIL "qualifier-pattern")
       " if the method's list of " (:TERM NIL "qualifiers") " is "
       (:FUNREF NIL "equal") " to the " (:PARAM NIL "qualifier-pattern")
       " (except that the symbol " (:MISC NIL "*") " in a "
       (:PARAM NIL "qualifier-pattern") " matches anything). Thus a "
       (:PARAM NIL "qualifier-pattern") " can be one of the following: the "
       (:TERM NIL "empty list") ", which matches "
       (:TERM NIL "unqualified methods") "; the symbol " (:MISC NIL "*")
       ", which matches all methods; a true list, which matches methods with the same number of "
       (:TERM NIL "qualifiers") " as the length of the list when each "
       (:TERM NIL "qualifier")
       " matches the corresponding list element; or a dotted list that ends in the symbol "
       (:MISC NIL "*") " (the " (:MISC NIL "*")
       " matches any number of additional " (:TERM NIL "qualifiers") "). " :PAR
       "Each applicable method is tested against the "
       (:PARAM NIL "qualifier-patterns") " and " (:PARAM NIL "predicates")
       " in left-to-right order. As soon as a "
       (:PARAM NIL "qualifier-pattern") " matches or a "
       (:PARAM NIL "predicate")
       " returns true, the method becomes a member of the corresponding method group and no further tests are made. Thus if a method could be a member of more than one method group, it joins only the first such group. If a method group has more than one "
       (:PARAM NIL "qualifier-pattern")
       ", a method need only satisfy one of the "
       (:PARAM NIL "qualifier-patterns") " to be a member of the group. " :PAR
       "The " (:TERM NIL "name") " of a " (:PARAM NIL "predicate")
       " function can appear instead of " (:PARAM NIL "qualifier-patterns")
       " in a method group specifier. The " (:PARAM NIL "predicate")
       " is called for each method that has not been assigned to an earlier method group; it is called with one argument, the method's "
       (:TERM NIL "qualifier") " " (:TERM NIL "list") ". The "
       (:PARAM NIL "predicate")
       " should return true if the method is to be a member of the method group. A "
       (:PARAM NIL "predicate") " can be distinguished from a "
       (:PARAM NIL "qualifier-pattern") " because it is a "
       (:TERM NIL "symbol") " other than " (:MISC NIL "nil") " or "
       (:MISC NIL "*") ". " :PAR (:COMMENT NIL " Wording improved --Moon") :PAR
       "If there is an applicable method that does not fall into any method group, the "
       (:TERM NIL "function") " " (:FUNREF NIL "invalid-method-error")
       " is called. " :PAR
       "Method group specifiers can have keyword options following the "
       (:TERM NIL "qualifier")
       " patterns or predicate. Keyword options can be distinguished from additional "
       (:TERM NIL "qualifier")
       " patterns because they are neither lists nor the symbol "
       (:MISC NIL "*") ". The keyword options are as follows: " :PAR
       (:LIST NIL
        (:ITEM NIL " The " (:KWD NIL "description")
         " option is used to provide a description of the role of methods in the method group. Programming environment tools use "
         (:TT NIL " (apply #'format stream " (:PARAM NIL "format-control")
          " (method-qualifiers " (:PARAM NIL "method") "))")
         " to print this description, which is expected to be concise. This keyword option allows the description of a method "
         (:TERM NIL "qualifier")
         " to be defined in the same module that defines the meaning of the method "
         (:TERM NIL "qualifier") ". In most cases, "
         (:PARAM NIL "format-control") " will not contain any "
         (:FUNREF NIL "format")
         " directives, but they are available for generality. If "
         (:KWD NIL "description")
         " is not supplied, a default description is generated based on the variable name and the "
         (:TERM NIL "qualifier")
         " patterns and on whether this method group includes the "
         (:TERM NIL "unqualified methods") ". " :PAR)
        (:ITEM NIL " The " (:KWD NIL "order")
         " option specifies the order of methods. The " (:PARAM NIL "order")
         " argument is a " (:TERM NIL "form") " that evaluates to "
         (:KWD NIL "most-specific-first") " or "
         (:KWD NIL "most-specific-last")
         ". If it evaluates to any other value, an error is signaled. "
         (:COMMENT NIL "This keyword option is a"
          "convenience and does not add any expressive power.")
         "If " (:KWD NIL "order") " is not supplied, it defaults to "
         (:KWD NIL "most-specific-first") ". " :PAR)
        (:ITEM NIL " The " (:KWD NIL "required")
         " option specifies whether at least one method in this method group is required. If its value is "
         (:TERM NIL "true")
         " and the method group is empty (that is, no applicable methods match the "
         (:TERM NIL "qualifier")
         " patterns or satisfy the predicate), an error is signaled. "
         (:COMMENT NIL "This keyword option is a convenience and does not"
          "add any expressive power.  ")
         "If " (:KWD NIL "required") " is not supplied, it defaults to "
         (:MISC NIL "nil") ". " :PAR))
       " " :PAR
       "The use of method group specifiers provides a convenient syntax to select methods, to divide them among the possible roles, and to perform the necessary error checking. It is possible to perform further filtering of methods in the body "
       (:TERM NIL "forms")
       " by using normal list-processing operations and the functions "
       (:FUNREF NIL "method-qualifiers") " and "
       (:FUNREF NIL "invalid-method-error") ". It is permissible to use "
       (:SPECREF NIL "setq")
       " on the variables named in the method group specifiers and to bind additional variables. It is also possible to bypass the method group specifier mechanism and do everything in the body "
       (:TERM NIL "forms")
       ". This is accomplished by writing a single method group with "
       (:MISC NIL "*") " as its only " (:PARAM NIL "qualifier-pattern")
       "; the variable is then bound to a " (:TERM NIL "list")
       " of all of the " (:TERM NIL "applicable methods")
       ", in most-specific-first order. " :PAR
       (:COMMENT NIL " Modified by Moon to clarify lexical environment:") :PAR
       "The body " (:PARAM NIL "forms") " compute and return the "
       (:TERM NIL "form")
       " that specifies how the methods are combined, that is, the effective method. The effective method is evaluated in the "
       (:TERM NIL "null lexical environment")
       " augmented with a local macro definition for "
       (:MACREF NIL "call-method") " and with bindings named by symbols not "
       (:TERM NIL "accessible") " from the " (:PACKREF NIL "common-lisp-user")
       " " (:TERM NIL "package") ". Given a method object in one of the "
       (:TERM NIL "lists") " produced by the method group specifiers and a "
       (:TERM NIL "list") " of next methods, " (:MACREF NIL "call-method")
       " will invoke the method such that " (:FUNREF NIL "call-next-method")
       " has available the next methods. " :PAR
       "When an effective method has no effect other than to call a single method, some implementations employ an optimization that uses the single method directly as the effective method, thus avoiding the need to create a new effective method. This optimization is active when the effective method form consists entirely of an invocation of the "
       (:MACREF NIL "call-method") " macro whose first " (:TERM NIL "subform")
       " is a method object and whose second " (:TERM NIL "subform") " is "
       (:MISC NIL "nil") " or unsupplied. Each "
       (:MACREF NIL "define-method-combination")
       " body is responsible for stripping off redundant invocations of "
       (:SPECREF NIL "progn") ", " (:MACREF NIL "and") ", "
       (:SPECREF NIL "multiple-value-prog1")
       ", and the like, if this optimization is desired. " :PAR
       (:COMMENT NIL
        " One sentence was removed and replaced by Moon, since the specification"
        " about congruence was excessively vague.  Also discuss the consequences"
        " of modifying arguments:")
       :PAR "The list "
       (:TT NIL " (:arguments . " (:PARAM NIL "lambda-list") ")")
       " can appear before any declarations or "
       (:TERM NIL "documentation string")
       ". This form is useful when the method combination type performs some specific behavior as part of the combined method and that behavior needs access to the arguments to the "
       (:TERM NIL "generic function") ". Each parameter variable defined by "
       (:PARAM NIL "lambda-list") " is bound to a " (:TERM NIL "form")
       " that can be inserted into the effective method. When this "
       (:TERM NIL "form")
       " is evaluated during execution of the effective method, its value is the corresponding argument to the "
       (:TERM NIL "generic function") "; the consequences of using such a "
       (:TERM NIL "form") " as the " (:PARAM NIL "place") " in a "
       (:MACREF NIL "setf") " " (:TERM NIL "form") " are undefined. "
       (:ISSUE NIL "METHOD-COMBINATION-ARGUMENTS:CLARIFY") " "
       (:COMMENT NIL "If \\param{lambda-list} is not congruent to the"
        "generic function's \\term{lambda list}, additional ignored parameters are"
        "automatically inserted until it is congruent."
        " If the arguments supplied to the \\term{generic function} do not"
        " match \\param{lambda-list}, extra arguments are ignored and missing"
        " arguments are defaulted to \\nil\\." " Thus it is permissible"
        " for \\param{lambda-list} to receive fewer arguments than the number of"
        " required arguments for the \\term{generic function}.")
       "Argument correspondence is computed by dividing the "
       (:KWD NIL "arguments") " " (:PARAM NIL "lambda-list") " and the "
       (:TERM NIL "generic function") " " (:PARAM NIL "lambda-list")
       " into three sections: the " (:TERM NIL "required parameters") ", the "
       (:TERM NIL "optional parameters") ", and the " (:TERM NIL "keyword")
       " and " (:TERM NIL "rest parameters") ". The " (:TERM NIL "arguments")
       " supplied to the " (:TERM NIL "generic function") " for a particular "
       (:TERM NIL "call")
       " are also divided into three sections; the required "
       (:TERM NIL "arguments") " section contains as many "
       (:TERM NIL "arguments") " as the " (:TERM NIL "generic function")
       " has " (:TERM NIL "required parameters") ", the optional "
       (:TERM NIL "arguments") " section contains as many arguments as the "
       (:TERM NIL "generic function") " has " (:TERM NIL "optional parameters")
       ", and the keyword/rest " (:TERM NIL "arguments")
       " section contains the remaining arguments. Each "
       (:TERM NIL "parameter") " in the required and optional sections of the "
       (:KWD NIL "arguments") " " (:PARAM NIL "lambda-list")
       " accesses the argument at the same position in the corresponding section of the "
       (:TERM NIL "arguments") ". If the section of the "
       (:KWD NIL "arguments") " " (:PARAM NIL "lambda-list")
       " is shorter, extra " (:TERM NIL "arguments")
       " are ignored. If the section of the " (:KWD NIL "arguments") " "
       (:PARAM NIL "lambda-list") " is longer, excess "
       (:TERM NIL "required parameters")
       " are bound to forms that evaluate to " (:MISC NIL "nil") " and excess "
       (:TERM NIL "optional parameters") " are " (:TERM NIL "bound")
       " to their initforms. The " (:TERM NIL "keyword parameters") " and "
       (:TERM NIL "rest parameters") " in the " (:KWD NIL "arguments") " "
       (:PARAM NIL "lambda-list") " access the keyword/rest section of the "
       (:TERM NIL "arguments") ". If the " (:KWD NIL "arguments") " "
       (:PARAM NIL "lambda-list") " contains " (:KEYREF NIL "key")
       ", it behaves as if it also contained " (:KEYREF NIL "allow-other-keys")
       ". " :PAR "In addition, " (:KEYREF NIL "whole") " " (:PARAM NIL "var")
       " can be placed first in the " (:KWD NIL "arguments") " "
       (:PARAM NIL "lambda-list") ". It causes " (:PARAM NIL "var") " to be "
       (:TERM NIL "bound") " to a " (:TERM NIL "form") " that "
       (:TERM NIL "evaluates") " to a " (:TERM NIL "list") " of all of the "
       (:TERM NIL "arguments") " supplied to the "
       (:TERM NIL "generic function") ". This is different from "
       (:KEYREF NIL "rest")
       " because it accesses all of the arguments, not just the keyword/rest "
       (:TERM NIL "arguments") ". " :PAR
       (:ENDISSUE NIL "METHOD-COMBINATION-ARGUMENTS:CLARIFY") " " :PAR
       "Erroneous conditions detected by the body should be reported with "
       (:FUNREF NIL "method-combination-error") " or "
       (:FUNREF NIL "invalid-method-error") "; these " (:TERM NIL "functions")
       " add any necessary contextual information to the error message and will signal the appropriate error. "
       :PAR "The body " (:PARAM NIL "forms") " are evaluated inside of the "
       (:TERM NIL "bindings") " created by the " (:TERM NIL "lambda list")
       " and method group specifiers. "
       (:REVIEWER NIL
        "Barmar: Are they inside or outside the :ARGUMENTS bindings?")
       " Declarations at the head of the body are positioned directly inside of "
       (:TERM NIL "bindings") " created by the " (:TERM NIL "lambda list")
       " and outside of the " (:TERM NIL "bindings")
       " of the method group variables. Thus method group variables cannot be declared in this way. "
       (:SPECREF NIL "locally") " may be used around the body, however. " :PAR
       "Within the body " (:PARAM NIL "forms") ", "
       (:PARAM NIL "generic-function-symbol") " is bound to the "
       (:TERM NIL "generic function") " " (:TERM NIL "object") ". " :PAR
       (:ISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " "
       (:PARAM NIL "Documentation") " is attached as a "
       (:TERM NIL "documentation string") " to " (:PARAM NIL "name")
       " (as kind " (:SPECREF NIL "method-combination") ") and to the "
       (:TERM NIL "method combination") " " (:TERM NIL "object") ". "
       (:ENDISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " " :PAR
       (:COMMENT NIL
        " Removed by Moon, appears to be redundant with what was stated earlier:")
       :PAR
       (:COMMENT NIL "The functions \\funref{method-combination-error} and "
        "\\funref{invalid-method-error} can be called from the body \\param{forms} or"
        "from \\term{functions} called by the body \\param{forms}.  The actions of these"
        "two \\term{functions} can depend on \\term{implementation-dependent} dynamic variables"
        "automatically bound before the generic function"
        "\\funref{compute-effective-method} is called.")
       :PAR
       "Note that two methods with identical specializers, but with different "
       (:TERM NIL "qualifiers")
       ", are not ordered by the algorithm described in Step 2 of the method selection and combination process described in "
       (:SECREF NIL :METHOD-SELECTION-AND-COMBINATION)
       ". Normally the two methods play different roles in the effective method because they have different "
       (:TERM NIL "qualifiers")
       ", and no matter how they are ordered in the result of Step 2, the effective method is the same. If the two methods play the same role and their order matters, "
       (:REVIEWER NIL
        "Barmar: How does the system know when the order matters?")
       " an error is signaled. This happens as part of the "
       (:TERM NIL "qualifier") " pattern matching in "
       (:MACREF NIL "define-method-combination") ". " :PAR))
     " " :PAR (:ISSUE NIL "DEFINE-METHOD-COMBINATION:CLARIFY") " If a "
     (:MACREF NIL "define-method-combination") " " (:TERM NIL "form")
     " appears as a " (:TERM NIL "top level form") ", the "
     (:TERM NIL "compiler") " must make the " (:TERM NIL "method combination")
     " " (:TERM NIL "name") " be recognized as a valid "
     (:TERM NIL "method combination") " " (:TERM NIL "name") " in subsequent "
     (:MACREF NIL "defgeneric") " " (:TERM NIL "forms") ". However, the "
     (:TERM NIL "method combination") " is executed no earlier than when the "
     (:MACREF NIL "define-method-combination") " " (:TERM NIL "form")
     " is executed, and possibly as late as the time that "
     (:TERM NIL "generic functions") " that use the "
     (:TERM NIL "method combination") " are executed. "
     (:ENDISSUE NIL "DEFINE-METHOD-COMBINATION:CLARIFY") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:COMMENT NIL
      "% Examples changed by Moon to reflect that the second argument of"
      "% call-method is unsupplied when call-next-method is not allowed")
     :PAR "Most examples of the long form of "
     (:MACREF NIL "define-method-combination")
     " also illustrate the use of the related " (:TERM NIL "functions")
     " that are provided as part of the declarative method combination facility. "
     :PAR
     (:CODE NIL ";;; Examples of the short form of define-method-combination
 
 (define-method-combination and :identity-with-one-argument t) 
  
 (defmethod func and ((x class1) y) ...)
 
;;; The equivalent of this example in the long form is:
 
 (define-method-combination and 
         (&optional (order :most-specific-first))
         ((around (:around))
          (primary (and) :order order :required t))
   (let ((form (if (rest primary)
                   `(and ,@(mapcar #'(lambda (method)
                                       `(call-method ,method))
                                   primary))
                   `(call-method ,(first primary)))))
     (if around
         `(call-method ,(first around)
                       (,@(rest around)
                        (make-method ,form)))
         form)))
  
;;; Examples of the long form of define-method-combination
 
;The default method-combination technique
 (define-method-combination standard ()
         ((around (:around))
          (before (:before))
          (primary () :required t)
          (after (:after)))
   (flet ((call-methods (methods)
            (mapcar #'(lambda (method)
                        `(call-method ,method))
                    methods)))
     (let ((form (if (or before after (rest primary))
                     `(multiple-value-prog1
                        (progn ,@(call-methods before)
                               (call-method ,(first primary)
                                            ,(rest primary)))
                        ,@(call-methods (reverse after)))
                     `(call-method ,(first primary)))))
       (if around
           `(call-method ,(first around)
                         (,@(rest around)
                          (make-method ,form)))
           form))))
  
;A simple way to try several methods until one returns non-nil
 (define-method-combination or ()
         ((methods (or)))
   `(or ,@(mapcar #'(lambda (method)
                      `(call-method ,method))
                  methods)))
  
;A more complete version of the preceding
 (define-method-combination or 
         (&optional (order ':most-specific-first))
         ((around (:around))
          (primary (or)))
   ;; Process the order argument
   (case order
     (:most-specific-first)
     (:most-specific-last (setq primary (reverse primary)))
     (otherwise (method-combination-error \"~S is an invalid order.~@
     :most-specific-first and :most-specific-last are the possible values.\"
                                          order)))
   ;; Must have a primary method
   (unless primary
     (method-combination-error \"A primary method is required.\"))
   ;; Construct the form that calls the primary methods
   (let ((form (if (rest primary)
                   `(or ,@(mapcar #'(lambda (method)
                                      `(call-method ,method))
                                  primary))
                   `(call-method ,(first primary)))))
     ;; Wrap the around methods around that form
     (if around
         `(call-method ,(first around)
                       (,@(rest around)
                        (make-method ,form)))
         form)))
  
;The same thing, using the :order and :required keyword options
 (define-method-combination or 
         (&optional (order ':most-specific-first))
         ((around (:around))
          (primary (or) :order order :required t))
   (let ((form (if (rest primary)
                   `(or ,@(mapcar #'(lambda (method)
                                      `(call-method ,method))
                                  primary))
                   `(call-method ,(first primary)))))
     (if around
         `(call-method ,(first around)
                       (,@(rest around)
                        (make-method ,form)))
         form)))
  
;This short-form call is behaviorally identical to the preceding
 (define-method-combination or :identity-with-one-argument t)
 
;Order methods by positive integer qualifiers
;:around methods are disallowed to keep the example small
 (define-method-combination example-method-combination ()
         ((methods positive-integer-qualifier-p))
   `(progn ,@(mapcar #'(lambda (method)
                         `(call-method ,method))
                     (stable-sort methods #'<
                       :key #'(lambda (method)
                                (first (method-qualifiers method)))))))
 
 (defun positive-integer-qualifier-p (method-qualifiers)
   (and (= (length method-qualifiers) 1)
        (typep (first method-qualifiers) '(integer 0 *))))
  
;;; Example of the use of :arguments
 (define-method-combination progn-with-lock ()
         ((methods ()))
   (:arguments object)
   `(unwind-protect
        (progn (lock (object-lock ,object))
               ,@(mapcar #'(lambda (method)
                             `(call-method ,method))
                         methods))
      (unlock (object-lock ,object))))
  
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR
     (:ISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " The "
     (:TERM NIL "compiler")
     " is not required to perform any compile-time side-effects. "
     (:ENDISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Method combination types defined with the short form require exactly one "
     (:TERM NIL "qualifier") " per method. An error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error")
     " is signaled if there are applicable methods with no "
     (:TERM NIL "qualifiers") " or with " (:TERM NIL "qualifiers")
     " that are not supported by the method combination type. At least one primary method must be applicable or an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error") " is signaled. " :PAR
     "If an applicable method does not fall into any method group, the system signals an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error")
     " indicating that the method is invalid for the kind of method combination in use. "
     :PAR "If the value of the " (:KWD NIL "required") " option is "
     (:TERM NIL "true")
     " and the method group is empty (that is, no applicable methods match the "
     (:TERM NIL "qualifier")
     " patterns or satisfy the predicate), an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") " is signaled. " :PAR "If the " (:KWD NIL "order")
     " option evaluates to a value other than "
     (:KWD NIL "most-specific-first") " or " (:KWD NIL "most-specific-last")
     ", an error of " (:TERM NIL "type") " " (:TYPEREF NIL "error")
     " is signaled. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "call-method") ", "
     (:FUNREF NIL "call-next-method") ", " (:FUNREF NIL "documentation") ", "
     (:FUNREF NIL "method-qualifiers") ", "
     (:FUNREF NIL "method-combination-error") ", "
     (:FUNREF NIL "invalid-method-error") ", " (:MACREF NIL "defgeneric") ", "
     (:SECREF NIL :METHOD-SELECTION-AND-COMBINATION) ", "
     (:SECREF NIL :BUILT-IN-METH-COMB-TYPES) ", " (:SECREF NIL :DOC-VS-DECLS)
     " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL " Added phrase to the end of this paragraph --Moon:") :PAR
     "The " (:KWD NIL "method-combination") " option of "
     (:MACREF NIL "defgeneric") " is used to specify that a "
     (:TERM NIL "generic function")
     " should use a particular method combination type. The first argument to the "
     (:KWD NIL "method-combination") " option is the " (:TERM NIL "name")
     " of a method combination type and the remaining arguments are options for that type. "
     :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FIND-METHOD")
   (:COM (:NAME "find-method" :FTYPE "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "generic-function") (:NAMES NIL "find-method")
      (:ARGLIST NIL "generic-function method-qualifiers specializers "
       (:KEYWORD NIL " &optional") " errorp")
      (:VALUES NIL "method"))
     " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "find-method")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "generic-function") " "
        (:TYPEREF NIL "standard-generic-function"))
       " method-qualifiers specializers " (:KEYWORD NIL " &optional")
       " errorp"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "generic-function") "—a " (:TERM NIL "generic function") ". "
     :PAR (:PARAM NIL "method-qualifiers") "—a " (:TERM NIL "list") ". " :PAR
     (:PARAM NIL "specializers") "—a " (:TERM NIL "list") ". " :PAR
     (:PARAM NIL "errorp") "—a " (:TERM NIL "generalized boolean")
     ". The default is " (:TERM NIL "true") ". " :PAR (:PARAM NIL "method")
     "—a " (:TERM NIL "method") " " (:TERM NIL "object") ", or "
     (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "generic function")
     " " (:FUNREF NIL "find-method") " takes a " (:TERM NIL "generic function")
     " and returns the " (:TERM NIL "method") " " (:TERM NIL "object")
     " that agrees on " (:TERM NIL "qualifiers") " and "
     (:TERM NIL "parameter specializers") " with the "
     (:PARAM NIL "method-qualifiers") " and " (:PARAM NIL "specializers")
     " arguments of " (:FUNREF NIL "find-method") ". "
     (:PARAM NIL "Method-qualifiers") " contains the method "
     (:TERM NIL "qualifiers") " for the " (:TERM NIL "method")
     ". The order of the method " (:TERM NIL "qualifiers")
     " is significant. For a definition of agreement in this context, see "
     (:SECREF NIL :SPECIALIZER-QUALIFIER-AGREEMENT) ". " :PAR "The "
     (:PARAM NIL "specializers")
     " argument contains the parameter specializers for the "
     (:TERM NIL "method")
     ". It must correspond in length to the number of required arguments of the "
     (:TERM NIL "generic function")
     ", or an error is signaled. This means that to obtain the default "
     (:TERM NIL "method") " on a given " (:PARAM NIL "generic-function") ", a "
     (:TERM NIL "list") " whose elements are the " (:TERM NIL "class") " "
     (:TYPEREF NIL "t") " must be given. " :PAR "If there is no such "
     (:TERM NIL "method") " and " (:PARAM NIL "errorp") " is "
     (:TERM NIL "true") ", " (:FUNREF NIL "find-method")
     " signals an error. If there is no such " (:TERM NIL "method") " and "
     (:PARAM NIL "errorp") " is " (:TERM NIL "false") ", "
     (:FUNREF NIL "find-method") " returns " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defmethod some-operation ((a integer) (b float)) (list a b))
→ #<STANDARD-METHOD SOME-OPERATION (INTEGER FLOAT) 26723357>
 (find-method #'some-operation '() (mapcar #'find-class '(integer float)))
→ #<STANDARD-METHOD SOME-OPERATION (INTEGER FLOAT) 26723357>
 (find-method #'some-operation '() (mapcar #'find-class '(integer integer)))
⊳ Error: No matching method
 (find-method #'some-operation '() (mapcar #'find-class '(integer integer)) nil)
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:FUNREF NIL "add-method") ", "
     (:MACREF NIL "defclass") ", " (:MACREF NIL "defgeneric") ", "
     (:MACREF NIL "defmethod") " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If the "
     (:PARAM NIL "specializers")
     " argument does not correspond in length to the number of required arguments of the "
     (:PARAM NIL "generic-function") ", an an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") " is signaled. " :PAR "If there is no such "
     (:TERM NIL "method") " and " (:PARAM NIL "errorp") " is "
     (:TERM NIL "true") ", " (:FUNREF NIL "find-method")
     " signals an error of " (:TERM NIL "type") " " (:TYPEREF NIL "error") ". "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:SECREF NIL :SPECIALIZER-QUALIFIER-AGREEMENT) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ADD-METHOD")
   (:COM (:NAME "add-method" :FTYPE "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "generic-function") (:NAMES NIL "add-method")
      (:ARGLIST NIL "generic-function method")
      (:VALUES NIL "generic-function"))
     " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "add-method")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "generic-function") " "
        (:TYPEREF NIL "standard-generic-function"))
       " " (:PAREN NIL (:PARAM NIL "method") " " (:TYPEREF NIL "method"))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "generic-function") "—a " (:TERM NIL "generic function") " "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "method") "—a "
     (:TERM NIL "method") " " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The generic function "
     (:FUNREF NIL "add-method") " adds a " (:TERM NIL "method") " to a "
     (:TERM NIL "generic function") ". " :PAR "If " (:PARAM NIL "method")
     " agrees with an existing " (:TERM NIL "method") " of "
     (:PARAM NIL "generic-function") " on "
     (:TERM NIL "parameter specializers") " and " (:TERM NIL "qualifiers")
     ", the existing " (:TERM NIL "method") " is replaced. " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Examples" :NONE T) " " :PAR (:COMMENT NIL "!!!") :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "The "
     (:TERM NIL "lambda list") " of the method function of "
     (:PARAM NIL "method") " must be congruent with the "
     (:TERM NIL "lambda list") " of " (:PARAM NIL "generic-function")
     ", or an error of " (:TERM NIL "type") " " (:TYPEREF NIL "error")
     " is signaled. " :PAR "If " (:PARAM NIL "method") " is a "
     (:TERM NIL "method") " " (:TERM NIL "object") " of another "
     (:TERM NIL "generic function") ", an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") " is signaled. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defmethod") ", "
     (:MACREF NIL "defgeneric") ", " (:FUNREF NIL "find-method") ", "
     (:FUNREF NIL "remove-method") ", "
     (:SECREF NIL :SPECIALIZER-QUALIFIER-AGREEMENT) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== INITIALIZE-INSTANCE")
   (:COM (:NAME "initialize-instance" :FTYPE "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " "
     (:DEF (:KIND "generic-function") (:NAMES NIL "initialize-instance")
      (:ARGLIST NIL "instance " (:KEYWORD NIL " &rest") " initargs "
       (:KEYWORD NIL " &key") " " (:KEYWORD NIL " &allow-other-keys"))
      (:VALUES NIL "instance"))
     " " (:ENDISSUE NIL "INITIALIZATION-FUNCTION-KEYWORD-CHECKING") " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "initialize-instance")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "instance") " "
        (:TYPEREF NIL "standard-object"))
       " " (:KEYWORD NIL " &rest") " initargs"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "instance")
     "—an " (:TERM NIL "object") ". " :PAR (:PARAM NIL "initargs") "—a "
     (:TERM NIL "defaulted initialization argument list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Called by "
     (:FUNREF NIL "make-instance") " to initialize a newly created "
     (:TERM NIL "instance") ". The generic function is called with the new "
     (:PARAM NIL "instance") " and the "
     (:TERM NIL "defaulted initialization argument list") ". " :PAR
     "The system-supplied primary " (:TERM NIL "method") " on "
     (:FUNREF NIL "initialize-instance") " initializes the "
     (:TERM NIL "slots") " of the " (:PARAM NIL "instance")
     " with values according to the " (:PARAM NIL "initargs") " and the "
     (:KWD NIL "initform") " forms of the " (:TERM NIL "slots")
     ". It does this by calling the generic function "
     (:FUNREF NIL "shared-initialize") " with the following arguments: the "
     (:PARAM NIL "instance") ", " (:MISC NIL "t") " (this indicates that all "
     (:TERM NIL "slots")
     " for which no initialization arguments are provided should be initialized according to their "
     (:KWD NIL "initform") " forms), and the " (:PARAM NIL "initargs") ". "
     :PAR "Programmers can define " (:TERM NIL "methods") " for "
     (:FUNREF NIL "initialize-instance")
     " to specify actions to be taken when an instance is initialized. If only "
     (:TERM NIL "after methods")
     " are defined, they will be run after the system-supplied primary "
     (:TERM NIL "method")
     " for initialization and therefore will not interfere with the default behavior of "
     (:FUNREF NIL "initialize-instance") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "shared-initialize") ", "
     (:FUNREF NIL "make-instance") ", " (:FUNREF NIL "slot-boundp") ", "
     (:FUNREF NIL "slot-makunbound") ", "
     (:SECREF NIL :OBJECT-CREATION-AND-INIT) ", " (:SECREF NIL :INITARG-RULES)
     ", " (:SECREF NIL :DECLARING-INITARG-VALIDITY) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== CLASS-NAME")
   (:COM (:NAME "class-name" :FTYPE "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "generic-function") (:NAMES NIL "class-name")
      (:ARGLIST NIL "class") (:VALUES NIL "name"))
     " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "class-name")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "class") " " (:TYPEREF NIL "class"))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "class") "—a "
     (:TERM NIL "class") " " (:TERM NIL "object") ". " :PAR (:PARAM NIL "name")
     "—a " (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns the " (:TERM NIL "name")
     " of the given " (:PARAM NIL "class") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "find-class") ", "
     (:SECREF NIL :CLASSES) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "If " (:MATH NIL (:MI NIL "S")) " is a "
     (:TERM NIL "symbol") " such that " (:MATH NIL (:MI NIL "S") (:MO NIL "="))
     (:TT NIL " (class-name " (:MATH NIL (:MI NIL "C")) ")") " and "
     (:MATH NIL (:MI NIL "C") (:MO NIL "="))
     (:TT NIL " (find-class " (:MATH NIL (:MI NIL "S")) ")") ", then "
     (:MATH NIL (:MI NIL "S")) " is the proper name of "
     (:MATH NIL (:MI NIL "C")) ". For further discussion, see "
     (:SECREF NIL :CLASSES) ". " :PAR "The name of an anonymous "
     (:TERM NIL "class") " is " (:MISC NIL "nil") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== (SETF CLASS-NAME)")
   (:COM (:NAME "(setf class-name)" :FTYPE "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "generic-function") (:NAMES NIL "(setf class-name)")
      (:ARGLIST NIL "new-value class") (:VALUES NIL "new-value"))
     " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf class-name)")
      (:ARGLIST NIL "new-value "
       (:PAREN NIL (:PARAM NIL "class") " " (:TYPEREF NIL "class"))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "new-value")
     "—a " (:TERM NIL "symbol") ". " :PAR (:PARAM NIL "class") "—a "
     (:TERM NIL "class") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The generic function "
     (:TT NIL "(setf class-name)") " sets the name of a " (:PARAM NIL "class")
     " object. " :PAR
     (:COMMENT NIL "The name of \\param{class} is set to \\param{new-value}.")
     :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "find-class") ", "
     (:TERM NIL "proper name") ", " (:SECREF NIL :CLASSES) " " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL
      "This info is in the glossary and elsewhere.  I added a cross reference above. -kmp 14-May-91"
      " If \\i{S} is a symbol such that "
      "     \\f{\\i{S} = (class-name \\i{C})}"
      " and \\f{\\i{C} = (find-class \\i{S})},"
      " then \\i{S} is the \\term{proper name} of \\i{C}.  "
      "For further discussion, \\seesection\\Classes.")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== CLASS-OF")
   (:COM (:NAME "class-of" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "class-of") (:ARGLIST NIL "object")
      (:VALUES NIL "class"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "class") "—a "
     (:TERM NIL "class") " " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns the " (:TERM NIL "class")
     " of which the " (:PARAM NIL "object") " is "
     (:COMMENT NIL "\"an instance\" -> \"a direct instance\" -kmp 15-Jan-91")
     "a " (:TERM NIL "direct instance") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (class-of 'fred) → #<BUILT-IN-CLASS SYMBOL 610327300>
 (class-of 2/3) → #<BUILT-IN-CLASS RATIO 610326642>
 
 (defclass book () ()) → #<STANDARD-CLASS BOOK 33424745>
 (class-of (make-instance 'book)) → #<STANDARD-CLASS BOOK 33424745>
 
 (defclass novel (book) ()) → #<STANDARD-CLASS NOVEL 33424764>
 (class-of (make-instance 'novel)) → #<STANDARD-CLASS NOVEL 33424764>

 (defstruct kons kar kdr) → KONS
 (class-of (make-kons :kar 3 :kdr 4)) → #<STRUCTURE-CLASS KONS 250020317>
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-instance") ", "
     (:FUNREF NIL "type-of") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "--------------------Object Errors--------------------") :PAR
   (:COM (:NAME "unbound-slot" :FTYPE "Condition Type")
    (:ISSUE NIL "UNDEFINED-VARIABLES-AND-FUNCTIONS:COMPROMISE") " " :PAR
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "unbound-slot")
     ", " (:TYPEREF NIL "cell-error") ", " (:TYPEREF NIL "error") ", "
     (:TYPEREF NIL "serious-condition") ", " (:TYPEREF NIL "condition") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "object")
     " having the unbound slot is initialized by the " (:KWD NIL "instance")
     " initialization argument to " (:FUNREF NIL "make-condition") ", and is "
     (:TERM NIL "accessed") " by the " (:TERM NIL "function") " "
     (:FUNREF NIL "unbound-slot-instance") ". "
     (:COMMENT NIL " \\Thetype{unbound-slot} has an instance slot that can be"
      " initialized using the \\kwd{instance} keyword to \\funref{make-condition}.")
     (:ENDISSUE NIL "UNDEFINED-VARIABLES-AND-FUNCTIONS:COMPROMISE") " " :PAR
     "The name of the cell (see " (:TYPEREF NIL "cell-error")
     ") is the name of the slot. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "cell-error-name") ", "
     (:FUNREF NIL "unbound-slot-instance") ", "
     (:SECREF NIL :CONDITION-SYSTEM-CONCEPTS) " " :PAR))
   :PAR (:COMMENT NIL "%% ========== UNBOUND-SLOT-INSTANCE")
   (:COM (:NAME "unbound-slot-instance" :FTYPE "Function")
    (:ISSUE NIL "UNDEFINED-VARIABLES-AND-FUNCTIONS:COMPROMISE") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "unbound-slot-instance")
      (:ARGLIST NIL "condition") (:VALUES NIL "instance"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "condition")
     "—a " (:TERM NIL "condition") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "unbound-slot") ". " :PAR (:PARAM NIL "instance") "—an "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "Returns the instance which had the unbound slot in the "
     (:TERM NIL "situation") " represented by the " (:PARAM NIL "condition")
     ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "cell-error-name") ", "
     (:TYPEREF NIL "unbound-slot") ", "
     (:SECREF NIL :CONDITION-SYSTEM-CONCEPTS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL "Shouldn't be needed."
      "It is an error to use \\macref{setf} with \\funref{unbound-slot-instance}.")
     :PAR (:ENDISSUE NIL "UNDEFINED-VARIABLES-AND-FUNCTIONS:COMPROMISE") " "))
   " ")
  " " :PAR)
 (:CHAPTER
  (:NUM "8" :TITLE ("Structures") :NUMTAG :CHAP-EIGHT :NAMETAG :STRUCTURES)
  (:DICTIONARY NIL :PAR
   (:COMMENT NIL
    "!!! Need a glossary term which refers to un-:type'd `structures'. -kmp 6-Jun-91")
   :PAR (:COMMENT NIL "%% ========== DEFSTRUCT")
   (:COM (:NAME "defstruct" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "defstruct")
      (:ARGLIST NIL "name-and-options " (:BRAC NIL "documentation") " "
       (:STAR NIL (:CURLY NIL (:DOWN NIL "slot-description"))))
      (:VALUES NIL "structure-name"))
     " " :PAR
     (:BNF (:NAME "name-and-options") "structure-name | "
      (:PAREN NIL "structure-name " (:INTERLEAVE NIL (:DOWN NIL "options"))))
     " " (:ISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
     (:BNF (:NAME "options") (:DOWN NIL "conc-name-option") " |" (:BR NIL) " "
      (:STAR NIL (:CURLY NIL (:DOWN NIL "constructor-option"))) " |" (:BR NIL)
      " " (:DOWN NIL "copier-option") " |" (:BR NIL) " "
      (:DOWN NIL "include-option") " |" (:BR NIL) " "
      (:DOWN NIL "initial-offset-option") " |" (:BR NIL) " "
      (:DOWN NIL "named-option") " |" (:BR NIL) " "
      (:DOWN NIL "predicate-option") " |" (:BR NIL) " "
      (:DOWN NIL "printer-option") " |" (:BR NIL) " "
      (:DOWN NIL "type-option"))
     " " (:ENDISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
     (:BNF (:NAME "conc-name-option") (:KWD NIL "conc-name") " | "
      (:PAREN NIL (:KWD NIL "conc-name")) " | "
      (:PAREN NIL (:KWD NIL "conc-name") " " (:PARAM NIL "conc-name")))
     " "
     (:BNF (:NAME "constructor-option") (:KWD NIL "constructor") " |" (:BR NIL)
      " " (:PAREN NIL (:KWD NIL "constructor")) " |" (:BR NIL) " "
      (:PAREN NIL (:KWD NIL "constructor") " " (:PARAM NIL "constructor-name"))
      " |" (:BR NIL) " "
      (:PAREN NIL (:KWD NIL "constructor") " " (:PARAM NIL "constructor-name")
       " " (:PARAM NIL "constructor-arglist")))
     " "
     (:BNF (:NAME "copier-option") (:KWD NIL "copier") " | "
      (:PAREN NIL (:KWD NIL "copier")) " | "
      (:PAREN NIL (:KWD NIL "copier") " " (:PARAM NIL "copier-name")))
     " "
     (:BNF (:NAME "predicate-option") (:KWD NIL "predicate") " | "
      (:PAREN NIL (:KWD NIL "predicate")) " | "
      (:PAREN NIL (:KWD NIL "predicate") " " (:PARAM NIL "predicate-name")))
     " "
     (:BNF (:NAME "include-option")
      (:PAREN NIL (:KWD NIL "include") " "
       (:PARAM NIL "included-structure-name") " "
       (:STAR NIL (:CURLY NIL (:DOWN NIL "slot-description")))))
     " " (:ISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
     (:BNF (:NAME "printer-option") (:DOWN NIL "print-object-option") " | "
      (:DOWN NIL "print-function-option"))
     " "
     (:BNF (:NAME "print-object-option")
      (:PAREN NIL (:KWD NIL "print-object") " " (:PARAM NIL "printer-name"))
      " | " (:PAREN NIL (:KWD NIL "print-object")))
     " " (:ENDISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
     (:BNF (:NAME "print-function-option")
      (:PAREN NIL (:KWD NIL "print-function") " " (:PARAM NIL "printer-name"))
      " | " (:PAREN NIL (:KWD NIL "print-function")))
     " "
     (:BNF (:NAME "type-option")
      (:PAREN NIL (:KWD NIL "type") " " (:PARAM NIL "type")))
     " " (:BNF (:NAME "named-option") (:KWD NIL "named")) " "
     (:BNF (:NAME "initial-offset-option")
      (:PAREN NIL (:KWD NIL "initial-offset") " "
       (:PARAM NIL "initial-offset")))
     " " (:COMMENT NIL "% 19.2.0 6")
     (:BNF (:NAME "slot-description") (:PARAM NIL "slot-name") " | " (:BR NIL)
      " "
      (:PAREN NIL (:PARAM NIL "slot-name") " "
       (:BRAC NIL (:PARAM NIL "slot-initform") " "
        (:INTERLEAVE NIL (:DOWN NIL "slot-option")))))
     " "
     (:BNF (:NAME "slot-option") (:KWD NIL "type") " " (:PARAM NIL "slot-type")
      " | " (:BR NIL) " " (:KWD NIL "read-only") " "
      (:PARAM NIL "slot-read-only-p"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "conc-name")
     "—a " (:TERM NIL "string designator") ". " :PAR
     (:PARAM NIL "constructor-arglist") "—a " (:TERM NIL "boa lambda list")
     ". " :PAR (:PARAM NIL "constructor-name") "—a " (:TERM NIL "symbol") ". "
     :PAR (:PARAM NIL "copier-name") "—a " (:TERM NIL "symbol") ". " :PAR
     (:PARAM NIL "included-structure-name") "—an already-defined "
     (:TERM NIL "structure name") ". "
     (:ISSUE NIL "DEFSTRUCT-INCLUDE-DEFTYPE:EXPLICITLY-UNDEFINED") " "
     (:COMMENT NIL " or a \\term{type specifier} \\term{symbol}.")
     "Note that a " (:TERM NIL "derived type")
     " is not permissible, even if it would expand into a "
     (:TERM NIL "structure name") ". "
     (:COMMENT NIL " or a \\term{type specifier} \\term{symbol}.)")
     (:ENDISSUE NIL "DEFSTRUCT-INCLUDE-DEFTYPE:EXPLICITLY-UNDEFINED") " " :PAR
     (:PARAM NIL "initial-offset") "—a non-negative " (:TERM NIL "integer")
     ". " :PAR (:PARAM NIL "predicate-name") "—a " (:TERM NIL "symbol") ". "
     :PAR (:ISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
     (:PARAM NIL "printer-name") "—a " (:TERM NIL "function name") " or a "
     (:TERM NIL "lambda expression") ". "
     (:ENDISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93") (:PARAM NIL "slot-name")
     "—a " (:TERM NIL "symbol") ". " :PAR (:PARAM NIL "slot-initform") "—a "
     (:TERM NIL "form") ". " :PAR (:PARAM NIL "slot-read-only-p") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "structure-name")
     "—a " (:TERM NIL "symbol") ". " :PAR (:PARAM NIL "type") "—one of the "
     (:TERM NIL "type specifiers") " " (:TYPEREF NIL "list") ", "
     (:TYPEREF NIL "vector") ", or "
     (:TT NIL "(vector " (:PARAM NIL "size") ")") ", or some other "
     (:TERM NIL "type specifier") " defined by the "
     (:TERM NIL "implementation") " to be appropriate. " :PAR
     (:COMMENT NIL "% 19.2.0 3" " Removed redundant syntax presentation. -kmp")
     :PAR (:COMMENT NIL "% 19.2.0 4") (:PARAM NIL "documentation") "—a "
     (:TERM NIL "string") "; not evaluated. " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "defstruct")
     " defines a structured " (:TERM NIL "type") ", named "
     (:PARAM NIL "structure-type") ", with named slots as specified by the "
     (:PARAM NIL "slot-options") ". " :PAR (:COMMENT NIL "% 19.2.0 8")
     (:MACREF NIL "defstruct") " defines " (:TERM NIL "readers")
     " for the slots and arranges for " (:MACREF NIL "setf")
     " to work properly on such " (:TERM NIL "reader")
     " functions. Also, unless overridden, it defines a predicate named "
     (:TT NIL (:PARAM NIL "name") "-p")
     ", defines a constructor function named "
     (:TT NIL "make-" (:PARAM NIL "constructor-name"))
     ", and defines a copier function named "
     (:TT NIL "copy-" (:PARAM NIL "constructor-name")) ". "
     (:COMMENT NIL "All names of automatically created functions are interned"
      "in whatever package is current at the time the \\macref{defstruct}"
      "form is expanded.")
     "All names of automatically created functions might automatically be declared "
     (:DECLREF NIL "inline") " (at the discretion of the "
     (:TERM NIL "implementation") "). " :PAR (:COMMENT NIL "% 19.2.0 5") "If "
     (:PARAM NIL "documentation") " is supplied, it is attached to "
     (:PARAM NIL "structure-name") " as a " (:TERM NIL "documentation string")
     " of kind " (:MISC NIL "structure") ", "
     (:ISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " and unless "
     (:KWD NIL "type") " is used, the " (:PARAM NIL "documentation")
     " is also attached to " (:PARAM NIL "structure-name") " as a "
     (:TERM NIL "documentation string") " of kind " (:MISC NIL "type")
     " and as a " (:TERM NIL "documentation string") " to the "
     (:TERM NIL "class") " " (:TERM NIL "object") " for the "
     (:TERM NIL "class") " named " (:PARAM NIL "structure-name") ". "
     (:ENDISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " " :PAR
     (:COMMENT NIL "% 19.3.0 1") (:MACREF NIL "defstruct")
     " defines a constructor function that is used to create instances of the structure created by "
     (:MACREF NIL "defstruct") ". The default name is "
     (:TT NIL "make-" (:PARAM NIL "structure-name"))
     ". A different name can be supplied by giving the name as the argument to the "
     (:PARAM NIL "constructor") " option. " (:MISC NIL "nil")
     " indicates that no constructor function will be created. " :PAR
     (:COMMENT NIL "% 19.3.0 2")
     "After a new structure type has been defined, instances of that type normally can be created by using the constructor function for the type. A call to a constructor function is of the following form: "
     :PAR :PAR "  "
     (:TABLE (:TABS T)
      (:ROW NIL (:CELL NIL) (:CELL NIL "(")
       (:CELL NIL (:TT NIL " constructor-function-name")))
      (:ROW NIL (:CELL NIL) (:CELL NIL)
       (:CELL NIL (:TT NIL " slot-keyword-1 form-1")))
      (:ROW NIL (:CELL NIL) (:CELL NIL)
       (:CELL NIL (:TT NIL " slot-keyword-2 form-2")))
      (:ROW NIL (:CELL NIL) (:CELL NIL)
       (:CELL NIL (:MATH NIL (:MO NIL "…")) ")")))
     " " :PAR " " (:RM NIL " ") :PAR (:COMMENT NIL "% 19.3.0 3")
     "The arguments to the constructor function are all keyword arguments. Each slot keyword argument must be a keyword whose name corresponds to the name of a structure slot. All the "
     (:PARAM NIL "keywords") " and " (:PARAM NIL "forms") " are evaluated. "
     (:COMMENT NIL " If a slot is not initialized in this way, "
      " it is initialized by evaluating \\param{slot-initform} in the "
      " slot description." " \\param{Slot-initform} is evaluated"
      " \\issue{DEFSTRUCT-DEFAULT-VALUE-EVALUATION:IFF-NEEDED}"
      " each time its value is to be used as the initial value of a slot." " "
      " %The following will be deleted:" " %"
      " %If no \\param{slot-initform} is"
      " %supplied, the contents of the slot are \\term{implementation-dependent}."
      " \\endissue{DEFSTRUCT-DEFAULT-VALUE-EVALUATION:IFF-NEEDED}"
      "% Rewritten for Barmar:")
     "If a slot is not initialized in this way, it is initialized by evaluating "
     (:PARAM NIL "slot-initform") " in the slot description "
     (:ISSUE NIL "DEFSTRUCT-DEFAULT-VALUE-EVALUATION:IFF-NEEDED")
     " at the time the constructor function is called. "
     (:COMMENT NIL "If no \\param{slot-initform} is"
      "supplied, the contents of the slot are \\term{implementation-dependent}.")
     (:ENDISSUE NIL "DEFSTRUCT-DEFAULT-VALUE-EVALUATION:IFF-NEEDED") " "
     (:ISSUE NIL "UNITIALIZED-ELEMENTS:CONSEQUENCES-UNDEFINED") " "
     (:COMMENT NIL
      " Refer to discussion of failed issue UNINITIALIZED-ELEMENTS for an explanation"
      " of how the next sentence came to be. -kmp 9-Feb-92"
      " This issue later actually passed at the Mar-93 meeting,"
      " affirming the wording here but making changes elsewhere (in MAKE-ARRAY and ADJUST-ARRAY)."
      "  -kmp 5-May-93")
     "If no " (:PARAM NIL "slot-initform")
     " is supplied, the consequences are undefined if an attempt is later made to read the slot's value before a value is explicitly assigned. "
     (:ENDISSUE NIL "UNITIALIZED-ELEMENTS:CONSEQUENCES-UNDEFINED") " " :PAR
     (:COMMENT NIL "% 19.3.0 4") "Each " (:PARAM NIL "slot-initform")
     " supplied for a " (:MACREF NIL "defstruct")
     " component, when used by the constructor function for an otherwise unsupplied component, is re-evaluated on every call to the constructor function. "
     (:ISSUE NIL "DEFSTRUCT-DEFAULT-VALUE-EVALUATION:IFF-NEEDED") " The "
     (:PARAM NIL "slot-initform")
     " is not evaluated unless it is needed in the creation of a particular structure instance. If it is never needed, there can be no type-mismatch error, even if the "
     (:TERM NIL "type")
     " of the slot is specified; no warning should be issued in this case. "
     (:ENDISSUE NIL "DEFSTRUCT-DEFAULT-VALUE-EVALUATION:IFF-NEEDED") " "
     (:COMMENT NIL
      "!!! Barmar: What if no initial value is specified when creating an instance??")
     "For example, in the following sequence, only the last call is an error. "
     :PAR
     (:CODE NIL " (defstruct person (name 007 :type string)) 
 (make-person :name \"James\")
 (make-person)
")
     " " :PAR "It is as if the " (:PARAM NIL "slot-initforms") " were used as "
     (:TERM NIL "initialization forms") " for the "
     (:TERM NIL "keyword parameters") " of the constructor function. " :PAR
     (:ISSUE NIL "DEFSTRUCT-CONSTRUCTOR-SLOT-VARIABLES:NOT-BOUND") " The "
     (:TERM NIL "symbols") " which name the slots must not be used by the "
     (:TERM NIL "implementation") " as the " (:TERM NIL "names") " for the "
     (:TERM NIL "lambda variables")
     " in the constructor function, since one or more of those "
     (:TERM NIL "symbols") " might have been proclaimed "
     (:DECLREF NIL "special") " or might be defined as the name of a "
     (:TERM NIL "constant variable")
     ". The slot default init forms are evaluated in the "
     (:TERM NIL "lexical environment") " in which the "
     (:MACREF NIL "defstruct") " form itself appears and in the "
     (:TERM NIL "dynamic environment")
     " in which the call to the constructor function appears. "
     (:ENDISSUE NIL "DEFSTRUCT-CONSTRUCTOR-SLOT-VARIABLES:NOT-BOUND") " " :PAR
     "For example, if the form " (:TT NIL "(gensym)")
     " were used as an initialization form, either in the constructor-function call or as the default initialization form in "
     (:MACREF NIL "defstruct")
     ", then every call to the constructor function would call "
     (:FUNREF NIL "gensym") " once to generate a new " (:TERM NIL "symbol")
     ". " :PAR (:ISSUE NIL "DEFSTRUCT-SLOTS-CONSTRAINTS-NUMBER") " "
     (:COMMENT NIL "% 19.4.0 1") "Each " (:PARAM NIL "slot-description") " in "
     (:MACREF NIL "defstruct") " can specify zero or more "
     (:PARAM NIL "slot-options") ". "
     (:ENDISSUE NIL "DEFSTRUCT-SLOTS-CONSTRAINTS-NUMBER") " A "
     (:PARAM NIL "slot-option")
     " consists of a pair of a keyword and a value (which is not a form to be evaluated, but the value itself). For example: "
     :PAR
     (:CODE NIL " (defstruct ship
   (x-position 0.0 :type short-float)
   (y-position 0.0 :type short-float)
   (x-velocity 0.0 :type short-float)
   (y-velocity 0.0 :type short-float)
   (mass *default-ship-mass* :type short-float :read-only t))
")
     " This specifies that each slot always contains a "
     (:TERM NIL "short float")
     ", and that the last slot cannot be altered once a ship is constructed. "
     :PAR (:COMMENT NIL "% 19.4.0 2") "The available slot-options are: "
     (:LIST NIL
      (:ITEM NIL (:TT NIL " " (:KWD NIL "type") " " (:PARAM NIL "type")) " "
       :PAR "This specifies that the contents of the slot is always of type "
       (:PARAM NIL "type")
       ". This is entirely analogous to the declaration of a variable or function; it effectively declares the result type of the "
       (:TERM NIL "reader") " function. "
       (:COMMENT NIL
        " Whether an \\term{implementation} chooses to check the type of the new \\term{object}"
        " when initializing or assigning to a slot is \\term{implementation-dependent}."
        "% Rewritten for Barmar:")
       "It is " (:TERM NIL "implementation-dependent") " whether the "
       (:TERM NIL "type")
       " is checked when initializing a slot or when assigning to it. "
       (:PARAM NIL "Type") " is not evaluated; it must be a valid "
       (:TERM NIL "type specifier") ". " :PAR (:COMMENT NIL "% 19.4.0 4"))
      (:ITEM NIL (:TT NIL " " (:KWD NIL "read-only") " " (:PARAM NIL "x")) " "
       :PAR "When " (:PARAM NIL "x") " is " (:TERM NIL "true")
       ", this specifies that this slot cannot be altered; it will always contain the value supplied at construction time. "
       (:MACREF NIL "setf") " will not accept the " (:TERM NIL "reader")
       " function for this slot. If " (:PARAM NIL "x") " is "
       (:TERM NIL "false") ", this slot-option has no effect. "
       (:PARAM NIL "X") " is not evaluated. " :PAR
       (:ISSUE NIL "SETF-FUNCTIONS-AGAIN:MINIMAL-CHANGES")
       " When this option is " (:TERM NIL "false") " or unsupplied, it is "
       (:TERM NIL "implementation-dependent") " whether the ability to "
       (:TERM NIL "write") " the slot is implemented by a "
       (:TERM NIL "setf function") " or a " (:TERM NIL "setf expander") ". "
       (:ENDISSUE NIL "SETF-FUNCTIONS-AGAIN:MINIMAL-CHANGES") " " :PAR))
     " " :PAR (:COMMENT NIL "% 19.5.0 3")
     "The following keyword options are available for use with "
     (:MACREF NIL "defstruct") ". A " (:MACREF NIL "defstruct")
     " option can be either a keyword or a " (:TERM NIL "list")
     " of a keyword and arguments for that keyword; "
     (:COMMENT NIL
      " This part added at Barmar's suggestion.  Quinquevirate appeared to concur. -kmp 30-Aug-91")
     "specifying the keyword by itself is equivalent to specifying a list consisting of the keyword and no arguments. The syntax for "
     (:MACREF NIL "defstruct")
     " options differs from the pair syntax used for slot-options. No part of any of these options is evaluated. "
     (:LIST NIL
      (:ITEM NIL (:KWD NIL "conc-name") " " :PAR
       "This provides for automatic prefixing of names of "
       (:TERM NIL "reader") " (or " (:TERM NIL "access")
       ") functions. The default behavior is to begin the names of all the "
       (:TERM NIL "reader")
       " functions of a structure with the name of the structure followed by a hyphen. "
       :PAR (:COMMENT NIL "% 19.5.0 5") (:KWD NIL "conc-name")
       " supplies an alternate prefix to be used. If a hyphen is to be used as a separator, it must be supplied as part of the prefix. If "
       (:KWD NIL "conc-name") " is " (:MISC NIL "nil")
       " or no argument is supplied, then no prefix is used; then the names of the "
       (:TERM NIL "reader") " functions are the same as the slot names. If a "
       (:TERM NIL "non-nil") " prefix is given, the name of the "
       (:TERM NIL "reader") " " (:TERM NIL "function")
       " for each slot is constructed by concatenating that prefix and the name of the slot, and interning the resulting "
       (:TERM NIL "symbol") " in the " (:TERM NIL "package")
       " that is current at the time the " (:MACREF NIL "defstruct")
       " form is expanded. " :PAR (:COMMENT NIL "% 19.5.0 6")
       "Note that no matter what is supplied for " (:KWD NIL "conc-name")
       ", slot keywords that match the slot names with no prefix attached are used with a constructor function. The "
       (:TERM NIL "reader") " function name is used in conjunction with "
       (:MACREF NIL "setf") ". Here is an example: " :PAR
       (:COMMENT NIL " \\code"
        "  (defstruct door knob-color width material) \\EV DOOR"
        "  (setq my-door (make-door :knob-color 'red :width 5.0)) "
        " \\EV #S(DOOR :KNOB-COLOR RED :WIDTH 5.0 :MATERIAL NIL)"
        "  (door-width my-door) \\EV 5.0" "  (setf (door-width my-door) 43.7)"
        "  (door-width my-door) \\EV 43.7" " \\endcode"
        " Barmar observes that the above didn't demonstrate use of :CONC-NAME...")
       :PAR
       (:CODE NIL
        " (defstruct (door (:conc-name dr-)) knob-color width material) → DOOR
 (setq my-door (make-door :knob-color 'red :width 5.0)) 
→ #S(DOOR :KNOB-COLOR RED :WIDTH 5.0 :MATERIAL NIL)
 (dr-width my-door) → 5.0
 (setf (dr-width my-door) 43.7) → 43.7
 (dr-width my-door) → 43.7
")
       " " :PAR "Whether or not the " (:KWD NIL "conc-name")
       " option is explicitly supplied, the following rule governs name conflicts of generated "
       (:TERM NIL "reader") " (or " (:TERM NIL "accessor") ") names: For any "
       (:TERM NIL "structure") " " (:TERM NIL "type") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MN NIL "1"))) " having a "
       (:TERM NIL "reader") " function named " (:MATH NIL (:MI NIL "R"))
       " for a slot named " (:MATH NIL (:MSUB NIL (:MI NIL "X") (:MN NIL "1")))
       " that is inherited by another " (:TERM NIL "structure") " "
       (:TERM NIL "type") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MN NIL "2")))
       " that would have a " (:TERM NIL "reader")
       " function with the same name " (:MATH NIL (:MI NIL "R"))
       " for a slot named " (:MATH NIL (:MSUB NIL (:MI NIL "X") (:MN NIL "2")))
       ", no definition for " (:MATH NIL (:MI NIL "R"))
       " is generated by the definition of "
       (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MN NIL "2")))
       "; instead, the definition of " (:MATH NIL (:MI NIL "R"))
       " is inherited from the definition of "
       (:MATH NIL (:MSUB NIL (:MI NIL "S") (:MN NIL "1")))
       ". (In such a case, if "
       (:MATH NIL (:MSUB NIL (:MI NIL "X") (:MN NIL "1"))) " and "
       (:MATH NIL (:MSUB NIL (:MI NIL "X") (:MN NIL "2")))
       " are different slots, the " (:TERM NIL "implementation")
       " might signal a style warning.) " :PAR)
      (:ITEM NIL (:KWD NIL "constructor") " " :PAR (:COMMENT NIL "% 19.5.0 7")
       "This option takes zero, one, or two arguments. If at least one argument is supplied and the first argument is not "
       (:MISC NIL "nil") ", then that argument is a " (:TERM NIL "symbol")
       " which specifies the name of the constructor function. If the argument is not supplied (or if the option itself is not supplied), the name of the constructor is produced by concatenating the string "
       (:TT NIL "\"MAKE-\"")
       " and the name of the structure, interning the name in whatever "
       (:TERM NIL "package") " is current at the time "
       (:MACREF NIL "defstruct")
       " is expanded. If the argument is provided and is " (:MISC NIL "nil")
       ", no constructor function is defined. " :PAR
       (:COMMENT NIL "% 19.5.0 8" "% 19.6.0 1") "If " (:KWD NIL "constructor")
       " is given as "
       (:TT NIL "(:constructor " (:PARAM NIL "name") " " (:PARAM NIL "arglist")
        ")")
       ", then instead of making a keyword driven constructor function, "
       (:MACREF NIL "defstruct")
       " defines a “positional” constructor function, taking arguments whose meaning is determined by the argument's position and possibly by keywords. "
       (:PARAM NIL "Arglist")
       " is used to describe what the arguments to the constructor will be. In the simplest case something like "
       (:TT NIL "(:constructor make-foo (a b c))") " defines "
       (:TT NIL "make-foo")
       " to be a three-argument constructor function whose arguments are used to initialize the slots named "
       (:TT NIL "a") ", " (:TT NIL "b") ", and " (:TT NIL "c") ". " :PAR
       (:COMMENT NIL "% 19.6.0 7")
       "Because a constructor of this type operates “By Order of Arguments,” it is sometimes known as a “boa constructor.” "
       :PAR "For information on how the " (:PARAM NIL "arglist")
       " for a “boa constructor” is processed, see "
       (:SECREF NIL :BOA-LAMBDA-LISTS) ". " :PAR (:COMMENT NIL "% 19.6.0 5")
       "It is permissible to use the " (:KWD NIL "constructor")
       " option more than once, so that you can define several different constructor functions, each taking different parameters. "
       :PAR
       (:REVIEWER NIL
        "Barmar: What about (:constructor) and (:constructor nil). Should we worry about it?")
       (:COMMENT NIL "!!!") :PAR
       (:COMMENT NIL
        " I think Barmar was referring to issue DEFSTRUCT-CONSTRUCTOR-OPTIONS,"
        " which had not been incorporated into the draft.  I have added the"
        " clarification below.  --sjl 4 Mar 92")
       :PAR (:ISSUE NIL "DEFSTRUCT-CONSTRUCTOR-OPTIONS:EXPLICIT") " "
       (:MACREF NIL "defstruct")
       " creates the default-named keyword constructor function only if no explicit "
       (:KWD NIL "constructor") " options are specified, or if the "
       (:KWD NIL "constructor") " option is specified without a "
       (:PARAM NIL "name") " argument. " :PAR (:TT NIL "(:constructor nil)")
       " is meaningful only when there are no other " (:KWD NIL "constructor")
       " options specified. It prevents " (:MACREF NIL "defstruct")
       " from generating any constructors at all. " :PAR "Otherwise, "
       (:MACREF NIL "defstruct")
       " creates a constructor function corresponding to each supplied "
       (:KWD NIL "constructor")
       " option. It is permissible to specify multiple keyword constructor functions as well as multiple “boa constructors”. "
       (:ENDISSUE NIL "DEFSTRUCT-CONSTRUCTOR-OPTIONS:EXPLICIT") " " :PAR)
      (:ITEM NIL (:KWD NIL "copier") " " :PAR (:COMMENT NIL "% 19.5.0 9")
       "This option takes one argument, a " (:TERM NIL "symbol")
       ", which specifies the name of the copier function. If the argument is not provided or if the option itself is not provided, the name of the copier is produced by concatenating the string "
       (:TT NIL "\"COPY-\"")
       " and the name of the structure, interning the name in whatever "
       (:TERM NIL "package") " is current at the time "
       (:MACREF NIL "defstruct")
       " is expanded. If the argument is provided and is " (:MISC NIL "nil")
       ", no copier function is defined. " :PAR (:COMMENT NIL "% 19.5.0 10")
       (:ISSUE NIL "DEFSTRUCT-COPIER:ARGUMENT-TYPE") " "
       (:COMMENT NIL " The automatically defined copier function "
        " makes a new structure"
        " and transfers all components verbatim from the argument into the"
        " newly created structure.  No attempt is made to make copies"
        " of the components.  Corresponding components of the old and"
        " new structures are \\funref{eql}.")
       "The automatically defined copier function is a function of one "
       (:TERM NIL "argument") ", "
       (:ISSUE NIL "DEFSTRUCT-COPIER-ARGUMENT-TYPE:RESTRICT")
       " which must be of the structure type being defined. "
       (:ENDISSUE NIL "DEFSTRUCT-COPIER-ARGUMENT-TYPE:RESTRICT")
       " The copier function creates a " (:TERM NIL "fresh")
       " structure that has the same " (:TERM NIL "type") " as its "
       (:TERM NIL "argument") ", and that has the " (:TERM NIL "same")
       " component values as the original structure; that is, the component values are not copied recursively. "
       (:ISSUE NIL "DEFSTRUCT-COPIER-ARGUMENT-TYPE:RESTRICT") " If the "
       (:MACREF NIL "defstruct") " " (:KWD NIL "type") " option was not used, "
       (:COMMENT NIL
        " the copier function has the same effect as \\funref{copy-structure},"
        " except that additional type-checking might be performed "
        " to make sure that the \\term{argument} to the copier is"
        " of \\term{type} \\param{structure-name}.")
       "the following equivalence applies: " :PAR
       (:CODE NIL " (" (:PARAM NIL "copier-name") " x) = (copy-structure (the "
        (:PARAM NIL "structure-name") " x))
")
       " " (:ENDISSUE NIL "DEFSTRUCT-COPIER-ARGUMENT-TYPE:RESTRICT") " "
       (:ENDISSUE NIL "DEFSTRUCT-COPIER:ARGUMENT-TYPE") " " :PAR)
      (:ITEM NIL (:KWD NIL "include") " " :PAR (:COMMENT NIL "% 19.5.0 12")
       "This option is used for building a new structure definition as an extension of another structure definition. For example: "
       :PAR
       (:CODE NIL " (defstruct person name age sex)
")
       " To make a new structure to represent an astronaut that has the attributes of name, age, and sex, and "
       (:TERM NIL "functions") " that operate on " (:TT NIL "person")
       " structures, " (:TT NIL "astronaut") " is defined with "
       (:KWD NIL "include") " as follows: " :PAR (:COMMENT NIL "% 19.5.0 13")
       (:CODE NIL " (defstruct (astronaut (:include person)
                       (:conc-name astro-))
    helmet-size
    (favorite-beverage 'tang))
")
       " " :PAR (:COMMENT NIL "% 19.5.0 14") (:KWD NIL "include")
       " causes the structure being defined to have the same slots as the included structure. This is done in such a way that the "
       (:TERM NIL "reader")
       " functions for the included structure also work on the structure being defined. In this example, an "
       (:TT NIL "astronaut") " therefore has five slots: the three defined in "
       (:TT NIL "person") " and the two defined in " (:TT NIL "astronaut")
       " itself. The " (:TERM NIL "reader") " functions defined by the "
       (:TT NIL "person") " structure can be applied to instances of the "
       (:TT NIL "astronaut") " structure, and they work correctly. Moreover, "
       (:TT NIL "astronaut") " has its own " (:TERM NIL "reader")
       " functions for components defined by the " (:TT NIL "person")
       " structure. The following examples illustrate the use of "
       (:TT NIL "astronaut") " structures: " :PAR (:COMMENT NIL "% 19.5.0 16")
       (:CODE NIL " (setq x (make-astronaut :name 'buzz
                         :age 45.
                         :sex t
                         :helmet-size 17.5))
 (person-name x) → BUZZ
 (astro-name x) → BUZZ
 (astro-favorite-beverage x) → TANG
")
       " " (:ISSUE NIL "REDUCE-ARGUMENT-EXTRACTION") " "
       (:CODE NIL
        " (reduce #'+ astros :key #'person-age) ; obtains the total of the ages 
                                       ; of the possibly empty
                                       ; sequence of astros
")
       " " (:ENDISSUE NIL "REDUCE-ARGUMENT-EXTRACTION")
       " The difference between the " (:TERM NIL "reader") " functions "
       (:TT NIL "person-name") " and " (:TT NIL "astro-name") " is that "
       (:TT NIL "person-name") " can be correctly applied to any "
       (:TT NIL "person") ", including an " (:TT NIL "astronaut") ", while "
       (:TT NIL "astro-name") " can be correctly applied only to an "
       (:TT NIL "astronaut")
       ". An implementation might check for incorrect use of "
       (:TERM NIL "reader") " functions. " :PAR
       (:COMMENT NIL "% 19.5.0 17                          ") "At most one "
       (:KWD NIL "include") " can be supplied in a single "
       (:MACREF NIL "defstruct") ". The argument to " (:KWD NIL "include")
       " is required and must be the name of some previously defined structure. If the structure being defined has no "
       (:KWD NIL "type")
       " option, then the included structure must also have had no "
       (:KWD NIL "type")
       " option supplied for it. If the structure being defined has a "
       (:KWD NIL "type")
       " option, then the included structure must have been declared with a "
       (:KWD NIL "type") " option specifying the same representation "
       (:TERM NIL "type") ". " :PAR (:COMMENT NIL "% 19.5.0 18") "If no "
       (:KWD NIL "type")
       " option is involved, then the structure name of the including structure definition becomes the name of a "
       (:TERM NIL "data type") ", and therefore a valid "
       (:TERM NIL "type specifier") " recognizable by " (:FUNREF NIL "typep")
       "; it becomes a " (:TERM NIL "subtype")
       " of the included structure. In the above example, "
       (:TT NIL "astronaut") " is a " (:TERM NIL "subtype") " of "
       (:TT NIL "person") "; hence " :PAR
       (:CODE NIL " (typep (make-astronaut) 'person) → " (:TERM NIL "true") "
")
       " indicating that all operations on persons also work on astronauts. "
       :PAR (:COMMENT NIL "% 19.5.0 19") "The structure using "
       (:KWD NIL "include")
       " can specify default values or slot-options for the included slots different from those the included structure specifies, by giving the "
       (:KWD NIL "include") " option as: " :PAR
       (:CODE NIL " (:include " (:PARAM NIL "included-structure-name") " "
        (:STAR NIL (:CURLY NIL (:PARAM NIL "slot-description"))) ")
")
       " Each " (:PARAM NIL "slot-description") " must have a "
       (:PARAM NIL "slot-name") " "
       (:COMMENT NIL "% What was this about? -kmp 9-Feb-92"
        "or \\param{slot-keyword}")
       "that is the same as that of some slot in the included structure. If a "
       (:PARAM NIL "slot-description") " has no " (:PARAM NIL "slot-initform")
       ", then in the new structure the slot has no initial value. Otherwise its initial value form is replaced by the "
       (:PARAM NIL "slot-initform") " in the " (:PARAM NIL "slot-description")
       ". A normally writable slot can be made read-only. If a slot is read-only in the included structure, then it must also be so in the including structure. If a "
       (:TERM NIL "type") " is supplied for a slot, it must be "
       (:COMMENT NIL
        "% Redundant.  \"subtype\" includes \"same type\". -kmp 30-Aug-91"
        "the same as, or")
       "a " (:TERM NIL "subtype") " of " (:COMMENT NIL ",") "the "
       (:TERM NIL "type") " specified in the included structure. "
       (:COMMENT NIL
        "%Barmar and I couldn't figure out what this contributed.  The implementation"
        "%can do this anyway, subtype or no.  Removed as confusing. -kmp 28-Dec-90"
        " If it is a strict \\term{subtype}, the implementation might choose to"
        " error-check assignments.")
       :PAR (:COMMENT NIL "% 19.5.0 20")
       "For example, if the default age for an astronaut is " (:TT NIL "45")
       ", then " :PAR
       (:CODE NIL " (defstruct (astronaut (:include person (age 45)))
    helmet-size
    (favorite-beverage 'tang))
")
       " " :PAR (:COMMENT NIL "% 19.7.3 1") :PAR "If " (:KWD NIL "include")
       " is used with the " (:KWD NIL "type")
       " option, then the effect is first to skip over as many representation elements as needed to represent the included structure, then to skip over any additional elements supplied by the "
       (:KWD NIL "initial-offset")
       " option, and then to begin allocation of elements from that point. For example: "
       :PAR
       (:CODE NIL " (defstruct (binop (:type list) :named (:initial-offset 2))
   (operator '? :type symbol)   
   operand-1
   operand-2) → BINOP
 (defstruct (annotated-binop (:type list)
                             (:initial-offset 3)
                             (:include binop))
  commutative associative identity) → ANNOTATED-BINOP
 (make-annotated-binop :operator '*
                       :operand-1 'x
                       :operand-2 5
                       :commutative t
                       :associative t
                       :identity 1)
   → (NIL NIL BINOP * X 5 NIL NIL NIL T T 1)
")
       " The first two " (:MISC NIL "nil") " elements stem from the "
       (:KWD NIL "initial-offset") " of " (:TT NIL "2")
       " in the definition of " (:TT NIL "binop")
       ". The next four elements contain the structure name and three slots for "
       (:TT NIL "binop") ". The next three " (:MISC NIL "nil")
       " elements stem from the " (:KWD NIL "initial-offset") " of "
       (:TT NIL "3") " in the definition of " (:TT NIL "annotated-binop")
       ". The last three list elements contain the additional slots for an "
       (:TT NIL "annotated-binop") ". " :PAR)
      (:ITEM NIL (:KWD NIL "initial-offset") " " :PAR
       (:COMMENT NIL "% 19.5.0 31") (:KWD NIL "initial-offset") " instructs "
       (:MACREF NIL "defstruct")
       " to skip over a certain number of slots before it starts allocating the slots described in the body. This option's argument is the number of slots "
       (:MACREF NIL "defstruct") " should skip. " (:KWD NIL "initial-offset")
       " can be used only if " (:KWD NIL "type") " is also supplied. " :PAR
       (:REVIEWER NIL "Barmar: What are initial values of the skipped slots?")
       (:COMMENT NIL "!!!") :PAR (:COMMENT NIL "% 19.7.3 1")
       (:KWD NIL "initial-offset")
       " allows slots to be allocated beginning at a representational element other than the first. For example, the form "
       :PAR
       (:CODE NIL " (defstruct (binop (:type list) (:initial-offset 2))
   (operator '? :type symbol)
   operand-1
   operand-2) → BINOP
")
       " would result in the following behavior for " (:TT NIL "make-binop")
       ": " :PAR
       (:CODE NIL " (make-binop :operator '+ :operand-1 'x :operand-2 5)
→ (NIL NIL + X 5)
 (make-binop :operand-2 4 :operator '*)
→ (NIL NIL * NIL 4)
")
       " The selector functions " (:TT NIL "binop-operator") ", "
       (:TT NIL "binop-operand-1") ", and " (:TT NIL " binop-operand-2")
       " would be essentially equivalent to " (:FUNREF NIL "third") ", "
       (:FUNREF NIL "fourth") ", and " (:FUNREF NIL "fifth")
       ", respectively. Similarly, the form " :PAR
       (:CODE NIL " (defstruct (binop (:type list) :named (:initial-offset 2))
   (operator '? :type symbol)
   operand-1
   operand-2) → BINOP
")
       " would result in the following behavior for " (:TT NIL "make-binop")
       ": " :PAR
       (:CODE NIL
        " (make-binop :operator '+ :operand-1 'x :operand-2 5) → (NIL NIL BINOP + X 5)
 (make-binop :operand-2 4 :operator '*) → (NIL NIL BINOP * NIL 4)
")
       " " :PAR "The first two " (:MISC NIL "nil") " elements stem from the "
       (:KWD NIL "initial-offset") " of " (:TT NIL "2")
       " in the definition of " (:TT NIL "binop")
       ". The next four elements contain the structure name and three slots for "
       (:TT NIL "binop") ". " :PAR)
      (:ITEM NIL (:KWD NIL "named") " " :PAR (:COMMENT NIL "% 19.5.0 29")
       (:KWD NIL "named") " specifies that the structure is named. If no "
       (:KWD NIL "type") " is supplied, then the structure is always named. "
       :PAR (:COMMENT NIL "% 19.7.0 1" "% this paragraph was left out") :PAR
       (:COMMENT NIL "% 19.7.1 1") "For example: " :PAR
       (:CODE NIL " (defstruct (binop (:type list))
   (operator '? :type symbol)
   operand-1
   operand-2) → BINOP
")
       " This defines a constructor function " (:TT NIL "make-binop")
       " and three selector functions, namely " (:TT NIL "binop-operator") ", "
       (:TT NIL "binop-operand-1") ", and " (:TT NIL "binop-operand-2")
       ". (It does not, however, define a predicate " (:TT NIL "binop-p")
       ", for reasons explained below.) " :PAR (:COMMENT NIL "% 19.7.1 2")
       "The effect of " (:TT NIL "make-binop")
       " is simply to construct a list of length three: " :PAR
       (:CODE NIL
        " (make-binop :operator '+ :operand-1 'x :operand-2 5) → (+ X 5)  
 (make-binop :operand-2 4 :operator '*) → (* NIL 4)
")
       " It is just like the function " (:TT NIL "list")
       " except that it takes keyword arguments and performs slot defaulting appropriate to the "
       (:TT NIL "binop")
       " conceptual data type. Similarly, the selector functions "
       (:TT NIL "binop-operator") ", " (:TT NIL "binop-operand-1") ", and "
       (:TT NIL "binop-operand-2") " are essentially equivalent to "
       (:FUNREF NIL "car") ", " (:FUNREF NIL "cadr") ", and "
       (:FUNREF NIL "caddr")
       ", respectively. They might not be completely equivalent because, for example, an implementation would be justified in adding error-checking code to ensure that the argument to each selector function is a length-3 list. "
       :PAR (:COMMENT NIL "% 19.7.1 3") (:TT NIL "binop")
       " is a conceptual data type in that it is not made a part of the "
       (:RM NIL " Common Lisp") " type system. " (:FUNREF NIL "typep")
       " does not recognize " (:TT NIL "binop") " as a "
       (:TERM NIL "type specifier") ", and " (:FUNREF NIL "type-of")
       " returns " (:TT NIL "list") " when given a " (:TT NIL "binop")
       " structure. There is no way to distinguish a data structure constructed by "
       (:TT NIL "make-binop") " from any other " (:TERM NIL "list")
       " that happens to have the correct structure. " :PAR
       (:COMMENT NIL "% 19.7.1 4")
       "There is not any way to recover the structure name " (:TT NIL "binop")
       " from a structure created by " (:TT NIL "make-binop")
       ". This can only be done if the structure is named. A named structure has the property that, given an instance of the structure, the structure name (that names the type) can be reliably recovered. For structures defined with no "
       (:KWD NIL "type")
       " option, the structure name actually becomes part of the "
       (:RM NIL " Common Lisp") " data-type system. " (:FUNREF NIL "type-of")
       ", when applied to such a structure, returns the structure name as the "
       (:TERM NIL "type") " of the " (:TERM NIL "object") "; "
       (:FUNREF NIL "typep") " recognizes the structure name as a valid "
       (:TERM NIL "type specifier") ". " :PAR "For structures defined with a "
       (:KWD NIL "type") " option, " (:FUNREF NIL "type-of") " returns a "
       (:TERM NIL "type specifier") " such as " (:TT NIL "list") " or "
       (:TT NIL "(vector t)") ", depending on the type supplied to the "
       (:KWD NIL "type") " option. The structure name does not become a valid "
       (:TERM NIL "type specifier") ". However, if the " (:KWD NIL "named")
       " option is also supplied, then the first component of the structure (as created by a "
       (:MACREF NIL "defstruct")
       " constructor function) always contains the structure name. This allows the structure name to be recovered from an instance of the structure and allows a reasonable predicate for the conceptual type to be defined: the automatically defined "
       (:PARAM NIL "name-p")
       " predicate for the structure operates by first checking that its argument is of the proper type ("
       (:TYPEREF NIL "list") ", " (:TT NIL "(vector t)")
       ", or whatever) and then checking whether the first component contains the appropriate type name. "
       :PAR "Consider the " (:TT NIL "binop")
       " example shown above, modified only to include the " (:KWD NIL "named")
       " option: " :PAR
       (:CODE NIL " (defstruct (binop (:type list) :named)
   (operator '? :type symbol)
   operand-1
   operand-2) → BINOP
")
       " As before, this defines a constructor function "
       (:TT NIL "make-binop") " and three selector functions "
       (:TT NIL "binop-operator") ", " (:TT NIL "binop-operand-1") ", and "
       (:TT NIL "binop-operand-2") ". It also defines a predicate "
       (:TT NIL "binop-p") ". The effect of " (:TT NIL "make-binop")
       " is now to construct a list of length four: " :PAR
       (:CODE NIL
        " (make-binop :operator '+ :operand-1 'x :operand-2 5) → (BINOP + X 5)
 (make-binop :operand-2 4 :operator '*) → (BINOP * NIL 4)
")
       " The structure has the same layout as before except that the structure name "
       (:TT NIL "binop")
       " is included as the first list element. The selector functions "
       (:TT NIL "binop-operator") ", " (:TT NIL "binop-operand-1") ", and "
       (:TT NIL "binop-operand-2") " are essentially equivalent to "
       (:FUNREF NIL "cadr") ", " (:FUNREF NIL "caddr") ", and "
       (:FUNREF NIL "cadddr") ", respectively. The predicate "
       (:TT NIL "binop-p") " is more or less equivalent to this definition: "
       :PAR
       (:CODE NIL " (defun binop-p (x)
   (and (consp x) (eq (car x) 'binop))) → BINOP-P
")
       " The name " (:TT NIL "binop") " is still not a valid "
       (:TERM NIL "type specifier") " recognizable to " (:FUNREF NIL "typep")
       ", but at least there is a way of distinguishing " (:TT NIL "binop")
       " structures from other similarly defined structures. " :PAR)
      (:ITEM NIL (:KWD NIL "predicate") " " :PAR (:COMMENT NIL "% 19.5.0 11")
       "This option takes one argument, which specifies the name of the type predicate. If the argument is not supplied or if the option itself is not supplied, the name of the predicate is made by concatenating the name of the structure to the string "
       (:TT NIL "\"-P\"") ", interning the name in whatever "
       (:TERM NIL "package") " is current at the time "
       (:MACREF NIL "defstruct")
       " is expanded. If the argument is provided and is " (:MISC NIL "nil")
       ", no predicate is defined. A predicate can be defined only if the structure is named; if "
       (:KWD NIL "type") " is supplied and " (:KWD NIL "named")
       " is not supplied, then " (:KWD NIL "predicate")
       " must either be unsupplied or have the value " (:MISC NIL "nil") ". "
       :PAR (:ISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " ")
      (:ITEM NIL (:KWD NIL "print-function") ", " (:KWD NIL "print-object") " "
       :PAR "The " (:KWD NIL "print-function") " and "
       (:KWD NIL "print-object") " "
       (:COMMENT NIL "% Added per X3J13. -kmp 05-Oct-93")
       "options specify that a " (:FUNREF NIL "print-object") " "
       (:TERM NIL "method") " for " (:TERM NIL "structures") " of type "
       (:PARAM NIL "structure-name")
       " should be generated. These options are not synonyms, but do perform a similar service; the choice of which option ("
       (:KWD NIL "print-function") " or " (:KWD NIL "print-object")
       ") is used affects how the function named " (:PARAM NIL "printer-name")
       " is called. Only one of these options may be used, and "
       (:COMMENT NIL "% 19.5.0 21") "these options may be used only if "
       (:KWD NIL "type") " is not supplied. " :PAR "If the "
       (:KWD NIL "print-function")
       " option is used, then when a structure of type "
       (:PARAM NIL "structure-name")
       " is to be printed, the designated printer function is called on three "
       (:TERM NIL "arguments") ": " :PAR
       (:LIST NIL
        (:ITEM NIL "– the structure to be printed (a "
         (:TERM NIL "generalized instance") " of "
         (:PARAM NIL "structure-name") "). " :PAR)
        (:ITEM NIL "– a " (:TERM NIL "stream") " to print to. " :PAR)
        (:ITEM NIL "– an " (:TERM NIL "integer")
         " indicating the current depth. The magnitude of this integer may vary between "
         (:TERM NIL "implementations")
         "; however, it can reliably be compared against "
         (:VARREF NIL "*print-level*")
         " to determine whether depth abbreviation is appropriate. " :PAR))
       " " :PAR "Specifying "
       (:TT NIL "(:print-function " (:PARAM NIL "printer-name") ")")
       " is approximately equivalent to specifying: " :PAR
       (:CODE NIL " (defmethod print-object ((object "
        (:PARAM NIL "structure-name") ") stream)
   (funcall (function "
        (:PARAM NIL "printer-name") ") object stream "
        (:METAVAR NIL "current-print-depth") "))
")
       " " :PAR "where the " (:METAVAR NIL "current-print-depth")
       " represents the printer's belief of how deep it is currently printing. It is "
       (:TERM NIL "implementation-dependent") " whether "
       (:METAVAR NIL "current-print-depth") " is always 0 and "
       (:PARAM NIL "*print-level*") ", if " (:TERM NIL "non-nil")
       ", is re-bound to successively smaller values as printing descends recursively, or whether "
       (:PARAM NIL "current-print-depth")
       " varies in value as printing descends recursively and "
       (:PARAM NIL "*print-level*")
       " remains constant during the same traversal. " :PAR "If the "
       (:KWD NIL "print-object")
       " option is used, then when a structure of type "
       (:PARAM NIL "structure-name")
       " is to be printed, the designated printer function is called on two arguments: "
       :PAR
       (:LIST NIL (:ITEM NIL "– the structure to be printed. " :PAR)
        (:ITEM NIL "– the stream to print to. " :PAR))
       " " :PAR "Specifying "
       (:TT NIL "(:print-object " (:PARAM NIL "printer-name") ")")
       " is equivalent to specifying: " :PAR
       (:CODE NIL " (defmethod print-object ((object "
        (:PARAM NIL "structure-name") ") stream)
   (funcall (function "
        (:PARAM NIL "printer-name") ") object stream))
")
       " " :PAR (:COMMENT NIL "% 19.5.0 22")
       (:ISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-INHERITANCE:YES") " "
       (:ISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " If no "
       (:KWD NIL "type") " option is supplied, and if either a "
       (:KWD NIL "print-function") " or a " (:KWD NIL "print-object")
       " option is supplied, and if no " (:PARAM NIL "printer-name")
       " is supplied, then a " (:FUNREF NIL "print-object") " "
       (:TERM NIL "method") " " (:TERM NIL "specialized") " for "
       (:PARAM NIL "structure-name")
       " is generated that calls a function that implements the default printing behavior for structures using "
       (:TT NIL "#S") " notation; see " (:SECREF NIL :PRINTING-STRUCTURES) ". "
       :PAR "If neither a " (:KWD NIL "print-function") " nor a "
       (:KWD NIL "print-object") " option is supplied, then "
       (:MACREF NIL "defstruct") " does not generate a "
       (:FUNREF NIL "print-object") " " (:TERM NIL "method") " "
       (:TERM NIL "specialized") " for " (:PARAM NIL "structure-name")
       " and some default behavior is inherited either from a structure named in an "
       (:KWD NIL "include")
       " option or from the default behavior for printing structures; see the "
       (:TERM NIL "function") " " (:FUNREF NIL "print-object") " and "
       (:SECREF NIL :PRINTING-STRUCTURES) ". "
       (:ENDISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
       (:ENDISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-INHERITANCE:YES") " " :PAR
       (:ISSUE NIL "PRINT-CIRCLE-STRUCTURE:USER-FUNCTIONS-WORK") " When "
       (:VARREF NIL "*print-circle*") " is " (:TERM NIL "true")
       ", a user-defined print function can print " (:TERM NIL "objects")
       " to the supplied " (:TERM NIL "stream") " using " (:FUNREF NIL "write")
       ", " (:FUNREF NIL "prin1") ", " (:FUNREF NIL "princ") ", or "
       (:FUNREF NIL "format")
       " and expect circularities to be detected and printed using the "
       (:TT NIL "#" (:I NIL "n") "#") " syntax. This applies to "
       (:TERM NIL "methods") " on " (:FUNREF NIL "print-object")
       " in addition to " (:KWD NIL "print-function")
       " options. If a user-defined print function prints to a "
       (:TERM NIL "stream")
       " other than the one that was supplied, then circularity detection starts over for that "
       (:TERM NIL "stream") ". See the " (:TERM NIL "variable") " "
       (:VARREF NIL "*print-circle*") ". "
       (:ENDISSUE NIL "PRINT-CIRCLE-STRUCTURE:USER-FUNCTIONS-WORK") " " :PAR
       (:COMMENT NIL "!!! Barmar:"
        "      Are side effects in :PRINT-FUNCTIONs ok?  I guess this implies so."
        "      We should then require that the implementation only call them once."
        "  KMP: I'm not so sure.  Mail sent to Barmar contesting this. -kmp 30-Aug-91")
       :PAR (:ENDISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
       :PAR)
      (:ITEM NIL (:KWD NIL "type") " " :PAR (:COMMENT NIL "% 19.5.0 23")
       (:KWD NIL "type")
       " explicitly specifies the representation to be used for the structure. Its argument must be one of these "
       (:TERM NIL "types") ": " :PAR
       (:LIST NIL
        (:ITEM NIL (:TYPEREF NIL "vector") " " :PAR
         "This produces the same result as specifying " (:TT NIL " (vector t)")
         ". The structure is represented as a general " (:TERM NIL "vector")
         ", storing components as vector elements. The first component is vector element 1 if the structure is "
         (:KWD NIL "named") ", and element 0 otherwise. " :PAR
         (:REVIEWER NIL
          "Barmar: Do any implementations create non-simple vectors?")
         (:COMMENT NIL "!!!") :PAR (:COMMENT NIL "% 19.5.0 27"))
        (:ITEM NIL (:TT NIL "(vector " (:PARAM NIL "element-type") ")") " "
         :PAR "The structure is represented as a (possibly specialized) "
         (:TERM NIL "vector")
         ", storing components as vector elements. Every component must be of a "
         (:TERM NIL "type") " that can be stored in a " (:TERM NIL "vector")
         " of the " (:TERM NIL "type")
         " specified. The first component is vector element 1 if the structure is "
         (:KWD NIL "named") ", and element 0 otherwise. The structure can be "
         (:KWD NIL "named") " only if the " (:TERM NIL "type") " "
         (:TYPEREF NIL "symbol") " is a " (:TERM NIL "subtype")
         " of the supplied " (:PARAM NIL "element-type") ". " :PAR
         (:COMMENT NIL "% 19.5.0 28") :PAR)
        (:ITEM NIL (:TYPEREF NIL "list") " " :PAR
         "The structure is represented as a " (:TERM NIL "list")
         ". The first component is the " (:TERM NIL "cadr")
         " if the structure is " (:KWD NIL "named") ", and the "
         (:TERM NIL "car") " if it is not " (:KWD NIL "named") ". "))
       " " :PAR (:COMMENT NIL "% 19.5.0 24")
       "Specifying this option has the effect of forcing a specific representation and of forcing the components to be stored in the order specified in "
       (:MACREF NIL "defstruct")
       " in corresponding successive elements of the specified representation. It also prevents the structure name from becoming a valid "
       (:TERM NIL "type specifier") " recognizable by " (:FUNREF NIL "typep")
       ". " :PAR
       (:COMMENT NIL
        "% The following is an RPG response to a question about a KCL bug.")
       "For example: " :PAR
       (:CODE NIL " (defstruct (quux (:type list) :named) x y)
")
       " " :PAR "should make a constructor that builds a " (:TERM NIL "list")
       " exactly like the one that " (:FUNREF NIL "list") " produces, with "
       (:TT NIL " quux") " as its " (:TERM NIL "car") ". " :PAR
       "If this type is defined: " :PAR
       (:CODE NIL " (deftype quux () '(satisfies quux-p))
")
       " then this form " :PAR
       (:CODE NIL " (typep (make-quux) 'quux)
")
       " should return precisely what this one does " :PAR
       (:CODE NIL " (typep (list 'quux nil nil) 'quux)
")
       " " (:COMMENT NIL "% end of RPG comment") :PAR
       (:COMMENT NIL "% 19.5.0 25") "If " (:KWD NIL "type")
       " is not supplied, "
       (:COMMENT NIL
        "the structure is represented in an \\term{implementation-dependent} manner.")
       "the structure is represented as an " (:TERM NIL "object") " of "
       (:TERM NIL "type") " " (:TYPEREF NIL "structure-object") ". " :PAR
       (:COMMENT NIL
        "%Barmar wanted to just strike this.  I couldn't figure out what it was trying to say either,"
        " so I went along with it. -kmp 28-Dec-90"
        " \\issue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}"
        " Except where explicitly allowed, the consequences are undefined if"
        " a \\term{symbol} in \\thepackage{common-lisp}"
        " is defined as the name of a structure type."
        " using \\macref{defstruct} with no \\kwd{type} option."
        " \\endissue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}")
       :PAR
       (:COMMENT NIL "% Need more infor about how this interacts with CLOS")
       (:MACREF NIL "defstruct") " without a " (:KWD NIL "type")
       " option defines a " (:TERM NIL "class")
       " with the structure name as its name. The " (:TERM NIL "metaclass")
       " of structure " (:TERM NIL "instances") " is "
       (:TYPEREF NIL "structure-class") ". " :PAR))
     " " :PAR (:ISSUE NIL "DEFSTRUCT-REDEFINITION:ERROR")
     " The consequences of redefining a " (:MACREF NIL "defstruct")
     " structure are undefined. "
     (:ENDISSUE NIL "DEFSTRUCT-REDEFINITION:ERROR") " " :PAR
     "In the case where no " (:MACREF NIL "defstruct")
     " options have been supplied, the following functions are automatically defined to operate on instances of the new structure: "
     :PAR
     (:LIST NIL
      (:ITEM NIL (:B NIL " Predicate") " " :PAR "A predicate with the name "
       (:TT NIL (:PARAM NIL "structure-name") "-p")
       " is defined to test membership in the structure type. The predicate "
       (:TT NIL "(" (:PARAM NIL "structure-name") "-p " (:PARAM NIL "object")
        ")")
       " is " (:TERM NIL "true") " if an " (:PARAM NIL "object") " is of this "
       (:TERM NIL "type") "; otherwise it is " (:TERM NIL "false") ". "
       (:FUNREF NIL "typep") " can also be used with the name of the new "
       (:TERM NIL "type") " to test whether an " (:TERM NIL "object")
       " belongs to the " (:TERM NIL "type")
       ". Such a function call has the form "
       (:TT NIL "(typep " (:PARAM NIL "object") " '"
        (:PARAM NIL "structure-name") ")")
       ". " :PAR)
      (:ITEM NIL (:B NIL " Component reader functions") " " :PAR
       (:TERM NIL "Reader") " functions are defined to " (:TERM NIL "read")
       " the components of the structure. For each slot name, there is a corresponding "
       (:TERM NIL "reader") " function with the name "
       (:TT NIL (:PARAM NIL "structure-name") "-" (:PARAM NIL "slot-name"))
       ". This function " (:TERM NIL "reads")
       " the contents of that slot. Each " (:TERM NIL "reader")
       " function takes one argument, which is an instance of the structure type. "
       (:MACREF NIL "setf") " can be used with any of these "
       (:TERM NIL "reader") " functions to alter the slot contents. " :PAR)
      (:ITEM NIL (:B NIL " Constructor function") " " :PAR
       "A constructor function with the name "
       (:TT NIL "make-" (:PARAM NIL "structure-name"))
       " is defined. This function creates and returns new instances of the structure type. "
       :PAR)
      (:ITEM NIL (:B NIL " Copier function") " " :PAR
       "A copier function with the name "
       (:TT NIL "copy-" (:PARAM NIL "structure-name"))
       " is defined. The copier function takes an object of the structure type and creates a new object of the same type that is a copy of the first. The copier function creates a new structure with the same component entries as the original. Corresponding components of the two structure instances are "
       (:FUNREF NIL "eql") ". "))
     " " :PAR
     (:COMMENT NIL
      "The predicate, \\term{reader} function, constructor function, and copier function"
      "names are all interned in whatever package is current at the "
      "time \\macref{defstruct} is expanded.")
     :PAR (:ISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     (:COMMENT NIL " added qualification about top-level-ness  --sjl 5 Mar 92")
     "If a " (:MACREF NIL "defstruct") " " (:TERM NIL "form") " appears as a "
     (:TERM NIL "top level form") ", the " (:TERM NIL "compiler")
     " must make the " (:TERM NIL "structure") " " (:TERM NIL "type")
     " name recognized as a valid " (:TERM NIL "type")
     " name in subsequent declarations (as for " (:MACREF NIL "deftype")
     ") and make the structure slot readers known to " (:MACREF NIL "setf")
     ". In addition, the " (:TERM NIL "compiler")
     " must save enough information about the " (:TERM NIL "structure") " "
     (:TERM NIL "type") " so that further " (:MACREF NIL "defstruct")
     " definitions can use " (:KWD NIL "include") " in a subsequent "
     (:MACREF NIL "deftype") " in the same " (:TERM NIL "file")
     " to refer to the " (:TERM NIL "structure") " " (:TERM NIL "type")
     " name. The functions which " (:MACREF NIL "defstruct")
     " generates are not defined in the compile time environment, although the "
     (:TERM NIL "compiler")
     " may save enough information about the functions to code subsequent calls inline. The "
     (:TT NIL "#S") " " (:TERM NIL "reader macro")
     " might or might not recognize the newly defined " (:TERM NIL "structure")
     " " (:TERM NIL "type") " name at compile time. "
     (:ENDISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     :PAR)
    (:PART (:NAME "Examples") " " (:COMMENT NIL "% 19.1.0 5")
     "An example of a structure definition follows: " :PAR
     (:CODE NIL " (defstruct ship
   x-position
   y-position
   x-velocity
   y-velocity
   mass)
")
     " This declares that every " (:TT NIL "ship") " is an "
     (:TERM NIL "object")
     " with five named components. The evaluation of this form does the following: "
     :PAR (:COMMENT NIL "% 19.1.0 6")
     (:LIST NIL
      (:ITEM NIL "1. It defines " (:TT NIL "ship-x-position")
       " to be a function of one argument, a ship, that returns the "
       (:TT NIL "x-position") " of the ship; " (:TT NIL "ship-y-position")
       " and the other components are given similar function definitions. These functions are called the "
       (:TERM NIL "access") " functions, as they are used to "
       (:TERM NIL "access") " elements of the structure. " :PAR
       (:COMMENT NIL "% 19.1.0 7"))
      (:ITEM NIL "2. " (:TT NIL "ship") " becomes the name of a "
       (:TERM NIL "type") " of which instances of ships are elements. "
       (:TT NIL "ship") " becomes acceptable to " (:FUNREF NIL "typep")
       ", for example; " (:TT NIL "(typep x 'ship)") " is " (:TERM NIL "true")
       " if " (:TT NIL "x") " is a ship and false if " (:TT NIL "x") " is any "
       (:TERM NIL "object") " other than a ship. "
       (:COMMENT NIL
        "%Moreover, all ships are instances of the type \\f{structure}, because"
        "%\\f{ship} is a subtype of \\f{structure}.")
       :PAR (:COMMENT NIL "% 19.1.0 8"))
      (:ITEM NIL "3. A function named " (:TT NIL "ship-p")
       " of one argument is defined; it is a predicate that is "
       (:TERM NIL "true") " if its argument is a ship and is "
       (:TERM NIL "false") " otherwise. " :PAR (:COMMENT NIL "% 19.1.0 9"))
      (:ITEM NIL "4. A function called " (:TT NIL "make-ship")
       " is defined that, when invoked, creates a data structure with five components, suitable for use with the "
       (:TERM NIL "access") " functions. Thus executing " :PAR
       (:CODE NIL " (setq ship2 (make-ship))
")
       " sets " (:TT NIL "ship2") " to a newly created " (:TT NIL "ship") " "
       (:TERM NIL "object")
       ". One can supply the initial values of any desired component in the call to "
       (:TT NIL "make-ship") " by using keyword arguments in this way: " :PAR
       (:CODE NIL " (setq ship2 (make-ship :mass *default-ship-mass*
                        :x-position 0
                        :y-position 0))
")
       " This constructs a new ship and initializes three of its components. This function is called the “constructor function” because it constructs a new structure. "
       :PAR (:COMMENT NIL "% 19.1.0 11"))
      (:ITEM NIL "5. A function called " (:TT NIL "copy-ship")
       " of one argument is defined that, when given a " (:TT NIL "ship") " "
       (:TERM NIL "object") ", creates a new " (:TT NIL "ship") " "
       (:TERM NIL "object")
       " that is a copy of the given one. This function is called the “copier function.” "))
     " " :PAR (:COMMENT NIL "% 19.1.0 12") (:MACREF NIL "setf")
     " can be used to alter the components of a " (:TT NIL "ship") ": " :PAR
     (:CODE NIL " (setf (ship-x-position ship2) 100)
")
     " This alters the " (:TT NIL "x-position") " of " (:TT NIL "ship2")
     " to be " (:TT NIL "100") ". This works because "
     (:MACREF NIL "defstruct") " behaves as if it generates an appropriate "
     (:MACREF NIL "defsetf") " for each " (:TERM NIL "access") " function. "
     :PAR (:COMMENT NIL "% 19.1.0 13" "% this paragraph left out") :PAR
     (:CODE NIL ";;;
;;; Example 1
;;; define town structure type
;;; area, watertowers, firetrucks, population, elevation are its components
;;;
 (defstruct town
             area
             watertowers
             (firetrucks 1 :type fixnum)    ;an initialized slot
             population 
             (elevation 5128 :read-only t)) ;a slot that can't be changed
→ TOWN
;create a town instance
 (setq town1 (make-town :area 0 :watertowers 0)) → #S(TOWN...)
;town's predicate recognizes the new instance
 (town-p town1) → "
      (:TERM NIL "true") "
;new town's area is as specified by make-town
 (town-area town1) → 0
;new town's elevation has initial value
 (town-elevation town1) → 5128
;setf recognizes reader function
 (setf (town-population town1) 99) → 99
 (town-population town1) → 99
;copier function makes a copy of town1
 (setq town2 (copy-town town1)) → #S(TOWN...)
 (= (town-population town1) (town-population town2))  → "
      (:TERM NIL "true") "
;since elevation is a read-only slot, its value can be set only
;when the structure is created
 (setq town3 (make-town :area 0 :watertowers 3 :elevation 1200))
→ #S(TOWN...)
;;;
;;; Example 2
;;; define clown structure type
;;; this structure uses a nonstandard prefix
;;;
 (defstruct (clown (:conc-name bozo-))
             (nose-color 'red)         
             frizzy-hair-p polkadots) → CLOWN
 (setq funny-clown (make-clown)) → #S(CLOWN)
;use non-default reader name
 (bozo-nose-color funny-clown) → RED        
 (defstruct (klown (:constructor make-up-klown) ;similar def using other
             (:copier clone-klown)              ;customizing keywords
             (:predicate is-a-bozo-p))
             nose-color frizzy-hair-p polkadots) → klown
;custom constructor now exists
 (fboundp 'make-up-klown) → "
      (:TERM NIL "true") "
;;;
;;; Example 3
;;; define a vehicle structure type
;;; then define a truck structure type that includes 
;;; the vehicle structure
;;;
 (defstruct vehicle name year (diesel t :read-only t)) → VEHICLE
 (defstruct (truck (:include vehicle (year 79)))
             load-limit                          
             (axles 6)) → TRUCK
 (setq x (make-truck :name 'mac :diesel t :load-limit 17))
→ #S(TRUCK...)
;vehicle readers work on trucks
 (vehicle-name x)
→ MAC
;default taken from :include clause 
 (vehicle-year x)
→ 79 
 (defstruct (pickup (:include truck))     ;pickup type includes truck
             camper long-bed four-wheel-drive) → PICKUP
 (setq x (make-pickup :name 'king :long-bed t)) → #S(PICKUP...)
;:include default inherited
 (pickup-year x) → 79
;;;
;;; Example 4
;;; use of BOA constructors
;;;
 (defstruct (dfs-boa                      ;BOA constructors
               (:constructor make-dfs-boa (a b c)) 
               (:constructor create-dfs-boa
                 (a &optional b (c 'cc) &rest d &aux e (f 'ff))))
             a b c d e f) → DFS-BOA
;a, b, and c set by position, and the rest are uninitialized
 (setq x (make-dfs-boa 1 2 3)) → #(DFS-BOA...)
 (dfs-boa-a x) → 1
;a and b set, c and f defaulted
 (setq x (create-dfs-boa 1 2)) → #(DFS-BOA...)
 (dfs-boa-b x) → 2
 (eq (dfs-boa-c x) 'cc) → "
      (:TERM NIL "true") "
;a, b, and c set, and the rest are collected into d
 (setq x (create-dfs-boa 1 2 3 4 5 6)) → #(DFS-BOA...)
 (dfs-boa-d x) → (4 5 6)
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL
      " Adequately addressed in the packages chapter --sjl 5 Mar 92."
      "\\issue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}"
      "The consequences are undefined if a \\term{symbol} in \\thepackage{common-lisp}"
      "is used as the \\param{structure-name} argument, or if any of the automatically-created"
      "\\term{functions} have \\term{names} in \\thepackage{common-lisp}."
      "\\endissue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}")
     :PAR (:ISSUE NIL "DEFSTRUCT-SLOTS-CONSTRAINTS-NAME:DUPLICATES-ERROR") " "
     (:COMMENT NIL
      " The consequences are undefined if two slots in a structure type have"
      " the same \\param{slot-name}; that is, the \\funref{symbol-name} of the"
      " \\param{slot-names} should not be \\funref{string=}."
      " This holds when"
      " they were both named directly by the same call to \\macref{defstruct}"
      " or when one is present by virtue of being in an included structure."
      " The situation of expanding a \\macref{defstruct} macro with a duplicate "
      " slot name should signal an error \\oftype{program-error}. "
      "% Rewritten for Barmar:")
     "If any two slot names (whether present directly or inherited by the "
     (:KWD NIL "include") " option) are the " (:TERM NIL "same") " under "
     (:FUNREF NIL "string=") ", " (:MACREF NIL "defstruct")
     " should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "program-error") ". "
     (:COMMENT NIL "(While not yet formally defined, the intent is that "
      "the error signaling may occur when compiling a file that contains"
      "duplicate names or when evaluating a DEFSTRUCT form with duplicate names"
      "in an interpreter.)")
     (:ENDISSUE NIL "DEFSTRUCT-SLOTS-CONSTRAINTS-NAME:DUPLICATES-ERROR") " "
     :PAR (:ISSUE NIL "DATA-TYPES-HIERARCHY-UNDERSPECIFIED")
     " The consequences are undefined if the "
     (:PARAM NIL "included-structure-name") " does not name a "
     (:TERM NIL "structure type") ". "
     (:ENDISSUE NIL "DATA-TYPES-HIERARCHY-UNDERSPECIFIED") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "documentation") ", "
     (:FUNREF NIL "print-object") ", " (:MACREF NIL "setf") ", "
     (:FUNREF NIL "subtypep") ", " (:FUNREF NIL "type-of") ", "
     (:FUNREF NIL "typep") ", " (:SECREF NIL :COMPILATION) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL
      "\\funref{typep} will accept and use the name returned by \\macref{defstruct}.")
     :PAR (:COMMENT NIL "% 19.7.2 1") "The " (:PARAM NIL "printer-name")
     " should observe the values of such printer-control variables as "
     (:VARREF NIL "*print-escape*") ". " :PAR
     "The restriction against issuing a warning for type mismatches between a "
     (:PARAM NIL "slot-initform") " and the corresponding slot's "
     (:KWD NIL "type") " option is necessary because a "
     (:PARAM NIL "slot-initform")
     " must be specified in order to specify slot options; in some cases, no suitable default may exist. "
     :PAR "The mechanism by which " (:MACREF NIL "defstruct")
     " arranges for slot accessors to be usable with " (:MACREF NIL "setf")
     " is " (:TERM NIL "implementation-dependent") "; for example, it may use "
     (:TERM NIL "setf functions") ", " (:TERM NIL "setf expanders")
     ", or some other " (:TERM NIL "implementation-dependent")
     " mechanism known to that " (:TERM NIL "implementation") "'s "
     (:TERM NIL "code") " for " (:MACREF NIL "setf") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DEFSTRUCT")
   (:COM (:NAME "copy-structure" :FTYPE "Function")
    (:ISSUE NIL "DEFSTRUCT-COPIER:ARGUMENT-TYPE") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "copy-structure")
      (:ARGLIST NIL "structure") (:VALUES NIL "copy"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "structure")
     "—a " (:TERM NIL "structure") ". " :PAR (:PARAM NIL "copy")
     "—a copy of the " (:PARAM NIL "structure") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.2.0 23") :PAR
     "Returns a " (:TERM NIL "copy") (:SUB NIL "6") " of the "
     (:PARAM NIL "structure") ". " :PAR "Only the " (:PARAM NIL "structure")
     " itself is copied; not the values of the slots. " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR "the " (:KWD NIL "copier") " option to "
     (:MACREF NIL "defstruct") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The " (:PARAM NIL "copy") " is the "
     (:TERM NIL "same") " as the given " (:PARAM NIL "structure") " under "
     (:FUNREF NIL "equalp") ", but not under " (:FUNREF NIL "equal") ". " :PAR
     (:ENDISSUE NIL "DEFSTRUCT-COPIER:ARGUMENT-TYPE") " " :PAR))
   " ")
  " " :PAR)
 (:CHAPTER
  (:NUM "9" :TITLE ("Conditions") :NUMTAG :CHAP-NINE :NAMETAG :CONDITIONS)
  (:SECTION
   (:TITLE ("Condition System Concepts") :TAGS (:CONDITION-SYSTEM-CONCEPTS))
   " " :PAR
   (:COMMENT NIL "% Errors" "% CONDITION-RESTARTS hasn't been included") :PAR
   (:COMMENT NIL
    "!!! What to do with this use of \"construct\"? -kmp 3-Sep-91")
   "Common Lisp constructs are described not only in terms of their behavior in situations during which they are intended to be used (see the “Description” part of each "
   (:TERM NIL "operator")
   " specification), but in all other situations (see the “Exceptional Situations” part of each "
   (:TERM NIL "operator") " specification). " :PAR
   "A situation is the evaluation of an expression in a specific context. "
   (:COMMENT NIL "at a particular point in time? -kmp 5-Sep-91") "A "
   (:TERM NIL "condition") " is an " (:TERM NIL "object")
   " that represents a specific situation that has been detected. "
   (:TERM NIL "Conditions") " are " (:TERM NIL "generalized instances")
   " of the " (:TERM NIL "class") " " (:TYPEREF NIL "condition")
   ". A hierarchy of " (:TERM NIL "condition") " classes is defined in "
   (:RM NIL " Common Lisp") ". A " (:TERM NIL "condition") " has "
   (:TERM NIL "slots") " that contain data relevant to the situation that the "
   (:TERM NIL "condition") " represents. " :PAR
   "An error is a situation in which normal program execution cannot continue correctly without some form of intervention (either interactively by the user or under program control). Not all errors are detected. When an error goes undetected, the effects can be "
   (:TERM NIL "implementation-dependent") ", "
   (:TERM NIL "implementation-defined") ", unspecified, or undefined. See "
   (:SECREF NIL :DEFINITIONS) ". All detected errors can be represented by "
   (:TERM NIL "conditions") ", but not all " (:TERM NIL "conditions")
   " represent errors. " :PAR "Signaling is the process by which a "
   (:TERM NIL "condition")
   " can alter the flow of control in a program by raising the "
   (:TERM NIL "condition") " which can then be " (:TERM NIL "handled")
   ". The functions " (:FUNREF NIL "error") ", " (:FUNREF NIL "cerror") ", "
   (:FUNREF NIL "signal") ", and " (:FUNREF NIL "warn") " are used to signal "
   (:TERM NIL "conditions") ". " :PAR
   "The process of signaling involves the selection and invocation of a "
   (:TERM NIL "handler") " from a set of " (:TERM NIL "active") " "
   (:TERM NIL "handlers") ". A " (:TERM NIL "handler") " is a "
   (:TERM NIL "function") " of one argument (the " (:TERM NIL "condition")
   ") that is invoked to handle a " (:TERM NIL "condition") ". Each "
   (:TERM NIL "handler") " is associated with a " (:TERM NIL "condition") " "
   (:TERM NIL "type") ", and a " (:TERM NIL "handler")
   " will be invoked only on a " (:TERM NIL "condition") " of the "
   (:TERM NIL "handler") "'s associated " (:TERM NIL "type") ". " :PAR
   (:TERM NIL "Active") " " (:TERM NIL "handlers") " are "
   (:TERM NIL "established") " dynamically (see " (:MACREF NIL "handler-bind")
   " or " (:MACREF NIL "handler-case") "). " (:TERM NIL "Handlers")
   " are invoked in a " (:TERM NIL "dynamic environment")
   " equivalent to that of the signaler, except that the set of "
   (:TERM NIL "active") " " (:TERM NIL "handlers")
   " is bound in such a way as to include only those that were "
   (:TERM NIL "active") " at the time the " (:TERM NIL "handler")
   " being invoked was " (:TERM NIL "established") ". Signaling a "
   (:TERM NIL "condition") " has no side-effect on the "
   (:TERM NIL "condition") ", and there is no dynamic state contained in a "
   (:TERM NIL "condition") ". " :PAR "If a " (:TERM NIL "handler")
   " is invoked, it can address the " (:TERM NIL "situation")
   " in one of three ways: " :PAR
   (:LIST NIL
    (:ITEM NIL (:B NIL "Decline") " " :PAR "It can decline to "
     (:TERM NIL "handle") " the " (:TERM NIL "condition")
     ". It does this by simply returning rather than transferring control. When this happens, any values returned by the handler are ignored and the next most recently established handler is invoked. If there is no such handler and the signaling function is "
     (:FUNREF NIL "error") " or " (:FUNREF NIL "cerror")
     ", the debugger is entered in the " (:TERM NIL "dynamic environment")
     " of the signaler. If there is no such handler and the signaling function is either "
     (:FUNREF NIL "signal") " or " (:FUNREF NIL "warn")
     ", the signaling function simply returns " (:MISC NIL "nil") ". " :PAR)
    (:ITEM NIL (:B NIL "Handle") " " :PAR "It can " (:TERM NIL "handle")
     " the " (:TERM NIL "condition")
     " by performing a non-local transfer of control. This can be done either primitively by using "
     (:SPECREF NIL "go") ", " (:MACREF NIL "return") ", "
     (:SPECREF NIL "throw") " or more abstractly by using a function such as "
     (:FUNREF NIL "abort") " or " (:FUNREF NIL "invoke-restart") ". " :PAR)
    (:ITEM NIL (:B NIL "Defer") " " :PAR
     "It can put off a decision about whether to " (:TERM NIL "handle") " or "
     (:TERM NIL "decline")
     ", by any of a number of actions, but most commonly by signaling another condition, resignaling the same condition, or forcing entry into the debugger. "
     :PAR))
   " "
   (:COMMENT NIL "%KMP" "The latter two actions "
    "are really just ways of putting off the decision to either \\term{handle}"
    "or decline. Ultimately,"
    "all a handler can do is to \\term{handle} or decline to \\term{handle}.")
   :PAR
   (:SUBSECTION (:TITLE ("Condition Types")) (:NEXTFIGURE (:CAPS T))
    " lists the " (:TERM NIL "standardized") " " (:TERM NIL "condition") " "
    (:TERM NIL "types") ". Additional " (:TERM NIL "condition") " "
    (:TERM NIL "types") " can be defined by using "
    (:MACREF NIL "define-condition") ". " :PAR
    (:ISSUE NIL "UNDEFINED-FUNCTIONS-AND-VARIABLES:COMPROMISE") " "
    (:ISSUE NIL "DATA-IO:ADD-SUPPORT") " "
    (:ISSUE NIL "PARSE-ERROR-STREAM:SPLIT-TYPES") " "
    (:ISSUE NIL "ACCESS-ERROR-NAME") " " (:ISSUE NIL "READER-ERROR:NEW-TYPE")
    " " (:ISSUE NIL "FLOATING-POINT-CONDITION-NAMES:X3J13-NOV-89") " "
    (:ISSUE NIL "COMPILER-DIAGNOSTICS:USE-HANDLER") "  "
    (:TABLE
     (:NAME ("Standardized Condition Types") :TAGS
      (:STANDARDIZED-CONDITION-TYPES))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " arithmetic-error"))
      (:CELL NIL (:TYPEREF NIL "floating-point-overflow"))
      (:CELL NIL (:TYPEREF NIL "simple-type-error")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " cell-error"))
      (:CELL NIL (:TYPEREF NIL "floating-point-underflow"))
      (:CELL NIL (:TYPEREF NIL "simple-warning")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " condition"))
      (:CELL NIL (:TYPEREF NIL "package-error"))
      (:CELL NIL (:TYPEREF NIL "storage-condition")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " control-error"))
      (:CELL NIL (:TYPEREF NIL "parse-error"))
      (:CELL NIL (:TYPEREF NIL "stream-error")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " division-by-zero"))
      (:CELL NIL (:TYPEREF NIL "print-not-readable"))
      (:CELL NIL (:TYPEREF NIL "style-warning")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " end-of-file"))
      (:CELL NIL (:TYPEREF NIL "program-error"))
      (:CELL NIL (:TYPEREF NIL "type-error")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " error"))
      (:CELL NIL (:TYPEREF NIL "reader-error"))
      (:CELL NIL (:TYPEREF NIL "unbound-slot")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " file-error"))
      (:CELL NIL (:TYPEREF NIL "serious-condition"))
      (:CELL NIL (:TYPEREF NIL "unbound-variable")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " floating-point-inexact"))
      (:CELL NIL (:TYPEREF NIL "simple-condition"))
      (:CELL NIL (:TYPEREF NIL "undefined-function")))
     (:ROW NIL (:CELL NIL (:TYPEREF NIL " floating-point-invalid-operation"))
      (:CELL NIL (:TYPEREF NIL "simple-error"))
      (:CELL NIL (:TYPEREF NIL "warning"))))
    " " (:ENDISSUE NIL "COMPILER-DIAGNOSTICS:USE-HANDLER") " "
    (:ENDISSUE NIL "FLOATING-POINT-CONDITION-NAMES:X3J13-NOV-89") " "
    (:ENDISSUE NIL "READER-ERROR:NEW-TYPE") " "
    (:ENDISSUE NIL "ACCESS-ERROR-NAME") " "
    (:ENDISSUE NIL "PARSE-ERROR-STREAM:SPLIT-TYPES") " "
    (:ENDISSUE NIL "DATA-IO:ADD-SUPPORT") " "
    (:ENDISSUE NIL "UNDEFINED-FUNCTIONS-AND-VARIABLES:COMPROMISE") " " :PAR
    "All " (:TERM NIL "condition") " types are " (:TERM NIL "subtypes") " of "
    (:TERM NIL "type") " " (:TYPEREF NIL "condition") ". That is, " :PAR
    (:CODE NIL " (typep " (:PARAM NIL "c") " 'condition) → " (:TERM NIL "true")
     "
")
    " if and only if " (:PARAM NIL "c") " is a " (:TERM NIL "condition") ". "
    :PAR (:TERM NIL "Implementations") " must define all specified "
    (:TERM NIL "subtype") " relationships. "
    (:COMMENT NIL "!!! Barrett: I don't understand this sentence.")
    "Except where noted, all " (:TERM NIL "subtype")
    " relationships indicated in this document are not mutually exclusive. A "
    (:TERM NIL "condition") " inherits the structure of its "
    (:TERM NIL "supertypes") ". "
    (:COMMENT NIL
     "!!! Barrett: It would be easier to say that conditions are classes, "
     "      but maybe there is some reason to avoid doing so?")
    :PAR "The metaclass of the " (:TERM NIL "class") " "
    (:TYPEREF NIL "condition") " is not specified. " (:TERM NIL "Names") " of "
    (:TERM NIL "condition") " " (:TERM NIL "types") " may be used to specify "
    (:TERM NIL "supertype") " relationships in "
    (:MACREF NIL "define-condition")
    ", but the consequences are not specified if an attempt is made to use a "
    (:TERM NIL "condition") " " (:TERM NIL "type") " as a "
    (:TERM NIL "superclass") " in a " (:MACREF NIL "defclass") " "
    (:TERM NIL "form") ". " :PAR
    (:COMMENT NIL
     " \\Thenextfigure\\ lists the \\term{condition} \\term{types} defined in this specification."
     "  " " \\issue{UNDEFINED-FUNCTIONS-AND-VARIABLES:COMPROMISE}"
     " \\issue{DATA-IO:ADD-SUPPORT}" " \\issue{PARSE-ERROR-STREAM:SPLIT-TYPES}"
     " \\issue{ACCESS-ERROR-NAME}" " \\issue{READER-ERROR:NEW-TYPE}"
     " \\issue{FLOATING-POINT-CONDITION-NAMES:X3J13-NOV-89}"
     " \\issue{COMPILER-DIAGNOSTICS:USE-HANDLER}"
     " \\displaythree{Condition Types}{"
     " arithmetic-error&package-error&storage-condition\\cr"
     " cell-error&parse-error&stream-error\\cr"
     " condition&print-not-readable&style-warning\\cr"
     " control-error&program-error&type-error\\cr"
     " division-by-zero&reader-error&unbound-slot\\cr"
     " end-of-file&serious-condition&unbound-slot-instance\\cr"
     " error&simple-condition&unbound-variable\\cr"
     " file-error&simple-error&undefined-function\\cr"
     " floating-point-overflow&simple-type-error&warning\\cr"
     " floating-point-underflow&simple-warning&\\cr" " }"
     " \\endissue{COMPILER-DIAGNOSTICS:USE-HANDLER}"
     " \\endissue{FLOATING-POINT-CONDITION-NAMES:X3J13-NOV-89}"
     " \\endissue{READER-ERROR:NEW-TYPE}" " \\endissue{ACCESS-ERROR-NAME}"
     " \\endissue{PARSE-ERROR-STREAM:SPLIT-TYPES}"
     " \\endissue{DATA-IO:ADD-SUPPORT}"
     " \\endissue{UNDEFINED-FUNCTIONS-AND-VARIABLES:COMPROMISE}")
    :PAR (:NEXTFIGURE (:CAPS T)) " shows " (:TERM NIL "operators")
    " that define " (:TERM NIL "condition") " " (:TERM NIL "types")
    " and creating " (:TERM NIL "conditions") ". " :PAR
    (:TABLE (:NAME ("Operators that define and create conditions."))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " define-condition"))
      (:CELL NIL (:FUNREF NIL "make-condition")) (:CELL NIL)))
    " " :PAR (:NEXTFIGURE (:CAPS T)) " shows " (:TERM NIL "operators") " that "
    (:TERM NIL "read") " the " (:TERM NIL "value") " of "
    (:TERM NIL "condition") " " (:TERM NIL "slots") ". " :PAR
    (:ISSUE NIL "DATA-IO:ADD-SUPPORT") " "
    (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
    (:TABLE (:NAME ("Operators that read condition slots."))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " arithmetic-error-operands"))
      (:CELL NIL (:FUNREF NIL "simple-condition-format-arguments")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " arithmetic-error-operation"))
      (:CELL NIL (:FUNREF NIL "simple-condition-format-control")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " cell-error-name"))
      (:CELL NIL (:FUNREF NIL "stream-error-stream")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " file-error-pathname"))
      (:CELL NIL (:FUNREF NIL "type-error-datum")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " package-error-package"))
      (:CELL NIL (:FUNREF NIL "type-error-expected-type")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " print-not-readable-object"))
      (:CELL NIL (:FUNREF NIL "unbound-slot-instance"))))
    " " (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
    (:ENDISSUE NIL "DATA-IO:ADD-SUPPORT") " " :PAR
    (:SUBSUBSECTION (:TITLE ("Serious Conditions")) "A "
     (:TERM NIL "serious condition") " is a " (:TERM NIL "condition")
     " serious enough to require interactive intervention if not handled. "
     (:TERM NIL "Serious conditions") " are typically signaled with "
     (:FUNREF NIL "error") " or " (:FUNREF NIL "cerror") "; non-serious "
     (:TERM NIL "conditions") " are typically signaled with "
     (:FUNREF NIL "signal") " or " (:FUNREF NIL "warn") ". "
     (:COMMENT NIL "%Barrett: Definitional."
      "All \\term{serious conditions} should be \\subtypesof{serious-condition}.")
     :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Creating Conditions")) "The function "
    (:FUNREF NIL "make-condition") " can be used to construct a "
    (:TERM NIL "condition") " " (:TERM NIL "object")
    " explicitly. Functions such as " (:FUNREF NIL "error") ", "
    (:FUNREF NIL "cerror") ", " (:FUNREF NIL "signal") ", and "
    (:FUNREF NIL "warn") " operate on " (:TERM NIL "conditions")
    " and might create " (:TERM NIL "condition") " " (:TERM NIL "objects")
    " implicitly. Macros such as " (:MACREF NIL "ccase") ", "
    (:MACREF NIL "ctypecase") ", " (:MACREF NIL "ecase") ", "
    (:MACREF NIL "etypecase") ", " (:MACREF NIL "check-type") ", and "
    (:MACREF NIL "assert") " might also implicitly create (and "
    (:TERM NIL "signal") ") " (:TERM NIL "conditions") ". " :PAR
    (:SUBSUBSECTION
     (:TITLE ("Condition Designators") :TAGS (:CONDITION-DESIGNATORS)) " " :PAR
     "A number of the functions in the condition system take arguments which are identified as "
     (:NEWTERM (:IDX "condition designator") "condition designators")
     ". By convention, those arguments are notated as " :PAR " "
     (:PARAM NIL "datum") " " (:KEYWORD NIL " &rest") " "
     (:PARAM NIL "arguments") " " :PAR "Taken together, the "
     (:PARAM NIL "datum") " and the " (:PARAM NIL "arguments") " are “"
     (:TERM NIL "designators") " for a " (:TERM NIL "condition")
     " of default type " (:PARAM NIL "default-type") ".” How the denoted "
     (:TERM NIL "condition") " is computed depends on the type of the "
     (:PARAM NIL "datum") ": " :PAR
     (:LIST NIL
      (:ITEM NIL "• If the " (:PARAM NIL "datum") " is a " (:TERM NIL "symbol")
       " naming a " (:TERM NIL "condition") " " (:TERM NIL "type") " "
       (:MATH NIL (:MO NIL "…")) " " :PAR "The denoted "
       (:TERM NIL "condition") " is the result of " :PAR
       (:CODE NIL " (apply #'make-condition " (:PARAM NIL "datum") " "
        (:PARAM NIL "arguments") ")
")
       " " :PAR (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " ")
      (:ITEM NIL "• If the " (:PARAM NIL "datum") " is a "
       (:TERM NIL "format control") " " (:MATH NIL (:MO NIL "…")) " "
       (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR
       "The denoted " (:TERM NIL "condition") " is the result of " :PAR
       (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
       (:CODE NIL " (make-condition " (:PARAM NIL "defaulted-type") " 
                 :format-control "
        (:PARAM NIL "datum") "
                 :format-arguments "
        (:PARAM NIL "arguments") ")
")
       " " (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR
       (:COMMENT NIL
        "Barrett wanted this added so that implementations could do something more"
        "elaborate than just the given type without interfering with user programs."
        "There's a lot of mail about simple-condition-disjointness-bug which might or"
        "might not actually turn into a formal issue someday. -kmp 2-Feb-92")
       "where the " (:PARAM NIL "defaulted-type") " is a "
       (:TERM NIL "subtype") " of " (:PARAM NIL "default-type") ". " :PAR)
      (:ITEM NIL "• If the " (:PARAM NIL "datum") " is a "
       (:TERM NIL "condition") " " (:MATH NIL (:MO NIL "…")) " " :PAR
       "The denoted " (:TERM NIL "condition") " is the " (:PARAM NIL "datum")
       " itself. In this case, unless otherwise specified by the description of the "
       (:TERM NIL "operator") " in question, the " (:TERM NIL "arguments")
       " must be " (:TERM NIL "null")
       "; that is, the consequences are undefined if any "
       (:PARAM NIL "arguments") " were supplied. " :PAR))
     " " :PAR "Note that the " (:PARAM NIL "default-type")
     " gets used only in the case where the " (:PARAM NIL "datum") " "
     (:TERM NIL "string")
     " is supplied. In the other situations, the resulting condition is not necessarily of "
     (:TERM NIL "type") " " (:PARAM NIL "default-type") ". " :PAR
     "Here are some illustrations of how different "
     (:TERM NIL "condition designators") " can denote equivalent "
     (:TERM NIL "condition") " " (:TERM NIL "objects") ": " :PAR
     (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
     (:CODE NIL
      "(let ((c (make-condition 'arithmetic-error :operation '/ :operands '(7 0))))
  (error c))
≡ (error 'arithmetic-error :operation '/ :operands '(7 0))

(error \"Bad luck.\")
≡ (error 'simple-error :format-control \"Bad luck.\" :format-arguments '())
")
     " " (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Printing Conditions") :TAGS (:PRINTING-CONDITIONS))
    " " :PAR "If the " (:KWD NIL "report") " argument to "
    (:MACREF NIL "define-condition")
    " is used, a print function is defined that is called whenever the defined "
    (:TERM NIL "condition") " is printed while the " (:TERM NIL "value") " of "
    (:VARREF NIL "*print-escape*") " is " (:TERM NIL "false")
    ". This function is called the " (:NEWTERM NIL "condition reporter")
    "; the text which it outputs is called a " (:NEWTERM NIL "report message")
    ". " :PAR "When a " (:TERM NIL "condition") " is printed and "
    (:VARREF NIL "*print-escape*") " is " (:TERM NIL "false") ", the "
    (:TERM NIL "condition reporter") " for the " (:TERM NIL "condition")
    " is invoked. " (:TERM NIL "Conditions")
    " are printed automatically by functions such as "
    (:FUNREF NIL "invoke-debugger") ", " (:FUNREF NIL "break") ", and "
    (:FUNREF NIL "warn") ". " :PAR "When " (:VARREF NIL "*print-escape*")
    " is " (:TERM NIL "true") ", the " (:TERM NIL "object")
    " should print in an abbreviated fashion according to the style of the implementation ("
    (:I NIL "e.g.") ",  by " (:MACREF NIL "print-unreadable-object")
    "). It is not required that a " (:TERM NIL "condition")
    " can be recreated by reading its printed representation. " :PAR "No "
    (:TERM NIL "function") " is provided for directly " (:TERM NIL "accessing")
    " or invoking " (:TERM NIL "condition reporters") ". " :PAR
    (:SUBSUBSECTION (:TITLE ("Recommended Style in Condition Reporting"))
     "In order to ensure a properly aesthetic result when presenting "
     (:TERM NIL "report messages")
     " to the user, certain stylistic conventions are recommended. " :PAR
     "There are stylistic recommendations for the content of the messages output by "
     (:TERM NIL "condition reporters")
     ", but there are no formal requirements on those " (:TERM NIL "programs")
     ". If a " (:TERM NIL "program")
     " violates the recommendations for some message, the display of that message might be less aesthetic than if the guideline had been observed, but the "
     (:TERM NIL "program") " is still considered a "
     (:TERM NIL "conforming program") ". " :PAR "The requirements on a "
     (:TERM NIL "program") " or " (:TERM NIL "implementation")
     " which invokes a " (:TERM NIL "condition reporter")
     " are somewhat stronger. A " (:TERM NIL "conforming program")
     " must be permitted to assume that if these style guidelines are followed, proper aesthetics will be maintained. Where appropriate, any specific requirements on such routines are explicitly mentioned below. "
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Capitalization and Punctuation in Condition Reports"))
      "It is recommended that a " (:TERM NIL "report message")
      " be a complete sentences, in the proper case and correctly punctuated. In English, for example, this means the first letter should be uppercase, and there should be a trailing period. "
      :PAR
      (:CODE NIL " (error \"This is a message\")  ; Not recommended
 (error \"this is a message.\") ; Not recommended

 (error \"This is a message.\") ; Recommended instead
")
      " " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Leading and Trailing Newlines in Condition Reports"))
      "It is recommended that a " (:TERM NIL "report message")
      " not begin with any introductory text, such as “" (:TT NIL "Error: ")
      "” or “" (:TT NIL "Warning: ") "” or even just " (:TERM NIL "freshline")
      " or " (:TERM NIL "newline")
      ". Such text is added, if appropriate to the context, by the routine invoking the "
      (:TERM NIL "condition reporter") ". " :PAR "It is recommended that a "
      (:TERM NIL "report message") " not be followed by a trailing "
      (:TERM NIL "freshline") " or " (:TERM NIL "newline")
      ". Such text is added, if appropriate to the context, by the routine invoking the "
      (:TERM NIL "condition reporter") ". " :PAR
      (:CODE NIL " (error \"This is a message.~%\")   ; Not recommended
 (error \"~&This is a message.\")   ; Not recommended
 (error \"~&This is a message.~%\") ; Not recommended

 (error \"This is a message.\")     ; Recommended instead
")
      " " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Embedded Newlines in Condition Reports"))
      "Especially if it is long, it is permissible and appropriate for a "
      (:TERM NIL "report message") " to contain one or more embedded "
      (:TERM NIL "newlines") ". " :PAR
      "If the calling routine conventionally inserts some additional prefix (such as “"
      (:TT NIL "Error: ") "” or “" (:TT NIL ";; Error: ")
      "”) on the first line of the message, it must also assure that an appropriate prefix will be added to each subsequent line of the output, so that the left edge of the message output by the "
      (:TERM NIL "condition reporter") " will still be properly aligned. " :PAR
      (:CODE NIL " (defun test ()
   (error \"This is an error message.~%It has two lines.\"))

 ;; Implementation A
 (test)
 This is an error message.
 It has two lines.

 ;; Implementation B
 (test)
 ;; Error: This is an error message.
 ;;        It has two lines.

 ;; Implementation C
 (test)
 >> Error: This is an error message. 
           It has two lines.
")
      " " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Note about Tabs in Condition Reports"))
      "Because the indentation of a " (:TERM NIL "report message")
      " might be shifted to the right or left by an arbitrary amount, special care should be taken with the semi-standard "
      (:TERM NIL "character") " " (:ANG NIL "Tab") " (in those "
      (:TERM NIL "implementations") " that support such a "
      (:TERM NIL "character") "). Unless the " (:TERM NIL "implementation")
      " specifically defines its behavior in this context, its use should be avoided. "
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Mentioning Containing Function in Condition Reports"))
      "The name of the containing function should generally not be mentioned in "
      (:TERM NIL "report messages") ". It is assumed that the "
      (:TERM NIL "debugger")
      " will make this information accessible in situations where it is necessary and appropriate. "
      :PAR)
     :PAR)
    :PAR)
   " "
   (:SUBSECTION
    (:TITLE ("Signaling and Handling Conditions") :TAGS (:COND-SIGNAL-HANDLE))
    " " :PAR
    "The operation of the condition system depends on the ordering of active "
    (:TERM NIL "applicable handlers") " from most recent to least recent. "
    :PAR "Each " (:TERM NIL "handler") " is associated with a "
    (:TERM NIL "type specifier") " that must designate a "
    (:TERM NIL "subtype") " of " (:TERM NIL "type") " "
    (:TYPEREF NIL "condition") ". A " (:TERM NIL "handler") " is said to be "
    (:TERM NIL "applicable") " to a " (:TERM NIL "condition") " if that "
    (:TERM NIL "condition") " is of the " (:TERM NIL "type")
    " designated by the associated " (:TERM NIL "type specifier") ". " :PAR
    (:TERM NIL "Active") " " (:TERM NIL "handlers") " are "
    (:TERM NIL "established") " by using " (:MACREF NIL "handler-bind")
    " (or an abstraction based on " (:MACREF NIL "handler-bind") ", such as "
    (:MACREF NIL "handler-case") " or " (:MACREF NIL "ignore-errors") "). "
    :PAR (:TERM NIL "Active") " " (:TERM NIL "handlers") " can be "
    (:TERM NIL "established") " within the dynamic scope of other "
    (:TERM NIL "active") " " (:TERM NIL "handlers")
    ". At any point during program execution, there is a set of "
    (:TERM NIL "active") " " (:TERM NIL "handlers") ". When a "
    (:TERM NIL "condition") " is signaled, the " (:TERM NIL "most recent")
    " active " (:TERM NIL "applicable handler") " for that "
    (:TERM NIL "condition") " is selected from this set. Given a "
    (:TERM NIL "condition") ", the order of recentness of active "
    (:TERM NIL "applicable handlers")
    " is defined by the following two rules: " :PAR
    (:LIST NIL
     (:ITEM NIL "1. Each handler in a set of active handlers "
      (:MATH NIL (:MSUB NIL (:MI NIL "H") (:MN NIL "1")))
      " is more recent than every handler in a set "
      (:MATH NIL (:MSUB NIL (:MI NIL "H") (:MN NIL "2")))
      " if the handlers in "
      (:MATH NIL (:MSUB NIL (:MI NIL "H") (:MN NIL "2")))
      " were active when the handlers in "
      (:MATH NIL (:MSUB NIL (:MI NIL "H") (:MN NIL "1"))) " were established. "
      :PAR)
     (:ITEM NIL "2. Let " (:MATH NIL (:MSUB NIL (:MI NIL "h") (:MN NIL "1")))
      " and " (:MATH NIL (:MSUB NIL (:MI NIL "h") (:MN NIL "2")))
      " be two applicable active handlers established by the same "
      (:TERM NIL "form") ". Then "
      (:MATH NIL (:MSUB NIL (:MI NIL "h") (:MN NIL "1")))
      " is more recent than "
      (:MATH NIL (:MSUB NIL (:MI NIL "h") (:MN NIL "2"))) " if "
      (:MATH NIL (:MSUB NIL (:MI NIL "h") (:MN NIL "1")))
      " was defined to the left of "
      (:MATH NIL (:MSUB NIL (:MI NIL "h") (:MN NIL "2"))) " in the "
      (:TERM NIL "form") " that established them. " :PAR))
    " " :PAR
    (:COMMENT NIL "!!! Barrett:  This doesn't match my reading of CSv18, p12."
     "     I believe contradicts p21,p22 of that document.  It also differs from"
     "     previous paragraph (w/ item 2) and first paragraph under \"signaling\".")
    "Once a handler in a handler binding " (:TERM NIL "form") " (such as "
    (:MACREF NIL "handler-bind") " or " (:MACREF NIL "handler-case")
    ") has been selected, all handlers in that " (:TERM NIL "form")
    " become inactive for the remainder of the signaling process. "
    (:COMMENT NIL "--------------------------------------")
    "While the selected " (:TERM NIL "handler") " runs, no other "
    (:TERM NIL "handler") " established by that " (:TERM NIL "form")
    " is active. That is, if the " (:TERM NIL "handler")
    " declines, no other handler established by that " (:TERM NIL "form")
    " will be considered for possible invocation. "
    (:COMMENT NIL
     "-----------------------------------------------------------------------------------------")
    :PAR (:NEXTFIGURE (:CAPS T)) " shows " (:TERM NIL "operators")
    " relating to the " (:TERM NIL "handling") " of " (:TERM NIL "conditions")
    ". " :PAR
    (:TABLE (:NAME ("Operators relating to handling conditions."))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " handler-bind"))
      (:CELL NIL (:FUNREF NIL "handler-case"))
      (:CELL NIL (:FUNREF NIL "ignore-errors"))))
    " " :PAR
    (:SUBSUBSECTION (:TITLE ("Signaling") :TAGS (:SIGNALING)) " " :PAR
     "When a " (:TERM NIL "condition")
     " is signaled, the most recent applicable " (:TERM NIL "active") " "
     (:TERM NIL "handler")
     " is invoked. Sometimes a handler will decline by simply returning without a transfer of control. In such cases, the next most recent applicable active handler is invoked. "
     :PAR "If there are no applicable handlers for a " (:TERM NIL "condition")
     " that has been signaled, or if all applicable handlers decline, the "
     (:TERM NIL "condition") " is unhandled. " :PAR "The functions "
     (:FUNREF NIL "cerror") " and " (:FUNREF NIL "error")
     " invoke the interactive " (:TERM NIL "condition")
     " handler (the debugger) rather than return if the "
     (:TERM NIL "condition") " being signaled, regardless of its "
     (:TERM NIL "type") ", is unhandled. In contrast, " (:FUNREF NIL "signal")
     " returns " (:MISC NIL "nil") " if the " (:TERM NIL "condition")
     " being signaled, regardless of its " (:TERM NIL "type")
     ", is unhandled. " :PAR "The " (:TERM NIL "variable") " "
     (:VARREF NIL "*break-on-signals*")
     " can be used to cause the debugger to be entered before the signaling process begins. "
     :PAR (:NEXTFIGURE (:CAPS T)) " shows " (:TERM NIL "defined names")
     " relating to the " (:TERM NIL "signaling") " of "
     (:TERM NIL "conditions") ". " :PAR
     (:TABLE (:NAME ("Defined names relating to signaling conditions."))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " *break-on-signals*"))
       (:CELL NIL (:FUNREF NIL "error")) (:CELL NIL (:FUNREF NIL "warn")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " cerror"))
       (:CELL NIL (:FUNREF NIL "signal")) (:CELL NIL)))
     " " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Resignaling a Condition"))
      (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " During the "
      (:TERM NIL "dynamic extent") " of the " (:TERM NIL "signaling")
      " process for a particular " (:TERM NIL "condition") " "
      (:TERM NIL "object") ", " (:TERM NIL "signaling") " the same "
      (:TERM NIL "condition") " " (:TERM NIL "object")
      " again is permitted if and only if the " (:TERM NIL "situation")
      " represented in both cases are the same. " :PAR "For example, a "
      (:TERM NIL "handler") " might legitimately " (:TERM NIL "signal") " the "
      (:TERM NIL "condition") " " (:TERM NIL "object") " that is its "
      (:TERM NIL "argument") " in order to allow outer " (:TERM NIL "handlers")
      " first opportunity to " (:TERM NIL "handle") " the condition. (Such a "
      (:TERM NIL "handlers")
      " is sometimes called a “default handler.”) This action is permitted because the "
      (:TERM NIL "situation") " which the second " (:TERM NIL "signaling")
      " process is addressing is really the same " (:TERM NIL "situation") ". "
      :PAR "On the other hand, in an " (:TERM NIL "implementation")
      " that implemented asynchronous keyboard events by interrupting the user process with a call to "
      (:FUNREF NIL "signal")
      ", it would not be permissible for two distinct asynchronous keyboard events to "
      (:TERM NIL "signal") " " (:TERM NIL "identical") " "
      (:TERM NIL "condition") " " (:TERM NIL "objects")
      " at the same time for different "
      (:COMMENT NIL "% Per X3J13 (at request of Gadbois). -kmp 5-Oct-93" "the")
      "situations. " (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION")
      " " :PAR)
     :PAR)
    (:SUBSUBSECTION (:TITLE ("Restarts") :TAGS (:RESTARTS)) " " :PAR
     (:COMMENT NIL
      "!!! Barrett: Not true. Debugger may permit arbitrary returning, depending on implementation.")
     "The interactive condition handler returns only through non-local transfer of control to specially defined "
     (:TERM NIL "restarts")
     " that can be set up either by the system or by user code. Transferring control to a restart is called “invoking” the restart. Like handlers, active "
     (:TERM NIL "restarts") " are " (:TERM NIL "established")
     " dynamically, and only active " (:TERM NIL "restarts")
     " can be invoked. An active " (:TERM NIL "restart")
     " can be invoked by the user from the debugger or by a program by using "
     (:FUNREF NIL "invoke-restart") ". " :PAR
     (:COMMENT NIL "!!! Barrett: :TEST predicate also affects applicability.")
     "A " (:TERM NIL "restart") " contains a " (:TERM NIL "function") " to be "
     (:TERM NIL "called") " when the " (:TERM NIL "restart")
     " is invoked, an optional name that can be used to find or invoke the "
     (:TERM NIL "restart")
     ", and an optional set of interaction information for the debugger to use to enable the user to manually invoke a "
     (:TERM NIL "restart") ". "
     (:COMMENT NIL "    some optional information that allows the debugger "
      "    to manage the interactive selection of the \\term{restart} in"
      "    situations where program handlers cannot select one.")
     :PAR "The name of a " (:TERM NIL "restart") " is used by "
     (:FUNREF NIL "invoke-restart") ". " (:TERM NIL "Restarts")
     " that can be invoked only within the debugger do not need names. "
     (:COMMENT NIL
      "Useless information - terms unnamed and anonymous are never used."
      "\\term{Restart} names provide a means " "to access program interfaces"
      "such as " "\\funref{find-restart} and \\funref{invoke-restart}.  "
      "\\term{Restarts} named"
      "\\nil\\ are called ``unnamed'' or ``anonymous'' "
      "\\term{restarts}. Named \\term{restarts} " "can be used in both"
      "interactive and non-interactive situations, but unnamed"
      "\\term{restarts} are typically useful only in interactive situations.")
     :PAR (:TERM NIL "Restarts") " can be established by using "
     (:MACREF NIL "restart-bind") ", " (:MACREF NIL "restart-case") ", and "
     (:MACREF NIL "with-simple-restart") ". A " (:TERM NIL "restart")
     " function can itself invoke any other " (:TERM NIL "restart")
     " that was active at the time of establishment of the "
     (:TERM NIL "restart") " of which the " (:TERM NIL "function") " is part. "
     :PAR (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " "
     (:ISSUE NIL "JUN90-TRIVIAL-ISSUES:14") " The " (:TERM NIL "restarts") " "
     (:TERM NIL "established") " by a " (:MACREF NIL "restart-bind") " "
     (:TERM NIL "form") ", a " (:MACREF NIL "restart-case") " "
     (:TERM NIL "form") ", or a " (:MACREF NIL "with-simple-restart") " "
     (:TERM NIL "form") " have " (:TERM NIL "dynamic extent")
     " which extends for the duration of that " (:TERM NIL "form")
     "'s execution. " (:ENDISSUE NIL "JUN90-TRIVIAL-ISSUES:14") " "
     (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " " :PAR
     (:TERM NIL "Restarts")
     " of the same name can be ordered from least recent to most recent according to the following two rules: "
     :PAR
     (:LIST NIL
      (:ITEM NIL "1. Each " (:TERM NIL "restart")
       " in a set of active restarts "
       (:MATH NIL (:MSUB NIL (:MI NIL "R") (:MN NIL "1")))
       " is more recent than every " (:TERM NIL "restart") " in a set "
       (:MATH NIL (:MSUB NIL (:MI NIL "R") (:MN NIL "2"))) " if the "
       (:TERM NIL "restarts") " in "
       (:MATH NIL (:MSUB NIL (:MI NIL "R") (:MN NIL "2")))
       " were active when the " (:TERM NIL "restarts") " in "
       (:MATH NIL (:MSUB NIL (:MI NIL "R") (:MN NIL "1")))
       " were established. " :PAR)
      (:ITEM NIL "2. Let " (:MATH NIL (:MSUB NIL (:MI NIL "r") (:MN NIL "1")))
       " and " (:MATH NIL (:MSUB NIL (:MI NIL "r") (:MN NIL "2")))
       " be two active " (:TERM NIL "restarts")
       " with the same name established by the same " (:TERM NIL "form")
       ". Then " (:MATH NIL (:MSUB NIL (:MI NIL "r") (:MN NIL "1")))
       " is more recent than "
       (:MATH NIL (:MSUB NIL (:MI NIL "r") (:MN NIL "2"))) " if "
       (:MATH NIL (:MSUB NIL (:MI NIL "r") (:MN NIL "1")))
       " was defined to the left of "
       (:MATH NIL (:MSUB NIL (:MI NIL "r") (:MN NIL "2"))) " in the "
       (:TERM NIL "form") " that established them. " :PAR))
     " " :PAR "If a " (:TERM NIL "restart")
     " is invoked but does not transfer control, the values resulting from the "
     (:TERM NIL "restart")
     " function are returned by the function that invoked the restart, either "
     (:FUNREF NIL "invoke-restart") " or "
     (:FUNREF NIL "invoke-restart-interactively") ". "
     (:COMMENT NIL
      "!!! Barrett: There are other functions that invoke restarts that we built"
      "      on these two; i.e., muffle-warning, etc.")
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Interactive Use of Restarts"))
      "For interactive handling, two pieces of information are needed from a "
      (:TERM NIL "restart") ": a report function and an interactive function. "
      :PAR "The report function "
      (:COMMENT NIL "which can be specified using the "
       "\\kwd{report-function}" "   keyword in "
       "\\macref{restart-bind} or the "
       "\\kwd{report} keyword in \\macref{restart-case},")
      "is used by a program such as the debugger to present a description of the action the "
      (:TERM NIL "restart")
      " will take. The report function is specified and established by the "
      (:KWD NIL "report-function") " keyword to " (:MACREF NIL "restart-bind")
      " or the " (:KWD NIL "report") " keyword to "
      (:MACREF NIL "restart-case") ". "
      (:COMMENT NIL "The"
       "   report function is a function of one argument, a stream on which"
       "   the output is to be done.  If no report function is specified by"
       "   the user, the restart will be reported in an \\term{implementation-dependent}"
       "   way. ")
      :PAR "The interactive function, which can be specified using the "
      (:KWD NIL "interactive-function") " keyword to "
      (:MACREF NIL "restart-bind") " or " (:KWD NIL "interactive")
      " keyword to " (:MACREF NIL "restart-case") ", is used when the "
      (:TERM NIL "restart")
      " is invoked interactively, such as from the debugger, to produce a suitable list of arguments. "
      (:COMMENT NIL "The function takes no arguments, and may"
       "   prompt interactively on *QUERY-IO* if necessary.  The result "
       "   should be a list of arguments suitable for use in the expression"
       "     (APPLY #'INVOKE-RESTART <restart> <arguments>)."
       "   If no interactive function is specified by the user, the argument"
       "   list NIL will be assumed.")
      :PAR (:FUNREF NIL "invoke-restart") " invokes the most recently "
      (:TERM NIL "established") " "
      (:COMMENT NIL
       "!!! Barrett: \"active\" -- :TEST could inhibit activation.")
      (:TERM NIL "restart") " whose name is the same as the first argument to "
      (:FUNREF NIL "invoke-restart") ". If a " (:TERM NIL "restart")
      " is invoked interactively by the debugger and does not transfer control but rather returns values, the precise action of the debugger on those values is "
      (:TERM NIL "implementation-defined") ". " :PAR
      (:COMMENT NIL
       "!!! Barrett: This doesn't talk about supplying restart objects to INVOKE-RESTART.")
      :PAR)
     (:SUBSUBSUBSECTION
      (:TITLE ("Interfaces to Restarts") :TAGS (:INTERFACES-TO-RESTARTS)) " "
      :PAR
      (:COMMENT NIL "%KMP replaced"
       "It is possible to define a functional interface that hides the use of"
       "\\funref{invoke-restart}.  The functions \\funref{abort},"
       "\\funref{continue}, \\funref{muffle-warning}, \\funref{store-value},"
       "and \\funref{use-value} are such interfaces.")
      "Some " (:TERM NIL "restarts") " have functional interfaces, "
      (:COMMENT NIL "either for syntactic"
       "   convenience or to de-emphasize the use of restarts in their"
       "   implementation.  ")
      "such as " (:FUNREF NIL "abort") ", " (:FUNREF NIL "continue") ", "
      (:FUNREF NIL "muffle-warning") ", " (:FUNREF NIL "store-value") ", and "
      (:FUNREF NIL "use-value") ". They are ordinary functions that use "
      (:FUNREF NIL "find-restart") " and " (:FUNREF NIL "invoke-restart")
      " internally, that have the same name as the " (:TERM NIL "restarts")
      " they manipulate, and that are provided simply for notational convenience. "
      :PAR (:NEXTFIGURE (:CAPS T)) " shows " (:TERM NIL "defined names")
      " relating to " (:TERM NIL "restarts") ". " :PAR
      (:TABLE (:NAME ("Defined names relating to restarts."))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " abort"))
        (:CELL NIL (:FUNREF NIL "invoke-restart-interactively"))
        (:CELL NIL (:FUNREF NIL "store-value")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " compute-restarts"))
        (:CELL NIL (:FUNREF NIL "muffle-warning"))
        (:CELL NIL (:FUNREF NIL "use-value")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " continue"))
        (:CELL NIL (:FUNREF NIL "restart-bind"))
        (:CELL NIL (:FUNREF NIL "with-simple-restart")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " find-restart"))
        (:CELL NIL (:FUNREF NIL "restart-case")) (:CELL NIL))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " invoke-restart"))
        (:CELL NIL (:FUNREF NIL "restart-name")) (:CELL NIL)))
      " " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Restart Tests"))
      (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " " :PAR "Each "
      (:TERM NIL "restart")
      " has an associated test, which is a function of one argument (a "
      (:TERM NIL "condition") " or " (:MISC NIL "nil") ") which returns "
      (:TERM NIL "true") " if the " (:TERM NIL "restart")
      " should be visible in the current " (:TERM NIL "situation")
      ". This test is created by the " (:KWD NIL "test-function") " option to "
      (:MACREF NIL "restart-bind") " or the " (:KWD NIL "test") " option to "
      (:MACREF NIL "restart-case") ". "
      (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Associating a Restart with a Condition") :TAGS
       (:ASSOC-RESTART-WITH-COND))
      " " :PAR (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " A "
      (:TERM NIL "restart") " can be “associated with” a "
      (:TERM NIL "condition") " explicitly by "
      (:MACREF NIL "with-condition-restarts") ", or implicitly by "
      (:MACREF NIL "restart-case") ". Such an assocation has "
      (:TERM NIL "dynamic extent") ". " :PAR "A single " (:TERM NIL "restart")
      " may be associated with several " (:TERM NIL "conditions")
      " at the same time. A single " (:TERM NIL "condition")
      " may have several associated " (:TERM NIL "restarts")
      " at the same time. " :PAR
      "Active restarts associated with a particular " (:TERM NIL "condition")
      " can be detected by " (:TERM NIL "calling") " a " (:TERM NIL "function")
      " such as " (:FUNREF NIL "find-restart") ", supplying that "
      (:TERM NIL "condition") " as the " (:PARAM NIL "condition") " "
      (:TERM NIL "argument")
      ". Active restarts can also be detected without regard to any associated "
      (:TERM NIL "condition") " by calling such a function without a "
      (:PARAM NIL "condition") " " (:TERM NIL "argument")
      ", or by supplying a value of " (:MISC NIL "nil") " for such an "
      (:TERM NIL "argument") ". "
      (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " " :PAR)
     :PAR))
   " "
   (:SUBSECTION (:TITLE ("Assertions")) "Conditional signaling of "
    (:TERM NIL "conditions")
    " based on such things as key match, form evaluation, and "
    (:TERM NIL "type") " are handled by assertion " (:TERM NIL "operators")
    ". " (:NEXTFIGURE (:CAPS T)) " shows " (:TERM NIL "operators")
    " relating to assertions. " :PAR
    (:TABLE (:NAME ("Operators relating to assertions."))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " assert"))
      (:CELL NIL (:FUNREF NIL "check-type")) (:CELL NIL (:FUNREF NIL "ecase")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " ccase"))
      (:CELL NIL (:FUNREF NIL "ctypecase"))
      (:CELL NIL (:FUNREF NIL "etypecase"))))
    " " :PAR)
   :PAR
   (:COMMENT NIL " Date: Tue, 4 Jun 91 10:39:28 EDT"
    " From: kab@chestnut.com (Kim Barrett)"
    " To: mueller@sumex-aim.stanford.edu" " Cc: common-lisp@mcc.com"
    " Message-Id: <9106041439.AA08564@chestnut.com>"
    " In-Reply-To: <2884982915-12705048@KSL-EXP-30>"
    " Subject: CLEH restarts..." " " " [...]"
    " The rules for determining whether a (visible) restart is active are:" " "
    " 1. If the test function for the restart returns false when applied to the"
    " condition argument (which may be NIL), then the restart is inactive." " "
    " 2. If testing for applicability to a specific condition (the condition argument"
    " is actually a condition object), then either"
    "   a. The restart is associated with the specified condition."
    "   b. The restart is not associated with some other condition object."
    "      [This case was accidentally left out of the Version 2 proposal.]"
    " or the restart is inactive." " "
    " 3. If neither of (1) and (2) indicate the restart to be inactive, then it is"
    " active." " [...]")
   :PAR
   (:SUBSECTION (:TITLE ("Notes about the Condition System's Background"))
    "For a background reference to the abstract concepts detailed in this section, see "
    (:BIB
     (:URL
      "https://www.nhplace.com/kent/Papers/Exceptional-Situations-1990.html")
     "Exceptional Situations in Lisp")
    ". The details of that paper are not binding on this document, but may be helpful in establishing a conceptual basis for understanding this material. "
    :PAR))
  :PAR
  (:DICTIONARY NIL :PAR
   (:COMMENT NIL " Conditions" "  Conditions" "   Signaling" "   Debugger"
    "   Handling" "   Condition Types" "    Condition Type Definition"
    "    Condition Instantiation" "    Condition Types/Accessors" "  Restarts"
    "   PreDefined Restarts")
   :PAR (:COMMENT NIL "%% ========== CONDITION")
   (:COM (:NAME "condition" :FTYPE "Condition Type")
    (:ISSUE NIL "CONDITION-RESTARTS:BUGGY") " "
    (:REVIEWER NIL
     "Barrett: I think CONDITION-RESTARTS is not fully integrated.")
    " " (:ENDISSUE NIL "CONDITION-RESTARTS:BUGGY") " " :PAR
    (:COMMENT NIL "!!! Barrett notes of the condition types:"
     "  There is little discussion in this descriptions of what the values "
     "  of the initargs ought to be.  For example, package-error permits name"
     "  or package object.")
    :PAR
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "condition") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "All types of "
     (:TERM NIL "conditions")
     ", whether error or non-error, must inherit from this " (:TERM NIL "type")
     ". " (:ISSUE NIL "CLOS-CONDITIONS-AGAIN:ALLOW-SUBSET") " "
     (:ISSUE NIL "CLOS-CONDITIONS:INTEGRATE") " "
     (:COMMENT NIL "%As noted by Symbolics, these just repeat the obvious:"
      "All types of \\term{conditions} are \\term{classes}.  "
      "All \\term{condition} \\term{objects} are \\term{generalized instances} of one"
      "or more \\term{classes}."
      "    Barmar thinks the next statement is unnecessary and incomplete."
      "    I think there's also a later cleanup issue which undoes it.  Work on this more. -kmp"
      "    Barrett also asks what about SLOT-VALUE and its setf."
      "% Removed. This is explained better below.  -kmp 1-Oct-91"
      " \\term{Slots} in \\term{condition} \\term{objects} can be accessed"
      " using \\macref{with-slots}.")
     (:ENDISSUE NIL "CLOS-CONDITIONS:INTEGRATE") " "
     (:ENDISSUE NIL "CLOS-CONDITIONS-AGAIN:ALLOW-SUBSET") " " :PAR
     (:COMMENT NIL
      " %!!! Barrett points out that these look a little lonely all by themselves. -kmp 23-Oct-90"
      " %    (Well, they used to be somewhere different, so maybe they are not so "
      " %    lonely now, but I'll leave the comment and think more about it later. -kmp 13-Nov-90)"
      " %!!! Barrett thinks this \"disjointness\" is probably false  and in any case uninteresting."
      "% Finally commented out for Barrett. -kmp 2-Feb-92"
      " The \\term{types} \\typeref{simple-condition}, \\typeref{warning}, "
      " and \\typeref{serious-condition} are \\term{pairwise} \\term{disjoint}.")
     :PAR "No additional " (:TERM NIL "subtype")
     " relationships among the specified " (:TERM NIL "subtypes") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "condition")
     " are allowed, except when explicitly mentioned in the text; however implementations are permitted to introduce additional "
     (:TERM NIL "types") " and one of these " (:TERM NIL "types") " can be a "
     (:TERM NIL "subtype") " of any number of the " (:TERM NIL "subtypes")
     " of " (:TERM NIL "type") " " (:TYPEREF NIL "condition") ". " :PAR
     (:ISSUE NIL "CONDITION-SLOTS:HIDDEN") " Whether a user-defined "
     (:TERM NIL "condition") " " (:TERM NIL "type") " has " (:TERM NIL "slots")
     " that are accessible by " (:MACREF NIL "with-slots") " is "
     (:TERM NIL "implementation-dependent") ". Furthermore, even in an "
     (:TERM NIL "implementation") " in which user-defined "
     (:TERM NIL "condition") " " (:TERM NIL "types") " would have "
     (:TERM NIL "slots") ", it is " (:TERM NIL "implementation-dependent")
     " whether any " (:TERM NIL "condition") " " (:TERM NIL "types")
     " defined in this document have such " (:TERM NIL "slots")
     " or, if they do, what their " (:TERM NIL "names")
     " might be; only the reader functions documented by this specification may be relied upon by portable code. "
     (:ENDISSUE NIL "CONDITION-SLOTS:HIDDEN") " " :PAR
     (:ISSUE NIL "CLOS-CONDITIONS-AGAIN:ALLOW-SUBSET") " "
     (:TERM NIL "Conforming code")
     " must observe the following restrictions related to "
     (:TERM NIL "conditions") ": " :PAR
     (:LIST NIL
      (:ITEM NIL " " (:MACREF NIL "define-condition") ", not "
       (:MACREF NIL "defclass") ", must be used to define new "
       (:TERM NIL "condition") " " (:TERM NIL "types") ". " :PAR)
      (:ITEM NIL " " (:FUNREF NIL "make-condition") ", not "
       (:FUNREF NIL "make-instance") ", must be used to create "
       (:TERM NIL "condition") " " (:TERM NIL "objects") " explicitly. " :PAR)
      (:ITEM NIL " The " (:KWD NIL "report") " option of "
       (:MACREF NIL "define-condition") ", not " (:MACREF NIL "defmethod")
       " for " (:FUNREF NIL "print-object")
       ", must be used to define a condition reporter. " :PAR)
      (:ITEM NIL " " (:FUNREF NIL "slot-value") ", "
       (:FUNREF NIL "slot-boundp") ", " (:FUNREF NIL "slot-makunbound")
       ", and " (:MACREF NIL "with-slots") " must not be used on "
       (:TERM NIL "condition") " " (:TERM NIL "objects")
       ". Instead, the appropriate accessor functions (defined by "
       (:MACREF NIL "define-condition") ") should be used. "))
     " " (:ENDISSUE NIL "CLOS-CONDITIONS-AGAIN:ALLOW-SUBSET") " " :PAR))
   :PAR
   (:COM (:NAME "warning" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "warning") ", "
     (:TYPEREF NIL "condition") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "warning") " consists of all types of warnings. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:TYPEREF NIL "style-warning") " "
     :PAR))
   :PAR (:ISSUE NIL "COMPILER-DIAGNOSTICS:USE-HANDLER") " "
   (:COM (:NAME "style-warning" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "style-warning")
     ", " (:TYPEREF NIL "warning") ", " (:TYPEREF NIL "condition") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "style-warning") " includes those " (:TERM NIL "conditions")
     " that represent " (:TERM NIL "situations") " involving "
     (:TERM NIL "code") " that is " (:TERM NIL "conforming code")
     " but that is nevertheless considered to be faulty or substandard. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "muffle-warning") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "An " (:TERM NIL "implementation")
     " might signal such a " (:TERM NIL "condition") " if it encounters "
     (:TERM NIL "code")
     " that uses deprecated features or that appears unaesthetic or inefficient. "
     :PAR "An `unused variable' warning must be of " (:TERM NIL "type") " "
     (:TYPEREF NIL "style-warning") ". " :PAR
     "In general, the question of whether " (:TERM NIL "code")
     " is faulty or substandard is a subjective decision to be made by the facility processing that "
     (:TERM NIL "code")
     ". The intent is that whenever such a facility wishes to complain about "
     (:TERM NIL "code") " on such subjective grounds, it should use this "
     (:TERM NIL "condition") " " (:TERM NIL "type")
     " so that any clients who wish to redirect or muffle superfluous warnings can do so without risking that they will be redirecting or muffling other, more serious warnings. "
     :PAR))
   (:ENDISSUE NIL "COMPILER-DIAGNOSTICS:USE-HANDLER") " " :PAR
   (:COM (:NAME "serious-condition" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " "
     (:TYPEREF NIL "serious-condition") ", " (:TYPEREF NIL "condition") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "All " (:TERM NIL "conditions")
     " serious enough to require interactive intervention if not handled should inherit from the "
     (:TERM NIL "type") " " (:TYPEREF NIL "serious-condition")
     ". This condition type is provided "
     (:COMMENT NIL "for terminological convenience.")
     "primarily so that it may be included as a " (:TERM NIL "superclass")
     " of other " (:TERM NIL "condition") " " (:TERM NIL "types")
     "; it is not intended to be signaled directly. " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL " It is"
      " conventional to use \\funref{error} (or something built on"
      " \\funref{error}) to \\term{signal} \\term{conditions} that are \\oftype{serious-condition},"
      " and to use \\funref{signal} to \\term{signal} \\term{conditions} "
      " that are not of this \\term{type}.")
     :PAR "Signaling a " (:TERM NIL "serious condition")
     " does not itself force entry into the debugger. However, except in the unusual situation where the programmer can assure that no harm will come from failing to "
     (:TERM NIL "handle") " a " (:TERM NIL "serious condition") ", such a "
     (:TERM NIL "condition") " is usually signaled with " (:FUNREF NIL "error")
     " rather than " (:FUNREF NIL "signal")
     " in order to assure that the program does not continue without "
     (:TERM NIL "handling") " the " (:TERM NIL "condition")
     ". (And conversely, it is conventional to use " (:FUNREF NIL "signal")
     " rather than " (:FUNREF NIL "error")
     " to signal conditions which are not " (:TERM NIL "serious conditions")
     ", since normally the failure to handle a non-serious condition is not reason enough for the debugger to be entered.) "
     :PAR))
   :PAR
   (:COM (:NAME "error" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "error") ", "
     (:TYPEREF NIL "serious-condition") ", " (:TYPEREF NIL "condition") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") " consists of all " (:TERM NIL "conditions")
     " that represent " (:TERM NIL "errors") ". " :PAR))
   :PAR
   (:COM (:NAME "cell-error" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "cell-error") ", "
     (:TYPEREF NIL "error") ", " (:TYPEREF NIL "serious-condition") ", "
     (:TYPEREF NIL "condition") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "cell-error")
     " consists of error conditions that occur during a location "
     (:TERM NIL "access")
     ". The name of the offending cell is initialized by the "
     (:KWD NIL "name") " initialization argument to "
     (:FUNREF NIL "make-condition") ", and is " (:TERM NIL "accessed")
     " by the " (:TERM NIL "function") " " (:FUNREF NIL "cell-error-name") ". "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "cell-error-name") " "
     :PAR))
   :PAR (:COMMENT NIL "%% ========== CELL-ERROR-NAME")
   (:COM (:NAME "cell-error-name" :FTYPE "Function")
    (:ISSUE NIL "ACCESS-ERROR-NAME") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "cell-error-name")
      (:ARGLIST NIL "condition") (:VALUES NIL "name"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "condition")
     "—a " (:TERM NIL "condition") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "cell-error") ". " :PAR (:PARAM NIL "name") "—an "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns the " (:TERM NIL "name")
     " of the offending cell involved in the " (:TERM NIL "situation")
     " represented by " (:PARAM NIL "condition") ". " :PAR
     "The nature of the result depends on the specific " (:TERM NIL "type")
     " of " (:PARAM NIL "condition") ". For example, if the "
     (:PARAM NIL "condition") " is of " (:TERM NIL "type") " "
     (:TYPEREF NIL "unbound-variable") ", the result is the "
     (:TERM NIL "name") " of the " (:TERM NIL "unbound variable")
     " which was being " (:TERM NIL "accessed") ", if the "
     (:PARAM NIL "condition") " is of " (:TERM NIL "type") " "
     (:TYPEREF NIL "undefined-function") ", this is the " (:TERM NIL "name")
     " of the " (:TERM NIL "undefined function") " which was being "
     (:TERM NIL "accessed") ", and if the " (:PARAM NIL "condition") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "unbound-slot") ", this is the "
     (:TERM NIL "name") " of the " (:TERM NIL "slot") " which was being "
     (:TERM NIL "accessed") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:TYPEREF NIL "cell-error") ", "
     (:TYPEREF NIL "unbound-slot") ", " (:TYPEREF NIL "unbound-variable") ", "
     (:TYPEREF NIL "undefined-function") ", "
     (:SECREF NIL :CONDITION-SYSTEM-CONCEPTS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL "Barmar: This should be ``consequences are unspecified.''"
      "Shouldn't be needed anyway--we don't provide an operator."
      "It is an error to use \\macref{setf} with \\funref{cell-error-name}.")
     :PAR (:ENDISSUE NIL "ACCESS-ERROR-NAME") " " :PAR))
   " " :PAR
   (:COM (:NAME "parse-error" :FTYPE "Condition Type")
    (:ISSUE NIL "PARSE-ERROR-STREAM:SPLIT-TYPES") " "
    (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
    (:ISSUE NIL "READER-ERROR:NEW-TYPE") " " :PAR
    (:PART (:NAME "Class Precedence List") " " :PAR
     (:TYPEREF NIL "parse-error") ", " (:TYPEREF NIL "error") ", "
     (:TYPEREF NIL "serious-condition") ", " (:TYPEREF NIL "condition") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "parse-error")
     " consists of error conditions that are related to parsing. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "parse-namestring") ", "
     (:TYPEREF NIL "reader-error") " " :PAR
     (:ENDISSUE NIL "READER-ERROR:NEW-TYPE") " "
     (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     (:ENDISSUE NIL "PARSE-ERROR-STREAM:SPLIT-TYPES") " " :PAR))
   :PAR
   (:COM (:NAME "storage-condition" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " "
     (:TYPEREF NIL "storage-condition") ", " (:TYPEREF NIL "serious-condition")
     ", " (:TYPEREF NIL "condition") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "storage-condition")
     " consists of serious conditions that relate to problems with memory management that are potentially due to "
     (:TERM NIL "implementation-dependent")
     " limits rather than semantic errors in "
     (:TERM NIL "conforming programs")
     ", and that typically warrant entry to the debugger if not handled. Depending on the details of the "
     (:TERM NIL "implementation")
     ", these might include such problems as stack overflow, memory region overflow, and storage exhausted. "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR "While some " (:RM NIL " Common Lisp")
     " operations might signal " (:TYPEREF NIL "storage-condition")
     " because they are defined to create " (:TERM NIL "objects")
     ", it is unspecified whether operations that are not defined to create "
     (:TERM NIL "objects") " create them anyway and so might also signal "
     (:TYPEREF NIL "storage-condition")
     ". Likewise, the evaluator itself might create " (:TERM NIL "objects")
     " and so might signal " (:TYPEREF NIL "storage-condition")
     ". (The natural assumption might be that such " (:TERM NIL "object")
     " creation is naturally inefficient, but even that is "
     (:TERM NIL "implementation-dependent")
     ".) In general, the entire question of how storage allocation is done is "
     (:TERM NIL "implementation-dependent")
     ", and so any operation might signal " (:TYPEREF NIL "storage-condition")
     " at any time. Because such a " (:TERM NIL "condition")
     " is indicative of a limitation of the " (:TERM NIL "implementation")
     " or of the " (:TERM NIL "image") " rather than an error in a "
     (:TERM NIL "program") ", " (:TERM NIL "objects") " of " (:TERM NIL "type")
     " " (:TYPEREF NIL "storage-condition") " are not of " (:TERM NIL "type")
     " " (:TYPEREF NIL "error") ". " :PAR))
   :PAR (:COMMENT NIL "-------------------- Signaling --------------------")
   :PAR (:COMMENT NIL "%% ========== ASSERT")
   (:COM (:NAME "assert" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "assert")
      (:ARGLIST NIL "test-form "
       (:BRAC NIL (:PAREN NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "place"))))
        " "
        (:BRAC NIL "datum-form "
         (:STAR NIL (:CURLY NIL (:PARAM NIL "argument-form"))))))
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "test-form")
     "—a " (:TERM NIL "form") "; always evaluated. " :PAR (:PARAM NIL "place")
     "—a " (:TERM NIL "place") "; evaluated if an error is signaled. " :PAR
     (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
     (:PARAM NIL "datum-form") "—a " (:TERM NIL "form") " that evaluates to a "
     (:PARAM NIL "datum")
     ". Evaluated each time an error is to be signaled, or not at all if no error is to be signaled. "
     :PAR (:PARAM NIL "argument-form") "—a " (:TERM NIL "form")
     " that evaluates to an " (:PARAM NIL "argument")
     ". Evaluated each time an error is to be signaled, or not at all if no error is to be signaled. "
     :PAR (:ISSUE NIL "ASSERT-ERROR-TYPE:ERROR") " " (:PARAM NIL "datum") ", "
     (:PARAM NIL "arguments") "—" (:TERM NIL "designators") " for a "
     (:TERM NIL "condition") " of default type " (:TYPEREF NIL "error")
     ". (These " (:TERM NIL "designators") " are the result of evaluating "
     (:PARAM NIL "datum-form") " and each of the "
     (:PARAM NIL "argument-forms") ".) "
     (:ENDISSUE NIL "ASSERT-ERROR-TYPE:ERROR") " "
     (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "assert")
     " assures that " (:PARAM NIL "test-form") " evaluates to "
     (:TERM NIL "true") ". If " (:PARAM NIL "test-form") " evaluates to "
     (:TERM NIL "false") ", " (:MACREF NIL "assert") " signals a "
     (:TERM NIL "correctable") " " (:TERM NIL "error") " (denoted by "
     (:PARAM NIL "datum") " and " (:PARAM NIL "arguments")
     "). Continuing from this error using the " (:MISC NIL "continue") " "
     (:TERM NIL "restart")
     " makes it possible for the user to alter the values of the "
     (:PARAM NIL "places") " before " (:MACREF NIL "assert") " evaluates "
     (:PARAM NIL "test-form") " again. If the value of "
     (:PARAM NIL "test-form") " is " (:TERM NIL "non-nil") ", "
     (:MACREF NIL "assert") " returns " (:MISC NIL "nil") ". " :PAR "The "
     (:PARAM NIL "places") " are " (:TERM NIL "generalized references")
     " to data upon which " (:PARAM NIL "test-form")
     " depends, whose values can be changed by the user in attempting to correct the error. "
     (:TERM NIL "Subforms") " of each " (:PARAM NIL "place")
     " are only evaluated if an error is signaled, and might be re-evaluated if the error is re-signaled (after continuing without actually fixing the problem). "
     (:ISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM")
     " The order of evaluation of the " (:PARAM NIL "places")
     " is not specified; see " (:SECREF NIL :GEN-REF-SUB-FORM-EVAL) "."
     (:IDXTEXT NIL "order of evaluation") (:IDXTEXT NIL "evaluation order") " "
     (:ENDISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM") " "
     (:ISSUE NIL "SETF-MULTIPLE-STORE-VARIABLES:ALLOW") " If a "
     (:PARAM NIL "place") " " (:TERM NIL "form")
     " is supplied that produces more values than there are store variables, the extra values are ignored. If the supplied "
     (:TERM NIL "form")
     " produces fewer values than there are store variables, the missing values are set to "
     (:MISC NIL "nil") ". "
     (:ENDISSUE NIL "SETF-MULTIPLE-STORE-VARIABLES:ALLOW") " " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (setq x (make-array '(3 5) :initial-element 3))
→ #2A((3 3 3 3 3) (3 3 3 3 3) (3 3 3 3 3))
 (setq y (make-array '(3 5) :initial-element 7))
→ #2A((7 7 7 7 7) (7 7 7 7 7) (7 7 7 7 7))
 (defun matrix-multiply (a b)
   (let ((*print-array* nil))
     (assert (and (= (array-rank a) (array-rank b) 2)
                  (= (array-dimension a 1) (array-dimension b 0)))
             (a b)
             \"Cannot multiply ~S by ~S.\" a b)
            (really-matrix-multiply a b))) → MATRIX-MULTIPLY
 (matrix-multiply x y)
⊳ Correctable error in MATRIX-MULTIPLY: 
⊳ Cannot multiply #<ARRAY ...> by #<ARRAY ...>.
⊳ Restart options:
⊳  1: You will be prompted for one or more new values.
⊳  2: Top level.
⊳ Debug> "
      (:IN NIL ":continue 1") "
⊳ Value for A: "
      (:IN NIL "x") "
⊳ Value for B: "
      (:IN NIL "(make-array '(5 3) :initial-element 6)") "
→ #2A((54 54 54 54 54)
       (54 54 54 54 54)
       (54 54 54 54 54)
       (54 54 54 54 54)
       (54 54 54 54 54))
")
     " " :PAR
     (:CODE NIL " (defun double-safely (x) (assert (numberp x) (x)) (+ x x))
 (double-safely 4) 
→ 8
 
 (double-safely t)
⊳ Correctable error in DOUBLE-SAFELY: The value of (NUMBERP X) must be non-NIL.
⊳ Restart options:
⊳  1: You will be prompted for one or more new values.
⊳  2: Top level.
⊳ Debug> "
      (:IN NIL ":continue 1") "
⊳ Value for X: "
      (:IN NIL "7") "
→ 14
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*break-on-signals*")
     " "
     (:COMMENT NIL
      " Barrett thinks that \\varref{*debug-io*} and others don't belong here because"
      " debugger might not be reached, and anyway it is a full turing machine and might"
      " depend on virtually anything.")
     :PAR "The set of active " (:TERM NIL "condition handlers") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR
     (:COMMENT NIL
      "% Barrett says, and I agree, that this isn't an exceptional situation."
      "% Anyway, it's said above. -kmp 2-Sep-91"
      " If the value of \\param{test-form} is \\nil,"
      " \\macref{assert} signals a user-specified \\term{condition},"
      " which defaults to \\typeref{simple-error}.")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "check-type") ", "
     (:FUNREF NIL "error") ", " (:SECREF NIL :GENERALIZED-REFERENCE) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The debugger need not include the "
     (:PARAM NIL "test-form") " in the error message, and the "
     (:PARAM NIL "places")
     " should not be included in the message, but they should be made available for the user's perusal. If the user gives the “continue” command, the values of any of the references can be altered. The details of this depend on the implementation's style of user interface. "))
   " " :PAR (:COMMENT NIL "%% ========== ERROR")
   (:COM (:NAME "error" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function" :NO-RETURN T) (:NAMES NIL "error")
      (:ARGLIST NIL "datum " (:KEYWORD NIL " &rest") " arguments"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "datum") ", "
     (:PARAM NIL "arguments") "—" (:TERM NIL "designators") " for a "
     (:TERM NIL "condition") " of default type " (:TYPEREF NIL "simple-error")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "error")
     " effectively invokes " (:FUNREF NIL "signal") " on the denoted "
     (:TERM NIL "condition") ". " :PAR "If the " (:TERM NIL "condition")
     " is not handled, " (:TT NIL "(invoke-debugger " (:I NIL "condition") ")")
     " is done. As a consequence of calling " (:FUNREF NIL "invoke-debugger")
     ", " (:FUNREF NIL "error") " cannot directly return; the only exit from "
     (:FUNREF NIL "error")
     " can come by non-local transfer of control in a handler or by use of an interactive debugging command. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun factorial (x)
   (cond ((or (not (typep x 'integer)) (minusp x))
          (error \"~S is not a valid argument to FACTORIAL.\" x))
         ((zerop x) 1)
         (t (* x (factorial (- x 1))))))
→ FACTORIAL
(factorial 20)
→ 2432902008176640000
(factorial -1)
⊳ Error: -1 is not a valid argument to FACTORIAL.
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Return to Lisp Toplevel.
⊳ Debug> 
")
     " " :PAR
     (:CODE NIL " (setq a 'fred)
→ FRED
 (if (numberp a) (1+ a) (error \"~S is not a number.\" A))
⊳ Error: FRED is not a number.
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Return to Lisp Toplevel.
⊳ Debug> "
      (:IN NIL ":Continue 1") "
⊳ Return to Lisp Toplevel.
 
 (define-condition not-a-number (error) 
                   ((argument :reader not-a-number-argument :initarg :argument))
   (:report (lambda (condition stream)
              (format stream \"~S is not a number.\"
                      (not-a-number-argument condition)))))
→ NOT-A-NUMBER
 
 (if (numberp a) (1+ a) (error 'not-a-number :argument a))
⊳ Error: FRED is not a number.
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Return to Lisp Toplevel.
⊳ Debug> "
      (:IN NIL ":Continue 1") "
⊳ Return to Lisp Toplevel.
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR (:TERM NIL "Handlers")
     " for the specified condition, if any, are invoked and might have side effects. Program execution might stop, and the debugger might be entered. "
     :PAR)
    (:PART (:NAME "Affected By") " " :PAR "Existing handler bindings. " :PAR
     (:VARREF NIL "*break-on-signals*") " "
     (:COMMENT NIL "\\varref{*debug-io*}.") :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR
     (:COMMENT NIL "% Not exceptional."
      " The reason for using \\funref{error} is to signal a \\term{condition},"
      " the exact nature of which is specified by the arguments;  however,"
      " that situation is not considered exceptional.")
     :PAR "Signals an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "datum") " and "
     (:PARAM NIL "arguments") " are not " (:TERM NIL "designators") " for a "
     (:TERM NIL "condition") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "cerror") ", "
     (:FUNREF NIL "signal") ", " (:FUNREF NIL "format") ", "
     (:MACREF NIL "ignore-errors") ", " (:VARREF NIL "*break-on-signals*") ", "
     (:MACREF NIL "handler-bind") ", " (:SECREF NIL :CONDITION-SYSTEM-CONCEPTS)
     " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "Some implementations may provide debugger commands for interactively returning from individual stack frames. However, it should be possible for the programmer to feel confident about writing code like: "
     :PAR
     (:CODE NIL " (defun wargames:no-win-scenario ()
   (error \"pushing the button would be stupid.\")
   (push-the-button))
")
     " In this scenario, there should be no chance that " (:FUNREF NIL "error")
     " will return and the button will get pushed. " :PAR
     "While the meaning of this program is clear and it might be proven `safe' by a formal theorem prover, such a proof is no guarantee that the program is safe to execute. Compilers have been known to have bugs, computers to have signal glitches, and human beings to manually intervene in ways that are not always possible to predict. Those kinds of errors, while beyond the scope of the condition system to formally model, are not beyond the scope of things that should seriously be considered when writing code that could have the kinds of sweeping effects hinted at by this example. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== CERROR")
   (:COM (:NAME "cerror" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "cerror")
      (:ARGLIST NIL "continue-format-control datum " (:KEYWORD NIL " &rest")
       " arguments")
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
     (:PARAM NIL "Continue-format-control") "—a " (:TERM NIL "format control")
     ". " (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR
     (:REVIEWER NIL "Barmar: What is continue-format-control used for??") " "
     :PAR (:PARAM NIL "datum") ", " (:PARAM NIL "arguments") "—"
     (:TERM NIL "designators") " for a " (:TERM NIL "condition")
     " of default type " (:TYPEREF NIL "simple-error") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "cerror")
     " effectively invokes " (:FUNREF NIL "error") " on the "
     (:TERM NIL "condition") " named by " (:PARAM NIL "datum")
     ". As with any function that implicitly calls " (:FUNREF NIL "error")
     ", if the " (:TERM NIL "condition") " is not handled, "
     (:TT NIL "(invoke-debugger " (:I NIL "condition") ")")
     " is executed. While signaling is going on, and while in the debugger if it is reached, it is possible to continue code execution ("
     (:I NIL "i.e.") ",  to return from " (:FUNREF NIL "cerror") ") using the "
     (:MISC NIL "continue") " " (:TERM NIL "restart") ". "
     (:COMMENT NIL " If the debugger is interactively instructed to continue,"
      " the call to \\funref{cerror} returns \\nil.")
     :PAR "If " (:PARAM NIL "datum") " is a " (:TERM NIL "condition") ", "
     (:PARAM NIL "arguments")
     " can be supplied, but are used only in conjunction with the "
     (:PARAM NIL "continue-format-control") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:COMMENT NIL
      "!!! I don't like the debugger typeout format here. -kmp 3-Sep-91")
     (:CODE NIL " (defun real-sqrt (n)
   (when (minusp n)
     (setq n (- n))
     (cerror \"Return sqrt(~D) instead.\" \"Tried to take sqrt(-~D).\" n))
   (sqrt n))

 (real-sqrt 4)
→ 2.0

 (real-sqrt -9)
⊳ Correctable error in REAL-SQRT: Tried to take sqrt(-9).
⊳ Restart options:
⊳  1: Return sqrt(9) instead.
⊳  2: Top level.
⊳ Debug> "
      (:IN NIL ":continue 1") "
→ 3.0
 
 (define-condition not-a-number (error)
   ((argument :reader not-a-number-argument :initarg :argument))
   (:report (lambda (condition stream)
              (format stream \"~S is not a number.\" 
                      (not-a-number-argument condition)))))
 
 (defun assure-number (n)
   (loop (when (numberp n) (return n))
         (cerror \"Enter a number.\"
                 'not-a-number :argument n)
         (format t \"~&Type a number: \")
         (setq n (read))
         (fresh-line)))

 (assure-number 'a)
⊳ Correctable error in ASSURE-NUMBER: A is not a number.
⊳ Restart options:
⊳  1: Enter a number.
⊳  2: Top level.
⊳ Debug> "
      (:IN NIL ":continue 1") "
⊳ Type a number: "
      (:IN NIL "1/2") "
→ 1/2

 (defun assure-large-number (n)
   (loop (when (and (numberp n) (> n 73)) (return n))
         (cerror \"Enter a number~:[~; a bit larger than ~D~].\"
                 \"~*~A is not a large number.\" 
                 (numberp n) n)
         (format t \"~&Type a large number: \")
         (setq n (read))
         (fresh-line)))
 
 (assure-large-number 10000)
→ 10000

 (assure-large-number 'a)
⊳ Correctable error in ASSURE-LARGE-NUMBER: A is not a large number.
⊳ Restart options:
⊳  1: Enter a number.
⊳  2: Top level.
⊳ Debug> "
      (:IN NIL ":continue 1") "
⊳ Type a large number: "
      (:IN NIL "88") "
→ 88

 (assure-large-number 37)
⊳ Correctable error in ASSURE-LARGE-NUMBER: 37 is not a large number.
⊳ Restart options:
⊳  1: Enter a number a bit larger than 37.
⊳  2: Top level.
⊳ Debug> "
      (:IN NIL ":continue 1") "
⊳ Type a large number: "
      (:IN NIL "259") "
→ 259
 
 (define-condition not-a-large-number (error)
   ((argument :reader not-a-large-number-argument :initarg :argument))
   (:report (lambda (condition stream)
              (format stream \"~S is not a large number.\" 
                      (not-a-large-number-argument condition)))))
 
 (defun assure-large-number (n)
   (loop (when (and (numberp n) (> n 73)) (return n))
         (cerror \"Enter a number~3*~:[~; a bit larger than ~*~D~].\"
                 'not-a-large-number
                 :argument n 
                 :ignore (numberp n)
                 :ignore n
                 :allow-other-keys t)
         (format t \"~&Type a large number: \")
         (setq n (read))
         (fresh-line)))
 

 (assure-large-number 'a)
⊳ Correctable error in ASSURE-LARGE-NUMBER: A is not a large number.
⊳ Restart options:
⊳  1: Enter a number.
⊳  2: Top level.
⊳ Debug> "
      (:IN NIL ":continue 1") "
⊳ Type a large number: "
      (:IN NIL "88") "
→ 88
 
 (assure-large-number 37)
⊳ Correctable error in ASSURE-LARGE-NUMBER: A is not a large number.
⊳ Restart options:
⊳  1: Enter a number a bit larger than 37.
⊳  2: Top level.
⊳ Debug> "
      (:IN NIL ":continue 1") "
⊳ Type a large number: "
      (:IN NIL "259") "
→ 259
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*break-on-signals*")
     ". " (:COMMENT NIL "\\varref{*debug-io*}.") :PAR
     "Existing handler bindings. " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR
     (:COMMENT NIL
      " The reason for using \\funref{cerror} is to signal a \\term{condition},"
      " the exact nature of which is specified by the arguments.")
     :PAR
     (:COMMENT NIL "!!! Was this saying anything useful??? -kmp 3-Sep-91"
      " An error \\oftype{type-error} is signaled if the \\term{condition} "
      " named by \\param{datum} is not handled.")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "error") ", "
     (:FUNREF NIL "format") ", " (:MACREF NIL "handler-bind") ", "
     (:VARREF NIL "*break-on-signals*") ", " (:TYPEREF NIL "simple-type-error")
     " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "If " (:PARAM NIL "datum") " is a "
     (:TERM NIL "condition") " " (:TERM NIL "type") " rather than a "
     (:TERM NIL "string") ", the " (:FUNREF NIL "format") " directive "
     (:TT NIL "  *") " may be especially useful in the "
     (:PARAM NIL "continue-format-control") " in order to ignore the "
     (:TERM NIL "keywords") " in the "
     (:TERM NIL "initialization argument list") ". For example: " :PAR
     (:CODE NIL "(cerror \"enter a new value to replace ~*~s\" 
        'not-a-number
        :argument a)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== CHECK-TYPE")
   (:COM (:NAME "check-type" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "check-type")
      (:ARGLIST NIL "place typespec " (:BRAC NIL (:PARAM NIL "string")))
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "place") "—a "
     (:TERM NIL "place") ". " :PAR (:PARAM NIL "typespec") "—a "
     (:TERM NIL "type specifier") ". " :PAR (:PARAM NIL "string") "—a "
     (:TERM NIL "string") "; evaluated. " (:COMMENT NIL "!!! Really??") :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "check-type")
     " signals a " (:TERM NIL "correctable") " " (:TERM NIL "error") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error") " if the contents of "
     (:PARAM NIL "place") " are not of the type " (:PARAM NIL "typespec") ". "
     :PAR (:MACREF NIL "check-type") " can return only if the "
     (:MISC NIL "store-value") " " (:TERM NIL "restart")
     " is invoked, either explicitly from a handler or implicitly as one of the options offered by the debugger. If the "
     (:MISC NIL "store-value") " " (:TERM NIL "restart") " is invoked, "
     (:MACREF NIL "check-type")
     " stores the new value that is the argument to the " (:TERM NIL "restart")
     " invocation (or that is prompted for interactively by the debugger) in "
     (:PARAM NIL "place")
     " and starts over, checking the type of the new value and signaling another error if it is still not of the desired "
     (:TERM NIL "type") ". " :PAR
     (:COMMENT NIL " This used to say:"
      "   The \\term{subforms} of \\param{place} are evaluated once in the "
      "   order specified as follows: ..."
      " Barmar said this is wrong. The first time the PLACE is evaluated, it is"
      " evaluated using normal evaluation.  It is only evaluated as a SETF place if"
      " the type check fails and \\therestart{store-value} is used."
      " Barrett concurs.  Rewritten...")
     :PAR "The first time " (:PARAM NIL "place") " is " (:TERM NIL "evaluated")
     ", it is " (:TERM NIL "evaluated")
     " by normal evaluation rules. It is later " (:TERM NIL "evaluated")
     " as a " (:TERM NIL "place") " if the type check fails and the "
     (:MISC NIL "store-value") " " (:TERM NIL "restart") " is used; see "
     (:SECREF NIL :GEN-REF-SUB-FORM-EVAL) ". " :PAR
     (:COMMENT NIL
      "% I think this is now unnecessary due to the previous paragraph. -kmp 21-Nov-91"
      " The \\param{place} and its \\term{subforms} might be evaluated again if"
      " the type check fails.")
     :PAR (:TERM NIL "string")
     " should be an English description of the type, starting with an indefinite article (“a” or “an”). If "
     (:TERM NIL "string")
     " is not supplied, it is computed automatically from "
     (:PARAM NIL "typespec") ". The automatically generated message mentions "
     (:PARAM NIL "place")
     ", its contents, and the desired type. An implementation may choose to generate a somewhat differently worded error message if it recognizes that "
     (:PARAM NIL "place")
     " is of a particular form, such as one of the arguments to the function that called "
     (:MACREF NIL "check-type") ". " (:TERM NIL "string")
     " is allowed because some applications of " (:MACREF NIL "check-type")
     " may require a more specific description of what is wanted than can be generated automatically from "
     (:PARAM NIL "typespec") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq aardvarks '(sam harry fred))
→ (SAM HARRY FRED)
 (check-type aardvarks (array * (3)))
⊳ Error: The value of AARDVARKS, (SAM HARRY FRED),
⊳        is not a 3-long array.
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Specify a value to use instead.
⊳  2: Return to Lisp Toplevel.
⊳ Debug> "
      (:IN NIL ":CONTINUE 1") "
⊳ Use Value: "
      (:IN NIL "#(SAM FRED HARRY)") "
→ NIL
 aardvarks
→ #<ARRAY-T-3 13571>
 (map 'list #'identity aardvarks)
→ (SAM FRED HARRY)
 (setq aardvark-count 'foo)
→ FOO
 (check-type aardvark-count (integer 0 *) \"A positive integer\")
⊳ Error: The value of AARDVARK-COUNT, FOO, is not a positive integer.
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Specify a value to use instead.
⊳  2: Top level.
⊳ Debug> "
      (:IN NIL ":CONTINUE 2") "
")
     " " :PAR
     (:CODE NIL " (defmacro define-adder (name amount)
   (check-type name (and symbol (not null)) \"a name for an adder function\")
   (check-type amount integer)
   `(defun ,name (x) (+ x ,amount)))
  
 (macroexpand '(define-adder add3 3))
→ (defun add3 (x) (+ x 3))
 
 (macroexpand '(define-adder 7 7))
⊳ Error: The value of NAME, 7, is not a name for an adder function.
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Specify a value to use instead.
⊳  2: Top level.
⊳ Debug> "
      (:IN NIL ":Continue 1") "
⊳ Specify a value to use instead.
⊳ Type a form to be evaluated and used instead: "
      (:IN NIL "'ADD7") "
→ (defun add7 (x) (+ x 7))
 
 (macroexpand '(define-adder add5 something))
⊳ Error: The value of AMOUNT, SOMETHING, is not an integer.
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Specify a value to use instead.
⊳  2: Top level.
⊳ Debug> "
      (:IN NIL ":Continue 1") "
⊳ Type a form to be evaluated and used instead: "
      (:IN NIL "5") "
→ (defun add5 (x) (+ x 5))
 
")
     " " :PAR "Control is transferred to a handler. " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The debugger might be entered. "
     :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*break-on-signals*")
     " " (:COMMENT NIL "\\varref{*debug-io*}") :PAR "The implementation. "
     :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR
     (:COMMENT NIL "% Barrett: Not exceptional."
      " An error \\oftype{type-error} is signaled "
      " if the contents of \\param{place} are not "
      " of the \\term{type} specified by \\param{typespec}.")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :CONDITION-SYSTEM-CONCEPTS)
     " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (check-type " (:PARAM NIL "place") " "
      (:PARAM NIL "typespec") ")
 ≡ (assert (typep "
      (:PARAM NIL "place") " '" (:PARAM NIL "typespec") ") ("
      (:PARAM NIL "place") ")
            'type-error :datum "
      (:PARAM NIL "place") " :expected-type '" (:PARAM NIL "typespec") ")
")
     " " :PAR))
   " " :PAR
   (:COM (:NAME "simple-error" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " " :PAR
     (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     (:TYPEREF NIL "simple-error") ", " (:TYPEREF NIL "simple-condition") ", "
     (:TYPEREF NIL "error") ", " (:TYPEREF NIL "serious-condition") ", "
     (:TYPEREF NIL "condition") ", " (:TYPEREF NIL "t") " "
     (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "simple-error") " consists of " (:TERM NIL "conditions")
     " that are signaled by " (:FUNREF NIL "error") " or "
     (:FUNREF NIL "cerror") " when a "
     (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY")
     (:TERM NIL "format control") " "
     (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY")
     "is supplied as the function's first argument. "
     (:COMMENT NIL "The default condition type for \\funref{error} and "
      "\\funref{cerror} is \\typeref{simple-error}.")
     :PAR))
   :PAR (:COMMENT NIL "%% ========== INVALID-METHOD-ERROR")
   (:COM (:NAME "invalid-method-error" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "invalid-method-error")
      (:ARGLIST NIL "method format-control " (:KEYWORD NIL " &rest") " args")
      (:VALUES NIL (:TERM NIL "implementation-dependent")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "method") "—a "
     (:TERM NIL "method") ". " :PAR
     (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
     (:PARAM NIL "format-control") "—a " (:TERM NIL "format control") ". "
     (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR
     (:PARAM NIL "args") "—" (:TERM NIL "format arguments") " for the "
     (:PARAM NIL "format-control") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "invalid-method-error") " is used to signal an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error")
     " when there is an applicable " (:TERM NIL "method") " whose "
     (:TERM NIL "qualifiers")
     " are not valid for the method combination type. The error message is constructed by using the "
     (:PARAM NIL "format-control") " suitable for " (:FUNREF NIL "format")
     " and any " (:PARAM NIL "args")
     " to it. Because an implementation may need to add additional contextual information to the error message, "
     (:FUNREF NIL "invalid-method-error")
     " should be called only within the dynamic extent of a method combination function. "
     :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "invalid-method-error") " is called automatically when a "
     (:TERM NIL "method") " fails to satisfy every " (:TERM NIL "qualifier")
     " pattern and predicate in a " (:MACREF NIL "define-method-combination")
     " " (:TERM NIL "form")
     ". A method combination function that imposes additional restrictions should call "
     (:FUNREF NIL "invalid-method-error") " explicitly if it encounters a "
     (:TERM NIL "method") " it cannot accept. " :PAR
     (:COMMENT NIL "!!! What does this mean? -kmp 13-Feb-91") "Whether "
     (:FUNREF NIL "invalid-method-error")
     " returns to its caller or exits via " (:SPECREF NIL "throw") " is "
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The debugger might be entered. "
     :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*break-on-signals*")
     " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:MACREF NIL "define-method-combination") " " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== METHOD-COMBINATION-ERROR")
   (:COM (:NAME "method-combination-error" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "method-combination-error")
      (:ARGLIST NIL "format-control " (:KEYWORD NIL " &rest") " args")
      (:VALUES NIL (:TERM NIL "implementation-dependent")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
     (:PARAM NIL "format-control") "—a " (:TERM NIL "format control") ". "
     (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR
     (:PARAM NIL "args") "—" (:TERM NIL "format arguments") " for "
     (:PARAM NIL "format-control") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "method-combination-error")
     " is used to signal an error in method combination. " :PAR
     "The error message is constructed by using a "
     (:PARAM NIL "format-control") " suitable for " (:FUNREF NIL "format")
     " and any " (:PARAM NIL "args")
     " to it. Because an implementation may need to add additional contextual information to the error message, "
     (:FUNREF NIL "method-combination-error")
     " should be called only within the dynamic extent of a method combination function. "
     :PAR (:COMMENT NIL "!!! What does this mean? -kmp 13-Feb-91") "Whether "
     (:FUNREF NIL "method-combination-error")
     " returns to its caller or exits via " (:SPECREF NIL "throw") " is "
     (:TERM NIL "implementation-dependent") ". " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The debugger might be entered. "
     :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*break-on-signals*")
     " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:MACREF NIL "define-method-combination") " " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SIGNAL")
   (:COM (:NAME "signal" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "signal")
      (:ARGLIST NIL "datum " (:KEYWORD NIL " &rest") " arguments")
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "datum") ", "
     (:PARAM NIL "arguments") "—" (:TERM NIL "designators") " for a "
     (:TERM NIL "condition") " of default type "
     (:TYPEREF NIL "simple-condition") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:TERM NIL "Signals") " the "
     (:TERM NIL "condition") " denoted by the given " (:PARAM NIL "datum")
     " and " (:PARAM NIL "arguments") ". If the " (:TERM NIL "condition")
     " is not handled, " (:FUNREF NIL "signal") " returns " (:MISC NIL "nil")
     ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun handle-division-conditions (condition)
   (format t \"Considering condition for division condition handling~%\")
   (when (and (typep condition 'arithmetic-error)
              (eq '/ (arithmetic-error-operation condition)))
     (invoke-debugger condition)))
HANDLE-DIVISION-CONDITIONS
 (defun handle-other-arithmetic-errors (condition)
   (format t \"Considering condition for arithmetic condition handling~%\")
   (when (typep condition 'arithmetic-error)
     (abort)))
HANDLE-OTHER-ARITHMETIC-ERRORS
 (define-condition a-condition-with-no-handler (condition) ())
A-CONDITION-WITH-NO-HANDLER
 (signal 'a-condition-with-no-handler)
NIL
 (handler-bind ((condition #'handle-division-conditions)
                  (condition #'handle-other-arithmetic-errors))
   (signal 'a-condition-with-no-handler))
Considering condition for division condition handling
Considering condition for arithmetic condition handling
NIL
 (handler-bind ((arithmetic-error #'handle-division-conditions)
                  (arithmetic-error #'handle-other-arithmetic-errors))
   (signal 'arithmetic-error :operation '* :operands '(1.2 b)))
Considering condition for division condition handling
Considering condition for arithmetic condition handling
Back to Lisp Toplevel
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR
     "The debugger might be entered due to " (:VARREF NIL "*break-on-signals*")
     ". " :PAR
     "Handlers for the condition being signaled might transfer control. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "Existing handler bindings. " :PAR
     (:VARREF NIL "*break-on-signals*") " "
     (:COMMENT NIL "\\varref{*debug-io*}") :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:VARREF NIL "*break-on-signals*") ", "
     (:FUNREF NIL "error") ", " (:TYPEREF NIL "simple-condition") ", "
     (:SECREF NIL :COND-SIGNAL-HANDLE) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "If "
     (:TT NIL "(typep " (:PARAM NIL "datum") " *break-on-signals*)") " "
     (:TERM NIL "yields") " " (:TERM NIL "true")
     ", the debugger is entered prior to beginning the signaling process. The "
     (:MISC NIL "continue") " " (:TERM NIL "restart")
     " can be used to continue with the signaling process. This is also true for all other "
     (:TERM NIL "functions") " and " (:TERM NIL "macros")
     " that should, might, or must " (:TERM NIL "signal") " "
     (:TERM NIL "conditions") ". " :PAR))
   " " :PAR (:COMMENT NIL "----------------------------------------") :PAR
   (:COM (:NAME "simple-condition" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " "
     (:TYPEREF NIL "simple-condition") ", " (:TYPEREF NIL "condition") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "simple-condition") " represents " (:TERM NIL "conditions")
     " that are signaled by " (:FUNREF NIL "signal") " whenever a "
     (:PARAM NIL "format-control")
     " is supplied as the function's first argument. "
     (:COMMENT NIL
      "The default \\term{condition} \\term{type} for \\funref{signal} "
      "and \\funref{warn} is \\typeref{simple-condition}.")
     (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " The "
     (:TERM NIL "format control") " and " (:TERM NIL "format arguments")
     " are initialized with the initialization arguments named "
     (:KWD NIL "format-control") " "
     (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " and "
     (:KWD NIL "format-arguments") " to " (:FUNREF NIL "make-condition")
     ", and are " (:TERM NIL "accessed") " by the " (:TERM NIL "functions") " "
     (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
     (:FUNREF NIL "simple-condition-format-control") " "
     (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " and "
     (:FUNREF NIL "simple-condition-format-arguments")
     ". If format arguments are not supplied to "
     (:FUNREF NIL "make-condition") ", " (:MISC NIL "nil")
     " is used as a default. " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
     (:FUNREF NIL "simple-condition-format-control") ", "
     (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
     (:FUNREF NIL "simple-condition-format-arguments") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== SIMPLE-CONDITION-FORMAT-ARGUMENTS")
   (:COM
    (:NAME "simple-condition-format-control, simple-condition-format-arguments"
     :FTYPE "Function")
    (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "simple-condition-format-control")
      (:ARGLIST NIL "condition") (:VALUES NIL "format-control"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "simple-condition-format-arguments")
      (:ARGLIST NIL "condition") (:VALUES NIL "format-arguments"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "condition")
     "—a " (:TERM NIL "condition") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "simple-condition") ". "
     (:COMMENT NIL "% Barmar: These are all subtypes of simple-condition..."
      " 				    or \\typeref{simple-warning}"
      " 				    or \\typeref{simple-error}"
      " 				    or \\typeref{simple-type-error}.")
     :PAR (:PARAM NIL "format-control") "—a " (:TERM NIL "format control") ". "
     :PAR (:PARAM NIL "format-arguments") "—a " (:TERM NIL "list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:FUNREF NIL "simple-condition-format-control") " returns the "
     (:TERM NIL "format control") " needed to process the "
     (:PARAM NIL "condition") "'s " (:TERM NIL "format arguments") ". " :PAR
     (:FUNREF NIL "simple-condition-format-arguments") " returns a "
     (:TERM NIL "list") " of " (:TERM NIL "format arguments")
     " needed to process the " (:PARAM NIL "condition") "'s "
     (:TERM NIL "format control") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq foo (make-condition 'simple-condition
                          :format-control \"Hi ~S\"
                          :format-arguments '(ho)))
→ #<SIMPLE-CONDITION 26223553>
 (apply #'format nil (simple-condition-format-control foo)
                     (simple-condition-format-arguments foo))
→ \"Hi HO\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:TYPEREF NIL "simple-condition") ", "
     (:SECREF NIL :CONDITION-SYSTEM-CONCEPTS) " " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL "% Shouldn't be needed. -kmp 1-Sep-91"
      "It is an error to use \\macref{setf} with \\funref{simple-condition-format-arguments}."
      "It is an error to use \\macref{setf} with \\funref{simple-condition-format-control}.")
     :PAR (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== WARN")
   (:COM (:NAME "warn" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "warn")
      (:ARGLIST NIL "datum " (:KEYWORD NIL " &rest") " arguments")
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "datum") ", "
     (:PARAM NIL "arguments") "—" (:TERM NIL "designators") " for a "
     (:TERM NIL "condition") " of default type "
     (:TYPEREF NIL "simple-warning") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:TERM NIL "Signals") " a "
     (:TERM NIL "condition") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "warning") ". If the " (:TERM NIL "condition") " is not "
     (:TERM NIL "handled") ", reports the " (:TERM NIL "condition") " to "
     (:TERM NIL "error output") ". " :PAR
     "The precise mechanism for warning is as follows: " :PAR
     (:ISSUE NIL "BREAK-ON-WARNINGS-OBSOLETE:REMOVE") " "
     (:COMMENT NIL "Discussion of *BREAK-ON-WARNINGS* removed.")
     (:ENDISSUE NIL "BREAK-ON-WARNINGS-OBSOLETE:REMOVE") " " :PAR
     (:COMMENT NIL
      "!!! Barret wonders whether stylistically it wouldn't be better to have just"
      "    normal text instead of this indented stuff.")
     (:LIST NIL
      (:ITEM NIL (:B NIL " The warning condition is signaled") " " :PAR
       "While the " (:TYPEREF NIL "warning") " " (:TERM NIL "condition")
       " is being signaled, the " (:MISC NIL "muffle-warning") " "
       (:TERM NIL "restart") " is established for use by a "
       (:TERM NIL "handler") ". If invoked, this " (:TERM NIL "restart")
       " bypasses further action by " (:FUNREF NIL "warn")
       ", which in turn causes " (:FUNREF NIL "warn") " to immediately return "
       (:MISC NIL "nil") ". " :PAR)
      (:ITEM NIL (:B NIL " If no handler for the warning condition is found")
       " " :PAR
       "If no handlers for the warning condition are found, or if all such handlers decline, then the "
       (:TERM NIL "condition") " is reported to " (:TERM NIL "error output")
       " by " (:FUNREF NIL "warn") " in an "
       (:TERM NIL "implementation-dependent") " format. "
       (:COMMENT NIL
        "% Barrett points out that the details of this are already said elsewhere in"
        "% the concept info for conditions."
        " (with possible implementation-specific extra"
        " output such as motion to a fresh line before and/or after the display"
        " of the warning, or supplying some introductory text that might mention"
        " the name of the function which called \\funref{warn} "
        " and/or the fact that this is a warning).")
       :PAR)
      (:ITEM NIL (:B NIL " " (:MISC NIL "nil") " is returned") " " :PAR
       "The value returned by " (:FUNREF NIL "warn") " if it returns is "
       (:MISC NIL "nil") ". "))
     " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL "  (defun foo (x)
    (let ((result (* x 2)))
      (if (not (typep result 'fixnum))
          (warn \"You're using very big numbers.\"))
      result))
→ FOO
 
  (foo 3)
→ 6
 
  (foo most-positive-fixnum)
⊳ Warning: You're using very big numbers.
→ 4294967294
 
  (setq *break-on-signals* t)
→ T
 
  (foo most-positive-fixnum)
⊳ Break: Caveat emptor.
⊳ To continue, type :CONTINUE followed by an option number.
⊳  1: Return from Break.
⊳  2: Abort to Lisp Toplevel.
⊳ Debug> :continue 1
⊳ Warning: You're using very big numbers.
→ 4294967294
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR
     "A warning is issued. The debugger might be entered. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "Existing handler bindings. " :PAR
     (:VARREF NIL "*break-on-signals*") ", " (:VARREF NIL "*error-output*")
     ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If " (:PARAM NIL "datum")
     " is a " (:TERM NIL "condition") " and if the " (:TERM NIL "condition")
     " is not of " (:TERM NIL "type") " " (:TYPEREF NIL "warning") ", or "
     (:PARAM NIL "arguments") " is " (:TERM NIL "non-nil") ", an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error") " is signaled. " :PAR
     "If " (:PARAM NIL "datum") " is a condition type, the result of "
     (:TT NIL " (apply #'make-condition datum arguments)") " must be of "
     (:TERM NIL "type") " " (:TYPEREF NIL "warning") " or an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error") " is signaled. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:VARREF NIL "*break-on-signals*") ", "
     (:FUNREF NIL "muffle-warning") ", " (:FUNREF NIL "signal") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COM (:NAME "simple-warning" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " " :PAR
     (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     (:TYPEREF NIL "simple-warning") ", " (:TYPEREF NIL "simple-condition")
     ", " (:TYPEREF NIL "warning") ", " (:TYPEREF NIL "condition") ", "
     (:TYPEREF NIL "t") " "
     (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "simple-warning") " represents " (:TERM NIL "conditions")
     " that are signaled by " (:FUNREF NIL "warn") " whenever a "
     (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
     (:TERM NIL "format control") " "
     (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY")
     " is supplied as the function's first argument. " :PAR))
   :PAR (:COMMENT NIL "-------------------- Debugger --------------------")
   :PAR (:COMMENT NIL "%% ========== INVOKE-DEBUGGER")
   (:COM (:NAME "invoke-debugger" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function" :NO-RETURN T) (:NAMES NIL "invoke-debugger")
      (:ARGLIST NIL "condition"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "condition")
     "—a " (:TERM NIL "condition") " " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "invoke-debugger")
     " attempts to enter the debugger with " (:PARAM NIL "condition") ". " :PAR
     "If " (:VARREF NIL "*debugger-hook*") " is not " (:MISC NIL "nil")
     ", it should be a " (:TERM NIL "function") " (or the name of a "
     (:TERM NIL "function")
     ") to be called prior to entry to the standard debugger. The "
     (:TERM NIL "function") " is called with " (:VARREF NIL "*debugger-hook*")
     " bound to " (:MISC NIL "nil") ", and the " (:TERM NIL "function")
     " must accept two arguments: the " (:PARAM NIL "condition") " and the "
     (:TERM NIL "value") " of " (:VARREF NIL "*debugger-hook*")
     " prior to binding it to " (:MISC NIL "nil") ". If the "
     (:TERM NIL "function")
     " returns normally, the standard debugger is entered. " :PAR
     (:COMMENT NIL
      "!!! KMP: Maybe make glossary term of \"standard debugger\"?")
     "The standard debugger never directly returns. Return can occur only by a non-local transfer of control, such as the use of a restart function. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (ignore-errors ;Normally, this would suppress debugger entry
   (handler-bind ((error #'invoke-debugger)) ;But this forces debugger entry
     (error \"Foo.\")))
Debug: Foo.
To continue, type :CONTINUE followed by an option number:
 1: Return to Lisp Toplevel.
Debug>
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR (:VARREF NIL "*debugger-hook*")
     " is bound to " (:MISC NIL "nil")
     ", program execution is discontinued, and the debugger is entered. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*debug-io*") " and "
     (:VARREF NIL "*debugger-hook*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "error") ", "
     (:FUNREF NIL "break") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== BREAK")
   (:COM (:NAME "break" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "break")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " format-control "
       (:KEYWORD NIL " &rest") " format-arguments")
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
     (:PARAM NIL "format-control") "—a " (:TERM NIL "format control") ". "
     (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " The default is "
     (:TERM NIL "implementation-dependent") ". " :PAR
     (:PARAM NIL "format-arguments") "—" (:TERM NIL "format arguments")
     " for the " (:PARAM NIL "format-control") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 24.0.0 29") :PAR
     (:FUNREF NIL "break") " " (:TERM NIL "formats") " "
     (:PARAM NIL "format-control") " and " (:PARAM NIL "format-arguments")
     " and then goes directly into the debugger without allowing any possibility of interception by programmed error-handling facilities. "
     :PAR "If the " (:MISC NIL "continue") " " (:TERM NIL "restart")
     " is used while in the debugger, " (:FUNREF NIL "break")
     " immediately returns " (:MISC NIL "nil")
     " without taking any unusual recovery action. " :PAR
     (:ISSUE NIL "DEBUGGER-HOOK-VS-BREAK:CLARIFY") " " (:FUNREF NIL "break")
     " binds " (:VARREF NIL "*debugger-hook*") " to " (:MISC NIL "nil")
     " before attempting to enter the debugger. "
     (:ENDISSUE NIL "DEBUGGER-HOOK-VS-BREAK:CLARIFY") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (break \"You got here with arguments: ~:S.\" '(FOO 37 A))
⊳ BREAK: You got here with these arguments: FOO, 37, A.
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Return from BREAK.
⊳  2: Top level.
⊳ Debug> :CONTINUE 1
⊳ Return from BREAK.
→ NIL
 
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The debugger is entered. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*debug-io*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "error") ", "
     (:FUNREF NIL "invoke-debugger") ". " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 24.0.0 30")
     (:FUNREF NIL "break")
     " is used as a way of inserting temporary debugging “breakpoints” in a program, not as a way of signaling errors. For this reason, "
     (:FUNREF NIL "break") " does not take the "
     (:PARAM NIL "continue-format-control") " " (:TERM NIL "argument") " that "
     (:FUNREF NIL "cerror")
     " takes. This and the lack of any possibility of interception by "
     (:TERM NIL "condition") " " (:TERM NIL "handling")
     " are the only program-visible differences between " (:FUNREF NIL "break")
     " and " (:FUNREF NIL "cerror") ". " :PAR "The user interface aspects of "
     (:FUNREF NIL "break") " and " (:FUNREF NIL "cerror")
     " are permitted to vary more widely, in order to accomodate the interface needs of the "
     (:TERM NIL "implementation") ". For example, it is permissible for a "
     (:TERM NIL "Lisp read-eval-print loop") " to be entered by "
     (:FUNREF NIL "break") " rather than the conventional debugger. " :PAR
     (:FUNREF NIL "break") " could be defined by: " :PAR
     (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
     (:CODE NIL
      " (defun break (&optional (format-control \"Break\") &rest format-arguments)
   (with-simple-restart (continue \"Return from BREAK.\")
     (let ((*debugger-hook* nil))
       (invoke-debugger
           (make-condition 'simple-condition
                           :format-control format-control
                           :format-arguments format-arguments))))
   nil)
")
     " " (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *DEBUGGER-HOOK*")
   (:COM (:NAME "*debugger-hook*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR
     (:COMMENT NIL
      "!!! Barrett: What if this is invoked directly instead of from invoke-debugger?")
     "a " (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " (a " (:TERM NIL "condition") " and the "
     (:TERM NIL "value") " of " (:VARREF NIL "*debugger-hook*")
     " at the time the debugger was entered), or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "When the " (:TERM NIL "value")
     " of " (:VARREF NIL "*debugger-hook*") " is " (:TERM NIL "non-nil")
     ", it is called prior to normal entry into the debugger, either due to a call to "
     (:FUNREF NIL "invoke-debugger")
     " or due to automatic entry into the debugger from a call to "
     (:FUNREF NIL "error") " or " (:FUNREF NIL "cerror")
     " with a condition that is not handled. The " (:TERM NIL "function")
     " may either handle the " (:TERM NIL "condition")
     " (transfer control) or return normally (allowing the standard debugger to run). To minimize recursive errors while debugging, "
     (:VARREF NIL "*debugger-hook*") " is bound to " (:MISC NIL "nil") " by "
     (:FUNREF NIL "invoke-debugger") " prior to calling the "
     (:TERM NIL "function") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun one-of (choices &optional (prompt \"Choice\"))
   (let ((n (length choices)) (i))
     (do ((c choices (cdr c)) (i 1 (+ i 1)))
         ((null c))
       (format t \"~&[~D] ~A~%\" i (car c)))
     (do () ((typep i `(integer 1 ,n)))
       (format t \"~&~A: \" prompt)
       (setq i (read))
       (fresh-line))
     (nth (- i 1) choices)))

 (defun my-debugger (condition me-or-my-encapsulation)
   (format t \"~&Fooey: ~A\" condition)
   (let ((restart (one-of (compute-restarts))))
     (if (not restart) (error \"My debugger got an error.\"))
     (let ((*debugger-hook* me-or-my-encapsulation))
       (invoke-restart-interactively restart))))
 
 (let ((*debugger-hook* #'my-debugger))
   (+ 3 'a))
⊳ Fooey: The argument to +, A, is not a number.
⊳  [1] Supply a replacement for A.
⊳  [2] Return to Cloe Toplevel.
⊳ Choice: 1
⊳  Form to evaluate and use: (+ 5 'b)
⊳  Fooey: The argument to +, B, is not a number.
⊳  [1] Supply a replacement for B.
⊳  [2] Supply a replacement for A.
⊳  [3] Return to Cloe Toplevel.
⊳ Choice: 1
⊳  Form to evaluate and use: 1
→ 9
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:FUNREF NIL "invoke-debugger") " "
     :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "When evaluating code typed in by the user interactively, it is sometimes useful to have the hook function bind "
     (:VARREF NIL "*debugger-hook*") " to the " (:TERM NIL "function")
     " that was its second argument so that recursive errors can be handled using the same interactive facility. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *BREAK-ON-SIGNALS*")
   (:COM (:NAME "*break-on-signals*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "type specifier") ". "
     :PAR)
    (:PART (:NAME "Initial Value") " " :PAR (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL
      "!!! Does this get involved in *debugger-hook*?  What kind of break is entered?")
     "When " (:TT NIL "(typep " (:I NIL "condition") " *break-on-signals*)")
     " returns " (:TERM NIL "true") ", calls to " (:FUNREF NIL "signal")
     ", and to other " (:TERM NIL "operators") " such as "
     (:FUNREF NIL "error") " that implicitly call " (:FUNREF NIL "signal")
     ", enter the debugger prior to " (:TERM NIL "signaling") " the "
     (:TERM NIL "condition") ". " :PAR "The " (:MISC NIL "continue") " "
     (:TERM NIL "restart") " can be used to continue with the normal "
     (:TERM NIL "signaling") " process when a break occurs process due to "
     (:VARREF NIL "*break-on-signals*") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
     (:CODE NIL " *break-on-signals* → NIL
 (ignore-errors (error 'simple-error :format-control \"Fooey!\"))
→ NIL, #<SIMPLE-ERROR 32207172>

 (let ((*break-on-signals* 'error))
   (ignore-errors (error 'simple-error :format-control \"Fooey!\")))
⊳ Break: Fooey!
⊳ BREAK entered because of *BREAK-ON-SIGNALS*.
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Continue to signal.
⊳  2: Top level.
⊳ Debug> "
      (:IN NIL ":CONTINUE 1") "
⊳ Continue to signal.
→ NIL, #<SIMPLE-ERROR 32212257>

 (let ((*break-on-signals* 'error))
   (error 'simple-error :format-control \"Fooey!\"))
⊳ Break: Fooey!
⊳ BREAK entered because of *BREAK-ON-SIGNALS*.
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Continue to signal.
⊳  2: Top level.
⊳ Debug> "
      (:IN NIL ":CONTINUE 1") "
⊳ Continue to signal.
⊳ Error: Fooey!
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Top level.
⊳ Debug> "
      (:IN NIL ":CONTINUE 1") "
⊳ Top level.
")
     " " (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "break") ", "
     (:FUNREF NIL "signal") ", " (:FUNREF NIL "warn") ", "
     (:FUNREF NIL "error") ", " (:FUNREF NIL "typep") ", "
     (:SECREF NIL :CONDITION-SYSTEM-CONCEPTS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:VARREF NIL "*break-on-signals*")
     " is intended primarily for use in debugging code that does signaling. When setting "
     (:VARREF NIL "*break-on-signals*")
     ", the user is encouraged to choose the most restrictive specification that suffices. Setting "
     (:VARREF NIL "*break-on-signals*")
     " effectively violates the modular handling of " (:TERM NIL "condition")
     " signaling. In practice, the complete effect of setting "
     (:VARREF NIL "*break-on-signals*")
     " might be unpredictable in some cases since the user might not be aware of the variety or number of calls to "
     (:FUNREF NIL "signal") " that are used in code called only incidentally. "
     :PAR (:ISSUE NIL "BREAK-ON-WARNINGS-OBSOLETE:REMOVE") " "
     (:COMMENT NIL " Reference to *BREAK-ON-WARNINGS* removed.")
     (:ENDISSUE NIL "BREAK-ON-WARNINGS-OBSOLETE:REMOVE") " " :PAR
     (:VARREF NIL "*break-on-signals*")
     " enables an early entry to the debugger but such an entry does not preclude an additional entry to the debugger in the case of operations such as "
     (:FUNREF NIL "error") " and " (:FUNREF NIL "cerror") ". " :PAR))
   " " :PAR (:COMMENT NIL "-------------------- Handling --------------------")
   :PAR (:COMMENT NIL "%% ========== HANDLER-BIND")
   (:COM (:NAME "handler-bind" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "handler-bind")
      (:ARGLIST NIL (:PAREN NIL (:STAR NIL (:CURLY NIL (:DOWN NIL "binding"))))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR (:BNF (:NAME "binding") (:PAREN NIL "type handler")) " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "type") "—a "
     (:TERM NIL "type specifier") ". " :PAR (:PARAM NIL "handler") "—a "
     (:TERM NIL "form") "; evaluated to produce a "
     (:PARAM NIL "handler-function") ". " :PAR (:PARAM NIL "handler-function")
     "—a " (:TERM NIL "designator") " for a " (:TERM NIL "function") " of one "
     (:TERM NIL "argument") ". " :PAR (:PARAM NIL "forms") "—an "
     (:TERM NIL "implicit progn") ". " :PAR (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " returned by the " (:TERM NIL "forms") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Executes " (:PARAM NIL "forms")
     " in a " (:TERM NIL "dynamic environment") " where the indicated "
     (:PARAM NIL "handler") " " (:TERM NIL "bindings") " are in effect. " :PAR
     "Each " (:PARAM NIL "handler") " should evaluate to a "
     (:PARAM NIL "handler-function") ", which is used to handle "
     (:TERM NIL "conditions") " of the given " (:PARAM NIL "type")
     " during execution of the " (:PARAM NIL "forms") ". This "
     (:TERM NIL "function") " should take a single argument, the "
     (:TERM NIL "condition") " being signaled. " :PAR
     (:COMMENT NIL
      "!!! Barmar: The next two paragraphs belong in description of signaling,"
      "      not handling. [I agree. -kmp]")
     "If more than one " (:PARAM NIL "handler") " " (:TERM NIL "binding")
     " is supplied, the " (:PARAM NIL "handler") " " (:TERM NIL "bindings")
     " are searched sequentially from top to bottom in search of a match (by visual analogy with "
     (:MACREF NIL "typecase") "). If an appropriate " (:TERM NIL "type")
     " is found, the associated handler is run in a "
     (:TERM NIL "dynamic environment") " where none of these "
     (:PARAM NIL "handler")
     " bindings are visible (to avoid recursive errors). If the "
     (:TERM NIL "handler") " " (:TERM NIL "declines")
     ", the search continues for another " (:TERM NIL "handler") ". " :PAR
     "If no appropriate " (:TERM NIL "handler") " is found, other "
     (:TERM NIL "handlers")
     " are sought from dynamically enclosing contours. If no "
     (:TERM NIL "handler") " is found outside, then " (:FUNREF NIL "signal")
     " returns or " (:FUNREF NIL "error") " enters the debugger. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:COMMENT NIL
      "Here's an example to think about as a possible replacement for the next"
      "couple of paragraphs..." " (defun test (x)"
      "   (handler-bind ((unbound-variable #'(lambda (c) (use-value 'unbound c)))"
      "                  (undefined-function "
      "                    #'(lambda (c) "
      "                        (use-value #'(lambda (&rest x) (cons (cell-error-name c) x)) c))))"
      "     (eval x)))" " (test '(frob (+ 1 2) hunoz))")
     :PAR
     "In the following code, if an unbound variable error is signaled in the body (and not handled by an intervening handler), the first function is called. "
     :PAR
     (:CODE NIL " (handler-bind ((unbound-variable #'(lambda ...))
                (error #'(lambda ...)))
   ...)
")
     " " :PAR
     "If any other kind of error is signaled, the second function is called. In either case, neither handler is active while executing the code in the associated function. "
     :PAR
     (:CODE NIL " (defun trap-error-handler (condition)
   (format *error-output* \"~&~A~&\" condition)
   (throw 'trap-errors nil))

 (defmacro trap-errors (&rest forms)
   `(catch 'trap-errors
      (handler-bind ((error #'trap-error-handler))
        ,@forms)))
 
 (list (trap-errors (signal \"Foo.\") 1)
       (trap-errors (error  \"Bar.\") 2)
       (+ 1 2))
⊳ Bar.
→ (1 NIL 3)
")
     " " :PAR "Note that “Foo.” is not printed because the condition made by "
     (:FUNREF NIL "signal") " is a " (:TERM NIL "simple condition")
     ", which is not of " (:TERM NIL "type") " " (:TYPEREF NIL "error")
     ", so it doesn't trigger the handler for " (:TYPEREF NIL "error")
     " set up by " (:TT NIL "trap-errors") ". " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "handler-case") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== HANDLER-CASE")
   (:COM (:NAME "handler-case" :FTYPE "Macro") (:ISSUE NIL "DECLS-AND-DOC") " "
    :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:COMMENT NIL "!!! \"expression\" is a bad var name to use here.")
     (:DEF (:KIND "macro") (:NAMES NIL "handler-case")
      (:ARGLIST NIL (:PARAM NIL "expression") " "
       (:INTERLEAVE NIL (:STAR NIL (:CURLY NIL (:DOWN NIL "error-clause")))
        " | " (:DOWN NIL "no-error-clause")))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR
     (:BNF (:NAME "clause") (:DOWN NIL "error-clause") " | "
      (:DOWN NIL "no-error-clause"))
     " "
     (:BNF (:NAME "error-clause")
      (:PAREN NIL "typespec " (:PAREN NIL (:BRAC NIL "var")) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form")))))
     " "
     (:BNF (:NAME "no-error-clause")
      (:PAREN NIL (:KWD NIL "no-error") " " (:PARAM NIL "lambda-list") " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form")))))
     " " :PAR
     (:COMMENT NIL "This should follow from the above BNF."
      "Note: There can be no more than one \\i{no-error-clause}.")
     :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "expression")
     "—a " (:TERM NIL "form") ". " :PAR (:PARAM NIL "typespec") "—a "
     (:TERM NIL "type specifier") ". " :PAR (:PARAM NIL "var") "—a "
     (:TERM NIL "variable") " " (:TERM NIL "name") ". " :PAR
     (:PARAM NIL "lambda-list") "—an " (:TERM NIL "ordinary lambda list") ". "
     :PAR (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR (:PARAM NIL "form")
     "—a " (:TERM NIL "form") ". " :PAR (:PARAM NIL "results")
     "—In the normal situation, the values returned are those that result from the evaluation of "
     (:PARAM NIL "expression")
     "; in the exceptional situation when control is transferred to a "
     (:PARAM NIL "clause") ", the value of the last " (:PARAM NIL "form")
     " in that " (:PARAM NIL "clause") " is returned. " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "handler-case")
     " executes " (:PARAM NIL "expression") " in a "
     (:TERM NIL "dynamic environment")
     " where various handlers are active. Each " (:I NIL "error-clause")
     " specifies how to handle a " (:TERM NIL "condition")
     " matching the indicated " (:PARAM NIL "typespec") ". A "
     (:I NIL "no-error-clause")
     " allows the specification of a particular action if control returns normally. "
     :PAR
     (:COMMENT NIL
      "!!! It would be nice if this reference to (TYPEP ...) and all others"
      "    were rewritten in text fashion.")
     "If a " (:TERM NIL "condition")
     " is signaled for which there is an appropriate " (:I NIL "error-clause")
     " during the execution of " (:PARAM NIL "expression") " (" (:I NIL "i.e.")
     ",  one for which "
     (:TT NIL "(typep " (:TERM NIL "condition") " '" (:PARAM NIL "typespec")
      ")")
     " returns " (:TERM NIL "true")
     ") and if there is no intervening handler for a " (:TERM NIL "condition")
     " of that " (:TERM NIL "type")
     ", then control is transferred to the body of the relevant "
     (:I NIL "error-clause")
     ". In this case, the dynamic state is unwound appropriately (so that the handlers established around the "
     (:PARAM NIL "expression") " are no longer active), and "
     (:PARAM NIL "var") " is bound to the " (:TERM NIL "condition")
     " that had been signaled. "
     (:COMMENT NIL "!!! Barmar: HANDLER-BIND describes this better...")
     "If more than one case is provided, those cases are made accessible in parallel. That is, in "
     :PAR
     (:CODE NIL "  (handler-case " (:I NIL "form") "
    ("
      (:I NIL "typespec1") " (" (:I NIL "var1") ") " (:I NIL "form1") ")
    ("
      (:I NIL "typespec2") " (" (:I NIL "var2") ") " (:I NIL "form2") "))
")
     " " :PAR "if the first " (:I NIL "clause") " (containing "
     (:I NIL "form1")
     ") has been selected, the handler for the second is no longer visible (or vice versa). "
     :PAR "The " (:I NIL "clauses")
     " are searched sequentially from top to bottom. If there is "
     (:TERM NIL "type") " overlap between " (:PARAM NIL "typespecs")
     ", the earlier of the " (:I NIL "clauses") " is selected. " :PAR "If "
     (:PARAM NIL "var") " is not needed, it can be omitted. That is, a "
     (:I NIL "clause") " such as: " :PAR
     (:CODE NIL "  (" (:PARAM NIL "typespec") " (" (:PARAM NIL "var")
      ") (declare (ignore " (:PARAM NIL "var") ")) " (:PARAM NIL "form") ")
")
     " " :PAR "can be written "
     (:TT NIL "(" (:PARAM NIL "typespec") " () " (:PARAM NIL "form") ")") ". "
     :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"
      "% 3 uses of HANDLER-BIND to be replaced by HANDLER-CASE in last para on page.")
     "If there are no " (:PARAM NIL "forms") " in a selected "
     (:I NIL "clause") ", the case, and therefore "
     (:MACREF NIL "handler-case") ", returns " (:MISC NIL "nil")
     ". If execution of " (:PARAM NIL "expression") " returns normally and no "
     (:I NIL "no-error-clause") " exists, the values returned by "
     (:PARAM NIL "expression") " are returned by " (:MACREF NIL "handler-case")
     ". If execution of " (:PARAM NIL "expression") " returns normally and a "
     (:I NIL "no-error-clause")
     " does exist, the values returned are used as arguments to the function described by constructing "
     (:TT NIL "(lambda " (:PARAM NIL "lambda-list") " "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))) ")")
     " from the " (:I NIL "no-error-clause") ", and the " (:TERM NIL "values")
     " of that function call are returned by " (:MACREF NIL "handler-case")
     ". "
     (:COMMENT NIL
      "The following was added to make Barmar happy. -kmp 1-Sep-91")
     "The handlers which were established around the "
     (:PARAM NIL "expression")
     " are no longer active at the time of this call. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun assess-condition (condition)
   (handler-case (signal condition)
     (warning () \"Lots of smoke, but no fire.\")
     ((or arithmetic-error control-error cell-error stream-error)
        (condition)
       (format nil \"~S looks especially bad.\" condition))
     (serious-condition (condition)
       (format nil \"~S looks serious.\" condition))
     (condition () \"Hardly worth mentioning.\")))
→ ASSESS-CONDITION
 (assess-condition (make-condition 'stream-error :stream *terminal-io*))
→ \"#<STREAM-ERROR 12352256> looks especially bad.\"
 (define-condition random-condition (condition) () 
   (:report (lambda (condition stream)
              (declare (ignore condition))
              (princ \"Yow\" stream))))
→ RANDOM-CONDITION
 (assess-condition (make-condition 'random-condition))
→ \"Hardly worth mentioning.\"
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "handler-bind") ", "
     (:MACREF NIL "ignore-errors") ", "
     (:SECREF NIL :CONDITION-SYSTEM-CONCEPTS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (handler-case form
   ("
      (:I NIL "type1") " (" (:I NIL "var1") ") . " (:I NIL "body1") ")
   ("
      (:I NIL "type2") " (" (:I NIL "var2") ") . " (:I NIL "body2") ") ...)
")
     " is approximately equivalent to: " :PAR
     (:CODE NIL " (block #1=#:g0001
   (let ((#2=#:g0002 nil))
     (tagbody
       (handler-bind (("
      (:I NIL "type1") " #'(lambda (temp)
                                       (setq #2# temp)
                                       (go #3=#:g0003)))
                      ("
      (:I NIL "type2") " #'(lambda (temp)
                                       (setq #2# temp)
                                       (go #4=#:g0004))) ...)
       (return-from #1# form))
         #3# (return-from #1# (let (("
      (:I NIL "var1") " #2#)) . " (:I NIL "body1") "))
         #4# (return-from #1# (let (("
      (:I NIL "var2") " #2#)) . " (:I NIL "body2") ")) ...)))
")
     " " :PAR
     (:CODE NIL " (handler-case form
   ("
      (:I NIL "type1") " " (:I NIL "(var1)") " . " (:I NIL "body1") ")
   ...
   (:no-error ("
      (:I NIL "varN-1") " " (:I NIL "varN-2") " ...) . " (:I NIL "bodyN") "))
")
     " is approximately equivalent to: " :PAR
     (:CODE NIL "
 (block #1=#:error-return
  (multiple-value-call #'(lambda ("
      (:I NIL "varN-1") " " (:I NIL "varN-2") " ...) . " (:I NIL "bodyN") ")
     (block #2=#:normal-return
       (return-from #1#
         (handler-case (return-from #2# form)
           ("
      (:I NIL "type1") " (" (:I NIL "var1") ") . " (:I NIL "body1") ") ...)))))
")
     " " :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== IGNORE-ERRORS")
   (:COM (:NAME "ignore-errors" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "ignore-errors")
      (:ARGLIST NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "forms") "—an "
     (:TERM NIL "implicit progn") ". " :PAR (:PARAM NIL "results")
     "—In the normal situation, the " (:TERM NIL "values") " of the "
     (:TERM NIL "forms")
     " are returned; in the exceptional situation, two values are returned: "
     (:MISC NIL "nil") " and the " (:TERM NIL "condition") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "ignore-errors")
     " is used to prevent " (:TERM NIL "conditions") " of " (:TERM NIL "type")
     " " (:TYPEREF NIL "error") " from causing entry into the debugger. " :PAR
     "Specifically, " (:MACREF NIL "ignore-errors") " " (:TERM NIL "executes")
     " " (:TERM NIL "forms") " in a " (:TERM NIL "dynamic environment")
     " where a " (:TERM NIL "handler") " for " (:TERM NIL "conditions") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error")
     " has been established; if invoked, it " (:TERM NIL "handles") " such "
     (:TERM NIL "conditions") " by returning two " (:TERM NIL "values") ", "
     (:MISC NIL "nil") " and the " (:TERM NIL "condition") " that was "
     (:TERM NIL "signaled") ", from the " (:MACREF NIL "ignore-errors") " "
     (:TERM NIL "form") ". " :PAR "If a " (:TERM NIL "normal return")
     " from the " (:TERM NIL "forms") " occurs, any " (:TERM NIL "values")
     " returned are returned by " (:MACREF NIL "ignore-errors") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun load-init-file (program)
   (let ((win nil))
     (ignore-errors ;if this fails, don't enter debugger
       (load (merge-pathnames (make-pathname :name program :type :lisp)
                              (user-homedir-pathname)))
       (setq win t))
     (unless win (format t \"~&Init file failed to load.~%\"))
     win))
 
 (load-init-file \"no-such-program\")
⊳ Init file failed to load.
NIL
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "handler-case") ", "
     (:SECREF NIL :CONDITION-SYSTEM-CONCEPTS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (ignore-errors . " (:I NIL "forms") ")
")
     " " :PAR "is equivalent to: " :PAR
     (:CODE NIL " (handler-case (progn . " (:I NIL "forms") ")
   (error (condition) (values nil condition)))
")
     " " :PAR "Because the second return value is a " (:TERM NIL "condition")
     " in the exceptional case, it is common (but not required) to arrange for the second return value in the normal case to be missing or "
     (:MISC NIL "nil") " so that the two situations can be distinguished. "
     :PAR))
   " " :PAR
   (:COMMENT NIL
    "-------------------- Condition Type Definition --------------------")
   :PAR (:COMMENT NIL "%% ========== DEFINE-CONDITION")
   (:COM (:NAME "define-condition" :FTYPE "Macro")
    (:ISSUE NIL
     "DEFINE-CONDITION-SYNTAX:INCOMPATIBLY-MORE-LIKE-DEFCLASS+EMPHASIZE-READ-ONLY")
    " " :PAR
    (:EDITORNOTE NIL
     "KMP: This syntax stuff is still very confused and needs lots of work.")
    " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:COMMENT NIL "!!! Consider renaming \"parent-type\" to \"supertype\".")
     (:DEF (:KIND "macro") (:NAMES NIL "define-condition")
      (:ARGLIST NIL "name "
       (:PAREN NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "parent-type")))) " "
       (:PAREN NIL (:STAR NIL (:CURLY NIL (:DOWN NIL "slot-spec")))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "option"))))
      (:VALUES NIL "name"))
     " " :PAR
     (:BNF (:NAME "slot-spec") "slot-name | "
      (:PAREN NIL "slot-name " (:DOWN NIL "slot-option")))
     " "
     (:BNF (:NAME "slot-option") "⟦ "
      (:STAR NIL (:CURLY NIL (:KWD NIL "reader") " " (:TERM NIL "symbol")))
      " | " (:BR NIL) " "
      (:STAR NIL
       (:CURLY NIL (:KWD NIL "writer") " " (:DOWN NIL "function-name")))
      " | " (:BR NIL) " "
      (:STAR NIL (:CURLY NIL (:KWD NIL "accessor") " " (:TERM NIL "symbol")))
      " | " (:BR NIL) " "
      (:CURLY NIL (:KWD NIL "allocation") " " (:DOWN NIL "allocation-type"))
      " | " (:BR NIL) " "
      (:STAR NIL (:CURLY NIL (:KWD NIL "initarg") " " (:TERM NIL "symbol")))
      " | " (:BR NIL) " "
      (:CURLY NIL (:KWD NIL "initform") " " (:TERM NIL "form")) " | " (:BR NIL)
      " " (:CURLY NIL (:KWD NIL "type") " " (:PARAM NIL "type-specifier"))
      " ⟧")
     " "
     (:BNF (:NAME "option") "⟦ "
      (:PAREN NIL (:KWD NIL "default-initargs") " " (:TT NIL ".") " "
       (:PARAM NIL "initarg-list"))
      " | " (:BR NIL) " "
      (:PAREN NIL (:KWD NIL "documentation") " " (:TERM NIL "string")) " | "
      (:BR NIL) " " (:PAREN NIL (:KWD NIL "report") " " (:I NIL "report-name"))
      " ⟧")
     " "
     (:BNF (:NAME "function-name")
      (:CURLY NIL (:TERM NIL "symbol") " | "
       (:TT NIL " (setf " (:TERM NIL "symbol") ")")))
     " "
     (:BNF (:NAME "allocation-type") (:KWD NIL "instance") " | "
      (:KWD NIL "class"))
     " "
     (:BNF (:NAME "report-name") (:TERM NIL "string") " | "
      (:TERM NIL "symbol") " | " (:TERM NIL "lambda expression"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "symbol") ". " :PAR
     (:COMMENT NIL "% Reworded per Barmar #9, First Public Review.")
     (:PARAM NIL "parent-type") "—a " (:TERM NIL "symbol") " naming a "
     (:TERM NIL "condition") " " (:TERM NIL "type") ". If no "
     (:PARAM NIL "parent-types") " are supplied, the "
     (:PARAM NIL "parent-types") " default to " (:TT NIL "(condition)") ". "
     :PAR (:PARAM NIL "default-initargs") "—a " (:TERM NIL "list") " of "
     (:TERM NIL "keyword/value pairs") ". " :PAR
     (:EDITORNOTE NIL
      "KMP: This is all mixed up as to which is a slot option and which is a main option. I'll sort that out. Also, some of this is implied by the bnf and needn't be stated explicitly.")
     (:COMMENT NIL "!!!") :PAR (:ISSUE NIL "CLOS-CONDITIONS:INTEGRATE") " "
     :PAR (:PARAM NIL "Slot-spec") "—the " (:TERM NIL "name") " of a "
     (:TERM NIL "slot") " or a " (:TERM NIL "list") " consisting of the "
     (:PARAM NIL "slot-name") " followed by zero or more "
     (:PARAM NIL "slot-options") ". " :PAR (:PARAM NIL "Slot-name")
     "—a slot name (a " (:TERM NIL "symbol") "), the " (:TERM NIL "list")
     " of a slot name, or the " (:TERM NIL "list")
     " of slot name/slot form pairs. " :PAR (:PARAM NIL "Option")
     "—Any of the following: " :PAR
     (:LIST NIL
      (:ITEM NIL (:KWD NIL "reader") " " :PAR (:KWD NIL "reader")
       " can be supplied more than once for a given " (:TERM NIL "slot")
       " and cannot be " (:MISC NIL "nil") ". " :PAR)
      (:ITEM NIL (:KWD NIL "writer") " " :PAR (:KWD NIL "writer")
       " can be supplied more than once for a given " (:TERM NIL "slot")
       " and must name a " (:TERM NIL "generic function") ". " :PAR)
      (:ITEM NIL (:KWD NIL "accessor") " " :PAR (:KWD NIL "accessor")
       " can be supplied more than once for a given " (:TERM NIL "slot")
       " and cannot be " (:MISC NIL "nil") ". " :PAR)
      (:ITEM NIL (:KWD NIL "allocation") " " :PAR (:KWD NIL "allocation")
       " can be supplied once at most for a given " (:TERM NIL "slot")
       ". The default if " (:KWD NIL "allocation") " is not supplied is "
       (:KWD NIL "instance") ". " :PAR)
      (:ITEM NIL (:KWD NIL "initarg") " " :PAR (:KWD NIL "initarg")
       " can be supplied more than once for a given " (:TERM NIL "slot") ". "
       :PAR)
      (:ITEM NIL (:KWD NIL "initform") " " :PAR (:KWD NIL "initform")
       " can be supplied once at most for a given " (:TERM NIL "slot") ". "
       :PAR)
      (:ITEM NIL (:KWD NIL "type") " " :PAR (:KWD NIL "type")
       " can be supplied once at most for a given " (:TERM NIL "slot") ". "
       :PAR)
      (:ITEM NIL (:KWD NIL "documentation") " " :PAR (:KWD NIL "documentation")
       " can be supplied once at most for a given " (:TERM NIL "slot") ". "
       :PAR)
      (:ITEM NIL (:KWD NIL "report") " " :PAR (:KWD NIL "report")
       " can be supplied once at most. " :PAR
       (:COMMENT NIL " Removed:" "  \\itemitem{\\kwd{conc-name}} ..."
        "  \\itemitem{\\kwd{documentation}} ...")))
     " " (:ENDISSUE NIL "CLOS-CONDITIONS:INTEGRATE") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "!!! Barrett: Some of this stuff")
     (:MACREF NIL "define-condition") " defines a new condition type called "
     (:PARAM NIL "name") ", which is a " (:TERM NIL "subtype") " of "
     (:ISSUE NIL "CLOS-CONDITIONS:INTEGRATE") " the " (:TERM NIL "type") " or "
     (:TERM NIL "types") " named by " (:PARAM NIL "parent-type") ". Each "
     (:PARAM NIL "parent-type") " argument specifies a direct "
     (:TERM NIL "supertype") " of the new " (:TERM NIL "condition")
     ". The new " (:TERM NIL "condition") " inherits " (:TERM NIL "slots")
     " and " (:TERM NIL "methods") " from each of its direct "
     (:TERM NIL "supertypes") ", and so on. "
     (:ENDISSUE NIL "CLOS-CONDITIONS:INTEGRATE") " "
     (:COMMENT NIL "% Redundant. -kmp 3-Sep-91"
      " \\term{Objects} of this \\term{condition} type have all of the "
      " indicated \\param{slots}, plus"
      "   any additional slots that would be available in \\term{objects}"
      " of type \\param{parent-type}.")
     :PAR "If a slot name/slot form pair is supplied, the slot form is a "
     (:TERM NIL "form") " that can be evaluated by "
     (:FUNREF NIL "make-condition")
     " to produce a default value when an explicit value is not provided. If no slot form is supplied, the contents of the "
     (:PARAM NIL "slot") " is initialized in an "
     (:TERM NIL "implementation-dependent") " way. " :PAR "If the "
     (:TERM NIL "type") " being defined and some other " (:TERM NIL "type")
     " from which it inherits have a slot by the same name, only one slot is allocated in the "
     (:TERM NIL "condition")
     ", but the supplied slot form overrides any slot form that might otherwise have been inherited from a "
     (:PARAM NIL "parent-type")
     ". If no slot form is supplied, the inherited slot form (if any) is still visible. "
     :PAR
     (:COMMENT NIL "% This looks suspicious to me. -kmp 14-May-91"
      "  Barrett agrees. -kmp 3-Sep-91"
      " Once the \\term{condition} is defined,"
      " \\funref{make-condition} accepts keywords (from \\thepackage{keyword}) with the"
      " \\term{name} of any of the designated \\param{slots},"
      " and will initialize the corresponding \\param{slots} in \\term{conditions} it creates.")
     :PAR "Accessors are created according to the same rules as used by "
     (:COMMENT NIL "\\macref{defstruct}.") (:MACREF NIL "defclass") ". " :PAR
     "A description of " (:PARAM NIL "slot-options") " follows: " :PAR
     (:ISSUE NIL "CLOS-CONDITIONS:INTEGRATE") " " :PAR
     (:COMMENT NIL "!!! Isn't there a way of contracting this?") :PAR
     (:LIST NIL
      (:ITEM NIL (:KWD NIL "reader") " " :PAR "The " (:KWD NIL "reader")
       " slot option specifies that an " (:TERM NIL "unqualified method")
       " is to be defined on the " (:TERM NIL "generic function")
       " named by the argument to " (:KWD NIL "reader")
       " to read the value of the given " (:TERM NIL "slot") ". " :PAR
       (:COMMENT NIL " Removed:" " \\itemitem{\\kwd{writer}} "
        " \\itemitem{\\kwd{accessor}} " " \\itemitem{\\kwd{allocation}} ")
       :PAR)
      (:ITEM NIL " The " (:KWD NIL "initform")
       " slot option is used to provide a default initial value form to be used in the initialization of the "
       (:TERM NIL "slot") ". This " (:TERM NIL "form")
       " is evaluated every time it is used to initialize the "
       (:TERM NIL "slot") ". The " (:TERM NIL "lexical environment")
       " in which this " (:TERM NIL "form") " is evaluated is the lexical "
       (:TERM NIL "environment") " in which the "
       (:MACREF NIL "define-condition") " form was evaluated. Note that the "
       (:TERM NIL "lexical environment") " refers both to variables and to "
       (:TERM NIL "functions") ". For " (:TERM NIL "local slots") ", the "
       (:TERM NIL "dynamic environment") " is the dynamic "
       (:TERM NIL "environment") " in which " (:FUNREF NIL "make-condition")
       " was called; for " (:TERM NIL "shared slots") ", the "
       (:TERM NIL "dynamic environment") " is the "
       (:TERM NIL "dynamic environment") " in which the "
       (:MACREF NIL "define-condition") " form was evaluated. "
       (:COMMENT NIL "\\Seesection\\ObjectCreationAndInit.") :PAR
       (:REVIEWER NIL "Barmar: Issue CLOS-CONDITIONS doesn't say this.")
       " No implementation is permitted to extend the syntax of "
       (:MACREF NIL "define-condition") " to allow "
       (:TT NIL "(" (:PARAM NIL "slot-name") " " (:PARAM NIL "form") ")")
       " as an abbreviation for "
       (:TT NIL "(" (:PARAM NIL "slot-name") " :initform " (:PARAM NIL "form")
        ")")
       ". " :PAR)
      (:ITEM NIL (:KWD NIL "initarg") " " :PAR "The " (:KWD NIL "initarg")
       " slot option declares an initialization argument named by its "
       (:TERM NIL "symbol")
       " argument and specifies that this initialization argument initializes the given "
       (:TERM NIL "slot")
       ". If the initialization argument has a value in the call to "
       (:FUNREF NIL "initialize-instance")
       ", the value is stored into the given " (:TERM NIL "slot")
       ", and the slot's " (:KWD NIL "initform")
       " slot option, if any, is not evaluated. If none of the initialization arguments specified for a given "
       (:TERM NIL "slot") " has a value, the " (:TERM NIL "slot")
       " is initialized according to the " (:KWD NIL "initform")
       " slot option, if specified. " :PAR)
      (:ITEM NIL (:KWD NIL "type") " " :PAR "The " (:KWD NIL "type")
       " slot option specifies that the contents of the " (:TERM NIL "slot")
       " is always of the specified " (:TERM NIL "type")
       ". It effectively declares the result type of the reader generic function when applied to an "
       (:TERM NIL "object") " of this " (:TERM NIL "condition")
       " type. The consequences of attempting to store in a "
       (:TERM NIL "slot") " a value that does not satisfy the type of the "
       (:TERM NIL "slot") " is undefined. "
       (:COMMENT NIL
        "The \\kwd{type} slot option is further discussed in \\secref\\SlotInheritance.")
       :PAR)
      (:ITEM NIL (:KWD NIL "default-initargs") " " :PAR
       (:EDITORNOTE NIL "KMP: This is an option, not a slot option.")
       (:COMMENT NIL "!!!") :PAR
       "This option is treated the same as it would be "
       (:MACREF NIL "defclass") ". " :PAR)
      (:ITEM NIL (:KWD NIL "documentation") " " :PAR
       (:EDITORNOTE NIL "KMP: This is both an option and a slot option.")
       (:COMMENT NIL "!!!") :PAR "The " (:KWD NIL "documentation")
       " slot option provides a " (:TERM NIL "documentation string")
       " for the " (:TERM NIL "slot") ". " :PAR
       (:COMMENT NIL "Removed:" "  \\itemitem{\\kwd{documentation}} ..."
        "  \\itemitem{\\kwd{conc-name}} ...")
       (:ENDISSUE NIL "CLOS-CONDITIONS:INTEGRATE") " ")
      (:ITEM NIL (:KWD NIL "report") " " :PAR
       (:EDITORNOTE NIL "KMP: This is an option, not a slot option.")
       (:COMMENT NIL "!!!") :PAR (:TERM NIL "Condition")
       " reporting is mediated through the " (:FUNREF NIL "print-object")
       " method for the " (:TERM NIL "condition") " type in question, with "
       (:VARREF NIL "*print-escape*") " always being " (:MISC NIL "nil")
       ". Specifying " (:TT NIL "(:report " (:PARAM NIL "report-name") ")")
       " in the definition of a condition type " (:TT NIL "C")
       " is equivalent to: " :PAR
       (:CODE NIL " (defmethod print-object ((x c) stream)
   (if *print-escape* (call-next-method) ("
        (:PARAM NIL "report-name") " x stream)))
")
       " " :PAR "If the value supplied by the argument to " (:KWD NIL "report")
       " (" (:PARAM NIL "report-name") ") is a " (:TERM NIL "symbol") " or a "
       (:TERM NIL "lambda expression") ", it must be acceptable to "
       (:SPECREF NIL "function") ". "
       (:TT NIL "(function " (:PARAM NIL "report-name") ")")
       " is evaluated in the current " (:TERM NIL "lexical environment")
       ". It should return a " (:TERM NIL "function") " of two arguments, a "
       (:TERM NIL "condition") " and a " (:TERM NIL "stream")
       ", that prints on the " (:TERM NIL "stream") " a description of the "
       (:TERM NIL "condition") ". This " (:TERM NIL "function")
       " is called whenever the " (:TERM NIL "condition") " is printed while "
       (:VARREF NIL "*print-escape*") " is " (:MISC NIL "nil") ". " :PAR "If "
       (:PARAM NIL "report-name") " is a " (:TERM NIL "string")
       ", it is a shorthand for " :PAR
       (:CODE NIL " (lambda (condition stream)
   (declare (ignore condition))
   (write-string "
        (:PARAM NIL "report-name") " stream))
")
       " " :PAR "This option is processed after the new "
       (:TERM NIL "condition") " type has been defined, so use of the "
       (:PARAM NIL "slot") " accessors within the " (:KWD NIL "report")
       " function is permitted. If this option is not supplied, information about how to report this type of "
       (:TERM NIL "condition") " is inherited from the "
       (:PARAM NIL "parent-type") ". " :PAR))
     " " :PAR
     (:COMMENT NIL
      " !!! Barmar: This is redundant because CLOS already says this."
      "     KMP: I think that until the connection between conditions and standard-class is"
      "          clearer, it doesn't hurt to say it redundantly.")
     "The consequences are unspecified if an attempt is made to "
     (:TERM NIL "read") " a " (:PARAM NIL "slot")
     " that has not been explicitly initialized and that has not been given a default value. "
     :PAR
     "The consequences are unspecified if an attempt is made to assign the "
     (:PARAM NIL "slots") " by using " (:MACREF NIL "setf") ". " :PAR
     (:ISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     (:COMMENT NIL " added qualification about top-level-ness  --sjl 5 Mar 92")
     "If a " (:MACREF NIL "define-condition") " " (:TERM NIL "form")
     " appears as a " (:TERM NIL "top level form") ", the "
     (:TERM NIL "compiler") " must make " (:PARAM NIL "name")
     " recognizable as a valid " (:TERM NIL "type")
     " name, and it must be possible to reference the " (:TERM NIL "condition")
     " " (:TERM NIL "type") " as the " (:PARAM NIL "parent-type")
     " of another " (:TERM NIL "condition") " " (:TERM NIL "type")
     " in a subsequent " (:MACREF NIL "define-condition") " "
     (:TERM NIL "form") " in the " (:TERM NIL "file") " being compiled. "
     (:ENDISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     "The following form defines a condition of " (:TERM NIL "type") " "
     (:TT NIL "peg/hole-mismatch")
     " which inherits from a condition type called "
     (:TT NIL "blocks-world-error") ": " :PAR
     (:CODE NIL "(define-condition peg/hole-mismatch 
                  (blocks-world-error)
                  ((peg-shape  :initarg :peg-shape
                               :reader peg/hole-mismatch-peg-shape)
                   (hole-shape :initarg :hole-shape
                               :reader peg/hole-mismatch-hole-shape))
  (:report (lambda (condition stream)
             (format stream \"A ~A peg cannot go in a ~A hole.\"
                     (peg/hole-mismatch-peg-shape  condition)
                     (peg/hole-mismatch-hole-shape condition)))))
")
     " " :PAR "The new type has slots " (:TT NIL "peg-shape") " and "
     (:TT NIL "hole-shape") ", so " (:FUNREF NIL "make-condition") " accepts "
     (:TT NIL ":peg-shape") " and " (:TT NIL ":hole-shape") " keywords. The "
     (:TERM NIL "readers") " " (:TT NIL "peg/hole-mismatch-peg-shape") " and "
     (:TT NIL "peg/hole-mismatch-hole-shape")
     " apply to objects of this type, as illustrated in the "
     (:KWD NIL "report") " information. " :PAR "The following form defines a "
     (:TERM NIL "condition") " " (:TERM NIL "type") " named "
     (:TT NIL "machine-error") " which inherits from " (:TYPEREF NIL "error")
     ": " :PAR
     (:CODE NIL "(define-condition machine-error 
                  (error)
                  ((machine-name :initarg :machine-name
                                 :reader machine-error-machine-name))
  (:report (lambda (condition stream)
             (format stream \"There is a problem with ~A.\"
                     (machine-error-machine-name condition)))))
")
     " " :PAR
     "Building on this definition, a new error condition can be defined which is a subtype of "
     (:TT NIL "machine-error") " for use when machines are not available: "
     :PAR
     (:CODE NIL
      "(define-condition machine-not-available-error (machine-error) ()
  (:report (lambda (condition stream)
             (format stream \"The machine ~A is not available.\"
                     (machine-error-machine-name condition)))))
")
     " " :PAR "This defines a still more specific condition, built upon "
     (:TT NIL "machine-not-available-error")
     ", which provides a slot initialization form for "
     (:TT NIL "machine-name")
     " but which does not provide any new slots or report information. It just gives the "
     (:TT NIL "machine-name") " slot a default initialization: " :PAR
     (:CODE NIL "(define-condition my-favorite-machine-not-available-error
                  (machine-not-available-error)
  ((machine-name :initform \"mc.lcs.mit.edu\")))
")
     " " :PAR "Note that since no " (:KWD NIL "report")
     " clause was given, the information inherited from "
     (:TT NIL "machine-not-available-error")
     " is used to report this type of condition. " :PAR
     (:CODE NIL " (define-condition ate-too-much (error) 
     ((person :initarg :person :reader ate-too-much-person)
      (weight :initarg :weight :reader ate-too-much-weight)
      (kind-of-food :initarg :kind-of-food
                    :reader :ate-too-much-kind-of-food)))
→ ATE-TOO-MUCH
 (define-condition ate-too-much-ice-cream (ate-too-much)
   ((kind-of-food :initform 'ice-cream)
    (flavor       :initarg :flavor
                  :reader ate-too-much-ice-cream-flavor
                  :initform 'vanilla ))
   (:report (lambda (condition stream)
              (format stream \"~A ate too much ~A ice-cream\"
                      (ate-too-much-person condition)
                      (ate-too-much-ice-cream-flavor condition)))))
→ ATE-TOO-MUCH-ICE-CREAM
 (make-condition 'ate-too-much-ice-cream
                 :person 'fred
                 :weight 300
                 :flavor 'chocolate)
→ #<ATE-TOO-MUCH-ICE-CREAM 32236101>
 (format t \"~A\" *)
⊳ FRED ate too much CHOCOLATE ice-cream
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-condition") ", "
     (:MACREF NIL "defclass") ", " (:SECREF NIL :CONDITION-SYSTEM-CONCEPTS) " "
     :PAR (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL
      "DEFINE-CONDITION-SYNTAX:INCOMPATIBLY-MORE-LIKE-DEFCLASS+EMPHASIZE-READ-ONLY")
     " " :PAR))
   " " :PAR
   (:COMMENT NIL
    "-------------------- Condition Instantiation --------------------")
   :PAR (:COMMENT NIL "%% ========== MAKE-CONDITION")
   (:COM (:NAME "make-condition" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-condition")
      (:ARGLIST NIL "type " (:KEYWORD NIL " &rest") " slot-initializations")
      (:VALUES NIL "condition"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL "Barmar: a condition type or condition type name ?"
      "Barrett worried about the same thing.  I think the intent was that it be a subtype of"
      "condition, so I've required that explicitly. -kmp 3-Sep-91")
     (:PARAM NIL "type") "—a " (:TERM NIL "type specifier") " (for a "
     (:TERM NIL "subtype") " of " (:TYPEREF NIL "condition") "). " :PAR
     (:PARAM NIL "slot-initializations") "—an "
     (:TERM NIL "initialization argument list") ". " :PAR
     (:PARAM NIL "condition") "—a " (:TERM NIL "condition") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Constructs and returns a "
     (:TERM NIL "condition") " of type " (:PARAM NIL "type") " using "
     (:PARAM NIL "slot-initializations")
     " for the initial values of the slots. The newly created "
     (:TERM NIL "condition") " is returned. " :PAR)
    (:PART (:NAME "Examples") " "
     (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
     (:CODE NIL " (defvar *oops-count* 0)

 (setq a (make-condition 'simple-error
                         :format-control \"This is your ~:R error.\"
                         :format-arguments (list (incf *oops-count*))))
→ #<SIMPLE-ERROR 32245104>
 
 (format t \"~&~A~%\" a)
⊳ This is your first error.
→ NIL
 
 (error a)
⊳ Error: This is your first error.
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Return to Lisp Toplevel.
⊳ Debug> 
")
     " " (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR
     (:COMMENT NIL "% Sandra thinks this is excessive."
      "Creates a \\term{condition}.")
     :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The set of defined "
     (:TERM NIL "condition") " " (:TERM NIL "types") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "define-condition") ", "
     (:SECREF NIL :CONDITION-SYSTEM-CONCEPTS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "-------------------- Restarts --------------------")
   :PAR
   (:COM (:NAME "restart" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "restart") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "An " (:TERM NIL "object") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "restart") " represents a "
     (:TERM NIL "function")
     " that can be called to perform some form of recovery action, usually a transfer of control to an outer point in the running program. "
     :PAR "An " (:TERM NIL "implementation") " is free to implement a "
     (:TERM NIL "restart") " in whatever manner is most convenient; a "
     (:TERM NIL "restart") " has only " (:TERM NIL "dynamic extent")
     " relative to the scope of the binding " (:TERM NIL "form") " which "
     (:TERM NIL "establishes") " it. " :PAR))
   :PAR (:COMMENT NIL "%% ========== COMPUTE-RESTARTS")
   (:COM (:NAME "compute-restarts" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " "
     (:DEF (:KIND "function") (:NAMES NIL "compute-restarts")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " condition")
      (:VALUES NIL "restarts"))
     " " (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " "
     (:PARAM NIL "condition") "—a " (:TERM NIL "condition") " "
     (:TERM NIL "object") ", or " (:MISC NIL "nil") ". "
     (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " " :PAR
     (:PARAM NIL "restarts") "—a " (:TERM NIL "list") " of "
     (:TERM NIL "restarts") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "compute-restarts")
     " uses the dynamic state of the program to compute a " (:TERM NIL "list")
     " of the " (:TERM NIL "restarts") " which are currently active. " :PAR
     "The resulting " (:TERM NIL "list")
     " is ordered so that the innermost (more-recently established) restarts are nearer the head of the "
     (:TERM NIL "list") ". " :PAR
     (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " When "
     (:PARAM NIL "condition") " is " (:TERM NIL "non-nil") ", only those "
     (:TERM NIL "restarts")
     " are considered that are either explicitly associated with that "
     (:PARAM NIL "condition") ", or not associated with any "
     (:TERM NIL "condition") "; that is, the excluded " (:TERM NIL "restarts")
     " are those that are associated with a non-empty set of "
     (:TERM NIL "conditions") " of which the given " (:PARAM NIL "condition")
     " is not an " (:TERM NIL "element") ". If " (:PARAM NIL "condition")
     " is " (:MISC NIL "nil") ", all " (:TERM NIL "restarts")
     " are considered. "
     (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " " :PAR
     (:FUNREF NIL "compute-restarts") " returns all "
     (:COMMENT NIL "\"valid\" -> \"applicable\" per Barrett")
     (:TERM NIL "applicable restarts")
     ", including anonymous ones, even if some of them have the same name as others and would therefore not be found by "
     (:FUNREF NIL "find-restart") " when given a " (:TERM NIL "symbol")
     " argument. " :PAR
     "Implementations are permitted, but not required, to return "
     (:TERM NIL "distinct") " " (:TERM NIL "lists") " from repeated calls to "
     (:FUNREF NIL "compute-restarts")
     " while in the same dynamic environment. The consequences are undefined if the "
     (:TERM NIL "list") " returned by " (:FUNREF NIL "compute-restarts")
     " is every modified. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " ;; One possible way in which an interactive debugger might present
 ;; restarts to the user.
 (defun invoke-a-restart ()
   (let ((restarts (compute-restarts)))
     (do ((i 0 (+ i 1)) (r restarts (cdr r))) ((null r))
       (format t \"~&~D: ~A~%\" i (car r)))
     (let ((n nil) (k (length restarts)))
       (loop (when (and (typep n 'integer) (>= n 0) (< n k))
               (return t))
             (format t \"~&Option: \")
             (setq n (read))
             (fresh-line))
       (invoke-restart-interactively (nth n restarts)))))

 (restart-case (invoke-a-restart)
   (one () 1)
   (two () 2)
   (nil () :report \"Who knows?\" 'anonymous)
   (one () 'I)
   (two () 'II))
⊳ 0: ONE
⊳ 1: TWO
⊳ 2: Who knows?
⊳ 3: ONE
⊳ 4: TWO
⊳ 5: Return to Lisp Toplevel.
⊳ Option: "
      (:IN NIL "4") "
→ II
 
 ;; Note that in addition to user-defined restart points, COMPUTE-RESTARTS
 ;; also returns information about any system-supplied restarts, such as
 ;; the \"Return to Lisp Toplevel\" restart offered above.
 
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "Existing restarts. " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "find-restart") ", "
     (:FUNREF NIL "invoke-restart") ", " (:FUNREF NIL "restart-bind") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FIND-RESTART")
   (:COM (:NAME "find-restart" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " "
     (:DEF (:KIND "function") (:NAMES NIL "find-restart")
      (:ARGLIST NIL "identifier " (:KEYWORD NIL " &optional") " condition"))
     " restart " (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " "
     :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "identifier")
     "—a " (:TERM NIL "non-nil") " " (:TERM NIL "symbol") ", or a "
     (:TERM NIL "restart") ". " :PAR
     (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " "
     (:PARAM NIL "condition") "—a " (:TERM NIL "condition") " "
     (:TERM NIL "object") ", or " (:MISC NIL "nil") ". "
     (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " " :PAR
     (:PARAM NIL "restart") "—a " (:TERM NIL "restart") " or "
     (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "find-restart")
     " searches for a particular " (:TERM NIL "restart") " in the current "
     (:TERM NIL "dynamic environment") ". " :PAR
     (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " When "
     (:PARAM NIL "condition") " is " (:TERM NIL "non-nil") ", only those "
     (:TERM NIL "restarts")
     " are considered that are either explicitly associated with that "
     (:PARAM NIL "condition") ", or not associated with any "
     (:TERM NIL "condition") "; that is, the excluded " (:TERM NIL "restarts")
     " are those that are associated with a non-empty set of "
     (:TERM NIL "conditions") " of which the given " (:PARAM NIL "condition")
     " is not an " (:TERM NIL "element") ". If " (:PARAM NIL "condition")
     " is " (:MISC NIL "nil") ", all " (:TERM NIL "restarts")
     " are considered. "
     (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " " :PAR "If "
     (:PARAM NIL "identifier") " is a " (:TERM NIL "symbol")
     ", then the innermost (most recently established) "
     (:TERM NIL "applicable restart") " with that " (:TERM NIL "name")
     " is returned. " (:MISC NIL "nil")
     " is returned if no such restart is found. " :PAR "If "
     (:PARAM NIL "identifier")
     " is a currently active restart, then it is returned. Otherwise, "
     (:MISC NIL "nil") " is returned. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (restart-case
     (let ((r (find-restart 'my-restart)))
       (format t \"~S is named ~S\" r (restart-name r)))
   (my-restart () nil))
⊳ #<RESTART 32307325> is named MY-RESTART
→ NIL
 (find-restart 'my-restart)
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "Existing restarts. " :PAR
     (:MACREF NIL "restart-case") ", " (:MACREF NIL "restart-bind") ", "
     (:MACREF NIL "with-condition-restarts") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "compute-restarts") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (find-restart " (:PARAM NIL "identifier") ")
 ≡ (find "
      (:PARAM NIL "identifier") " (compute-restarts) :key :restart-name)
")
     " " :PAR "Although anonymous restarts have a name of " (:MISC NIL "nil")
     ", the consequences are unspecified if " (:MISC NIL "nil")
     " is given as an " (:PARAM NIL "identifier")
     ". Occasionally, programmers lament that " (:MISC NIL "nil")
     " is not permissible as an " (:PARAM NIL "identifier")
     " argument. In most such cases, " (:FUNREF NIL "compute-restarts")
     " can probably be used to simulate the desired effect. " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== INVOKE-RESTART")
   (:COM (:NAME "invoke-restart" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "invoke-restart")
      (:ARGLIST NIL "restart " (:KEYWORD NIL " &rest") " arguments")
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "restart") "—a "
     (:TERM NIL "restart designator") ". " :PAR (:PARAM NIL "argument") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " returned by the " (:TERM NIL "function")
     " associated with " (:PARAM NIL "restart") ", if that "
     (:TERM NIL "function") " returns. " :PAR)
    (:PART (:NAME "Description") " " :PAR "Calls the " (:TERM NIL "function")
     " associated with " (:PARAM NIL "restart") ", passing "
     (:PARAM NIL "arguments") " to it. " (:PARAM NIL "Restart")
     " must be valid in the current " (:TERM NIL "dynamic environment") ". "
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (defun add3 (x) (check-type x number) (+ x 3))
 
 (foo 'seven)
⊳ Error: The value SEVEN was not of type NUMBER.
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Specify a different value to use.
⊳  2: Return to Lisp Toplevel.
⊳ Debug> "
      (:IN NIL "(invoke-restart 'store-value 7)") "
→ 10
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR
     (:COMMENT NIL
      "!!! Barmar: This is true whenever calling random functions.")
     "A non-local transfer of control might be done by the restart. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "Existing restarts. " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If "
     (:PARAM NIL "restart") " is not valid, an error of " (:TERM NIL "type")
     " " (:TYPEREF NIL "control-error") " is signaled. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "find-restart") ", "
     (:MACREF NIL "restart-bind") ", " (:MACREF NIL "restart-case") ", "
     (:FUNREF NIL "invoke-restart-interactively") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The most common use for "
     (:FUNREF NIL "invoke-restart") " is in a " (:TERM NIL "handler")
     ". It might be used explicitly, or implicitly through "
     (:FUNREF NIL "invoke-restart-interactively") " or a "
     (:TERM NIL "restart function") ". " :PAR (:TERM NIL "Restart functions")
     " call " (:FUNREF NIL "invoke-restart") ", not vice versa. That is, "
     (:FUNREF NIL "invoke-restart") " provides primitive functionality, and "
     (:TERM NIL "restart functions") " are non-essential “syntactic sugar.” "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== INVOKE-RESTART-INTERACTIVELY")
   (:COM (:NAME "invoke-restart-interactively" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "invoke-restart-interactively")
      (:ARGLIST NIL "restart")
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "restart") "—a "
     (:TERM NIL "restart designator") ". " :PAR (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " returned by the " (:TERM NIL "function")
     " associated with " (:PARAM NIL "restart") ", if that "
     (:TERM NIL "function") " returns. " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:FUNREF NIL "invoke-restart-interactively") " calls the "
     (:TERM NIL "function") " associated with " (:PARAM NIL "restart")
     ", prompting for any necessary arguments. If " (:PARAM NIL "restart")
     " is a name, it must be valid in the current "
     (:TERM NIL "dynamic environment") ". " :PAR
     (:FUNREF NIL "invoke-restart-interactively")
     " prompts for arguments by executing the code provided in the "
     (:KWD NIL "interactive") " keyword to " (:MACREF NIL "restart-case")
     " or " (:KWD NIL "interactive-function") " keyword to "
     (:MACREF NIL "restart-bind") ". " :PAR
     (:COMMENT NIL "!!! Barrett: Make consistent with wrong # of args errors.")
     "If no such options have been supplied in the corresponding "
     (:MACREF NIL "restart-bind") " or " (:MACREF NIL "restart-case")
     ", then the consequences are undefined if the " (:PARAM NIL "restart")
     " takes required arguments. If the arguments are optional, an argument list of "
     (:MISC NIL "nil") " is used. " :PAR
     "Once the arguments have been determined, "
     (:FUNREF NIL "invoke-restart-interactively") " executes the following: "
     :PAR
     (:CODE NIL " (apply #'invoke-restart " (:I NIL "restart") " "
      (:I NIL "arguments") ")
")
     " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun add3 (x) (check-type x number) (+ x 3))
 
 (add3 'seven)
⊳ Error: The value SEVEN was not of type NUMBER.
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Specify a different value to use.
⊳  2: Return to Lisp Toplevel.
⊳ Debug> "
      (:IN NIL "(invoke-restart-interactively 'store-value)") "
⊳ Type a form to evaluate and use: "
      (:IN NIL "7") "
→ 10
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR
     "If prompting for arguments is necesary, some typeout may occur (on "
     (:TERM NIL "query I/O") "). " :PAR
     (:COMMENT NIL
      "!!! Barmar: This is true whenever calling random functions.")
     "A non-local transfer of control might be done by the restart. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*query-io*")
     ", active " (:TERM NIL "restarts") " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If "
     (:PARAM NIL "restart") " is not valid, an error of " (:TERM NIL "type")
     " " (:TYPEREF NIL "control-error") " is signaled. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "find-restart") ", "
     (:FUNREF NIL "invoke-restart") ", " (:MACREF NIL "restart-case") ", "
     (:MACREF NIL "restart-bind") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:FUNREF NIL "invoke-restart-interactively")
     " is used internally by the debugger and may also be useful in implementing other portable, interactive debugging tools. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== RESTART-BIND")
   (:COM (:NAME "restart-bind" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "restart-bind")
      (:ARGLIST NIL
       (:PAREN NIL
        (:CURLY NIL
         (:PAREN NIL "name function "
          (:STAR NIL (:CURLY NIL (:DOWN NIL "key-val-pair"))))))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR
     (:COMMENT NIL
      "!!! Barmar: Somehow indicate that each may be supplied at most once.")
     (:BNF (:NAME "key-val-pair") (:KWD NIL "interactive-function")
      " interactive-function | " (:BR NIL) " " (:KWD NIL "report-function")
      " report-function | " (:BR NIL) " " (:KWD NIL "test-function")
      " test-function")
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "symbol") "; not evaluated. " :PAR (:PARAM NIL "function")
     "—a " (:TERM NIL "form") "; evaluated. " :PAR (:PARAM NIL "forms") "—an "
     (:TERM NIL "implicit progn") ". " :PAR (:PARAM NIL "interactive-function")
     "—a " (:TERM NIL "form") "; evaluated. " :PAR
     (:PARAM NIL "report-function") "—a " (:TERM NIL "form") "; evaluated. "
     :PAR (:PARAM NIL "test-function") "—a " (:TERM NIL "form") "; evaluated. "
     :PAR (:PARAM NIL "results") "—the " (:TERM NIL "values")
     " returned by the " (:TERM NIL "forms") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "restart-bind")
     " executes the body of " (:PARAM NIL "forms") " in a "
     (:TERM NIL "dynamic environment") " where " (:TERM NIL "restarts")
     " with the given " (:PARAM NIL "names") " are in effect. " :PAR "If a "
     (:PARAM NIL "name") " is " (:MISC NIL "nil")
     ", it indicates an anonymous restart; if a " (:PARAM NIL "name") " is a "
     (:TERM NIL "non-nil") " " (:TERM NIL "symbol")
     ", it indicates a named restart. " :PAR "The " (:PARAM NIL "function")
     ", " (:PARAM NIL "interactive-function") ", and "
     (:PARAM NIL "report-function")
     " are unconditionally evaluated in the current lexical and dynamic environment prior to evaluation of the body. Each of these "
     (:TERM NIL "forms") " must evaluate to a " (:TERM NIL "function") ". "
     :PAR "If " (:FUNREF NIL "invoke-restart") " is done on that restart, the "
     (:TERM NIL "function") " which resulted from evaluating "
     (:PARAM NIL "function") " is called, in the "
     (:TERM NIL "dynamic environment") " of the "
     (:FUNREF NIL "invoke-restart") ", with the " (:TERM NIL "arguments")
     " given to " (:FUNREF NIL "invoke-restart") ". The "
     (:TERM NIL "function")
     " may either perform a non-local transfer of control or may return normally. "
     :PAR "If the restart is invoked interactively from the debugger (using "
     (:FUNREF NIL "invoke-restart-interactively")
     "), the arguments are defaulted by calling the " (:TERM NIL "function")
     " which resulted from evaluating " (:PARAM NIL "interactive-function")
     ". That " (:TERM NIL "function")
     " may optionally prompt interactively on " (:TERM NIL "query I/O")
     ", and should return a " (:TERM NIL "list") " of arguments to be used by "
     (:FUNREF NIL "invoke-restart-interactively")
     " when invoking the restart. " :PAR
     "If a restart is invoked interactively but no "
     (:PARAM NIL "interactive-function") " is used, then an argument list of "
     (:MISC NIL "nil") " is used. In that case, the " (:TERM NIL "function")
     " must be compatible with an empty argument list. " :PAR
     "If the restart is presented interactively (" (:I NIL "e.g.")
     ",  by the debugger), the presentation is done by calling the "
     (:TERM NIL "function") " which resulted from evaluating "
     (:PARAM NIL "report-function") ". This " (:TERM NIL "function")
     " must be a " (:TERM NIL "function") " of one argument, a "
     (:TERM NIL "stream")
     ". It is expected to print a description of the action that the restart takes to that "
     (:TERM NIL "stream") ". This " (:TERM NIL "function")
     " is called any time the restart is printed while "
     (:VARREF NIL "*print-escape*") " is " (:MISC NIL "nil") ". " :PAR
     "In the case of interactive invocation, the result is dependent on the value of "
     (:KWD NIL "interactive-function") " as follows. " :PAR
     (:LIST NIL
      (:ITEM NIL (:KWD NIL "interactive-function") " " :PAR
       (:PARAM NIL "Value")
       " is evaluated in the current lexical environment and should return a "
       (:TERM NIL "function") " of no arguments which constructs a "
       (:TERM NIL "list") " of arguments to be used by "
       (:FUNREF NIL "invoke-restart-interactively")
       " when invoking this restart. The " (:TERM NIL "function")
       " may prompt interactively using " (:TERM NIL "query I/O")
       " if necessary. " :PAR)
      (:ITEM NIL (:KWD NIL "report-function") " " :PAR (:PARAM NIL "Value")
       " is evaluated in the current lexical environment and should return a "
       (:TERM NIL "function") " of one argument, a " (:TERM NIL "stream")
       ", which prints on the " (:TERM NIL "stream")
       " a summary of the action that this restart takes. This "
       (:TERM NIL "function")
       " is called whenever the restart is reported (printed while "
       (:VARREF NIL "*print-escape*") " is " (:MISC NIL "nil") "). "
       (:COMMENT NIL " This next was added for Barmar. -kmp 1-Sep-91") "If no "
       (:KWD NIL "report-function")
       " option is provided, the manner in which the " (:TERM NIL "restart")
       " is reported is " (:TERM NIL "implementation-dependent") ". " :PAR
       (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " ")
      (:ITEM NIL (:KWD NIL "test-function") " " :PAR (:PARAM NIL "Value")
       " is evaluated in the current lexical environment and should return a "
       (:TERM NIL "function") " of one argument, a " (:TERM NIL "condition")
       ", which returns " (:TERM NIL "true")
       " if the restart is to be considered visible. "
       (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " " :PAR))
     " " :PAR
     (:COMMENT NIL " \\label Examples::" " " "\\code"
      " (defun choose-an-interactive-restart ()" "   (restart-bind"
      "       ((optional-value"
      "          #'(lambda (&optional (x 'default)) x)"
      "          :report-function #'(lambda (stream)"
      "                               (format stream \"Return an optional value\")))\\kern-3pt"
      "        (return-value" "          #'identity"
      "          :report-function #'(lambda (stream)"
      "                               (format stream \"Return the given value\"))"
      "          :interactive-function #'(lambda ()"
      "                                    (format t \"Enter a value to return: \")"
      "                                  (list (eval (read))))))"
      "     (let ((cases (compute-restarts))"
      "           (*print-structure* t)" "           (index -1))"
      "       (dolist (case cases)"
      "         (format t \"~&~D: ~A~%\" (incf index) case))"
      "       (format t \"Please enter restart to invoke: \")"
      "       (invoke-restart-interactively (nth (eval (read)) cases)))))"
      "\\EV\\ CHOOSE-AN-INTERACTIVE-RESTART" " (choose-an-interactive-restart)"
      "\\EV\\ 0: Return an optional value" "1: Return the given value"
      "2: Abort to Lisp Top Level" "Please enter restart to invoke: 0"
      "DEFAULT" " (choose-an-interactive-restart)"
      "\\EV\\ 0: Return an optional value" "1: Return the given value"
      "2: Abort to Lisp Top Level" "Please enter restart to invoke: 1"
      "Enter a value to return: t" "T" "\\endcode")
     :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*query-io*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "restart-case") ", "
     (:MACREF NIL "with-simple-restart") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:MACREF NIL "restart-bind")
     " is primarily intended to be used to implement "
     (:MACREF NIL "restart-case")
     " and might be useful in implementing other macros. Programmers who are uncertain about whether to use "
     (:MACREF NIL "restart-case") " or " (:MACREF NIL "restart-bind")
     " should prefer " (:MACREF NIL "restart-case")
     " for the cases where it is powerful enough, using "
     (:MACREF NIL "restart-bind")
     " only in cases where its full generality is really needed. " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== RESTART-CASE")
   (:COM (:NAME "restart-case" :FTYPE "Macro") (:ISSUE NIL "DECLS-AND-DOC") " "
    :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "restart-case")
      (:ARGLIST NIL "restartable-form " (:CURLY NIL (:DOWN NIL "clause")))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " "
     (:BNF (:NAME "clause") "( case-name lambda-list " (:BR NIL) "  "
      (:INTERLEAVE NIL (:KWD NIL "interactive") " interactive-expression | "
       (:KWD NIL "report") " report-expression | " (:KWD NIL "test")
       " test-expression")
      " " (:BR NIL) "  " (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration")))
      " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))) ")")
     " " (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "restartable-form") "—a " (:TERM NIL "form") ". " :PAR
     (:PARAM NIL "case-name") "—a " (:TERM NIL "symbol") " or "
     (:MISC NIL "nil") ". " :PAR (:PARAM NIL "lambda-list") "—an "
     (:TERM NIL "ordinary lambda list") ". " :PAR
     (:PARAM NIL "interactive-expression") "—a " (:TERM NIL "symbol") " or a "
     (:TERM NIL "lambda expression") ". " :PAR (:PARAM NIL "report-expression")
     "—a " (:TERM NIL "string") ", a " (:TERM NIL "symbol") ", or a "
     (:TERM NIL "lambda expression") ". " :PAR (:PARAM NIL "test-expression")
     "—a " (:TERM NIL "symbol") " or a " (:TERM NIL "lambda expression") ". "
     :PAR (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR (:PARAM NIL "form")
     "—a " (:TERM NIL "form") ". " :PAR (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " resulting from the " (:TERM NIL "evaluation")
     " of " (:PARAM NIL "restartable-form") ", or the " (:TERM NIL "values")
     " returned by the last " (:PARAM NIL "form") " executed in a chosen "
     (:TERM NIL "clause") ", or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "restart-case")
     " evaluates " (:PARAM NIL "restartable-form") " in a "
     (:TERM NIL "dynamic environment")
     " where the clauses have special meanings as points to which control may be transferred. If "
     (:PARAM NIL "restartable-form")
     " finishes executing and returns any values, all values returned are returned by "
     (:MACREF NIL "restart-case") " and processing has completed. While "
     (:PARAM NIL "restartable-form")
     " is executing, any code may transfer control to one of the clauses (see "
     (:FUNREF NIL "invoke-restart")
     "). If a transfer occurs, the forms in the body of that clause is evaluated and any values returned by the last such form are returned by "
     (:MACREF NIL "restart-case")
     ". In this case, the dynamic state is unwound appropriately (so that the restarts established around the "
     (:PARAM NIL "restartable-form")
     " are no longer active) prior to execution of the clause. " :PAR
     "If there are no " (:PARAM NIL "forms") " in a selected clause, "
     (:MACREF NIL "restart-case") " returns " (:MISC NIL "nil") ". " :PAR "If "
     (:PARAM NIL "case-name") " is a " (:TERM NIL "symbol")
     ", it names this restart. " :PAR
     "It is possible to have more than one clause use the same "
     (:PARAM NIL "case-name")
     ". In this case, the first clause with that name is found by "
     (:FUNREF NIL "find-restart") ". The other clauses are accessible using "
     (:FUNREF NIL "compute-restarts") ". " :PAR "Each " (:PARAM NIL "arglist")
     " is an " (:TERM NIL "ordinary lambda list")
     " to be bound during the execution of its corresponding "
     (:PARAM NIL "forms") ". These parameters are used by the "
     (:MACREF NIL "restart-case")
     " clause to receive any necessary data from a call to "
     (:FUNREF NIL "invoke-restart") ". " :PAR "By default, "
     (:FUNREF NIL "invoke-restart-interactively")
     " passes no arguments and all arguments must be optional in order to accomodate interactive restarting. However, the arguments need not be optional if the "
     (:KWD NIL "interactive") " keyword has been used to inform "
     (:FUNREF NIL "invoke-restart-interactively")
     " about how to compute a proper argument list. " :PAR
     (:PARAM NIL "Keyword") " options have the following meaning. "
     (:LIST NIL
      (:ITEM NIL (:KWD NIL "interactive") " " :PAR "The " (:PARAM NIL "value")
       " supplied by " (:TT NIL ":interactive " (:PARAM NIL "value"))
       " must be a suitable argument to " (:SPECREF NIL "function") ". "
       (:TT NIL "(function " (:PARAM NIL "value") ")")
       " is evaluated in the current lexical environment. It should return a "
       (:TERM NIL "function")
       " of no arguments which returns arguments to be used by "
       (:FUNREF NIL "invoke-restart-interactively") " when it is invoked. "
       (:FUNREF NIL "invoke-restart-interactively")
       " is called in the dynamic environment available prior to any restart attempt, and uses "
       (:TERM NIL "query I/O") " for user interaction. " :PAR
       "If a restart is invoked interactively but no " (:KWD NIL "interactive")
       " option was supplied, the argument list used in the invocation is the empty list. "
       :PAR)
      (:ITEM NIL (:KWD NIL "report") " " :PAR "If the " (:PARAM NIL "value")
       " supplied by " (:TT NIL ":report " (:PARAM NIL "value")) " is a "
       (:TERM NIL "lambda expression") " or a " (:TERM NIL "symbol")
       ", it must be acceptable to " (:SPECREF NIL "function") ". "
       (:TT NIL "(function " (:PARAM NIL "value") ")")
       " is evaluated in the current lexical environment. It should return a "
       (:TERM NIL "function") " of one argument, a " (:TERM NIL "stream")
       ", which prints on the " (:TERM NIL "stream")
       " a description of the restart. This " (:TERM NIL "function")
       " is called whenever the restart is printed while "
       (:VARREF NIL "*print-escape*") " is " (:MISC NIL "nil") ". " :PAR "If "
       (:PARAM NIL "value") " is a " (:TERM NIL "string")
       ", it is a shorthand for " :PAR
       (:CODE NIL " (lambda (stream) (write-string value stream))
")
       " " :PAR
       "If a named restart is asked to report but no report information has been supplied, the name of the restart is used in generating default report text. "
       :PAR "When " (:VARREF NIL "*print-escape*") " is " (:MISC NIL "nil")
       ", the printer uses the report information for a restart. For example, a debugger might announce the action of typing a “continue” command by: "
       :PAR
       (:CODE NIL " (format t \"~&~S -- ~A~%\" ':continue some-restart)
")
       " which might then display as something like: " :PAR
       (:CODE NIL " :CONTINUE -- Return to command level
")
       " " :PAR
       "The consequences are unspecified if an unnamed restart is specified but no "
       (:KWD NIL "report") " option is provided. " :PAR
       (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " ")
      (:ITEM NIL (:KWD NIL "test") " " :PAR "The " (:PARAM NIL "value")
       " supplied by " (:TT NIL ":test " (:PARAM NIL "value"))
       " must be a suitable argument to " (:SPECREF NIL "function") ". "
       (:TT NIL "(function " (:PARAM NIL "value") ")")
       " is evaluated in the current lexical environment. It should return a "
       (:TERM NIL "function") " of one " (:TERM NIL "argument") ", the "
       (:TERM NIL "condition") ", that returns " (:TERM NIL "true")
       " if the restart is to be considered visible. " :PAR
       "The default for this option is equivalent to "
       (:TT NIL "(lambda (c) (declare (ignore c)) t)") ". "
       (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " "))
     " " :PAR (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " If the "
     (:PARAM NIL "restartable-form") " is a " (:TERM NIL "list") " whose "
     (:TERM NIL "car") " is any of the " (:TERM NIL "symbols") " "
     (:FUNREF NIL "signal") ", " (:FUNREF NIL "error") ", "
     (:FUNREF NIL "cerror") ", or " (:FUNREF NIL "warn") " (or is a "
     (:TERM NIL "macro form") " which macroexpands into such a "
     (:TERM NIL "list") "), then " (:MACREF NIL "with-condition-restarts")
     " is used implicitly to associate the indicated " (:TERM NIL "restarts")
     " with the " (:TERM NIL "condition") " to be signaled. "
     (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (restart-case
     (handler-bind ((error #'(lambda (c)
                             (declare (ignore condition))
                             (invoke-restart 'my-restart 7))))
       (error \"Foo.\"))
   (my-restart (&optional v) v))
→ 7

 (define-condition food-error (error) ())
→ FOOD-ERROR
 (define-condition bad-tasting-sundae (food-error) 
   ((ice-cream :initarg :ice-cream :reader bad-tasting-sundae-ice-cream)
    (sauce :initarg :sauce :reader bad-tasting-sundae-sauce)
    (topping :initarg :topping :reader bad-tasting-sundae-topping))
   (:report (lambda (condition stream)
              (format stream \"Bad tasting sundae with ~S, ~S, and ~S\"
                      (bad-tasting-sundae-ice-cream condition)
                      (bad-tasting-sundae-sauce condition)
                      (bad-tasting-sundae-topping condition)))))
→ BAD-TASTING-SUNDAE
 (defun all-start-with-same-letter (symbol1 symbol2 symbol3)
   (let ((first-letter (char (symbol-name symbol1) 0)))
     (and (eql first-letter (char (symbol-name symbol2) 0))
          (eql first-letter (char (symbol-name symbol3) 0)))))
→ ALL-START-WITH-SAME-LETTER
 (defun read-new-value ()
   (format t \"Enter a new value: \")
   (multiple-value-list (eval (read))))
→ READ-NEW-VALUE
 (defun verify-or-fix-perfect-sundae (ice-cream sauce topping)
   (do ()
      ((all-start-with-same-letter ice-cream sauce topping))
     (restart-case
       (error 'bad-tasting-sundae
              :ice-cream ice-cream
              :sauce sauce
              :topping topping)
       (use-new-ice-cream (new-ice-cream)
         :report \"Use a new ice cream.\"
         :interactive read-new-value  
         (setq ice-cream new-ice-cream))
       (use-new-sauce (new-sauce)
         :report \"Use a new sauce.\"
         :interactive read-new-value
         (setq sauce new-sauce))
       (use-new-topping (new-topping)
         :report \"Use a new topping.\"
         :interactive read-new-value
         (setq topping new-topping))))
   (values ice-cream sauce topping))
→ VERIFY-OR-FIX-PERFECT-SUNDAE
 (verify-or-fix-perfect-sundae 'vanilla 'caramel 'cherry)
⊳ Error: Bad tasting sundae with VANILLA, CARAMEL, and CHERRY.
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Use a new ice cream.
⊳  2: Use a new sauce.
⊳  3: Use a new topping.
⊳  4: Return to Lisp Toplevel.
⊳ Debug> "
      (:IN NIL ":continue 1") "
⊳ Use a new ice cream.
⊳ Enter a new value: "
      (:IN NIL "'chocolate") "
→ CHOCOLATE, CARAMEL, CHERRY
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "restart-bind") ", "
     (:MACREF NIL "with-simple-restart") ". " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (restart-case " (:I NIL "expression") "
    ("
      (:I NIL "name1") " " (:I NIL "arglist1") " ..." (:I NIL "options1")
      "... . " (:I NIL "body1") ")
    ("
      (:I NIL "name2") " " (:I NIL "arglist2") " ..." (:I NIL "options2")
      "... . " (:I NIL "body2") "))
")
     " is essentially equivalent to " :PAR
     (:CODE NIL " (block #1=#:g0001
   (let ((#2=#:g0002 nil))
        (tagbody
        (restart-bind ((name1 #'(lambda (&rest temp)
                                (setq #2# temp)
                                (go #3=#:g0003))
                          ..."
      (:I NIL "slightly-transformed-options1") "...)
                       (name2 #'(lambda (&rest temp)
                                (setq #2# temp)
                                (go #4=#:g0004))
                          ..."
      (:I NIL "slightly-transformed-options2") "...))
        (return-from #1# "
      (:I NIL "expression") "))
          #3# (return-from #1#
                  (apply #'(lambda "
      (:I NIL "arglist1") " . " (:I NIL "body1") ") #2#))
          #4# (return-from #1#
                  (apply #'(lambda "
      (:I NIL "arglist2") " . " (:I NIL "body2") ") #2#)))))
")
     " " :PAR
     "Unnamed restarts are generally only useful interactively and an interactive option which has no description is of little value. Implementations are encouraged to warn if an unnamed restart is used and no report information is provided at compilation time. At runtime, this error might be noticed when entering the debugger. Since signaling an error would probably cause recursive entry into the debugger (causing yet another recursive error, etc.) it is suggested that the debugger print some indication of such problems when they occur but not actually signal errors. "
     :PAR (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " "
     (:CODE NIL " (restart-case (signal fred)
   (a ...)
   (b ...))
 ≡
 (restart-case
     (with-condition-restarts fred 
                              (list (find-restart 'a) 
                                    (find-restart 'b))
       (signal fred))
   (a ...)
   (b ...))
")
     " " (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " " :PAR
     (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== RESTART-NAME")
   (:COM (:NAME "restart-name" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "restart-name")
      (:ARGLIST NIL "restart") (:VALUES NIL "name"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "restart") "—a "
     (:TERM NIL "restart") ". " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns the name of the "
     (:PARAM NIL "restart") ", or " (:MISC NIL "nil") " if the "
     (:PARAM NIL "restart") " is not named. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (restart-case 
     (loop for restart in (compute-restarts)
               collect (restart-name restart))
   (case1 () :report \"Return 1.\" 1)
   (nil   () :report \"Return 2.\" 2)
   (case3 () :report \"Return 3.\" 3)
   (case1 () :report \"Return 4.\" 4))
→ (CASE1 NIL CASE3 CASE1 ABORT)
 ;; In the example above the restart named ABORT was not created
 ;; explicitly, but was implicitly supplied by the system.
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "compute-restarts") " "
     (:FUNREF NIL "find-restart") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== WITH-CONDITION-RESTARTS") :PAR
   (:COM (:NAME "with-condition-restarts" :FTYPE "Macro")
    (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "with-condition-restarts")
      (:ARGLIST NIL "condition-form restarts-form "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "condition-form") "—a " (:TERM NIL "form") "; "
     (:TERM NIL "evaluated") " to produce a " (:PARAM NIL "condition") ". "
     :PAR (:PARAM NIL "condition") "—a " (:TERM NIL "condition") " "
     (:TERM NIL "object") " resulting from the " (:TERM NIL "evaluation")
     " of " (:PARAM NIL "condition-form") ". " :PAR (:PARAM NIL "restart-form")
     "—a " (:TERM NIL "form") "; " (:TERM NIL "evaluated") " to produce a "
     (:PARAM NIL "restart-list") ". " :PAR (:PARAM NIL "restart-list") "—a "
     (:TERM NIL "list") " of " (:TERM NIL "restart") " " (:TERM NIL "objects")
     " resulting from the " (:TERM NIL "evaluation") " of "
     (:PARAM NIL "restart-form") ". " :PAR (:PARAM NIL "forms") "—an "
     (:TERM NIL "implicit progn") "; evaluated. " :PAR (:PARAM NIL "results")
     "—the " (:TERM NIL "values") " returned by " (:PARAM NIL "forms") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR "First, the "
     (:PARAM NIL "condition-form") " and " (:PARAM NIL "restarts-form") " are "
     (:TERM NIL "evaluated") " in normal left-to-right order; the "
     (:TERM NIL "primary values") " yielded by these "
     (:TERM NIL "evaluations") " are respectively called the "
     (:PARAM NIL "condition") " and the " (:PARAM NIL "restart-list") ". " :PAR
     "Next, the " (:PARAM NIL "forms") " are " (:TERM NIL "evaluated") " in a "
     (:TERM NIL "dynamic environment") " in which each " (:TERM NIL "restart")
     " in " (:PARAM NIL "restart-list") " is associated with the "
     (:PARAM NIL "condition") ". See " (:SECREF NIL :ASSOC-RESTART-WITH-COND)
     ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "restart-case") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "Usually this " (:TERM NIL "macro")
     " is not used explicitly in code, since " (:MACREF NIL "restart-case")
     " handles most of the common cases in a way that is syntactically more concise. "
     :PAR (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== WITH-SIMPLE-RESTART")
   (:COM (:NAME "with-simple-restart" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "with-simple-restart")
      (:ARGLIST NIL
       (:PAREN NIL "name format-control "
        (:STAR NIL (:CURLY NIL (:PARAM NIL "format-argument"))))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "symbol") ". " :PAR
     (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
     (:PARAM NIL "format-control") "—a " (:TERM NIL "format control") ". "
     (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR
     (:PARAM NIL "format-argument") "—an " (:TERM NIL "object") " ("
     (:I NIL "i.e.") ",  a " (:TERM NIL "format argument") "). " :PAR
     (:PARAM NIL "forms") "—an " (:TERM NIL "implicit progn") ". " :PAR
     (:PARAM NIL "results") "—in the normal situation, the "
     (:TERM NIL "values") " returned by the " (:PARAM NIL "forms")
     "; in the exceptional situation where the " (:TERM NIL "restart")
     " named " (:PARAM NIL "name") " is invoked, two values—" (:MISC NIL "nil")
     " and " (:MISC NIL "t") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "with-simple-restart")
     " establishes a restart. " :PAR "If the restart designated by "
     (:PARAM NIL "name") " is not invoked while executing "
     (:PARAM NIL "forms") ", all values returned by the last of "
     (:PARAM NIL "forms") " are returned. If the restart designated by "
     (:PARAM NIL "name") " is invoked, control is transferred to "
     (:MACREF NIL "with-simple-restart") ", which returns two values, "
     (:MISC NIL "nil") " and " (:MISC NIL "t") ". " :PAR "If "
     (:PARAM NIL "name") " is " (:MISC NIL "nil")
     ", an anonymous restart is established. " :PAR "The "
     (:PARAM NIL "format-control") " and " (:PARAM NIL "format-arguments")
     " are used report the " (:TERM NIL "restart") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun read-eval-print-loop (level)
   (with-simple-restart (abort \"Exit command level ~D.\" level)
     (loop
       (with-simple-restart (abort \"Return to command level ~D.\" level)
         (let ((form (prog2 (fresh-line) (read) (fresh-line))))
           (prin1 (eval form)))))))
→ READ-EVAL-PRINT-LOOP
 (read-eval-print-loop 1)
 (+ 'a 3)
⊳ Error: The argument, A, to the function + was of the wrong type.
⊳        The function expected a number.
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Specify a value to use this time.
⊳  2: Return to command level 1.
⊳  3: Exit command level 1.
⊳  4: Return to Lisp Toplevel.
")
     " " :PAR
     (:CODE NIL " (defun compute-fixnum-power-of-2 (x)
   (with-simple-restart (nil \"Give up on computing 2^~D.\" x)
     (let ((result 1))
       (dotimes (i x result)
         (setq result (* 2 result))
         (unless (fixnump result)
           (error \"Power of 2 is too large.\"))))))
COMPUTE-FIXNUM-POWER-OF-2
 (defun compute-power-of-2 (x)
   (or (compute-fixnum-power-of-2 x) 'something-big))
COMPUTE-POWER-OF-2
 (compute-power-of-2 10)
1024
 (compute-power-of-2 10000)
⊳ Error: Power of 2 is too large.
⊳ To continue, type :CONTINUE followed by an option number.
⊳  1: Give up on computing 2^10000.
⊳  2: Return to Lisp Toplevel
⊳ Debug> "
      (:IN NIL ":continue 1") "
→ SOMETHING-BIG
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "restart-case") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:MACREF NIL "with-simple-restart")
     " is shorthand for one of the most common uses of "
     (:MACREF NIL "restart-case") ". " :PAR (:MACREF NIL "with-simple-restart")
     " could be defined by: " :PAR
     (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
     (:CODE NIL " (defmacro with-simple-restart ((restart-name format-control
                                              &rest format-arguments)
                                &body forms)
   `(restart-case (progn ,@forms)
      (,restart-name ()
          :report (lambda (stream)
                    (format stream ,format-control ,@format-arguments))
         (values nil t))))
")
     " " (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR
     "Because the second return value is " (:MISC NIL "t")
     " in the exceptional case, it is common (but not required) to arrange for the second return value in the normal case to be missing or "
     (:MISC NIL "nil") " so that the two situations can be distinguished. "
     :PAR))
   " " :PAR
   (:COMMENT NIL
    "-------------------- Pre-Defined Restarts --------------------")
   :PAR (:COMMENT NIL "%% ========== ABORT")
   (:COM (:NAME "abort" :FTYPE "Restart")
    (:PART (:NAME "Data Arguments Required") " " :PAR "None. " :PAR)
    (:PART (:NAME "Description") " " :PAR "The intent of the "
     (:MISC NIL "abort")
     " restart is to allow return to the innermost “command level.” Implementors are encouraged to make sure that there is always a restart named "
     (:FUNREF NIL "abort") " around any user code so that user code can call "
     (:FUNREF NIL "abort")
     " at any time and expect something reasonable to happen; exactly what the reasonable thing is may vary somewhat. Typically, in an interactive listener, the invocation of "
     (:FUNREF NIL "abort") " returns to the " (:TERM NIL "Lisp reader")
     " phase of the " (:TERM NIL "Lisp read-eval-print loop")
     ", though in some batch or multi-processing situations there may be situations in which having it kill the running process is more appropriate. "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :RESTARTS) ", "
     (:SECREF NIL :INTERFACES-TO-RESTARTS) ", " (:FUNREF NIL "invoke-restart")
     ", " (:FUNREF NIL "abort") " (" (:TERM NIL "function") ") " :PAR))
   :PAR (:COMMENT NIL "%% ========== CONTINUE")
   (:COM (:NAME "continue" :FTYPE "Restart")
    (:PART (:NAME "Data Arguments Required") " " :PAR "None. " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:MISC NIL "continue") " "
     (:TERM NIL "restart")
     " is generally part of protocols where there is a single “obvious” way to continue, such as in "
     (:FUNREF NIL "break") " and " (:FUNREF NIL "cerror")
     ". Some user-defined protocols may also wish to incorporate it for similar reasons. In general, however, it is more reliable to design a special purpose restart with a name that more directly suits the particular application. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (let ((x 3))
   (handler-bind ((error #'(lambda (c)
                             (let ((r (find-restart 'continue c)))
                               (when r (invoke-restart r))))))
     (cond ((not (floatp x))
            (cerror \"Try floating it.\" \"~D is not a float.\" x)
            (float x))
           (t x)))) → 3.0
")
     " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :RESTARTS) ", "
     (:SECREF NIL :INTERFACES-TO-RESTARTS) ", " (:FUNREF NIL "invoke-restart")
     ", " (:FUNREF NIL "continue") " (" (:TERM NIL "function") "), "
     (:MACREF NIL "assert") ", " (:FUNREF NIL "cerror") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== MUFFLE-WARNING")
   (:COM (:NAME "muffle-warning" :FTYPE "Restart")
    (:PART (:NAME "Data Arguments Required") " " :PAR "None. " :PAR)
    (:PART (:NAME "Description") " " :PAR "This " (:TERM NIL "restart")
     " is established by " (:FUNREF NIL "warn") " so that "
     (:TERM NIL "handlers") " of " (:TYPEREF NIL "warning") " "
     (:TERM NIL "conditions") " have a way to tell " (:FUNREF NIL "warn")
     " that a warning has already been dealt with and that no further action is warranted. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defvar *all-quiet* nil) → *ALL-QUIET*
 (defvar *saved-warnings* '()) → *SAVED-WARNINGS*
 (defun quiet-warning-handler (c)
   (when *all-quiet*
     (let ((r (find-restart 'muffle-warning c)))
       (when r 
         (push c *saved-warnings*)
         (invoke-restart r)))))
→ CUSTOM-WARNING-HANDLER
 (defmacro with-quiet-warnings (&body forms)
   `(let ((*all-quiet* t)
          (*saved-warnings* '()))
      (handler-bind ((warning #'quiet-warning-handler))
        ,@forms
        *saved-warnings*)))
→ WITH-QUIET-WARNINGS
 (setq saved
   (with-quiet-warnings
     (warn \"Situation #1.\")
     (let ((*all-quiet* nil))
       (warn \"Situation #2.\"))
     (warn \"Situation #3.\")))
⊳ Warning: Situation #2.
→ (#<SIMPLE-WARNING 42744421> #<SIMPLE-WARNING 42744365>)
 (dolist (s saved) (format t \"~&~A~%\" s))
⊳ Situation #3.
⊳ Situation #1.
→ NIL
")
     " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :RESTARTS) ", "
     (:SECREF NIL :INTERFACES-TO-RESTARTS) ", " (:FUNREF NIL "invoke-restart")
     ", " (:FUNREF NIL "muffle-warning") " (" (:TERM NIL "function") "), "
     (:FUNREF NIL "warn") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== STORE-VALUE")
   (:COM (:NAME "store-value" :FTYPE "Restart")
    (:PART (:NAME "Data Arguments Required") " " :PAR
     "a value to use instead (on an ongoing basis). " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:MISC NIL "store-value") " "
     (:TERM NIL "restart") " is generally used by " (:TERM NIL "handlers")
     " trying to recover from errors of " (:TERM NIL "types") " such as "
     (:TYPEREF NIL "cell-error") " or " (:TYPEREF NIL "type-error")
     ", which may wish to supply a replacement datum to be stored permanently. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun type-error-auto-coerce (c)
   (when (typep c 'type-error)
     (let ((r (find-restart 'store-value c)))
       (handler-case (let ((v (coerce (type-error-datum c)
                                      (type-error-expected-type c))))
                       (invoke-restart r v))
         (error ()))))) → TYPE-ERROR-AUTO-COERCE
 (let ((x 3))
   (handler-bind ((type-error #'type-error-auto-coerce))
     (check-type x float)
     x)) → 3.0
")
     " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :RESTARTS) ", "
     (:SECREF NIL :INTERFACES-TO-RESTARTS) ", " (:FUNREF NIL "invoke-restart")
     ", " (:FUNREF NIL "store-value") " (" (:TERM NIL "function") "), "
     (:MACREF NIL "ccase") ", " (:MACREF NIL "check-type") ", "
     (:MACREF NIL "ctypecase") ", " (:FUNREF NIL "use-value") " ("
     (:TERM NIL "function") " and " (:TERM NIL "restart") ") " :PAR))
   :PAR (:COMMENT NIL "%% ========== USE-VALUE")
   (:COM (:NAME "use-value" :FTYPE "Restart")
    (:PART (:NAME "Data Arguments Required") " " :PAR
     "a value to use instead (once). " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:MISC NIL "use-value") " "
     (:TERM NIL "restart") " is generally used by " (:TERM NIL "handlers")
     " trying to recover from errors of " (:TERM NIL "types") " such as "
     (:TYPEREF NIL "cell-error")
     ", where the handler may wish to supply a replacement datum for one-time use. "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :RESTARTS) ", "
     (:SECREF NIL :INTERFACES-TO-RESTARTS) ", " (:FUNREF NIL "invoke-restart")
     ", " (:FUNREF NIL "use-value") " (" (:TERM NIL "function") "), "
     (:FUNREF NIL "store-value") " (" (:TERM NIL "function") " and "
     (:TERM NIL "restart") ") " :PAR))
   :PAR
   (:COMMENT NIL "%% ========== ABORT" "%% ========== CONTINUE"
    "%% ========== MUFFLE-WARNING" "%% ========== STORE-VALUE"
    "%% ========== USE-VALUE")
   (:COM
    (:NAME "abort, continue, muffle-warning, store-value, use-value" :FTYPE
     "Function")
    (:IDXREF NIL "abort") (:IDXREF NIL "continue")
    (:IDXREF NIL "muffle-warning") (:IDXREF NIL "store-value")
    (:IDXREF NIL "use-value") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:COMMENT NIL
      "!!! KMP: Issue CONDITION-RESTARTS forgot to add the condition argument here,"
      "         but I have added it tentatively (pending x3j13 approval) since I'm "
      "         sure it was intended.  (MUFFLE-WARNING-CONDITION-ARGUMENT was the technical"
      "         issue that was raised to fix this, but it was never voted upon.)")
     :PAR (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " "
     (:DEF (:KIND "function" :NO-RETURN T) (:NAMES NIL "abort")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " condition"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "continue")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " condition")
      (:VALUES NIL (:MISC NIL "nil")))
     " "
     (:DEF (:KIND "function" :NO-RETURN T) (:NAMES NIL "muffle-warning")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " condition"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "store-value")
      (:ARGLIST NIL "value " (:KEYWORD NIL " &optional") " condition")
      (:VALUES NIL (:MISC NIL "nil")))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "use-value")
      (:ARGLIST NIL "value " (:KEYWORD NIL " &optional") " condition")
      (:VALUES NIL (:MISC NIL "nil")))
     " " (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "value") "—an "
     (:TERM NIL "object") ". " :PAR
     (:ISSUE NIL "MUFFLE-WARNING-CONDITION-ARGUMENT") " "
     (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " "
     (:PARAM NIL "condition") "—a " (:TERM NIL "condition") " "
     (:TERM NIL "object") ", or " (:MISC NIL "nil") ". "
     (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " "
     (:ENDISSUE NIL "MUFFLE-WARNING-CONDITION-ARGUMENT") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "Transfers control to the most recently established "
     (:TERM NIL "applicable restart")
     " having the same name as the function. That is, the "
     (:TERM NIL "function") " " (:FUNREF NIL "abort") " searches for an "
     (:TERM NIL "applicable") " " (:MISC NIL "abort") " " (:TERM NIL "restart")
     ", the " (:TERM NIL "function") " " (:FUNREF NIL "continue")
     " searches for an " (:TERM NIL "applicable") " " (:MISC NIL "continue")
     " " (:TERM NIL "restart") ", and so on. " :PAR "If no such "
     (:TERM NIL "restart") " exists, the functions " (:FUNREF NIL "continue")
     ", " (:FUNREF NIL "store-value") ", and " (:FUNREF NIL "use-value")
     " return " (:MISC NIL "nil") ", and the functions " (:FUNREF NIL "abort")
     " and " (:FUNREF NIL "muffle-warning") " signal an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "control-error") ". " :PAR
     (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " When "
     (:PARAM NIL "condition") " is " (:TERM NIL "non-nil") ", only those "
     (:TERM NIL "restarts")
     " are considered that are either explicitly associated with that "
     (:PARAM NIL "condition") ", or not associated with any "
     (:TERM NIL "condition") "; that is, the excluded " (:TERM NIL "restarts")
     " are those that are associated with a non-empty set of "
     (:TERM NIL "conditions") " of which the given " (:PARAM NIL "condition")
     " is not an " (:TERM NIL "element") ". If " (:PARAM NIL "condition")
     " is " (:MISC NIL "nil") ", all " (:TERM NIL "restarts")
     " are considered. "
     (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL ";;; Example of the ABORT retart

 (defmacro abort-on-error (&body forms)
   `(handler-bind ((error #'abort))
      ,@forms)) → ABORT-ON-ERROR
 (abort-on-error (+ 3 5)) → 8
 (abort-on-error (error \"You lose.\"))
⊳ Returned to Lisp Top Level.

;;; Example of the CONTINUE restart

 (defun real-sqrt (n)
   (when (minusp n)
     (setq n (- n))
     (cerror \"Return sqrt(~D) instead.\" \"Tried to take sqrt(-~D).\" n))
   (sqrt n))

 (real-sqrt 4) → 2
 (real-sqrt -9)
⊳ Error: Tried to take sqrt(-9).
⊳ To continue, type :CONTINUE followed by an option number:
⊳  1: Return sqrt(9) instead.
⊳  2: Return to Lisp Toplevel.
⊳ Debug> "
      (:IN NIL "(continue)") "
⊳ Return sqrt(9) instead.
→ 3
 
 (handler-bind ((error #'(lambda (c) (continue))))
   (real-sqrt -9)) → 3

;;; Example of the MUFFLE-WARNING restart

 (defun count-down (x)
   (do ((counter x (1- counter)))
       ((= counter 0) 'done)
     (when (= counter 1)
       (warn \"Almost done\"))
     (format t \"~&~D~%\" counter)))
→ COUNT-DOWN
 (count-down 3)
⊳ 3
⊳ 2
⊳ Warning: Almost done
⊳ 1
→ DONE
 (defun ignore-warnings-while-counting (x)
   (handler-bind ((warning #'ignore-warning))
     (count-down x)))
→ IGNORE-WARNINGS-WHILE-COUNTING
 (defun ignore-warning (condition)
   (declare (ignore condition))
   (muffle-warning))
→ IGNORE-WARNING
 (ignore-warnings-while-counting 3)
⊳ 3
⊳ 2
⊳ 1
→ DONE

;;; Example of the STORE-VALUE and USE-VALUE restarts

 (defun careful-symbol-value (symbol)
   (check-type symbol symbol)
   (restart-case (if (boundp symbol)
                     (return-from careful-symbol-value 
                                  (symbol-value symbol))
                     (error 'unbound-variable
                            :name symbol))
     (use-value (value)
       :report \"Specify a value to use this time.\"
       value)
     (store-value (value)
       :report \"Specify a value to store and use in the future.\"
       (setf (symbol-value symbol) value))))
 (setq a 1234) → 1234
 (careful-symbol-value 'a) → 1234
 (makunbound 'a) → A
 (careful-symbol-value 'a)
⊳ Error: A is not bound.
⊳ To continue, type :CONTINUE followed by an option number.
⊳  1: Specify a value to use this time.
⊳  2: Specify a value to store and use in the future.
⊳  3: Return to Lisp Toplevel.
⊳ Debug> "
      (:IN NIL "(use-value 12)") "
→ 12
 (careful-symbol-value 'a)
⊳ Error: A is not bound.
⊳ To continue, type :CONTINUE followed by an option number.
⊳   1: Specify a value to use this time.
⊳   2: Specify a value to store and use in the future.
⊳   3: Return to Lisp Toplevel.
⊳ Debug> "
      (:IN NIL "(store-value 24)") "
→ 24
 (careful-symbol-value 'a)
→ 24

;;; Example of the USE-VALUE restart

 (defun add-symbols-with-default (default &rest symbols)
   (handler-bind ((sys:unbound-symbol
                    #'(lambda (c)
                        (declare (ignore c)) 
                        (use-value default))))
     (apply #'+ (mapcar #'careful-symbol-value symbols))))
→ ADD-SYMBOLS-WITH-DEFAULT
 (setq x 1 y 2) → 2
 (add-symbols-with-default 3 'x 'y 'z) → 6


")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR
     "A transfer of control may occur if an appropriate " (:TERM NIL "restart")
     " is available, or (in the case of the " (:TERM NIL "function") " "
     (:FUNREF NIL "abort") " or the " (:TERM NIL "function") " "
     (:FUNREF NIL "muffle-warning") ") execution may be stopped. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "Each of these functions can be affected by the presence of a "
     (:TERM NIL "restart") " having the same name. " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If an appropriate "
     (:MISC NIL "abort") " " (:TERM NIL "restart") " is not available for the "
     (:TERM NIL "function") " " (:FUNREF NIL "abort") ", or an appropriate "
     (:MISC NIL "muffle-warning") " " (:TERM NIL "restart")
     " is not available for the " (:TERM NIL "function") " "
     (:FUNREF NIL "muffle-warning") ", an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "control-error") " is signaled. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "invoke-restart") ", "
     (:SECREF NIL :RESTARTS) ", " (:SECREF NIL :INTERFACES-TO-RESTARTS) ", "
     (:MACREF NIL "assert") ", " (:MACREF NIL "ccase") ", "
     (:FUNREF NIL "cerror") ", " (:MACREF NIL "check-type") ", "
     (:MACREF NIL "ctypecase") ", " (:FUNREF NIL "use-value") ", "
     (:FUNREF NIL "warn") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (abort condition) ≡ (invoke-restart 'abort)
 (muffle-warning)  ≡ (invoke-restart 'muffle-warning)
 (continue)        ≡ (let ((r (find-restart 'continue))) (if r (invoke-restart r)))
 (use-value "
      (:PARAM NIL "x")
      ") ≡ (let ((r (find-restart 'use-value))) (if r (invoke-restart r "
      (:PARAM NIL "x") ")))
 (store-value x) ≡ (let ((r (find-restart 'store-value))) (if r (invoke-restart r "
      (:PARAM NIL "x") ")))
")
     " " :PAR
     "No functions defined in this specification are required to provide a "
     (:MISC NIL "use-value") " " (:TERM NIL "restart") ". " :PAR))
   " ")
  " " :PAR)
 (:CHAPTER (:NUM "10" :TITLE ("Symbols") :NUMTAG :CHAP-TEN :NAMETAG :SYMBOLS)
  (:SECTION (:TITLE ("Symbol Concepts")) :PAR (:NEXTFIGURE (:CAPS T))
   " lists some " (:TERM NIL "defined names") " that are applicable to the "
   (:TERM NIL "property lists") " of " (:TERM NIL "symbols") ". " :PAR
   (:TABLE (:NAME ("Property list defined names"))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " get"))
     (:CELL NIL (:FUNREF NIL "remprop"))
     (:CELL NIL (:FUNREF NIL "symbol-plist"))))
   " " :PAR (:NEXTFIGURE (:CAPS T)) " lists some " (:TERM NIL "defined names")
   " that are applicable to the creation of and inquiry about "
   (:TERM NIL "symbols") ". " :PAR
   (:TABLE (:NAME ("Symbol creation and inquiry defined names"))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " copy-symbol"))
     (:CELL NIL (:FUNREF NIL "keywordp"))
     (:CELL NIL (:FUNREF NIL "symbol-package")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " gensym"))
     (:CELL NIL (:FUNREF NIL "make-symbol"))
     (:CELL NIL (:FUNREF NIL "symbol-value")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " gentemp"))
     (:CELL NIL (:FUNREF NIL "symbol-name")) (:CELL NIL)))
   " " :PAR)
  :PAR
  (:DICTIONARY NIL :PAR
   (:COMMENT NIL
    "!!! Sandra: Avoid talking about \"symbols in the foo package\""
    "      This is ambiguous.  Does it mean \"accessible in\", \"external in\", "
    "      \"whose home package is\", ...?")
   :PAR
   (:COMMENT NIL " Symbol Types" " Symbol Creation" " Symbol Accessors"
    " Symbol Properties" " Symbol Function/Value")
   :PAR (:COMMENT NIL "-------------------- Symbol Types --------------------")
   :PAR
   (:COM (:NAME "symbol" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "symbol") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 11.0.0 11" "% 10.3.0 2"
      "% 10.3.0 3                                " "%% 11.0.0 12"
      " Some stuff about INTERN, IMPORT, SHADOWING-IMPORT, UNINTERN, etc. was commented out.")
     :PAR (:TERM NIL "Symbols") " are used for their " (:TERM NIL "object")
     " identity to name various entities in " (:RM NIL " Common Lisp")
     ", including (but not limited to) linguistic entities such as "
     (:TERM NIL "variables") " and " (:TERM NIL "functions") ". " :PAR
     (:TERM NIL "Symbols") " can be collected together into "
     (:TERM NIL "packages") ". A " (:TERM NIL "symbol") " is said to be "
     (:TERM NIL "interned") " in a " (:TERM NIL "package") " if it is "
     (:TERM NIL "accessible") " in that " (:TERM NIL "package") "; the same "
     (:TERM NIL "symbol") " can be " (:TERM NIL "interned")
     " in more than one " (:TERM NIL "package") ". If a " (:TERM NIL "symbol")
     " is not " (:TERM NIL "interned") " in any " (:TERM NIL "package")
     ", it is called " (:TERM NIL "uninterned") ". " :PAR "An "
     (:TERM NIL "interned") " " (:TERM NIL "symbol")
     " is uniquely identifiable by its " (:TERM NIL "name") " from any "
     (:TERM NIL "package") " in which it is " (:TERM NIL "accessible") ". "
     :PAR
     (:COMMENT NIL
      "!!! Sandra: I REALLY dislike this terminology.  Can't we call these \"attributes\" "
      "     rather than \"components\" and leave out the discussion of \"cells\" entirely?")
     :PAR
     (:COMMENT NIL
      " My attempt at simplifying some of this convoluted discussion of ``cells''"
      " follows.  --sjl 16 Mar 92"
      "\\term{Symbols} have the following components, or \\term{cells}."
      "(In each case, it is \\term{implementation-dependent} how these \\term{cells}"
      "are represented.  For example, they might be explicitly represented as a ``slots''"
      "in the \\term{symbol} itself, or they might be represented as external associations "
      "between the \\term{symbol} and the \\term{cell} \\term{value} (if any) in some "
      "\\term{environment} or table, or in some cases they might not be explicitly"
      "represented at all.)")
     :PAR (:TERM NIL "Symbols") " have the following attributes. "
     (:COMMENT NIL
      "% \"historically\" => \"historical\" per Boyer/Kaufmann/Moore #11 (by X3J13 vote at May 4-5, 1994 meeting)"
      "% -kmp 9-May-94")
     "For historical reasons, these are sometimes referred to as "
     (:TERM NIL "cells") ", although the actual internal representation of "
     (:TERM NIL "symbols") " and their attributes is "
     (:TERM NIL "implementation-dependent") ". " :PAR
     (:LIST NIL
      (:ITEM NIL (:B NIL "Name") " " :PAR "The " (:TERM NIL "name") " of a "
       (:TERM NIL "symbol") " is a " (:TERM NIL "string")
       " used to identify the " (:TERM NIL "symbol") ". Every "
       (:TERM NIL "symbol") " has a " (:TERM NIL "name") ", "
       (:ISSUE NIL "CHARACTER-PROPOSAL:2-6-3")
       " and the consequences are undefined if that " (:TERM NIL "name")
       " is altered. " (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-6-3") " The "
       (:TERM NIL "name")
       " is used as part of the external, printed representation of the "
       (:TERM NIL "symbol") "; see " (:SECREF NIL :CHARACTER-SYNTAX) ". The "
       (:TERM NIL "function") " " (:FUNREF NIL "symbol-name") " returns the "
       (:TERM NIL "name") " of a given " (:TERM NIL "symbol") ". "
       (:ISSUE NIL "CHARACTER-PROPOSAL:2-6-2") " "
       (:COMMENT NIL
        "% I replaced this on suggestion of KAB.  It doesn't match CHARACTER-PROPOSAL 2.6.2,"
        "% so who knows how it got here. -kmp 21-Jan-92"
        " The \\term{characters} in a \\term{symbol}'s \\term{name} must be \\term{graphic},"
        " and may come from any supported \\term{character} \\term{repertoire}.")
       "A " (:TERM NIL "symbol") " may have any " (:TERM NIL "character")
       " in its " (:TERM NIL "name") ". "
       (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-6-2") " " :PAR
       (:COMMENT NIL "% 10.3.0 1" "% 10.0.0 3" "% 10.0.0 4" "% 10.1.0 1"
        "% 10.1.0 2" "% 10.1.0 3")
       :PAR
       (:COMMENT NIL "% 10.0.0 4" "% 10.3.0 4" "% 11.0.0 8" "% 11.0.0 10"
        "% 11.0.0 28"))
      (:ITEM NIL (:B NIL "Package") " " :PAR "The " (:TERM NIL "object")
       " in this " (:TERM NIL "cell") " is called the "
       (:TERM NIL "home package") " of the " (:TERM NIL "symbol") ". If the "
       (:TERM NIL "home package") " is " (:MISC NIL "nil") ", the "
       (:TERM NIL "symbol") " is sometimes said to have no "
       (:TERM NIL "home package") ". " :PAR "When a " (:TERM NIL "symbol")
       " is first created, it has no " (:TERM NIL "home package")
       ". When it is first " (:TERM NIL "interned") ", the "
       (:TERM NIL "package") " in which it is initially "
       (:TERM NIL "interned") " becomes its " (:TERM NIL "home package")
       ". The " (:TERM NIL "home package") " of a " (:TERM NIL "symbol")
       " can be " (:TERM NIL "accessed") " by using the "
       (:TERM NIL "function") " " (:FUNREF NIL "symbol-package") ". " :PAR
       "If a " (:TERM NIL "symbol") " is " (:TERM NIL "uninterned")
       " from the " (:TERM NIL "package") " which is its "
       (:TERM NIL "home package") ", its " (:TERM NIL "home package")
       " is set to " (:MISC NIL "nil")
       ". Depending on whether there is another " (:TERM NIL "package")
       " in which the " (:TERM NIL "symbol") " is " (:TERM NIL "interned")
       ", the symbol might or might not really be an " (:TERM NIL "uninterned")
       " " (:TERM NIL "symbol") ". A " (:TERM NIL "symbol") " with no "
       (:TERM NIL "home package") " is therefore called "
       (:TERM NIL "apparently uninterned") ". " :PAR
       (:ISSUE NIL "LISP-SYMBOL-REDEFINITION:MAR89-X3J13")
       " The consequences are undefined if an attempt is made to alter the "
       (:TERM NIL "home package") " of a " (:TERM NIL "symbol") " "
       (:COMMENT NIL "Added per Sandra -kmp 13-Dec-91"
        " ``accessible'' is wrong here -- sjl 16 Mar 92" "accessible")
       "external in the " (:PACKREF NIL "common-lisp") " "
       (:TERM NIL "package") " or the " (:PACKREF NIL "keyword") " "
       (:TERM NIL "package") ". "
       (:ENDISSUE NIL "LISP-SYMBOL-REDEFINITION:MAR89-X3J13") " " :PAR
       (:COMMENT NIL "% 10.1.0 4"))
      (:ITEM NIL (:B NIL "Property list") " " :PAR "The "
       (:TERM NIL "property list") " of a " (:TERM NIL "symbol")
       " provides a mechanism for associating named attributes with that "
       (:TERM NIL "symbol")
       ". The operations for adding and removing entries are "
       (:TERM NIL "destructive") " to the " (:TERM NIL "property list") ". "
       (:RM NIL " Common Lisp") " provides " (:TERM NIL "operators")
       " both for direct manipulation of " (:TERM NIL "property list") " "
       (:TERM NIL "objects") " (" (:I NIL "e.g.") ",  see "
       (:FUNREF NIL "getf") ", " (:MACREF NIL "remf") ", and "
       (:FUNREF NIL "symbol-plist") ") and for implicit manipulation of a "
       (:TERM NIL "symbol") "'s " (:TERM NIL "property list")
       " by reference to the " (:TERM NIL "symbol") " (" (:I NIL "e.g.")
       ",  see " (:FUNREF NIL "get") " and " (:FUNREF NIL "remprop") "). The "
       (:TERM NIL "property list") " associated with a " (:TERM NIL "fresh")
       " " (:TERM NIL "symbol") " is initially " (:TERM NIL "null") ". "
       (:COMMENT NIL
        "!!! Sandra: What about the property list of symbols in the COMMON-LISP package?")
       :PAR (:COMMENT NIL "% 10.0.0 8                  "))
      (:ITEM NIL (:B NIL "Value") " " :PAR
       (:COMMENT NIL
        "!!! Sandra: You could avoid this awkwardness [in sentence 1] by not talking about"
        "     cells at all!  All you have to say is:"
        "      \"If a symbol has a value attribute, it is said to be bound ...\""
        "!!! KAB: Does this first sentence really have to be said?"
        " My attempt at rewording this is below.  --sjl 16 Mar 92"
        "Conceptually, every \\term{symbol} has a \\term{value cell}, although"
        "no \\term{implementation} is required to explicitly represent it as an \\term{object}."
        "A \\term{symbol}'s \\term{value cell} might or might not contain an \\term{object}."
        "If it does contain an \\term{object}, it is said to be \\term{bound},")
       "If a symbol has a value attribute, it is said to be "
       (:TERM NIL "bound") ", and that fact can be detected by the "
       (:TERM NIL "function") " " (:FUNREF NIL "boundp") ". The "
       (:TERM NIL "object") " contained in the " (:TERM NIL "value cell")
       " of a " (:TERM NIL "bound") " " (:TERM NIL "symbol") " is the "
       (:TERM NIL "value") " of the " (:TERM NIL "global variable")
       " named by that " (:TERM NIL "symbol") ", and can be "
       (:TERM NIL "accessed") " by the " (:TERM NIL "function") " "
       (:FUNREF NIL "symbol-value") ". A " (:TERM NIL "symbol")
       " can be made to be " (:TERM NIL "unbound") " by the "
       (:TERM NIL "function") " " (:FUNREF NIL "makunbound") ". " :PAR
       "The consequences are undefined if an attempt is made to change the "
       (:TERM NIL "value") " of a " (:TERM NIL "symbol") " that names a "
       (:TERM NIL "constant variable") ", or to make such a "
       (:TERM NIL "symbol") " be " (:TERM NIL "unbound") ". " :PAR)
      (:ITEM NIL (:B NIL "Function") " " :PAR
       (:COMMENT NIL "!!! Sandra: See comment on \"Value\" above."
        "!!! KAB: Does this first sentence really have to be said?"
        " My attempt at rewording this is below.  --sjl 16 Mar 92"
        "Conceptually, every \\term{symbol} has a \\term{function cell}, although"
        "no \\term{implementation} is required to explicitly represent it as an \\term{object}."
        "A \\term{symbol}'s \\term{function cell} might or might not contain an \\term{object}."
        "If it does contain an \\term{object}, it is said to be \\term{fbound}, ")
       "If a symbol has a function attribute, it is said to be "
       (:TERM NIL "fbound") ", and that fact can be detected by the "
       (:TERM NIL "function") " " (:FUNREF NIL "fboundp") ". If the "
       (:TERM NIL "symbol") " is the " (:TERM NIL "name") " of a "
       (:TERM NIL "function") " in the " (:TERM NIL "global environment")
       ", the " (:TERM NIL "function cell") " contains the "
       (:TERM NIL "function") ", and can be " (:TERM NIL "accessed") " by the "
       (:TERM NIL "function") " " (:FUNREF NIL "symbol-function") ". If the "
       (:TERM NIL "symbol") " is the " (:TERM NIL "name") " of either a "
       (:TERM NIL "macro") " in the " (:TERM NIL "global environment") " (see "
       (:FUNREF NIL "macro-function") ") or a " (:TERM NIL "special operator")
       " (see " (:FUNREF NIL "special-operator-p") "), the "
       (:TERM NIL "symbol") " is " (:TERM NIL "fbound") ", and can be "
       (:TERM NIL "accessed") " by the " (:TERM NIL "function") " "
       (:FUNREF NIL "symbol-function") ", but the " (:TERM NIL "object")
       " which the " (:TERM NIL "function cell") " contains is of "
       (:TERM NIL "implementation-dependent") " " (:TERM NIL "type")
       " and purpose. A " (:TERM NIL "symbol") " can be made to be "
       (:TERM NIL "funbound") " by the " (:TERM NIL "function") " "
       (:FUNREF NIL "fmakunbound") ". " :PAR
       "The consequences are undefined if an attempt is made to change the "
       (:TERM NIL "functional value") " of a " (:TERM NIL "symbol")
       " that names a " (:TERM NIL "special form") ". " :PAR))
     " " :PAR "Operations on a " (:TERM NIL "symbol") "'s "
     (:TERM NIL "value cell") " and " (:TERM NIL "function cell")
     " are sometimes described in terms of their effect on the "
     (:TERM NIL "symbol")
     " itself, but the user should keep in mind that there is an intimate relationship between the contents of those "
     (:TERM NIL "cells") " and the " (:TERM NIL "global variable")
     " or global " (:TERM NIL "function") " definition, respectively. " :PAR
     (:TERM NIL "Symbols") " are used as identifiers for "
     (:TERM NIL "lexical variables") " and lexical " (:TERM NIL "function")
     " definitions, but in that role, only their " (:TERM NIL "object")
     " identity is significant. " (:RM NIL " Common Lisp")
     " provides no operation on a " (:TERM NIL "symbol")
     " that can have any effect on a " (:TERM NIL "lexical variable")
     " or on a lexical " (:TERM NIL "function") " definition. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :SYMBOL-TOKENS) ", "
     (:SECREF NIL :POTENTIAL-NUMBERS-AS-TOKENS) ", "
     (:SECREF NIL :PRINTING-SYMBOLS) " " :PAR))
   :PAR
   (:COM (:NAME "keyword" :FTYPE "Type")
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "keyword") ", "
     (:TYPEREF NIL "symbol") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "keyword") " includes all " (:TERM NIL "symbols") " "
     (:TERM NIL "interned") " the " (:PACKREF NIL "keyword") " "
     (:TERM NIL "package") ". " :PAR
     (:COMMENT NIL "!!! Non-standard use of \"intern\"?")
     (:TERM NIL "Interning") " a " (:TERM NIL "symbol") " in the "
     (:PACKREF NIL "keyword") " " (:TERM NIL "package")
     " has three automatic effects: " :PAR
     (:LIST NIL
      (:ITEM NIL "1. It causes the " (:TERM NIL "symbol") " to become "
       (:TERM NIL "bound") " to itself. ")
      (:ITEM NIL "2. It causes the " (:TERM NIL "symbol") " to become an "
       (:TERM NIL "external symbol") " of the " (:PACKREF NIL "keyword") " "
       (:TERM NIL "package") ". ")
      (:ITEM NIL "3. It causes the " (:TERM NIL "symbol") " to become a "
       (:TERM NIL "constant variable") ". "))
     " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "keywordp") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== SYMBOLP")
   (:COM (:NAME "symbolp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "symbolp") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 4") "Returns "
     (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "symbol") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (symbolp 'elephant) → " (:TERM NIL "true") "
 (symbolp 12) → "
      (:TERM NIL "false") "
 (symbolp nil) → "
      (:TERM NIL "true") "
 (symbolp '()) → "
      (:TERM NIL "true") "
 (symbolp :test) → "
      (:TERM NIL "true") "
 (symbolp \"hello\") → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "keywordp") ", "
     (:TYPEREF NIL "symbol") ", " (:FUNREF NIL "typep") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (symbolp " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'symbol)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== KEYWORDP")
   (:COM (:NAME "keywordp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "keywordp") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 10.3.0 15")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is a "
     (:TERM NIL "keyword") (:SUB NIL "1") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (keywordp 'elephant) → " (:TERM NIL "false") "
 (keywordp 12) → "
      (:TERM NIL "false") "
 (keywordp :test) → "
      (:TERM NIL "true") "
 (keywordp ':test) → "
      (:TERM NIL "true") "
 (keywordp nil) → "
      (:TERM NIL "false") "
 (keywordp :nil) → "
      (:TERM NIL "true") "
 (keywordp '(:test)) → "
      (:TERM NIL "false") "
 (keywordp \"hello\") → "
      (:TERM NIL "false") "
 (keywordp \":hello\") → "
      (:TERM NIL "false") "
 (keywordp '&optional) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "constantp") ", "
     (:TYPEREF NIL "keyword") ", " (:FUNREF NIL "symbolp") ", "
     (:FUNREF NIL "symbol-package") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Symbol Creation --------------------")
   :PAR (:COMMENT NIL "%% ========== MAKE-SYMBOL")
   (:COM (:NAME "make-symbol" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-symbol") (:ARGLIST NIL "name")
      (:VALUES NIL "new-symbol"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL
      "\"simple string\" => \"string\" per Barrett. -kmp 14-Feb-92")
     (:PARAM NIL "name") "—a " (:TERM NIL "string") ". " :PAR
     (:PARAM NIL "new-symbol") "—a " (:TERM NIL "fresh") ", "
     (:TERM NIL "uninterned") " " (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 10.3.0 5")
     (:FUNREF NIL "make-symbol") " creates and returns a " (:TERM NIL "fresh")
     ", " (:TERM NIL "uninterned") " " (:TERM NIL "symbol") " whose "
     (:TERM NIL "name") " is the given " (:PARAM NIL "name") ". The "
     (:PARAM NIL "new-symbol") " is neither " (:TERM NIL "bound") " nor "
     (:TERM NIL "fbound") " and has a " (:TERM NIL "null") " "
     (:TERM NIL "property list") ". " :PAR (:COMMENT NIL "% 10.3.0 6") "It is "
     (:TERM NIL "implementation-dependent") " whether the "
     (:TERM NIL "string") " that becomes the " (:PARAM NIL "new-symbol") "'s "
     (:TERM NIL "name") " is the given " (:PARAM NIL "name")
     " or a copy of it. Once a " (:TERM NIL "string") " has been given as the "
     (:PARAM NIL "name") " " (:TERM NIL "argument") " to "
     (:FUNREF NIL "make-symbol")
     ", the consequences are undefined if a subsequent attempt is made to alter that "
     (:TERM NIL "string") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq temp-string \"temp\") → \"temp\"
 (setq temp-symbol (make-symbol temp-string)) → #:|temp|
 (symbol-name temp-symbol) → \"temp\"
 (eq (symbol-name temp-symbol) temp-string) → "
      (:TERM NIL "implementation-dependent") "
 (find-symbol \"temp\") → NIL, NIL
 (eq (make-symbol temp-string) (make-symbol temp-string)) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR
     (:COMMENT NIL " This sentence seems totally misplaced.  --sjl 16 Mar 92"
      "The \\term{value} of the \\term{place} named by \\param{index}, if any, is modified.")
     :PAR
     (:COMMENT NIL "% Sandra thinks this is excessive."
      "Creates a \\term{fresh} \\term{symbol}.")
     :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL
      "\"simple string\" => \"string\" per Barrett. -kmp 14-Feb-92")
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "name") " is not a "
     (:TERM NIL "string") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "copy-symbol") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "No attempt is made by "
     (:FUNREF NIL "make-symbol") " to convert the case of the "
     (:TERM NIL "name")
     " to uppercase. The only case conversion which ever occurs for "
     (:TERM NIL "symbols") " is done by the " (:TERM NIL "Lisp reader")
     ". The program interface to " (:TERM NIL "symbol")
     " creation retains case, and the program interface to interning symbols is case-sensitive. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== COPY-SYMBOL")
   (:COM (:NAME "copy-symbol" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "copy-symbol")
      (:ARGLIST NIL "symbol " (:KEYWORD NIL " &optional") " copy-properties")
      (:VALUES NIL "new-symbol"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbol") "—a "
     (:TERM NIL "symbol") ". " :PAR (:PARAM NIL "copy-properties") "—a "
     (:TERM NIL "generalized boolean") ". The default is " (:TERM NIL "false")
     ". " :PAR (:PARAM NIL "new-symbol") "—a " (:TERM NIL "fresh") ", "
     (:TERM NIL "uninterned") " " (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 10.3.0 8")
     (:ISSUE NIL "COPY-SYMBOL-PRINT-NAME:EQUAL") " "
     (:FUNREF NIL "copy-symbol") " returns a " (:TERM NIL "fresh") ", "
     (:TERM NIL "uninterned") " " (:TERM NIL "symbol") ", the "
     (:TERM NIL "name") " of which is " (:FUNREF NIL "string=")
     " to and possibly the " (:TERM NIL "same") " as the " (:TERM NIL "name")
     " of the given " (:PARAM NIL "symbol") ". "
     (:ENDISSUE NIL "COPY-SYMBOL-PRINT-NAME:EQUAL") " " :PAR "If "
     (:PARAM NIL "copy-properties") " is " (:TERM NIL "false") ", the "
     (:PARAM NIL "new-symbol") " is neither " (:TERM NIL "bound") " nor "
     (:TERM NIL "fbound") " and has a " (:TERM NIL "null") " "
     (:TERM NIL "property list") ". If " (:PARAM NIL "copy-properties") " is "
     (:TERM NIL "true") ", then the initial " (:TERM NIL "value") " of "
     (:PARAM NIL "new-symbol") " is the " (:TERM NIL "value") " of "
     (:PARAM NIL "symbol") ", the initial " (:TERM NIL "function")
     " definition of " (:PARAM NIL "new-symbol") " is the "
     (:TERM NIL "functional value") " of " (:PARAM NIL "symbol") ", and the "
     (:TERM NIL "property list") " of " (:PARAM NIL "new-symbol") " is "
     (:ISSUE NIL "COPY-SYMBOL-COPY-PLIST:COPY-LIST") " a " (:TERM NIL "copy")
     (:SUB NIL "2") " of the " (:TERM NIL "property list") " of "
     (:PARAM NIL "symbol") ". "
     (:ENDISSUE NIL "COPY-SYMBOL-COPY-PLIST:COPY-LIST") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq fred 'fred-smith) → FRED-SMITH
 (setf (symbol-value fred) 3) → 3
 (setq fred-clone-1a (copy-symbol fred nil)) → #:FRED-SMITH
 (setq fred-clone-1b (copy-symbol fred nil)) → #:FRED-SMITH
 (setq fred-clone-2a (copy-symbol fred t))   → #:FRED-SMITH
 (setq fred-clone-2b (copy-symbol fred t))   → #:FRED-SMITH
 (eq fred fred-clone-1a) → "
      (:TERM NIL "false") "
 (eq fred-clone-1a fred-clone-1b) → "
      (:TERM NIL "false") "
 (eq fred-clone-2a fred-clone-2b) → "
      (:TERM NIL "false") "
 (eq fred-clone-1a fred-clone-2a) → "
      (:TERM NIL "false") "
 (symbol-value fred) → 3
 (boundp fred-clone-1a) → "
      (:TERM NIL "false") "
 (symbol-value fred-clone-2a) → 3
 (setf (symbol-value fred-clone-2a) 4) → 4
 (symbol-value fred) → 3
 (symbol-value fred-clone-2a) → 4
 (symbol-value fred-clone-2b) → 3
 (boundp fred-clone-1a) → "
      (:TERM NIL "false") "
 (setf (symbol-function fred) #'(lambda (x) x)) → #<FUNCTION anonymous>
 (fboundp fred) → "
      (:TERM NIL "true") "
 (fboundp fred-clone-1a) → "
      (:TERM NIL "false") "
 (fboundp fred-clone-2a) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR
     (:COMMENT NIL "% Sandra thinks this is excessive."
      "Creates a \\term{fresh} \\term{symbol}.")
     :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "symbol") " is not a "
     (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-symbol") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "Implementors are encouraged not to copy the " (:TERM NIL "string")
     " which is the " (:TERM NIL "symbol") "'s " (:TERM NIL "name")
     " unnecessarily. Unless there is a good reason to do so, the normal implementation strategy is for the "
     (:PARAM NIL "new-symbol") "'s " (:TERM NIL "name") " to be "
     (:TERM NIL "identical") " to the given " (:PARAM NIL "symbol") "'s "
     (:TERM NIL "name") ". " :PAR
     (:COMMENT NIL
      "% Barrett: This is only true if the implementation of MAKE-SYMBOL "
      "   doesn't copy, which it might." " \\code"
      " (copy-symbol \\param{x} nil) \\EQ (make-symbol (symbol-name \\param{x}))"
      " \\endcode")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== GENSYM")
   (:COM (:NAME "gensym" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "gensym")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " x")
      (:VALUES NIL "new-symbol"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "x") "—a "
     (:TERM NIL "string") " or a non-negative " (:TERM NIL "integer")
     ". Complicated defaulting behavior; see below. " :PAR
     (:PARAM NIL "new-symbol") "—a " (:TERM NIL "fresh") ", "
     (:TERM NIL "uninterned") " " (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 10.3.0 9" "% 10.3.0 10" "% 10.3.0 11") :PAR
     "Creates and returns a " (:TERM NIL "fresh") ", " (:TERM NIL "uninterned")
     " " (:TERM NIL "symbol") ", as if by calling " (:FUNREF NIL "make-symbol")
     ". (The only difference between " (:FUNREF NIL "gensym") " and "
     (:FUNREF NIL "make-symbol") " is in how the " (:PARAM NIL "new-symbol")
     "'s " (:TERM NIL "name") " is determined.) " :PAR "The "
     (:TERM NIL "name") " of the " (:PARAM NIL "new-symbol")
     " is the concatenation of a prefix, which defaults to " (:TT NIL "\"G\"")
     ", and " (:ISSUE NIL "GENSYM-NAME-STICKINESS:LIKE-TEFLON")
     " a suffix, which is the decimal representation of a number that defaults to the "
     (:TERM NIL "value") " of " (:VARREF NIL "*gensym-counter*") ". " :PAR
     "If " (:PARAM NIL "x") " is supplied, and is a " (:TERM NIL "string")
     ", then that " (:TERM NIL "string") " is used as a prefix instead of "
     (:TT NIL "\"G\"") " for this call to " (:FUNREF NIL "gensym") " only. "
     :PAR "If " (:PARAM NIL "x") " is supplied, and is an "
     (:TERM NIL "integer") ", then that " (:TERM NIL "integer")
     ", instead of the " (:TERM NIL "value") " of "
     (:VARREF NIL "*gensym-counter*")
     ", is used as the suffix for this call to " (:FUNREF NIL "gensym")
     " only. " :PAR "If and only if no explicit suffix is supplied, "
     (:VARREF NIL "*gensym-counter*") " is incremented after it is used. "
     (:ENDISSUE NIL "GENSYM-NAME-STICKINESS:LIKE-TEFLON") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq sym1 (gensym)) → #:G3142
 (symbol-package sym1) → NIL
 (setq sym2 (gensym 100)) → #:G100
 (setq sym3 (gensym 100)) → #:G100
 (eq sym2 sym3) → "
      (:TERM NIL "false") "
 (find-symbol \"G100\") → NIL, NIL
 (gensym \"T\") → #:T3143
 (gensym) → #:G3144
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR
     (:COMMENT NIL "% Sandra thinks this is excessive."
      "Creates a \\term{fresh} \\term{symbol}.")
     :PAR "Might increment " (:VARREF NIL "*gensym-counter*") ". " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*gensym-counter*") " "
     :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "x") " is not a "
     (:TERM NIL "string") " or a non-negative " (:TERM NIL "integer") ". "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "gentemp") ", "
     (:VARREF NIL "*gensym-counter*") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "The ability to pass a numeric argument to " (:FUNREF NIL "gensym")
     " has been deprecated; explicitly " (:TERM NIL "binding") " "
     (:VARREF NIL "*gensym-counter*")
     " is now stylistically preferred. (The somewhat baroque conventions for the optional argument are historical in nature, and supported primarily for compatibility with older dialects of "
     (:RM NIL " Lisp")
     ". In modern code, it is recommended that the only kind of argument used be a string prefix. In general, though, to obtain more flexible control of the "
     (:PARAM NIL "new-symbol") "'s " (:TERM NIL "name") ", consider using "
     (:FUNREF NIL "make-symbol") " instead.) " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *GENSYM-COUNTER*")
   (:COM (:NAME "*gensym-counter*" :FTYPE "Variable")
    (:ISSUE NIL "GENSYM-NAME-STICKINESS:LIKE-TEFLON") " " :PAR
    (:PART (:NAME "Value Type") " " :PAR "a non-negative "
     (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR
     (:COMMENT NIL
      "A non-negative \\term{integer}, the magnitude of which is ")
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "A number which will be used in constructing the " (:TERM NIL "name")
     " of the next " (:TERM NIL "symbol") " generated by the "
     (:TERM NIL "function") " " (:FUNREF NIL "gensym") ". " :PAR
     (:VARREF NIL "*gensym-counter*") " can be either " (:TERM NIL "assigned")
     " or " (:TERM NIL "bound")
     " at any time, but its value must always be a non-negative "
     (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:FUNREF NIL "gensym") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "gensym") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "The ability to pass a numeric argument to " (:FUNREF NIL "gensym")
     " has been deprecated; explicitly " (:TERM NIL "binding") " "
     (:VARREF NIL "*gensym-counter*") " is now stylistically preferred. "
     (:ENDISSUE NIL "GENSYM-NAME-STICKINESS:LIKE-TEFLON") " "))
   " " :PAR (:COMMENT NIL "%% ========== GENTEMP")
   (:COM (:NAME "gentemp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "gentemp")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " prefix package")
      (:VALUES NIL "new-symbol"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "prefix") "—a "
     (:TERM NIL "string") ". The default is " (:TT NIL "\"T\"") ". " :PAR
     (:PARAM NIL "package") "—a " (:TERM NIL "package designator")
     ". The default is the " (:TERM NIL "current package") ". " :PAR
     (:PARAM NIL "new-symbol") "—a " (:TERM NIL "fresh") ", "
     (:TERM NIL "interned") " " (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 10.3.0 14")
     (:FUNREF NIL "gentemp") " creates and returns a " (:TERM NIL "fresh") " "
     (:TERM NIL "symbol") ", " (:TERM NIL "interned") " in the indicated "
     (:PARAM NIL "package") ". "
     (:COMMENT NIL
      "The \\term{symbol} is guaranteed to be one that did not previously "
      "exist in \\param{package}. ")
     "The " (:TERM NIL "symbol")
     " is guaranteed to be one that was not previously "
     (:TERM NIL "accessible") " in " (:PARAM NIL "package") ". It is neither "
     (:TERM NIL "bound") " nor " (:TERM NIL "fbound") ", and has a "
     (:TERM NIL "null") " " (:TERM NIL "property list") ". " :PAR "The "
     (:TERM NIL "name") " of the " (:PARAM NIL "new-symbol")
     " is the concatenation of the " (:PARAM NIL "prefix")
     " and a suffix, which is taken from an internal counter used only by "
     (:FUNREF NIL "gentemp") ". (If a " (:TERM NIL "symbol") " by that name "
     (:COMMENT NIL
      " already exists in \\param{package}, the counter is incremented as")
     "is already " (:TERM NIL "accessible") " in " (:PARAM NIL "package")
     ", the counter is incremented as many times as is necessary to produce a "
     (:TERM NIL "name") " that is not already the " (:TERM NIL "name") " of a "
     (:TERM NIL "symbol") " " (:TERM NIL "accessible") " in "
     (:PARAM NIL "package") ".) " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (gentemp) → T1298
 (gentemp \"FOO\") → FOO1299
 (find-symbol \"FOO1300\") → NIL, NIL
 (gentemp \"FOO\") → FOO1300
 (find-symbol \"FOO1300\") → FOO1300, :INTERNAL
 (intern \"FOO1301\") → FOO1301, :INTERNAL
 (gentemp \"FOO\") → FOO1302
 (gentemp) → T1303
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR
     "Its internal counter is incremented one or more times. " :PAR
     (:TERM NIL "Interns") " the " (:PARAM NIL "new-symbol") " in "
     (:PARAM NIL "package") ". " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "The current state of its internal counter, and the current state of the "
     (:PARAM NIL "package") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "prefix") " is not a "
     (:TERM NIL "string") ". Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "package") " is not a "
     (:TERM NIL "package designator") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "gensym") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The function " (:FUNREF NIL "gentemp")
     " is deprecated. " :PAR "If " (:PARAM NIL "package") " is the "
     (:PACKREF NIL "keyword") " " (:TERM NIL "package") ", the result is an "
     (:TERM NIL "external symbol") " of " (:PARAM NIL "package")
     ". Otherwise, the result is an " (:TERM NIL "internal symbol") " of "
     (:PARAM NIL "package") ". " :PAR "The " (:FUNREF NIL "gentemp")
     " internal counter is independent of " (:VARREF NIL "*gensym-counter*")
     ", the counter used by " (:FUNREF NIL "gensym")
     ". There is no provision for accessing the " (:FUNREF NIL "gentemp")
     " internal counter. " :PAR "Just because " (:FUNREF NIL "gentemp")
     " creates a " (:TERM NIL "symbol")
     " which did not previously exist does not mean that such a "
     (:TERM NIL "symbol") " might not be seen in the future (" (:I NIL "e.g.")
     ",  in a data file—perhaps even created by the same program in another session). As such, this symbol is not truly unique in the same sense as a "
     (:TERM NIL "gensym")
     " would be. In particular, programs which do automatic code generation should be careful not to attach global attributes to such generated "
     (:TERM NIL "symbols") " (" (:I NIL "e.g.") ",  " (:DECLREF NIL "special")
     " " (:TERM NIL "declarations")
     ") and then write them into a file because such global attributes might, in a different session, end up applying to other "
     (:TERM NIL "symbols")
     " that were automatically generated on another day for some other purpose. "
     :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Symbol Accessors --------------------")
   :PAR (:COMMENT NIL "%% ========== SYMBOL-FUNCTION")
   (:COM (:NAME "symbol-function" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "symbol-function")
      (:ARGLIST NIL "symbol") (:VALUES NIL "contents"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "symbol-function")
      (:ARGLIST NIL "symbol") (:NEW-VALUE NIL "new-contents"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " "
     (:COMMENT NIL
      " The symbol need not be fbound for the SETF form.  --sjl 16 Mar 92"
      "\\param{symbol}---an \\term{fbound} \\term{symbol}.")
     (:PARAM NIL "symbol") "—a " (:TERM NIL "symbol") ". "
     (:ENDISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR
     (:PARAM NIL "contents") "— " (:ISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88")
     " If the " (:PARAM NIL "symbol") " is globally defined as a "
     (:TERM NIL "macro") " or a " (:TERM NIL "special operator") ", "
     (:COMMENT NIL "% Removed per Barrett. -kmp 14-Feb-92"
      "and if the \\param{symbol} is \\term{fbound}, ")
     "an " (:TERM NIL "object") " of " (:TERM NIL "implementation-dependent")
     " nature and identity is returned. If the " (:PARAM NIL "symbol")
     " is not globally defined as either a " (:TERM NIL "macro") " or a "
     (:TERM NIL "special operator") ", and if the " (:PARAM NIL "symbol")
     " is " (:TERM NIL "fbound") ", a " (:TERM NIL "function") " "
     (:TERM NIL "object") " is returned. "
     (:ENDISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR
     (:ISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " "
     (:PARAM NIL "new-contents") "—a " (:TERM NIL "function") ". "
     (:ENDISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " "
     (:COMMENT NIL "% This shouldn't be needed, actually."
      " \\issue{FUNCTION-TYPE:X3J13-MARCH-88}"
      " The consequences of attempting to make the global \\term{function} definition"
      " of a \\term{symbol} be a \\term{symbol}, a \\term{list}, or the value returned"
      " by \\funref{symbol-function} on the name of a \\term{macro} or a"
      " \\term{special form} are unspecified."
      " \\endissue{FUNCTION-TYPE:X3J13-MARCH-88}")
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.1.1 14")
     (:TERM NIL "Accesses") " the " (:TERM NIL "symbol") "'s "
     (:TERM NIL "function cell") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:COMMENT NIL
      "Some examples involving FBOUNDP simplified/corrected per Moore #2 (first public review)"
      " -kmp 12-May-93")
     (:CODE NIL " (symbol-function 'car) → #<FUNCTION CAR>
 (symbol-function 'twice) is an error   ;because TWICE isn't defined.
 (defun twice (n) (* n 2)) → TWICE
 (symbol-function 'twice) → #<FUNCTION TWICE>
 (list (twice 3)
       (funcall (function twice) 3)
       (funcall (symbol-function 'twice) 3))
→ (6 6 6)
 (flet ((twice (x) (list x x)))
   (list (twice 3)
         (funcall (function twice) 3)
         (funcall (symbol-function 'twice) 3)))
→ ((3 3) (3 3) 6)   
 (setf (symbol-function 'twice) #'(lambda (x) (list x x)))
→ #<FUNCTION anonymous>
 (list (twice 3)
       (funcall (function twice) 3)
       (funcall (symbol-function 'twice) 3))
→ ((3 3) (3 3) (3 3))
 (fboundp 'defun) → "
      (:TERM NIL "true") "
 (symbol-function 'defun)
→ "
      (:TERM NIL "implementation-dependent") "
 (functionp (symbol-function 'defun))
→ "
      (:TERM NIL "implementation-dependent") "
 (defun symbol-function-or-nil (symbol)
   (if (and (fboundp symbol) 
            (not (macro-function symbol))
            (not (special-operator-p symbol)))
       (symbol-function symbol)
       nil)) → SYMBOL-FUNCTION-OR-NIL
 (symbol-function-or-nil 'car) → #<FUNCTION CAR>
 (symbol-function-or-nil 'defun) → NIL
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:MACREF NIL "defun") " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "symbol") " is not a "
     (:TERM NIL "symbol") ". " :PAR "Should signal "
     (:TYPEREF NIL "undefined-function") " if " (:PARAM NIL "symbol")
     " is not " (:TERM NIL "fbound") " and an attempt is made to "
     (:TERM NIL "read")
     " its definition. (No such error is signaled on an attempt to "
     (:TERM NIL "write") " its definition.) " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "fboundp") ", "
     (:FUNREF NIL "fmakunbound") ", " (:FUNREF NIL "macro-function") ", "
     (:ISSUE NIL "SPECIAL-FORM-P-MISNOMER:RENAME") " "
     (:FUNREF NIL "special-operator-p") " "
     (:ENDISSUE NIL "SPECIAL-FORM-P-MISNOMER:RENAME") " " :PAR)
    (:PART (:NAME "Notes") " " (:COMMENT NIL "% 7.1.1 16")
     (:FUNREF NIL "symbol-function") " cannot " (:TERM NIL "access")
     " the value of a lexical function name produced by " (:SPECREF NIL "flet")
     " or " (:SPECREF NIL "labels") "; it can " (:TERM NIL "access")
     " only the global function value. " :PAR
     (:COMMENT NIL
      "!!! Sandra thinks this should be in the Description.  I'm not so sure. -kmp 13-Dec-91")
     (:MACREF NIL "setf") " may be used with " (:FUNREF NIL "symbol-function")
     " to replace a global function definition when the " (:TERM NIL "symbol")
     "'s function definition does not represent a "
     (:TERM NIL "special operator") ". " :PAR
     (:CODE NIL "(symbol-function " (:PARAM NIL "symbol") ") ≡ (fdefinition "
      (:PARAM NIL "symbol") ")
")
     " However, " (:FUNREF NIL "fdefinition")
     " accepts arguments other than just " (:TERM NIL "symbols") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SYMBOL-NAME")
   (:COM (:NAME "symbol-name" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "symbol-name")
      (:ARGLIST NIL "symbol") (:VALUES NIL "name"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbol") "—a "
     (:TERM NIL "symbol") ". " :PAR
     (:COMMENT NIL
      "\"simple string\" => \"string\" per Barrett. -kmp 14-Feb-92")
     (:PARAM NIL "name") "—a " (:TERM NIL "string") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 10.2.0 2")
     (:FUNREF NIL "symbol-name") " returns the " (:TERM NIL "name") " of "
     (:PARAM NIL "symbol") ". "
     (:ISSUE NIL "LISP-SYMBOL-REDEFINITION:MAR89-X3J13")
     " The consequences are undefined if " (:PARAM NIL "name")
     " is ever modified. "
     (:ENDISSUE NIL "LISP-SYMBOL-REDEFINITION:MAR89-X3J13") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (symbol-name 'temp) → \"TEMP\" 
 (symbol-name :start) → \"START\"
 (symbol-name (gensym)) → \"G1234\" ;for example
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "symbol") " is not a "
     (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SYMBOL-PACKAGE")
   (:COM (:NAME "symbol-package" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "symbol-package")
      (:ARGLIST NIL "symbol") (:VALUES NIL "contents"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbol") "—a "
     (:TERM NIL "symbol") ". " :PAR (:PARAM NIL "contents") "—a "
     (:TERM NIL "package") " " (:TERM NIL "object") " or " (:MISC NIL "nil")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 10.3.0 15")
     "Returns the " (:TERM NIL "home package") " of " (:PARAM NIL "symbol")
     ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (in-package \"CL-USER\") → #<PACKAGE \"COMMON-LISP-USER\">
 (symbol-package 'car) → #<PACKAGE \"COMMON-LISP\">
 (symbol-package 'bus) → #<PACKAGE \"COMMON-LISP-USER\">
 (symbol-package :optional) → #<PACKAGE \"KEYWORD\">
 ;; Gensyms are uninterned, so have no home package.
 (symbol-package (gensym)) → NIL
 (make-package 'pk1) → #<PACKAGE \"PK1\">
 (intern \"SAMPLE1\" \"PK1\") → PK1::SAMPLE1, NIL
 (export (find-symbol \"SAMPLE1\" \"PK1\") \"PK1\") → T
 (make-package 'pk2 :use '(pk1)) → #<PACKAGE \"PK2\">
 (find-symbol \"SAMPLE1\" \"PK2\") → PK1:SAMPLE1, :INHERITED
 (symbol-package 'pk1::sample1) → #<PACKAGE \"PK1\">
 (symbol-package 'pk2::sample1) → #<PACKAGE \"PK1\">
 (symbol-package 'pk1::sample2) → #<PACKAGE \"PK1\">
 (symbol-package 'pk2::sample2) → #<PACKAGE \"PK2\">
 ;; The next several forms create a scenario in which a symbol
 ;; is not really uninterned, but is \"apparently uninterned\",
 ;; and so SYMBOL-PACKAGE still returns NIL.
 (setq s3 'pk1::sample3) → PK1::SAMPLE3
 (import s3 'pk2) → T
 (unintern s3 'pk1) → T
 (symbol-package s3) → NIL
 (eq s3 'pk2::sample3) → T
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:FUNREF NIL "import") ", "
     (:FUNREF NIL "intern") ", " (:FUNREF NIL "unintern") " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "symbol") " is not a "
     (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "intern") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SYMBOL-PLIST")
   (:COM (:NAME "symbol-plist" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "symbol-plist")
      (:ARGLIST NIL "symbol") (:VALUES NIL "plist"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "symbol-plist") (:ARGLIST NIL "symbol")
      (:NEW-VALUE NIL "new-plist"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbol") "—a "
     (:TERM NIL "symbol") ". " :PAR (:PARAM NIL "plist") ", "
     (:PARAM NIL "new-plist") "—a " (:TERM NIL "property list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 10.1.0 14" "% 10.1.0 16") (:TERM NIL "Accesses") " the "
     (:TERM NIL "property list") " of " (:PARAM NIL "symbol") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq sym (gensym)) → #:G9723
 (symbol-plist sym) → ()
 (setf (get sym 'prop1) 'val1) → VAL1
 (symbol-plist sym) → (PROP1 VAL1)
 (setf (get sym 'prop2) 'val2) → VAL2
 (symbol-plist sym) → (PROP2 VAL2 PROP1 VAL1)
 (setf (symbol-plist sym) (list 'prop3 'val3)) → (PROP3 VAL3)
 (symbol-plist sym) → (PROP3 VAL3)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "symbol") " is not a "
     (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "get") ", "
     (:FUNREF NIL "remprop") " "
     (:COMMENT NIL
      "!!! Barmar thinks there should be a concept section describing"
      "    the format of a plist.")
     :PAR)
    (:PART (:NAME "Notes") " " :PAR "The use of " (:MACREF NIL "setf")
     " should be avoided, since a " (:TERM NIL "symbol") "'s "
     (:TERM NIL "property list")
     " is a global resource that can contain information established and depended upon by unrelated programs in the same "
     (:TERM NIL "Lisp image") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SYMBOL-VALUE")
   (:COM (:NAME "symbol-value" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "symbol-value")
      (:ARGLIST NIL "symbol") (:VALUES NIL "value"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "symbol-value") (:ARGLIST NIL "symbol")
      (:NEW-VALUE NIL "new-value"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbol") "—a "
     (:TERM NIL "symbol") " that must have a " (:TERM NIL "value") ". " :PAR
     (:PARAM NIL "value") ", " (:PARAM NIL "new-value") "—an "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:TERM NIL "Accesses") " the "
     (:TERM NIL "symbol") "'s " (:TERM NIL "value cell") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setf (symbol-value 'a) 1) → 1
 (symbol-value 'a) → 1
 ;; SYMBOL-VALUE cannot see lexical variables.
 (let ((a 2)) (symbol-value 'a)) → 1
 (let ((a 2)) (setq a 3) (symbol-value 'a)) → 1
 ;; SYMBOL-VALUE can see dynamic variables.
 (let ((a 2)) 
   (declare (special a)) 
   (symbol-value 'a)) → 2
 (let ((a 2)) 
   (declare (special a)) 
   (setq a 3)
   (symbol-value 'a)) → 3
 (let ((a 2))
   (setf (symbol-value 'a) 3)
   a) → 2
 a → 3
 (symbol-value 'a) → 3
 (let ((a 4))
   (declare (special a))
   (let ((b (symbol-value 'a)))
     (setf (symbol-value 'a) 5)
     (values a b))) → 5, 4
 a → 3
 (symbol-value :any-keyword) → :ANY-KEYWORD
 (symbol-value 'nil) → NIL
 (symbol-value '()) → NIL
 ;; The precision of this next one is "
      (:TERM NIL "implementation-dependent") ".
 (symbol-value 'pi) → 3.141592653589793d0  
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:FUNREF NIL "makunbound") ", "
     (:FUNREF NIL "set") ", " (:SPECREF NIL "setq") " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "symbol") " is not a "
     (:TERM NIL "symbol") ". " :PAR "Should signal "
     (:TYPEREF NIL "unbound-variable") " if " (:PARAM NIL "symbol") " is "
     (:TERM NIL "unbound") " and an attempt is made to " (:TERM NIL "read")
     " its " (:TERM NIL "value")
     ". (No such error is signaled on an attempt to " (:TERM NIL "write")
     " its " (:TERM NIL "value") ".) " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "boundp") ", "
     (:FUNREF NIL "makunbound") ", " (:FUNREF NIL "set") ", "
     (:SPECREF NIL "setq") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "symbol-value")
     " can be used to get the value of a " (:TERM NIL "constant variable") ". "
     (:COMMENT NIL "% 7.1.1 12") (:FUNREF NIL "symbol-value") " cannot "
     (:TERM NIL "access") " the value of a " (:TERM NIL "lexical variable")
     ". " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Symbol Properties --------------------")
   :PAR (:COMMENT NIL "%% ========== GET")
   (:COM (:NAME "get" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "get")
      (:ARGLIST NIL "symbol indicator " (:KEYWORD NIL " &optional") " default")
      (:VALUES NIL "value"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "get")
      (:ARGLIST NIL "symbol indicator " (:KEYWORD NIL " &optional") " default")
      (:NEW-VALUE NIL "new-value"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbol") "—a "
     (:TERM NIL "symbol") ". " :PAR (:PARAM NIL "indicator") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "default") "—an "
     (:TERM NIL "object") ". The default is " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "value") "—if the indicated property exists, the "
     (:TERM NIL "object") " that is its " (:TERM NIL "value")
     "; otherwise, the specified " (:PARAM NIL "default") ". " :PAR
     (:PARAM NIL "new-value") "—an " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 10.1.0 8" "% Barrett: Redundant with next paragraph."
      " \\funref{get} searches the \\term{property list} of \\param{symbol} for an"
      " indicator \\funref{eq} to \\param{indicator}.")
     :PAR
     (:COMMENT NIL
      " \\funref{get} returns the corresponding value of an indicator from "
      " the \\term{property list} of \\param{symbol} \\funref{eq} to \\param{indicator},"
      " if one is found.")
     (:FUNREF NIL "get") " finds a " (:TERM NIL "property") " on the "
     (:TERM NIL "property list") (:SUB NIL "2") " of " (:PARAM NIL "symbol")
     " whose " (:TERM NIL "property indicator") " is " (:TERM NIL "identical")
     " to " (:PARAM NIL "indicator") ", and returns its corresponding "
     (:TERM NIL "property value") ". " (:ISSUE NIL "PLIST-DUPLICATES:ALLOW")
     " If there are multiple " (:TERM NIL "properties") (:SUB NIL "1")
     " with that " (:TERM NIL "property indicator") ", " (:FUNREF NIL "get")
     " uses the first such " (:TERM NIL "property") ". "
     (:ENDISSUE NIL "PLIST-DUPLICATES:ALLOW") " If there is no "
     (:TERM NIL "property") " with that " (:TERM NIL "property indicator") ", "
     (:PARAM NIL "default") " is returned. " :PAR
     (:COMMENT NIL " %% 10.1.0 12"
      " \\macref{setf} may be used with \\funref{get} to create a new property-value"
      " pair, possibly replacing an old pair with the same property name.")
     (:MACREF NIL "setf") " of " (:FUNREF NIL "get")
     " may be used to associate a new " (:TERM NIL "object")
     " with an existing indicator already on the " (:PARAM NIL "symbol") "'s "
     (:TERM NIL "property list")
     ", or to create a new assocation if none exists. "
     (:ISSUE NIL "PLIST-DUPLICATES:ALLOW") " If there are multiple "
     (:TERM NIL "properties") (:SUB NIL "1") " with that "
     (:TERM NIL "property indicator") ", " (:MACREF NIL "setf") " of "
     (:FUNREF NIL "get") " associates the " (:PARAM NIL "new-value")
     " with the first such " (:TERM NIL "property") ". "
     (:ENDISSUE NIL "PLIST-DUPLICATES:ALLOW") " "
     (:ISSUE NIL "SETF-GET-DEFAULT:EVALUATED-BUT-IGNORED") " When a "
     (:FUNREF NIL "get") " " (:TERM NIL "form") " is used as a "
     (:MACREF NIL "setf") " " (:PARAM NIL "place") ", any "
     (:PARAM NIL "default")
     " which is supplied is evaluated according to normal left-to-right evaluation rules, but its "
     (:TERM NIL "value") " is ignored. "
     (:ENDISSUE NIL "SETF-GET-DEFAULT:EVALUATED-BUT-IGNORED") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun make-person (first-name last-name)
   (let ((person (gensym \"PERSON\")))
     (setf (get person 'first-name) first-name)
     (setf (get person 'last-name) last-name)
     person)) → MAKE-PERSON
 (defvar *john* (make-person \"John\" \"Dow\")) → *JOHN*
 *john* → #:PERSON4603
 (defvar *sally* (make-person \"Sally\" \"Jones\")) → *SALLY*
 (get *john* 'first-name) → \"John\"
 (get *sally* 'last-name) → \"Jones\"
 (defun marry (man woman married-name)
   (setf (get man 'wife) woman)
   (setf (get woman 'husband) man)
   (setf (get man 'last-name) married-name)
   (setf (get woman 'last-name) married-name)
   married-name) → MARRY
 (marry *john* *sally* \"Dow-Jones\") → \"Dow-Jones\"
 (get *john* 'last-name) → \"Dow-Jones\"
 (get (get *john* 'wife) 'first-name) → \"Sally\"
 (symbol-plist *john*)
→ (WIFE #:PERSON4604 LAST-NAME \"Dow-Jones\" FIRST-NAME \"John\")
 (defmacro age (person &optional (default ''thirty-something)) 
   `(get ,person 'age ,default)) → AGE
 (age *john*) → THIRTY-SOMETHING
 (age *john* 20) → 20
 (setf (age *john*) 25) → 25
 (age *john*) → 25
 (age *john* 20) → 25
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "symbol") " is not a "
     (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "getf") ", "
     (:FUNREF NIL "symbol-plist") ", " (:FUNREF NIL "remprop") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (get x y) ≡ (getf (symbol-plist x) y)
")
     " " :PAR (:TERM NIL "Numbers") " and " (:TERM NIL "characters")
     " are not recommended for use as " (:PARAM NIL "indicators")
     " in portable code since " (:FUNREF NIL "get") " tests with "
     (:FUNREF NIL "eq") " rather than " (:FUNREF NIL "eql")
     ", and consequently the effect of using such " (:PARAM NIL "indicators")
     " is " (:TERM NIL "implementation-dependent") ". " :PAR
     (:COMMENT NIL " \\code" "  (get 'clyde 'species) \\EV NIL"
      "  (setf (get 'clyde 'species) 'elephant) \\EV elephant"
      "  (get 'clyde 'species) \\EV ELEPHANT" " \\endcode"
      " \\param{Default} may be supplied to \\funref{get} in this context; "
      " it is ignored by the \\macref{setf} expander function"
      " for \\funref{get}, but"
      " may be useful in such macros as \\macref{push} "
      " that are related to \\macref{setf}:" " " " \\code"
      "  (push item (get sym 'token-stack '(initial-item)))" " \\endcode"
      " means approximately the same as" " " " \\code"
      "  (setf (get sym 'token-stack '(initial-item))"
      "        (cons item (get sym 'token-stack '(initial-item))))"
      " \\endcode" " which in turn would be treated as" " " " \\code"
      "  (setf (get sym 'token-stack)"
      "        (cons item (get sym 'token-stack '(initial-item))))"
      " \\endcode" " ")
     :PAR "There is no way using " (:FUNREF NIL "get")
     " to distinguish an absent property from one whose value is "
     (:PARAM NIL "default") ". However, see " (:FUNREF NIL "get-properties")
     ". " :PAR
     (:COMMENT NIL " %% 10.1.0 15"
      " Using \\funref{get} on the result of \\funref{symbol-plist} does not work;"
      " the \\term{symbol} itself must be given to \\funref{get}. \\funref{getf} can"
      " be used to extract properties from a disembodied property list.")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== REMPROP")
   (:COM (:NAME "remprop" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "remprop")
      (:ARGLIST NIL "symbol indicator") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbol") "—a "
     (:TERM NIL "symbol") ". " :PAR (:PARAM NIL "indicator") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 10.1.0 13")
     (:FUNREF NIL "remprop") " removes from the " (:TERM NIL "property list")
     (:SUB NIL "2") " of " (:PARAM NIL "symbol") " a " (:TERM NIL "property")
     (:SUB NIL "1") " with a " (:TERM NIL "property indicator") " "
     (:COMMENT NIL " EQ => identical -kmp 14-Jul-93") (:TERM NIL "identical")
     " to " (:PARAM NIL "indicator") ". " (:ISSUE NIL "PLIST-DUPLICATES:ALLOW")
     " If there are multiple " (:TERM NIL "properties") (:SUB NIL "1")
     " with the " (:TERM NIL "identical") " key, " (:FUNREF NIL "remprop")
     " only removes the first such " (:TERM NIL "property") ". "
     (:ENDISSUE NIL "PLIST-DUPLICATES:ALLOW") " " (:FUNREF NIL "remprop")
     " returns " (:TERM NIL "false") " if no such " (:TERM NIL "property")
     " was found, or " (:TERM NIL "true") " if a property was found. " :PAR
     "The " (:TERM NIL "property indicator") " and the corresponding "
     (:TERM NIL "property value")
     " are removed in an undefined order by destructively splicing the property list. "
     (:ISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89")
     " The permissible side-effects correspond to those permitted for "
     (:MACREF NIL "remf") ", such that: " :PAR
     (:CODE NIL " (remprop " (:I NIL "x") " " (:I NIL "y")
      ") ≡ (remf (symbol-plist " (:I NIL "x") ") " (:I NIL "y") ")
")
     " " (:ENDISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq test (make-symbol \"PSEUDO-PI\")) → #:PSEUDO-PI
 (symbol-plist test) → ()
 (setf (get test 'constant) t) → T
 (setf (get test 'approximation) 3.14) → 3.14
 (setf (get test 'error-range) 'noticeable) → NOTICEABLE
 (symbol-plist test) 
→ (ERROR-RANGE NOTICEABLE APPROXIMATION 3.14 CONSTANT T)
 (setf (get test 'approximation) nil) → NIL
 (symbol-plist test) 
→ (ERROR-RANGE NOTICEABLE APPROXIMATION NIL CONSTANT T)
 (get test 'approximation) → NIL
 (remprop test 'approximation) → "
      (:TERM NIL "true") "
 (get test 'approximation) → NIL
 (symbol-plist test)
→ (ERROR-RANGE NOTICEABLE CONSTANT T)
 (remprop test 'approximation) → NIL
 (symbol-plist test)
→ (ERROR-RANGE NOTICEABLE CONSTANT T)
 (remprop test 'error-range) → "
      (:TERM NIL "true") "
 (setf (get test 'approximation) 3) → 3
 (symbol-plist test)
→ (APPROXIMATION 3 CONSTANT T)
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:TERM NIL "property list")
     " of " (:PARAM NIL "symbol") " is modified. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "symbol") " is not a "
     (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "remf") ", "
     (:FUNREF NIL "symbol-plist") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:TERM NIL "Numbers") " and "
     (:TERM NIL "characters") " are not recommended for use as "
     (:PARAM NIL "indicators") " in portable code since "
     (:FUNREF NIL "remprop") " tests with " (:FUNREF NIL "eq") " rather than "
     (:FUNREF NIL "eql") ", and consequently the effect of using such "
     (:PARAM NIL "indicators") " is " (:TERM NIL "implementation-dependent")
     ". Of course, if you've gotten as far as needing to remove such a "
     (:TERM NIL "property")
     ", you don't have much choice—the time to have been thinking about this was when you used "
     (:MACREF NIL "setf") " of " (:FUNREF NIL "get") " to establish the "
     (:TERM NIL "property") ". " (:COMMENT NIL "Barrett: Bletch.") :PAR))
   " " :PAR
   (:COMMENT NIL
    "-------------------- Symbol Function/Value --------------------")
   :PAR (:COMMENT NIL "%% ========== BOUNDP")
   (:COM (:NAME "boundp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "boundp") (:ARGLIST NIL "symbol")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbol") "—a "
     (:TERM NIL "symbol") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.1.1 18   ")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "symbol") " is "
     (:TERM NIL "bound") "; otherwise, returns " (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq x 1) → 1
 (boundp 'x) → "
      (:TERM NIL "true") "
 (makunbound 'x) → X
 (boundp 'x) → "
      (:TERM NIL "false") "
 (let ((x 2)) (boundp 'x)) → "
      (:TERM NIL "false") "
 (let ((x 2)) (declare (special x)) (boundp 'x)) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "symbol") " is not a "
     (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "set") ", "
     (:SPECREF NIL "setq") ", " (:FUNREF NIL "symbol-value") ", "
     (:FUNREF NIL "makunbound") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL " I see no lexical environment here.  --sjl 16 Mar 92"
      "The \\term{lexical environment} is ignored.")
     "The " (:TERM NIL "function") " " (:FUNREF NIL "boundp")
     " determines only whether a " (:TERM NIL "symbol") " has a value in the "
     (:TERM NIL "global environment") "; any " (:TERM NIL "lexical bindings")
     " are ignored. " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MAKUNBOUND")
   (:COM (:NAME "makunbound" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "makunbound") (:ARGLIST NIL "symbol")
      (:VALUES NIL "symbol"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbol") "—a "
     (:TERM NIL "symbol") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "Makes the " (:PARAM NIL "symbol")
     " be " (:TERM NIL "unbound") ", regardless of whether it was previously "
     (:TERM NIL "bound") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setf (symbol-value 'a) 1)
 (boundp 'a) → "
      (:TERM NIL "true") "
 a → 1
 (makunbound 'a) → A
 (boundp 'a) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:TERM NIL "value cell")
     " of " (:PARAM NIL "symbol") " is modified. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "symbol") " is not a "
     (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "boundp") ", "
     (:FUNREF NIL "fmakunbound") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SET")
   (:COM (:NAME "set" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "set") (:ARGLIST NIL "symbol value")
      (:VALUES NIL "value"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbol") "—a "
     (:TERM NIL "symbol") ". " :PAR (:COMMENT NIL "% 7.1.2 9")
     (:ISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " " (:PARAM NIL "value")
     "—an " (:TERM NIL "object") ". "
     (:ENDISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.1.2 8")
     (:FUNREF NIL "set") " changes the contents of the "
     (:TERM NIL "value cell") " of " (:TERM NIL "symbol") " to the given "
     (:TERM NIL "value") ". " :PAR
     (:CODE NIL "(set " (:PARAM NIL "symbol") " " (:PARAM NIL "value")
      ") ≡ (setf (symbol-value " (:PARAM NIL "symbol") ") "
      (:PARAM NIL "value") ")
")
     " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setf (symbol-value 'n) 1) → 1
 (set 'n 2) → 2
 (symbol-value 'n) → 2
 (let ((n 3))
   (declare (special n))
   (setq n (+ n 1))
   (setf (symbol-value 'n) (* n 10))
   (set 'n (+ (symbol-value 'n) n))
   n) → 80
 n → 2
 (let ((n 3))
   (setq n (+ n 1))
   (setf (symbol-value 'n) (* n 10))
   (set 'n (+ (symbol-value 'n) n))
   n) → 4
 n → 44
 (defvar *n* 2)
 (let ((*n* 3))
   (setq *n* (+ *n* 1))
   (setf (symbol-value '*n*) (* *n* 10))
   (set '*n* (+ (symbol-value '*n*) *n*))
   *n*) → 80
  *n* → 2
 (defvar *even-count* 0) → *EVEN-COUNT*
 (defvar *odd-count* 0) → *ODD-COUNT*
 (defun tally-list (list)
   (dolist (element list)
     (set (if (evenp element) '*even-count* '*odd-count*)
          (+ element (if (evenp element) *even-count* *odd-count*)))))
 (tally-list '(1 9 4 3 2 7)) → NIL
 *even-count* → 6
 *odd-count* → 20
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:TERM NIL "value") " of "
     (:PARAM NIL "symbol") " is changed. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SPECREF NIL "setq") ", "
     (:SPECREF NIL "progv") ", " (:FUNREF NIL "symbol-value") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The function " (:FUNREF NIL "set")
     " is deprecated. " :PAR (:COMMENT NIL "% 7.1.2 11") (:FUNREF NIL "set")
     " cannot change the value of a " (:TERM NIL "lexical variable") ". "
     :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Symbol Errors --------------------")
   :PAR
   (:COM (:NAME "unbound-variable" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " "
     (:TYPEREF NIL "unbound-variable") ", " (:TYPEREF NIL "cell-error") ", "
     (:TYPEREF NIL "error") ", " (:TYPEREF NIL "serious-condition") ", "
     (:TYPEREF NIL "condition") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "unbound-variable") " consists of " (:TERM NIL "error") " "
     (:TERM NIL "conditions") " that represent attempts to " (:TERM NIL "read")
     " the " (:TERM NIL "value") " of an " (:TERM NIL "unbound variable") ". "
     (:COMMENT NIL "Barrett: \"name\"?"
      "KMP: An \"unbound variable\" is by definition just a \"name\".  See glossary.")
     :PAR "The name of the cell (see " (:TYPEREF NIL "cell-error") ") is the "
     (:TERM NIL "name") " of the " (:TERM NIL "variable") " that was "
     (:TERM NIL "unbound") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "cell-error-name") " "
     :PAR)))
  " " :PAR)
 (:CHAPTER
  (:NUM "11" :TITLE ("Packages") :NUMTAG :CHAP-ELEVEN :NAMETAG :PACKAGES)
  (:SECTION (:TITLE ("Package Concepts") :TAGS (:PACKAGE-CONCEPTS)) " " :PAR
   (:COMMENT NIL "!!! Barmar: Tell me why multiple packags are needed. "
    "    e.g., to prevent variable and function conflicts.")
   :PAR
   (:SUBSECTION (:TITLE ("Introduction to Packages")) "A "
    (:NEWTERM NIL "package") " establishes a mapping from names to "
    (:TERM NIL "symbols") ". At any given time, one " (:TERM NIL "package")
    " is current. The " (:NEWTERM NIL "current package")
    " is the one that is the " (:TERM NIL "value") " of "
    (:VARREF NIL "*package*") ". When using the " (:TERM NIL "Lisp reader")
    ", it is possible to refer to " (:TERM NIL "symbols") " in "
    (:TERM NIL "packages") " other than the current one through the use of "
    (:TERM NIL "package prefixes") " in the printed representation of the "
    (:TERM NIL "symbol") ". " :PAR (:COMMENT NIL "% 11.2.0 5")
    (:NEXTFIGURE (:CAPS T)) " lists some " (:TERM NIL "defined names")
    " that are applicable to " (:TERM NIL "packages") ". "
    (:COMMENT NIL
     "Shouldn't be needed.  This info is all explicit now. -kmp 29-Apr-91"
     " For the \\term{operators} listed here, all optional arguments named "
     " \\param{package} default to the \\term{current package}.")
    "Where an " (:TERM NIL "operator") " takes an argument that is either a "
    (:TERM NIL "symbol") " or a " (:TERM NIL "list") " of "
    (:TERM NIL "symbols") ", an argument of " (:MISC NIL "nil")
    " is treated as an empty " (:TERM NIL "list") " of " (:TERM NIL "symbols")
    ". Any " (:PARAM NIL "package") " argument may be either a "
    (:TERM NIL "string") ", a " (:TERM NIL "symbol") ", or a "
    (:TERM NIL "package") ". If a " (:TERM NIL "symbol")
    " is supplied, its name will be used as the " (:TERM NIL "package")
    " name. " (:ISSUE NIL "REQUIRE-PATHNAME-DEFAULTS:ELIMINATE") " "
    (:COMMENT NIL
     " \\funref{provide}, \\funref{require}, and \\varref{*modules*} will"
     " be removed from this table (and the language)."
     "PROVIDE and REQUIRE need to be removed, right? -kmp 29-Apr-91"
     "Nope! -kmp 13-Feb-92")
    (:TABLE (:NAME ("Some Defined Names related to Packages"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " *modules*"))
      (:CELL NIL (:FUNREF NIL "import")) (:CELL NIL (:FUNREF NIL "provide")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " *package*"))
      (:CELL NIL (:FUNREF NIL "in-package"))
      (:CELL NIL (:FUNREF NIL "rename-package")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " defpackage"))
      (:CELL NIL (:FUNREF NIL "intern")) (:CELL NIL (:FUNREF NIL "require")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " do-all-symbols"))
      (:CELL NIL (:FUNREF NIL "list-all-packages"))
      (:CELL NIL (:FUNREF NIL "shadow")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " do-external-symbols"))
      (:CELL NIL (:FUNREF NIL "make-package"))
      (:CELL NIL (:FUNREF NIL "shadowing-import")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " do-symbols"))
      (:CELL NIL (:FUNREF NIL "package-name"))
      (:CELL NIL (:FUNREF NIL "unexport")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " export"))
      (:CELL NIL (:FUNREF NIL "package-nicknames"))
      (:CELL NIL (:FUNREF NIL "unintern")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " find-all-symbols"))
      (:CELL NIL (:FUNREF NIL "package-shadowing-symbols"))
      (:CELL NIL (:FUNREF NIL "unuse-package")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " find-package"))
      (:CELL NIL (:FUNREF NIL "package-use-list"))
      (:CELL NIL (:FUNREF NIL "use-package")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " find-symbol"))
      (:CELL NIL (:FUNREF NIL "package-used-by-list")) (:CELL NIL)))
    " " (:ENDISSUE NIL "REQUIRE-PATHNAME-DEFAULTS:ELIMINATE") " " :PAR
    (:SUBSUBSECTION (:TITLE ("Package Names and Nicknames")) "Each "
     (:TERM NIL "package") " has a " (:TERM NIL "name") " (a "
     (:TERM NIL "string") ") and perhaps some " (:TERM NIL "nicknames")
     " (also " (:TERM NIL "strings") "). These are assigned when the "
     (:TERM NIL "package") " is created and can be changed later. " :PAR
     (:COMMENT NIL "% 11.0.0 20") "There is a single namespace for "
     (:TERM NIL "packages") ". The " (:TERM NIL "function") " "
     (:FUNREF NIL "find-package") " translates a package " (:TERM NIL "name")
     " or " (:TERM NIL "nickname") " into the associated "
     (:TERM NIL "package") ". The " (:TERM NIL "function") " "
     (:FUNREF NIL "package-name") " returns the " (:TERM NIL "name") " of a "
     (:TERM NIL "package") ". The " (:TERM NIL "function") " "
     (:FUNREF NIL "package-nicknames") " returns a " (:TERM NIL "list")
     " of all " (:TERM NIL "nicknames") " for a " (:TERM NIL "package") ". "
     (:FUNREF NIL "rename-package") " removes a " (:TERM NIL "package")
     "'s current " (:TERM NIL "name") " and " (:TERM NIL "nicknames")
     " and replaces them with new ones specified by the caller. " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Symbols in a Package"))
     (:SUBSUBSUBSECTION (:TITLE ("Internal and External Symbols"))
      "The mappings in a " (:TERM NIL "package")
      " are divided into two classes, external and internal. The "
      (:TERM NIL "symbols") " targeted by these different mappings are called "
      (:TERM NIL "external symbols") " and " (:TERM NIL "internal symbols")
      (:IDXTERM NIL "internal symbol") " of the " (:TERM NIL "package")
      ". Within a " (:TERM NIL "package") ", a name refers to one "
      (:TERM NIL "symbol") " or to none; if it does refer to a "
      (:TERM NIL "symbol") ", then it is either external or internal in that "
      (:TERM NIL "package") ", but not both. " (:COMMENT NIL "% 11.0.0 6")
      (:NEWTERM (:IDX "external symbol") "External symbols")
      " are part of the package's public interface to other "
      (:TERM NIL "packages") ". " (:TERM NIL "Symbols") " become "
      (:TERM NIL "external symbols") " of a given " (:TERM NIL "package")
      " if they have been " (:TERM NIL "exported") " from that "
      (:TERM NIL "package") ". " :PAR
      (:COMMENT NIL "% 11.0.0 7                                 ") "A "
      (:TERM NIL "symbol") " has the same " (:TERM NIL "name")
      " no matter what " (:TERM NIL "package") " it is " (:TERM NIL "present")
      " in, but it might be an " (:TERM NIL "external symbol") " of some "
      (:TERM NIL "packages") " and an " (:TERM NIL "internal symbol")
      " of others. " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Package Inheritance")) (:TERM NIL "Packages")
      " can be built up in layers. From one point of view, a "
      (:TERM NIL "package") " is a single collection of mappings from "
      (:TERM NIL "strings") " into " (:TERM NIL "internal symbols") " and "
      (:TERM NIL "external symbols")
      ". However, some of these mappings might be established within the "
      (:TERM NIL "package")
      " itself, while other mappings are inherited from other "
      (:TERM NIL "packages") " via " (:FUNREF NIL "use-package") ". A "
      (:TERM NIL "symbol") " is said to be " (:NEWTERM NIL "present") " in a "
      (:TERM NIL "package") " if the mapping is in the " (:TERM NIL "package")
      " itself and is not inherited from somewhere else. " :PAR
      (:COMMENT NIL "% 11.4.0 ") "There is no way to inherit the "
      (:TERM NIL "internal symbols") " of another " (:TERM NIL "package")
      "; to refer to an " (:TERM NIL "internal symbol") " using the "
      (:TERM NIL "Lisp reader") ", a " (:TERM NIL "package") " containing the "
      (:TERM NIL "symbol") " must be made to be the "
      (:TERM NIL "current package") ", a " (:TERM NIL "package prefix")
      " must be used, or the " (:TERM NIL "symbol") " must be "
      (:TERM NIL "imported") " into the " (:TERM NIL "current package") ". "
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Accessibility of Symbols in a Package")) "A "
      (:TERM NIL "symbol") " becomes " (:NEWTERM NIL "accessible") " in a "
      (:TERM NIL "package") " if that is its " (:TERM NIL "home package")
      " when it is created, or if it is " (:TERM NIL "imported") " into that "
      (:TERM NIL "package") ", or by inheritance via "
      (:FUNREF NIL "use-package") ". " :PAR "If a " (:TERM NIL "symbol") " is "
      (:TERM NIL "accessible") " in a " (:TERM NIL "package")
      ", it can be referred to when using the " (:TERM NIL "Lisp reader")
      " without a " (:TERM NIL "package prefix") " when that "
      (:TERM NIL "package") " is the " (:TERM NIL "current package")
      ", regardless of whether it is " (:TERM NIL "present") " or inherited. "
      :PAR
      (:COMMENT NIL "???Move the following to \\secref\\Syntax???"
       "A \\term{symbol} will not necessarily always have the same"
       "printed representation because the way \\term{symbols} are printed"
       "depends on whether or not they are \\term{accessible} in the \\term{current package}.")
      :PAR (:COMMENT NIL "% 11.0.0 35") (:TERM NIL "Symbols") " from one "
      (:TERM NIL "package") " can be made " (:TERM NIL "accessible")
      " in another " (:TERM NIL "package") " in two ways. " :PAR
      (:COMMENT NIL "% 11.0.0 36")
      (:LIST NIL
       (:ITEM NIL "– Any individual " (:TERM NIL "symbol")
        " can be added to a " (:TERM NIL "package") " by use of "
        (:FUNREF NIL "import") ". After the call to " (:FUNREF NIL "import")
        " the " (:TERM NIL "symbol") " is " (:TERM NIL "present")
        " in the importing " (:TERM NIL "package") ". The status of the "
        (:TERM NIL "symbol") " in the " (:TERM NIL "package")
        " it came from (if any) is unchanged, and the "
        (:TERM NIL "home package") " for this " (:TERM NIL "symbol")
        " is unchanged. Once " (:TERM NIL "imported") ", a "
        (:TERM NIL "symbol") " is " (:TERM NIL "present") " in the importing "
        (:TERM NIL "package") " and can be removed only by calling "
        (:FUNREF NIL "unintern") ". " :PAR (:COMMENT NIL "% 11.4.0 4") "A "
        (:TERM NIL "symbol") " is " (:TERM NIL "shadowed") (:SUB NIL "3")
        " by another " (:TERM NIL "symbol") " in some " (:TERM NIL "package")
        " if the first " (:TERM NIL "symbol") " would be "
        (:TERM NIL "accessible")
        " by inheritance if not for the presence of the second "
        (:TERM NIL "symbol") ". See " (:FUNREF NIL "shadowing-import") ". "
        :PAR (:COMMENT NIL "% 11.4.0 39" "% 11.4.0 40"))
       (:ITEM NIL "– The second mechanism for making " (:TERM NIL "symbols")
        " from one " (:TERM NIL "package") " " (:TERM NIL "accessible")
        " in another is provided by " (:FUNREF NIL "use-package")
        ". All of the " (:TERM NIL "external symbols") " of the used "
        (:TERM NIL "package") " are inherited by the using "
        (:TERM NIL "package") ". The " (:TERM NIL "function") " "
        (:FUNREF NIL "unuse-package") " undoes the effects of a previous "
        (:FUNREF NIL "use-package") ". "))
      " " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Locating a Symbol in a Package")) "When a "
      (:TERM NIL "symbol") " is to be located in a given "
      (:TERM NIL "package") " the following occurs: "
      (:LIST NIL
       (:ITEM NIL "– The " (:TERM NIL "external symbols") " and "
        (:TERM NIL "internal symbols") " of the " (:TERM NIL "package")
        " are searched for the " (:TERM NIL "symbol") ". ")
       (:ITEM NIL "– The " (:TERM NIL "external symbols") " of the used "
        (:TERM NIL "packages")
        " are searched in some unspecified order. The order does not matter; see the rules for handling name conflicts listed below. "))
      " " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Prevention of Name Conflicts in Packages"))
      "Within one " (:TERM NIL "package")
      ", any particular name can refer to at most one " (:TERM NIL "symbol")
      ". A name conflict is said to occur when there would be more than one candidate "
      (:TERM NIL "symbol") ". Any time a name conflict is about to occur, a "
      (:TERM NIL "correctable") " " (:TERM NIL "error") " is signaled. " :PAR
      "The following rules apply to name conflicts: "
      (:COMMENT NIL "% 11.0.0 47")
      (:LIST NIL
       (:ITEM NIL
        "– Name conflicts are detected when they become possible, that is, when the package structure is altered. Name conflicts are not checked during every name lookup. "
        :PAR)
       (:ITEM NIL "– If the " (:TERM NIL "same") " " (:TERM NIL "symbol")
        " is " (:TERM NIL "accessible") " to a " (:TERM NIL "package")
        " through more than one path, there is no name conflict. A "
        (:TERM NIL "symbol")
        " cannot conflict with itself. Name conflicts occur only between "
        (:TERM NIL "distinct") " " (:TERM NIL "symbols")
        " with the same name (under " (:FUNREF NIL "string=") "). " :PAR
        (:COMMENT NIL "% 11.0.0 48"))
       (:ITEM NIL "– Every " (:TERM NIL "package") " has a list of shadowing "
        (:TERM NIL "symbols") ". A shadowing " (:TERM NIL "symbol")
        " takes precedence over any other " (:TERM NIL "symbol")
        " of the same name that would otherwise be " (:TERM NIL "accessible")
        " in the " (:TERM NIL "package")
        ". A name conflict involving a shadowing symbol is always resolved in favor of the shadowing "
        (:TERM NIL "symbol")
        ", without signaling an error (except for one exception involving "
        (:FUNREF NIL "import") "). See " (:FUNREF NIL "shadow") " and "
        (:FUNREF NIL "shadowing-import") ". " :PAR
        (:COMMENT NIL "% 11.0.0 50"))
       (:ITEM NIL "– The functions " (:FUNREF NIL "use-package") ", "
        (:FUNREF NIL "import") ", and " (:FUNREF NIL "export")
        " check for name conflicts. " :PAR (:COMMENT NIL "% 11.0.0 52"))
       (:ITEM NIL "– " (:FUNREF NIL "shadow") " and "
        (:FUNREF NIL "shadowing-import")
        " never signal a name-conflict error. " :PAR
        (:COMMENT NIL "% 11.0.0 53"))
       (:ITEM NIL "– "
        (:COMMENT NIL
         " \\funref{unuse-package}, \\funref{unexport}, and \\funref{unintern} "
         " (when the \\term{symbol} being uninterned is not a \\term{shadowing symbol}) "
         " do not need to do any name-conflict checking."
         "% Rewording for JonL:")
        (:FUNREF NIL "unuse-package") " and " (:FUNREF NIL "unexport")
        " do not need to do any name-conflict checking. "
        (:FUNREF NIL "unintern") " does name-conflict checking only when a "
        (:TERM NIL "symbol") " being " (:TERM NIL "uninterned") " is a "
        (:TERM NIL "shadowing symbol") (:IDXTERM NIL "shadowing symbol") ". "
        :PAR (:COMMENT NIL "% 11.0.0 54"))
       (:ITEM NIL "– Giving a shadowing symbol to " (:FUNREF NIL "unintern")
        " can uncover a name conflict that had previously been resolved by the shadowing. "
        :PAR
        (:COMMENT NIL "% 11.0.0 55" "\\itemitem{--} "
         "Aborting from a name-conflict error leaves the original \\term{symbol} "
         "\\term{accessible}.")
        :PAR)
       (:ITEM NIL "– Package functions signal name-conflict errors of "
        (:TERM NIL "type") " " (:TYPEREF NIL "package-error")
        " before making any change to the package structure. When multiple changes are to be made, it is permissible for the implementation to process each change separately. For example, when "
        (:FUNREF NIL "export") " is given a " (:TERM NIL "list") " of "
        (:TERM NIL "symbols")
        ", aborting from a name conflict caused by the second "
        (:TERM NIL "symbol") " in the " (:TERM NIL "list")
        " might still export the first " (:TERM NIL "symbol") " in the "
        (:TERM NIL "list") ". However, a name-conflict error caused by "
        (:FUNREF NIL "export") " of a single " (:TERM NIL "symbol")
        " will be signaled before that " (:TERM NIL "symbol") "'s "
        (:TERM NIL "accessibility") " in any " (:TERM NIL "package")
        " is changed. " :PAR (:COMMENT NIL "% 11.0.0 56"))
       (:ITEM NIL
        "– Continuing from a name-conflict error must offer the user a chance to resolve the name conflict in favor of either of the candidates. The "
        (:TERM NIL "package")
        " structure should be altered to reflect the resolution of the name conflict, via "
        (:FUNREF NIL "shadowing-import") ", " (:FUNREF NIL "unintern") ", "
        (:COMMENT NIL
         "!!! Barmar: The next two bullets don't mention \"unexport\".")
        "or " (:FUNREF NIL "unexport") ". " :PAR (:COMMENT NIL "% 11.0.0 57"))
       (:ITEM NIL "– A name conflict in " (:FUNREF NIL "use-package")
        " between a " (:TERM NIL "symbol") " " (:COMMENT NIL "directly ")
        (:TERM NIL "present") " in the using " (:TERM NIL "package") " and an "
        (:TERM NIL "external symbol") " of the used " (:TERM NIL "package")
        " is resolved in favor of the first " (:TERM NIL "symbol")
        " by making it a shadowing " (:TERM NIL "symbol")
        ", or in favor of the second " (:TERM NIL "symbol")
        " by uninterning the first " (:TERM NIL "symbol") " from the using "
        (:TERM NIL "package") ". " :PAR (:COMMENT NIL "% 11.0.0 60"))
       (:ITEM NIL "– A name conflict in " (:FUNREF NIL "export") " or "
        (:FUNREF NIL "unintern") " due to a " (:TERM NIL "package")
        "'s inheriting two " (:TERM NIL "distinct") " " (:TERM NIL "symbols")
        " with the " (:TERM NIL "same") " " (:TERM NIL "name") " (under "
        (:FUNREF NIL "string=") ") from two other " (:TERM NIL "packages")
        " can be resolved in favor of either " (:TERM NIL "symbol")
        " by importing it into the using " (:TERM NIL "package")
        " and making it a " (:TERM NIL "shadowing symbol")
        (:IDXTERM NIL "shadowing symbol") ", just as with "
        (:FUNREF NIL "use-package") ". "))
      " " :PAR)
     :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Standardized Packages"))
    "This section describes the " (:TERM NIL "packages")
    " that are available in every " (:TERM NIL "conforming implementation")
    ". A summary of the " (:TERM NIL "names") " and " (:TERM NIL "nicknames")
    " of those " (:TERM NIL "standardized") " " (:TERM NIL "packages")
    " is given in " (:NEXTFIGURE NIL) ". " :PAR
    (:TABLE (:NAME ("Standardized Package Names"))
     (:ROW NIL (:CELL NIL "Name") (:CELL NIL "Nicknames"))
     (:ROW NIL (:CELL NIL (:PACKREF NIL "common-lisp"))
      (:CELL NIL (:PACKREF NIL "cl")))
     (:ROW NIL (:CELL NIL (:PACKREF NIL "common-lisp-user"))
      (:CELL NIL (:PACKREF NIL "cl-user")))
     (:ROW NIL (:CELL NIL (:PACKREF NIL "keyword"))
      (:CELL NIL (:I NIL "none"))))
    " " :PAR (:ISSUE NIL "LISP-PACKAGE-NAME:COMMON-LISP") " "
    (:COMMENT NIL "% 11.6.0 2"
     " Discussion of package LISP and USER removed. -kmp 15-Feb-92")
    (:ENDISSUE NIL "LISP-PACKAGE-NAME:COMMON-LISP") " " :PAR
    (:ISSUE NIL "PACKAGE-CLUTTER:REDUCE") " "
    (:COMMENT NIL "% 11.6.0 5"
     " Discussion of the CLtL1 package named SYSTEM removed.")
    (:ENDISSUE NIL "PACKAGE-CLUTTER:REDUCE") " " :PAR
    (:SUBSUBSECTION (:TITLE ("The COMMON-LISP Package"))
     (:IDXPACKREF NIL "common-lisp") (:IDXPACKREF NIL "cl") " " :PAR
     (:ISSUE NIL "LISP-PACKAGE-NAME:COMMON-LISP") " " :PAR "The "
     (:PACKREF NIL "common-lisp") " " (:TERM NIL "package")
     " contains the primitives of the " (:RM NIL " Common Lisp")
     " system as defined by this specification. Its " (:TERM NIL "external")
     " " (:TERM NIL "symbols") " include all of the "
     (:TERM NIL "defined names") " (except for " (:TERM NIL "defined names")
     " in the " (:PACKREF NIL "keyword") " " (:TERM NIL "package")
     ") that are present in the " (:RM NIL " Common Lisp") " system, such as "
     (:FUNREF NIL "car") ", " (:FUNREF NIL "cdr") ", "
     (:VARREF NIL "*package*") ", etc. The " (:PACKREF NIL "common-lisp") " "
     (:TERM NIL "package") " has the " (:TERM NIL "nickname") " "
     (:PACKREF NIL "cl") ". " :PAR (:ISSUE NIL "PACKAGE-CLUTTER:REDUCE")
     " The " (:PACKREF NIL "common-lisp") " " (:TERM NIL "package") " has as "
     (:TERM NIL "external") " " (:TERM NIL "symbols")
     " those symbols enumerated in the figures in " (:SECREF NIL :CL-SYMBOLS)
     ", and no others. These " (:TERM NIL "external") " " (:TERM NIL "symbols")
     " are " (:TERM NIL "present") " in the " (:PACKREF NIL "common-lisp") " "
     (:TERM NIL "package") " but their " (:TERM NIL "home package")
     " need not be the " (:PACKREF NIL "common-lisp") " " (:TERM NIL "package")
     ". " :PAR "For example, the symbol " (:TT NIL "HELP") " cannot be an "
     (:TERM NIL "external symbol") " of the " (:PACKREF NIL "common-lisp") " "
     (:TERM NIL "package") " because it is not mentioned in "
     (:SECREF NIL :CL-SYMBOLS) ". In contrast, the " (:TERM NIL "symbol") " "
     (:MISC NIL "variable") " must be an " (:TERM NIL "external symbol")
     " of the " (:PACKREF NIL "common-lisp") " " (:TERM NIL "package")
     " even though it has no definition because it is listed in that section (to support its use as a valid second "
     (:TERM NIL "argument") " to the " (:TERM NIL "function") " "
     (:FUNREF NIL "documentation") "). " :PAR
     (:COMMENT NIL
      " Moved this sentence out of previous paragraph.  --sjl 7 Mar 92")
     "The " (:PACKREF NIL "common-lisp") " " (:TERM NIL "package")
     " can have additional " (:TERM NIL "internal symbols") ". "
     (:ENDISSUE NIL "PACKAGE-CLUTTER:REDUCE") " " :PAR
     (:SUBSUBSUBSECTION
      (:TITLE
       ("Constraints on the COMMON-LISP Package for Conforming Implementations"))
      (:ISSUE NIL "PACKAGE-CLUTTER:REDUCE") " In a "
      (:TERM NIL "conforming implementation") ", an " (:TERM NIL "external")
      " " (:TERM NIL "symbol") " of the " (:PACKREF NIL "common-lisp") " "
      (:TERM NIL "package") " can have a " (:TERM NIL "function") ", "
      (:TERM NIL "macro") ", or " (:TERM NIL "special operator")
      " definition, " (:COMMENT NIL "top level value  ???") "a "
      (:TERM NIL "global variable") " definition (or other status as a "
      (:TERM NIL "dynamic variable") " due to a " (:DECLREF NIL "special") " "
      (:TERM NIL "proclamation") "), or a " (:TERM NIL "type")
      " definition only if explicitly permitted in this standard. "
      (:COMMENT NIL
       "% That's the definition of a conforming implementation. -kmp"
       "that is, a \\term{conforming program} may assume that this is true.")
      "For example, " (:FUNREF NIL "fboundp") " " (:TERM NIL "yields") " "
      (:TERM NIL "false") " for any " (:TERM NIL "external symbol") " of the "
      (:PACKREF NIL "common-lisp") " " (:TERM NIL "package")
      " that is not the " (:TERM NIL "name") " of a "
      (:TERM NIL "standardized") " " (:TERM NIL "function") ", "
      (:TERM NIL "macro") " or " (:TERM NIL "special operator") ", and "
      (:FUNREF NIL "boundp") " returns " (:TERM NIL "false") " for any "
      (:TERM NIL "external symbol") " of the " (:PACKREF NIL "common-lisp") " "
      (:TERM NIL "package") " that is not the " (:TERM NIL "name") " of a "
      (:TERM NIL "standardized") " " (:TERM NIL "global variable")
      ". It also follows that " (:TERM NIL "conforming programs") " can use "
      (:TERM NIL "external symbols") " of the " (:PACKREF NIL "common-lisp")
      " " (:TERM NIL "package") " as the " (:TERM NIL "names") " of local "
      (:TERM NIL "lexical variables") " with confidence that those "
      (:TERM NIL "names") " have not been " (:TERM NIL "proclaimed") " "
      (:DECLREF NIL "special") " by the " (:TERM NIL "implementation")
      " unless those " (:TERM NIL "symbols") " are " (:TERM NIL "names") " of "
      (:TERM NIL "standardized") " " (:TERM NIL "global variables") ". " :PAR
      (:COMMENT NIL "%KMP: Initially or for all times? -kmp 2-Jan-91"
       "%Sandra: The intent was to cover properties put there by the implementation, not the user."
       "%KMP: I double-checked the issues, and that seems to be right."
       " No \\term{external symbols} of \\thepackage{common-lisp} "
       " can have \\term{properties} with \\term{property indicators} "
       " that are either \\term{external symbols} of any \\term{standardized} \\term{packages}"
       " or otherwise \\term{accessible} in \\thepackage{common-lisp-user}."
       "% Rewritten. -kmp 15-Feb-92")
      "A " (:TERM NIL "conforming implementation") " must not place any "
      (:TERM NIL "property") " on an " (:TERM NIL "external symbol") " of the "
      (:PACKREF NIL "common-lisp") " " (:TERM NIL "package") " using a "
      (:TERM NIL "property indicator") " that is either an "
      (:TERM NIL "external symbol") " of any " (:TERM NIL "standardized") " "
      (:TERM NIL "package") " or a " (:TERM NIL "symbol") " that is otherwise "
      (:TERM NIL "accessible") " in the " (:PACKREF NIL "common-lisp-user") " "
      (:TERM NIL "package") ". " :PAR
      (:COMMENT NIL "Valid programs"
       "  can assume that the conformal Lisp implementation will not"
       "  have prohibited properties.  The proposal LISP-SYMBOL-REDEFINITION"
       "  addresses the converse; that is, what user programs are allowed"
       "  to do.")
      (:ENDISSUE NIL "PACKAGE-CLUTTER:REDUCE") " ")
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE
       ("Constraints on the COMMON-LISP Package for Conforming Programs"))
      (:IDXTEXT NIL "redefinition") " "
      (:ISSUE NIL "LISP-SYMBOL-REDEFINITION:MAR89-X3J13")
      " Except where explicitly allowed, the consequences are undefined if any of the following actions are performed on an "
      (:TERM NIL "external symbol") " of the " (:PACKREF NIL "common-lisp") " "
      (:TERM NIL "package") ": " :PAR
      (:LIST NIL
       (:ITEM NIL "1. " (:TERM NIL "Binding")
        " or altering its value (lexically or dynamically). (Some exceptions are noted below.) "
        :PAR)
       (:ITEM NIL "2. Defining, "
        (:ISSUE NIL "LISP-SYMBOL-REDEFINITION-AGAIN:MORE-FIXES")
        " undefining, "
        (:ENDISSUE NIL "LISP-SYMBOL-REDEFINITION-AGAIN:MORE-FIXES") " or "
        (:TERM NIL "binding") " it as a " (:TERM NIL "function")
        ". (Some exceptions are noted below.) " :PAR)
       (:ITEM NIL "3. Defining, "
        (:ISSUE NIL "LISP-SYMBOL-REDEFINITION-AGAIN:MORE-FIXES")
        " undefining, "
        (:ENDISSUE NIL "LISP-SYMBOL-REDEFINITION-AGAIN:MORE-FIXES") " or "
        (:TERM NIL "binding") " it as a " (:TERM NIL "macro") " "
        (:ISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89") " or "
        (:TERM NIL "compiler macro") ". "
        (:ENDISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89")
        " (Some exceptions are noted below.) " :PAR
        (:COMMENT NIL " added define-condition --sjl 7 Mar 92"))
       (:ITEM NIL "4. Defining it as a " (:TERM NIL "type specifier") " (via "
        (:MACREF NIL "defstruct") ", " (:MACREF NIL "defclass") ", "
        (:MACREF NIL "deftype") ", " (:MACREF NIL "define-condition") "). "
        :PAR)
       (:ITEM NIL "5. Defining it as a structure (via "
        (:MACREF NIL "defstruct") "). " :PAR)
       (:ITEM NIL "6. Defining it as a " (:TERM NIL "declaration") " with a "
        (:DECLREF NIL "declaration") " " (:TERM NIL "proclamation") ". " :PAR)
       (:ITEM NIL "7. Defining it as a " (:TERM NIL "symbol macro") ". " :PAR
        (:COMMENT NIL "%Barmar notes that this can't be done to any symbols."
         "% Sandra complained, too." " \\itemitem{n.} Altering its name. ")
        :PAR)
       (:ITEM NIL "8. Altering its " (:TERM NIL "home package") ". " :PAR)
       (:ITEM NIL "9. Tracing it (via " (:MACREF NIL "trace") "). " :PAR
        (:COMMENT NIL "What's this \"or lexical\" biz? -kmp 13-May-91"))
       (:ITEM NIL "10. Declaring or proclaiming it "
        (:COMMENT NIL
         "% we voted down the lexical declaration proposal.  --sjl 7 Mar 92"
         "	       \\declref{special} or lexical")
        (:DECLREF NIL "special") " (via " (:MISC NIL "declare") ", "
        (:ISSUE NIL "PROCLAIM-ETC-IN-COMPILE-FILE:NEW-MACRO") " "
        (:MACREF NIL "declaim") ", "
        (:ENDISSUE NIL "PROCLAIM-ETC-IN-COMPILE-FILE:NEW-MACRO") " or "
        (:FUNREF NIL "proclaim") "). " :PAR)
       (:ITEM NIL "11. Declaring or proclaiming its " (:DECLREF NIL "type")
        " or " (:DECLREF NIL "ftype") " (via " (:MISC NIL "declare") ", "
        (:ISSUE NIL "PROCLAIM-ETC-IN-COMPILE-FILE:NEW-MACRO") " "
        (:MACREF NIL "declaim") ", "
        (:ENDISSUE NIL "PROCLAIM-ETC-IN-COMPILE-FILE:NEW-MACRO") " or "
        (:FUNREF NIL "proclaim") "). (Some exceptions are noted below.) " :PAR)
       (:ITEM NIL "12. Removing it from the " (:PACKREF NIL "common-lisp") " "
        (:TERM NIL "package") ". " :PAR
        (:ISSUE NIL "LISP-SYMBOL-REDEFINITION-AGAIN:MORE-FIXES") " " :PAR)
       (:ITEM NIL "13. Defining a " (:TERM NIL "setf expander") " for it (via "
        (:MACREF NIL "defsetf") " or " (:MACREF NIL "define-setf-expander")
        "). " :PAR)
       (:ITEM NIL "14. Defining, undefining, or binding its "
        (:TERM NIL "setf function name") ". " :PAR)
       (:ITEM NIL "15. Defining it as a " (:TERM NIL "method combination")
        " type (via " (:MACREF NIL "define-method-combination") "). " :PAR)
       (:ITEM NIL "16. Using it as the class-name argument to "
        (:FUNREF NIL "setf") " of " (:FUNREF NIL "find-class") ". " :PAR)
       (:ITEM NIL "17. Binding it as a " (:TERM NIL "catch tag") ". " :PAR)
       (:ITEM NIL "18. Binding it as a " (:TERM NIL "restart") " "
        (:TERM NIL "name") ". " :PAR)
       (:ITEM NIL "19. Defining a " (:TERM NIL "method") " for a "
        (:TERM NIL "standardized") " " (:TERM NIL "generic function")
        " which is " (:TERM NIL "applicable") " when all of the "
        (:TERM NIL "arguments") " are " (:TERM NIL "direct instances") " of "
        (:TERM NIL "standardized") " " (:TERM NIL "classes") ". " :PAR
        (:ENDISSUE NIL "LISP-SYMBOL-REDEFINITION-AGAIN:MORE-FIXES") " " :PAR))
      " " :PAR
      (:SUBSUBSUBSUBSECTION
       (:TITLE
        ("Some Exceptions to Constraints on the COMMON-LISP Package for Conforming Programs"))
       "If an " (:TERM NIL "external symbol") " of the "
       (:PACKREF NIL "common-lisp") " " (:TERM NIL "package")
       " is not globally defined as a " (:TERM NIL "standardized") " "
       (:TERM NIL "dynamic variable") " or " (:TERM NIL "constant variable")
       ", it is allowed to lexically " (:TERM NIL "bind")
       " it and to declare the " (:DECLREF NIL "type") " of that "
       (:TERM NIL "binding") ", and it is allowed to locally "
       (:TERM NIL "establish") " it as a " (:TERM NIL "symbol macro") " ("
       (:I NIL "e.g.") ",  with " (:SPECREF NIL "symbol-macrolet") "). " :PAR
       (:COMMENT NIL
        "KMP: Maybe clarify that binding CL special variables is ok,"
        "     but that their type decls are lexical.  Is that right?"
        "%I implemented the first half of that suggestion. -kmp 15-Feb-92")
       "Unless explicitly specified otherwise, if an "
       (:TERM NIL "external symbol") " of the " (:PACKREF NIL "common-lisp")
       " " (:TERM NIL "package") " is globally defined as a "
       (:TERM NIL "standardized") " " (:TERM NIL "dynamic variable")
       ", it is permitted to " (:TERM NIL "bind") " or " (:TERM NIL "assign")
       " that " (:TERM NIL "dynamic variable")
       " provided that the “Value Type” constraints on the "
       (:TERM NIL "dynamic variable") " are maintained, and that the new "
       (:TERM NIL "value") " of the " (:TERM NIL "variable")
       " is consistent with the stated purpose of the " (:TERM NIL "variable")
       ". " :PAR "If an " (:TERM NIL "external symbol") " of the "
       (:PACKREF NIL "common-lisp") " " (:TERM NIL "package")
       " is not defined as a " (:TERM NIL "standardized") " "
       (:TERM NIL "function") ", " (:TERM NIL "macro") ", or "
       (:TERM NIL "special operator") ", it is allowed to lexically "
       (:TERM NIL "bind") " it as a " (:TERM NIL "function") " ("
       (:I NIL "e.g.") ",  with " (:SPECREF NIL "flet") "), to declare the "
       (:DECLREF NIL "ftype") " of that " (:TERM NIL "binding") ", and "
       (:COMMENT NIL
        "KMP: Barmar wanted some explication here.  I think it was sandra who had "
        "     asked for this tracing feature just in case the implementation supported it.")
       "(in " (:TERM NIL "implementations")
       " which provide the ability to do so) to " (:MACREF NIL "trace")
       " that " (:TERM NIL "binding") ". " :PAR "If an "
       (:TERM NIL "external symbol") " of the " (:PACKREF NIL "common-lisp")
       " " (:TERM NIL "package") " is not defined as a "
       (:TERM NIL "standardized") " " (:TERM NIL "function") ", "
       (:TERM NIL "macro") ", or " (:TERM NIL "special operator")
       ", it is allowed to lexically " (:TERM NIL "bind") " it as a "
       (:TERM NIL "macro") " (" (:I NIL "e.g.") ",  with "
       (:SPECREF NIL "macrolet") "). "
       (:ENDISSUE NIL "LISP-SYMBOL-REDEFINITION:MAR89-X3J13") " " :PAR
       (:ENDISSUE NIL "LISP-PACKAGE-NAME:COMMON-LISP") " " :PAR
       (:ISSUE NIL "LISP-SYMBOL-REDEFINITION-AGAIN:MORE-FIXES") " If an "
       (:TERM NIL "external symbol") " of the " (:PACKREF NIL "common-lisp")
       " " (:TERM NIL "package") " is not defined as a "
       (:TERM NIL "standardized") " " (:TERM NIL "function") ", "
       (:TERM NIL "macro") ", or " (:TERM NIL "special operator")
       ", it is allowed to lexically " (:TERM NIL "bind") " its "
       (:TERM NIL "setf function name") " as a " (:TERM NIL "function")
       ", and to declare the " (:DECLREF NIL "ftype") " of that "
       (:TERM NIL "binding") ". "
       (:ENDISSUE NIL "LISP-SYMBOL-REDEFINITION-AGAIN:MORE-FIXES") " " :PAR)
      :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("The COMMON-LISP-USER Package"))
     (:IDXPACKREF NIL "common-lisp-user") (:IDXPACKREF NIL "cl-user") " " :PAR
     "The " (:PACKREF NIL "common-lisp-user") " " (:TERM NIL "package")
     " is the " (:TERM NIL "current package") " when a "
     (:RM NIL " Common Lisp") " system starts up. This " (:TERM NIL "package")
     " " (:TERM NIL "uses") " the " (:PACKREF NIL "common-lisp") " "
     (:TERM NIL "package") ". The " (:PACKREF NIL "common-lisp-user") " "
     (:TERM NIL "package") " has the " (:TERM NIL "nickname") " "
     (:PACKREF NIL "cl-user") ". " (:ISSUE NIL "PACKAGE-CLUTTER:REDUCE")
     " The " (:PACKREF NIL "common-lisp-user") " " (:TERM NIL "package")
     " can have additional " (:TERM NIL "symbols") " " (:TERM NIL "interned")
     " within it; it can " (:TERM NIL "use") " other "
     (:TERM NIL "implementation-defined") " " (:TERM NIL "packages") ". "
     (:ENDISSUE NIL "PACKAGE-CLUTTER:REDUCE") " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("The KEYWORD Package"))
     (:IDXPACKREF NIL "keyword") " " :PAR
     (:COMMENT NIL "% 5.1.2 6" "% 11.3.0 5"
      " % KMP: This isn't a very apt description! " " % %% 11.6.0 4"
      " \\Thepackage{keyword} contains all of the \\newterm{keywords}\\meaning{1}"
      " used by built-in or user-defined \\term{functions}.  " "% Replaced:")
     "The " (:PACKREF NIL "keyword") " " (:TERM NIL "package") " contains "
     (:TERM NIL "symbols") ", called " (:TERM NIL "keywords") (:SUB NIL "1")
     ", that are typically used as special markers in " (:TERM NIL "programs")
     " and their associated data " (:TERM NIL "expressions") (:SUB NIL "1")
     ". " :PAR (:TERM NIL "Symbol") " " (:TERM NIL "tokens")
     " that start with a " (:TERM NIL "package marker") " are parsed by the "
     (:TERM NIL "Lisp reader") " as " (:TERM NIL "symbols") " in the "
     (:PACKREF NIL "keyword") " " (:TERM NIL "package") "; see "
     (:SECREF NIL :SYMBOL-TOKENS)
     ". This makes it notationally convenient to use " (:TERM NIL "keywords")
     " when communicating between programs in different "
     (:TERM NIL "packages") ". For example, the mechanism for passing "
     (:TERM NIL "keyword parameters") " in a " (:TERM NIL "call") " uses "
     (:TERM NIL "keywords") (:SUB NIL "1") " to name the corresponding "
     (:TERM NIL "arguments") "; see " (:SECREF NIL :ORDINARY-LAMBDA-LISTS) ". "
     :PAR (:TERM NIL "Symbols") " in the " (:PACKREF NIL "keyword") " "
     (:TERM NIL "package") " are, by definition, of " (:TERM NIL "type") " "
     (:TYPEREF NIL "keyword") ". " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Interning a Symbol in the KEYWORD Package"))
      "The " (:PACKREF NIL "keyword") " " (:TERM NIL "package")
      " is treated differently than other " (:TERM NIL "packages")
      " in that special actions are taken when a " (:TERM NIL "symbol") " is "
      (:TERM NIL "interned") " in it. In particular, when a "
      (:TERM NIL "symbol") " is " (:TERM NIL "interned") " in the "
      (:PACKREF NIL "keyword") " " (:TERM NIL "package")
      ", it is automatically made to be an " (:TERM NIL "external symbol")
      " and is automatically made to be a " (:TERM NIL "constant variable")
      " with itself as a " (:TERM NIL "value") ". " :PAR
      (:COMMENT NIL
       "% Not really needed. This is documented adequately under SYMBOL-VALUE."
       " \\Thefunction{symbol-value} can be used to"
       " \\term{access} the \\term{value} of a \\term{keyword}\\meaning{1}.)")
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Notes about The KEYWORD Package"))
      "It is generally best to confine the use of " (:TERM NIL "keywords")
      " to situations in which there are a finitely enumerable set of names to be selected between. For example, if there were two states of a light switch, they might be called "
      (:KWD NIL "on") " and " (:KWD NIL "off") ". " :PAR
      "In situations where the set of names is not finitely enumerable ("
      (:I NIL "i.e.")
      ",  where name conflicts might arise) it is frequently best to use "
      (:TERM NIL "symbols") " in some " (:TERM NIL "package") " other than "
      (:PACKREF NIL "keyword")
      " so that conflicts will be naturally avoided. For example, it is generally not wise for a "
      (:TERM NIL "program") " to use a " (:TERM NIL "keyword") (:SUB NIL "1")
      " as a " (:TERM NIL "property indicator")
      ", since if there were ever another " (:TERM NIL "program")
      " that did the same thing, each would clobber the other's data. " :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Implementation-Defined Packages"))
     (:ISSUE NIL "PACKAGE-CLUTTER:REDUCE") " Other, "
     (:TERM NIL "implementation-defined") " " (:TERM NIL "packages")
     " might be present in the initial " (:RM NIL " Common Lisp")
     " environment. "
     (:COMMENT NIL "If it is appropriate, the standard might contain"
      "  as an example that implementations might have a package named"
      "  \"SYSTEM\".")
     (:ENDISSUE NIL "PACKAGE-CLUTTER:REDUCE") " " :PAR
     "It is recommended, but not required, that the documentation for a "
     (:TERM NIL "conforming implementation") " contain a full list of all "
     (:TERM NIL "package") " names initially present in that "
     (:TERM NIL "implementation")
     " but not specified in this specification. (See also the "
     (:TERM NIL "function") " " (:FUNREF NIL "list-all-packages") ".) " :PAR)
    :PAR)
   :PAR)
  :PAR
  (:DICTIONARY NIL :PAR
   (:COMMENT NIL "-------------------- Package Type --------------------") :PAR
   (:COMMENT NIL "% 2.8.0 1")
   (:COM (:NAME "package" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "package") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "package") " is a "
     (:TERM NIL "namespace") " that maps " (:TERM NIL "symbol") " "
     (:TERM NIL "names") " to " (:TERM NIL "symbols") "; see "
     (:SECREF NIL :PACKAGE-CONCEPTS) ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :PACKAGE-CONCEPTS) ", "
     (:SECREF NIL :PRINTING-OTHER-OBJECTS) ", " (:SECREF NIL :SYMBOL-TOKENS)
     " " :PAR))
   :PAR (:COMMENT NIL "%% ========== EXPORT")
   (:COM (:NAME "export" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "export")
      (:ARGLIST NIL "symbols " (:KEYWORD NIL " &optional") " package")
      (:VALUES NIL (:MISC NIL "t")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbols") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "list") " of "
     (:TERM NIL "symbols") ". " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "package") "—a " (:TERM NIL "package designator") ". "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE")
     " The default is the " (:TERM NIL "current package") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 11.0.0 44" "% 11.2.0 28") (:FUNREF NIL "export")
     " makes one or more " (:PARAM NIL "symbols") " that are "
     (:TERM NIL "accessible") " in " (:PARAM NIL "package")
     " (whether directly or by inheritance) be " (:TERM NIL "external symbols")
     " of that " (:PARAM NIL "package") ". " :PAR "If any of the "
     (:PARAM NIL "symbols") " is already " (:TERM NIL "accessible") " as an "
     (:TERM NIL "external symbol") " of " (:PARAM NIL "package") ", "
     (:FUNREF NIL "export") " has no effect on that " (:TERM NIL "symbol")
     ". If the " (:PARAM NIL "symbol") " is " (:COMMENT NIL "directly")
     (:TERM NIL "present") " in " (:PARAM NIL "package")
     " as an internal symbol, it is simply changed to external status. If it is "
     (:TERM NIL "accessible") " as an " (:TERM NIL "internal symbol") " via "
     (:FUNREF NIL "use-package") ", " (:COMMENT NIL "one of \\param{symbols} ")
     "it is first " (:TERM NIL "imported") " into " (:PARAM NIL "package")
     ", then " (:TERM NIL "exported") ". (The " (:PARAM NIL "symbol")
     " is then " (:TERM NIL "present") " in the " (:PARAM NIL "package")
     " whether or not " (:PARAM NIL "package") " continues to use the "
     (:TERM NIL "package") " through which the " (:TERM NIL "symbol")
     " was originally inherited.) " :PAR (:COMMENT NIL "% 11.0.0 50")
     (:FUNREF NIL "export") " makes "
     (:COMMENT NIL "one of \\param{symbols} at a time ") "each "
     (:PARAM NIL "symbol") " " (:TERM NIL "accessible") " to all the "
     (:TERM NIL "packages") " that use " (:PARAM NIL "package")
     ". All of these " (:TERM NIL "packages")
     " are checked for name conflicts: "
     (:TT NIL "(export " (:I NIL "s") " " (:I NIL "p") ")") " does "
     (:TT NIL "(find-symbol (symbol-name " (:I NIL "s") ") " (:I NIL "q") ")")
     " for each package " (:I NIL "q") " in "
     (:TT NIL "(package-used-by-list " (:I NIL "p") ")")
     ". Note that in the usual case of an " (:FUNREF NIL "export")
     " during the initial definition of a " (:TERM NIL "package")
     ", the result of " (:FUNREF NIL "package-used-by-list") " is "
     (:MISC NIL "nil")
     " and the name-conflict checking takes negligible time. When multiple changes are to be made, "
     (:COMMENT NIL "however, ") "for example when " (:FUNREF NIL "export")
     " is given a " (:PARAM NIL "list") " of " (:PARAM NIL "symbols")
     ", it is permissible for the implementation to process each change separately, so that aborting from a name conflict caused by any but the first "
     (:PARAM NIL "symbol") " in the " (:TERM NIL "list")
     " does not unexport the first " (:PARAM NIL "symbol") " in the "
     (:PARAM NIL "list")
     ". However, aborting from a name-conflict error caused by "
     (:FUNREF NIL "export") " of one of " (:PARAM NIL "symbols")
     " does not leave that " (:TERM NIL "symbol") " " (:TERM NIL "accessible")
     " to some " (:TERM NIL "packages") " and " (:TERM NIL "inaccessible")
     " to others; with respect to each of " (:PARAM NIL "symbols")
     " processed, " (:FUNREF NIL "export")
     " behaves as if it were as an atomic operation. " :PAR
     (:COMMENT NIL "% 11.0.0 59") "A name conflict in " (:FUNREF NIL "export")
     " between one of " (:PARAM NIL "symbols") " being exported and a "
     (:TERM NIL "symbol") " already " (:TERM NIL "present") " in a "
     (:TERM NIL "package") " that would inherit the newly-exported "
     (:TERM NIL "symbol") " may be resolved in favor of the exported "
     (:TERM NIL "symbol")
     " by uninterning the other one, or in favor of the already-present "
     (:TERM NIL "symbol") " by making it a shadowing symbol. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (make-package 'temp :use nil) → #<PACKAGE \"TEMP\">
 (use-package 'temp) → T
 (intern \"TEMP-SYM\" 'temp) → TEMP::TEMP-SYM, NIL
 (find-symbol \"TEMP-SYM\") → NIL, NIL
 (export (find-symbol \"TEMP-SYM\" 'temp) 'temp) → T
 (find-symbol \"TEMP-SYM\") → TEMP-SYM, :INHERITED
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The package system is modified. "
     :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:TERM NIL "Accessible") " "
     (:TERM NIL "symbols") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If any of the "
     (:PARAM NIL "symbols") " is not " (:TERM NIL "accessible") " at all in "
     (:PARAM NIL "package") ", an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "package-error") " is signaled that is "
     (:TERM NIL "correctable") " by permitting the " (:TERM NIL "user")
     " to interactively specify whether that " (:TERM NIL "symbol")
     " should be " (:TERM NIL "imported") ". " :PAR
     (:COMMENT NIL "!!! Sandra: Something about name conflicts here?") :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "import") ", "
     (:FUNREF NIL "unexport") ", " (:SECREF NIL :PACKAGE-CONCEPTS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FIND-SYMBOL")
   (:COM (:NAME "find-symbol" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "find-symbol")
      (:ARGLIST NIL "string " (:KEYWORD NIL " &optional") " package")
      (:VALUES NIL "symbol, status"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "string") "—a "
     (:TERM NIL "string") ". " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "package") "—a " (:TERM NIL "package designator") ". "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE")
     " The default is the " (:TERM NIL "current package") ". " :PAR
     (:PARAM NIL "symbol") "—a " (:TERM NIL "symbol") " accessible in the "
     (:PARAM NIL "package") ", or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "status") "—one of " (:KWD NIL "inherited") ", "
     (:KWD NIL "external") ", " (:KWD NIL "internal") ", or " (:MISC NIL "nil")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 11.2.0 24")
     (:FUNREF NIL "find-symbol") " locates a " (:TERM NIL "symbol") " whose "
     (:TERM NIL "name") " is " (:PARAM NIL "string") " in a "
     (:TERM NIL "package") ". If a " (:TERM NIL "symbol") " named "
     (:PARAM NIL "string") " is found in " (:PARAM NIL "package")
     ", directly or by inheritance, the " (:TERM NIL "symbol")
     " found is returned as the first value; the second value is as follows: "
     :PAR
     (:LIST NIL
      (:ITEM NIL (:KWD NIL "internal") " " :PAR "If the " (:TERM NIL "symbol")
       " is " (:TERM NIL "present") " in " (:PARAM NIL "package") " as an "
       (:TERM NIL "internal symbol") ". " :PAR)
      (:ITEM NIL (:KWD NIL "external") " " :PAR "If the " (:TERM NIL "symbol")
       " is " (:TERM NIL "present") " in " (:PARAM NIL "package") " as an "
       (:TERM NIL "external symbol") ". " :PAR)
      (:ITEM NIL (:KWD NIL "inherited") " " :PAR "If the " (:TERM NIL "symbol")
       " is inherited by " (:PARAM NIL "package") " through "
       (:FUNREF NIL "use-package") ", " (:COMMENT NIL " Added for Sandra:")
       "but is not " (:TERM NIL "present") " in " (:PARAM NIL "package") ". "
       :PAR))
     " " :PAR "If no such " (:TERM NIL "symbol") " is "
     (:TERM NIL "accessible") " in " (:PARAM NIL "package")
     ", both values are " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (find-symbol \"NEVER-BEFORE-USED\") → NIL, NIL
 (find-symbol \"NEVER-BEFORE-USED\") → NIL, NIL
 (intern \"NEVER-BEFORE-USED\") → NEVER-BEFORE-USED, NIL
 (intern \"NEVER-BEFORE-USED\") → NEVER-BEFORE-USED, :INTERNAL
 (find-symbol \"NEVER-BEFORE-USED\") → NEVER-BEFORE-USED, :INTERNAL
 (find-symbol \"never-before-used\") → NIL, NIL
 (find-symbol \"CAR\" 'common-lisp-user) → CAR, :INHERITED
 (find-symbol \"CAR\" 'common-lisp) → CAR, :EXTERNAL
 (find-symbol \"NIL\" 'common-lisp-user) → NIL, :INHERITED
 (find-symbol \"NIL\" 'common-lisp) → NIL, :EXTERNAL
 (find-symbol \"NIL\" (prog1 (make-package \"JUST-TESTING\" :use '())
                           (intern \"NIL\" \"JUST-TESTING\")))
→ JUST-TESTING::NIL, :INTERNAL
 (export 'just-testing::nil 'just-testing)
 (find-symbol \"NIL\" 'just-testing) → JUST-TESTING:NIL, :EXTERNAL
 (find-symbol \"NIL\" \"KEYWORD\")
→ NIL, NIL
OR→ :NIL, :EXTERNAL
 (find-symbol (symbol-name :nil) \"KEYWORD\") → :NIL, :EXTERNAL
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:FUNREF NIL "intern") ", "
     (:FUNREF NIL "import") ", " (:FUNREF NIL "export") ", "
     (:FUNREF NIL "use-package") ", " (:FUNREF NIL "unintern") ", "
     (:FUNREF NIL "unexport") ", " (:FUNREF NIL "unuse-package") " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "intern") ", "
     (:FUNREF NIL "find-all-symbols") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "find-symbol")
     " is operationally equivalent to " (:FUNREF NIL "intern")
     ", except that it never creates a new " (:TERM NIL "symbol") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FIND-PACKAGE") :PAR
   (:COM (:NAME "find-package" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "find-package") (:ARGLIST NIL "name")
      (:VALUES NIL "package"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL "% Text of this dictionary entry slightly rearranged"
      "% per Margolin #13 (first public review). -kmp 1-Jul-93")
     :PAR (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "name") "—a " (:TERM NIL "string designator") " or a "
     (:TERM NIL "package") " " (:TERM NIL "object") ". "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " " :PAR
     (:PARAM NIL "package") "—a " (:TERM NIL "package") " "
     (:TERM NIL "object") " or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 11.2.0 12") "If "
     (:PARAM NIL "name") " is a " (:TERM NIL "string designator") ", "
     (:FUNREF NIL "find-package") " locates and returns the "
     (:TERM NIL "package") " whose name or nickname is " (:PARAM NIL "name")
     ". " (:COMMENT NIL "% 11.0.0 21" "The \\funref{find-package} ")
     "This search is case sensitive. If there is no such "
     (:TERM NIL "package") ", " (:FUNREF NIL "find-package") " returns "
     (:MISC NIL "nil") ". " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " If "
     (:PARAM NIL "name") " is a " (:TERM NIL "package") " "
     (:TERM NIL "object") ", that " (:TERM NIL "package") " "
     (:TERM NIL "object") " is returned. "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (find-package 'common-lisp) → #<PACKAGE \"COMMON-LISP\">
 (find-package \"COMMON-LISP-USER\") → #<PACKAGE \"COMMON-LISP-USER\">
 (find-package 'not-there) → NIL
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The set of " (:TERM NIL "packages")
     " created by the " (:TERM NIL "implementation") ". " :PAR
     (:MACREF NIL "defpackage") ", " (:FUNREF NIL "delete-package") ", "
     (:FUNREF NIL "make-package") ", " (:FUNREF NIL "rename-package") " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-package") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FIND-ALL-SYMBOLS")
   (:COM (:NAME "find-all-symbols" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "find-all-symbols")
      (:ARGLIST NIL "string") (:VALUES NIL "symbols"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "string") "—a "
     (:TERM NIL "string designator") ". " :PAR (:PARAM NIL "symbols") "—a "
     (:TERM NIL "list") " of " (:TERM NIL "symbols") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 11.2.0 38")
     (:FUNREF NIL "find-all-symbols") " searches "
     (:ISSUE NIL "PACKAGE-DELETION:NEW-FUNCTION") " every "
     (:TERM NIL "registered package") " "
     (:ENDISSUE NIL "PACKAGE-DELETION:NEW-FUNCTION") " for "
     (:TERM NIL "symbols") " that have a " (:TERM NIL "name") " that is the "
     (:TERM NIL "same") " (under " (:FUNREF NIL "string=") ") as "
     (:PARAM NIL "string") ". A " (:TERM NIL "list") " of all such "
     (:TERM NIL "symbols") " is returned. Whether or how the "
     (:TERM NIL "list") " is ordered is "
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (find-all-symbols 'car)
→ (CAR)
OR→ (CAR VEHICLES:CAR)
OR→ (VEHICLES:CAR CAR)
 (intern \"CAR\" (make-package 'temp :use nil)) → TEMP::CAR, NIL
 (find-all-symbols 'car)
→ (TEMP::CAR CAR)
OR→ (CAR TEMP::CAR)
OR→ (TEMP::CAR CAR VEHICLES:CAR)
OR→ (CAR TEMP::CAR VEHICLES:CAR)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "find-symbol") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== IMPORT")
   (:COM (:NAME "import" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "import")
      (:ARGLIST NIL "symbols " (:KEYWORD NIL " &optional") " package")
      (:VALUES NIL (:MISC NIL "t")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbols") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "list") " of "
     (:TERM NIL "symbols") ". " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "package") "—a " (:TERM NIL "package designator") ". "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE")
     " The default is the " (:TERM NIL "current package") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 11.2.0 31" "% 11.0.0 50") (:FUNREF NIL "import") " adds "
     (:PARAM NIL "symbol") " or " (:PARAM NIL "symbols")
     " to the internals of " (:PARAM NIL "package")
     ", checking for name conflicts with existing " (:TERM NIL "symbols")
     " either " (:TERM NIL "present") " in " (:PARAM NIL "package") " or "
     (:TERM NIL "accessible") " to it. Once the " (:PARAM NIL "symbols")
     " have been " (:TERM NIL "imported") ", they may be referenced in the "
     (:TERM NIL "importing") " " (:PARAM NIL "package")
     " without the use of a " (:TERM NIL "package prefix") " when using the "
     (:TERM NIL "Lisp reader") ". " :PAR (:COMMENT NIL "% 11.0.0 61 ")
     "A name conflict in " (:FUNREF NIL "import") " between the "
     (:PARAM NIL "symbol")
     " being imported and a symbol inherited from some other "
     (:TERM NIL "package") " can be resolved in favor of the "
     (:PARAM NIL "symbol") " being " (:TERM NIL "imported")
     " by making it a shadowing symbol, or in favor of the "
     (:TERM NIL "symbol") " already " (:TERM NIL "accessible")
     " by not doing the " (:FUNREF NIL "import") ". A name conflict in "
     (:FUNREF NIL "import") " with a " (:TERM NIL "symbol") " already "
     (:TERM NIL "present") " in the " (:PARAM NIL "package")
     " may be resolved by uninterning that " (:TERM NIL "symbol")
     ", or by not doing the " (:FUNREF NIL "import") ". " :PAR "The imported "
     (:TERM NIL "symbol") " is not automatically exported from the "
     (:TERM NIL "current package") ", but if it is already "
     (:TERM NIL "present")
     " and external, then the fact that it is external is not changed. "
     (:ISSUE NIL "IMPORT-SETF-SYMBOL-PACKAGE") " If any " (:TERM NIL "symbol")
     " to be " (:TERM NIL "imported") " has no home package (" (:I NIL "i.e.")
     ",  " (:TT NIL " (symbol-package " (:PARAM NIL "symbol") ") → nil") "), "
     (:FUNREF NIL "import") " sets the " (:TERM NIL "home package") " of the "
     (:PARAM NIL "symbol") " to " (:PARAM NIL "package") ". "
     (:ENDISSUE NIL "IMPORT-SETF-SYMBOL-PACKAGE") " " :PAR
     (:COMMENT NIL "% 11.0.0 37") "If the " (:PARAM NIL "symbol")
     " is already " (:TERM NIL "present") " in the importing "
     (:PARAM NIL "package") ", " (:FUNREF NIL "import") " has no effect. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (import 'common-lisp::car (make-package 'temp :use nil)) → T
 (find-symbol \"CAR\" 'temp) → CAR, :INTERNAL
 (find-symbol \"CDR\" 'temp) → NIL, NIL 
")
     " " :PAR "The form " (:TT NIL "(import 'editor:buffer)")
     " takes the external symbol named " (:TT NIL "buffer") " in the "
     (:PACKREF NIL "editor") " " (:TERM NIL "package")
     " (this symbol was located when the form was read by the "
     (:TERM NIL "Lisp reader") ") and adds it to the "
     (:TERM NIL "current package") " as an " (:TERM NIL "internal symbol")
     ". The symbol " (:TT NIL "buffer") " is then " (:TERM NIL "present")
     " in the " (:TERM NIL "current package") ". " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The package system is modified. "
     :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "Current state of the package system. " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR (:FUNREF NIL "import")
     " signals a " (:TERM NIL "correctable") " error of " (:TERM NIL "type")
     " " (:TYPEREF NIL "package-error") " if any of the "
     (:PARAM NIL "symbols") " to be " (:TERM NIL "imported") " has the "
     (:TERM NIL "same") " " (:TERM NIL "name") " (under "
     (:FUNREF NIL "string=") ") as some distinct " (:TERM NIL "symbol")
     " (under " (:FUNREF NIL "eql") ") already " (:TERM NIL "accessible")
     " in the " (:PARAM NIL "package") ", even if the conflict is with a "
     (:TERM NIL "shadowing symbol") " of the " (:PARAM NIL "package") ". "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "shadow") ", "
     (:FUNREF NIL "export") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LIST-ALL-PACKAGES")
   (:COM (:NAME "list-all-packages" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "list-all-packages")
      (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments")))
      (:VALUES NIL "packages"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "packages")
     "—a " (:TERM NIL "list") " of " (:TERM NIL "package") " "
     (:TERM NIL "objects") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 11.2.0 19")
     (:FUNREF NIL "list-all-packages") " returns a "
     (:ISSUE NIL "RESULT-LISTS-SHARED:SPECIFY") " " (:TERM NIL "fresh") " "
     (:ENDISSUE NIL "RESULT-LISTS-SHARED:SPECIFY") " " (:TERM NIL "list")
     " of " (:ISSUE NIL "PACKAGE-DELETION:NEW-FUNCTION") " all "
     (:TERM NIL "registered packages") ". "
     (:ENDISSUE NIL "PACKAGE-DELETION:NEW-FUNCTION") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (let ((before (list-all-packages)))
    (make-package 'temp)
    (set-difference (list-all-packages) before)) → (#<PACKAGE \"TEMP\">)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:MACREF NIL "defpackage") ", "
     (:FUNREF NIL "delete-package") ", " (:FUNREF NIL "make-package") " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR
     (:COMMENT NIL "% Sandra thinks this is excessive."
      "Might signal \\typeref{storage-condition}.")
     :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== RENAME-PACKAGE")
   (:COM (:NAME "rename-package" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "rename-package")
      (:ARGLIST NIL "package new-name " (:KEYWORD NIL " &optional")
       " new-nicknames")
      (:VALUES NIL "package-object"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "package") "—a " (:TERM NIL "package designator") ". "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " " :PAR
     (:PARAM NIL "new-name") "—a " (:TERM NIL "package designator") ". " :PAR
     (:PARAM NIL "new-nicknames") "—a " (:TERM NIL "list") " of "
     (:TERM NIL "string designators") ". The default is the "
     (:TERM NIL "empty list") ". " :PAR
     (:ISSUE NIL "RETURN-VALUES-UNSPECIFIED:SPECIFY") " "
     (:PARAM NIL "package-object") "—the renamed " (:PARAM NIL "package") " "
     (:TERM NIL "object") ". "
     (:ENDISSUE NIL "RETURN-VALUES-UNSPECIFIED:SPECIFY") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "Replaces the name and nicknames of "
     (:PARAM NIL "package") ". " (:COMMENT NIL "% 11.2.0 15")
     "The old name and all of the old nicknames of " (:PARAM NIL "package")
     " are eliminated and are replaced by " (:PARAM NIL "new-name") " and "
     (:PARAM NIL "new-nicknames") ". " :PAR
     "The consequences are undefined if " (:PARAM NIL "new-name") " or any "
     (:PARAM NIL "new-nickname") " conflicts with any existing package names. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (make-package 'temporary :nicknames '(\"TEMP\")) → #<PACKAGE \"TEMPORARY\">
 (rename-package 'temp 'ephemeral) → #<PACKAGE \"EPHEMERAL\">
 (package-nicknames (find-package 'ephemeral)) → ()
 (find-package 'temporary) → NIL
 (rename-package 'ephemeral 'temporary '(temp fleeting))
→ #<PACKAGE \"TEMPORARY\">
 (package-nicknames (find-package 'temp)) → (\"TEMP\" \"FLEETING\")
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-package") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SHADOW")
   (:COM (:NAME "shadow" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "shadow")
      (:ARGLIST NIL "symbol-names " (:KEYWORD NIL " &optional") " package")
      (:VALUES NIL (:MISC NIL "t")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "SHADOW-ALREADY-PRESENT:WORKS") " "
     (:PARAM NIL "symbol-names") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "list") " of " (:TERM NIL "string designators") ". "
     (:ENDISSUE NIL "SHADOW-ALREADY-PRESENT:WORKS") " " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "package") "—a " (:TERM NIL "package designator") ". "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE")
     " The default is the " (:TERM NIL "current package") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "shadow")
     " assures that " (:TERM NIL "symbols") " with names given by "
     (:PARAM NIL "symbol-names") " are " (:TERM NIL "present") " "
     (:COMMENT NIL "as \\term{internal symbols} of") "in the "
     (:PARAM NIL "package") ". " :PAR (:COMMENT NIL "% 11.2.0 34")
     "Specifically, " (:PARAM NIL "package") " is searched for "
     (:TERM NIL "symbols") " with the " (:TERM NIL "names") " supplied by "
     (:PARAM NIL "symbol-names") ". "
     (:ISSUE NIL "SHADOW-ALREADY-PRESENT:WORKS") " For each such "
     (:TERM NIL "name") ", if a corresponding " (:TERM NIL "symbol") " "
     (:COMMENT NIL " oops!  --sjl 7 Mar 92"
      "is \\term{present} in \\param{package} (directly, not by inheritance), ")
     "is not " (:TERM NIL "present") " in " (:PARAM NIL "package")
     " (directly, not by inheritance), then a corresponding "
     (:TERM NIL "symbol") " is created with that " (:TERM NIL "name")
     ", and inserted into " (:PARAM NIL "package") " as an "
     (:TERM NIL "internal symbol") ". The corresponding " (:TERM NIL "symbol")
     ", whether pre-existing or newly created, is then added, if not already present, to the "
     (:TERM NIL "shadowing symbols list") " of " (:PARAM NIL "package") ". "
     (:ENDISSUE NIL "SHADOW-ALREADY-PRESENT:WORKS") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (package-shadowing-symbols (make-package 'temp)) → NIL
 (find-symbol \"CAR\" 'temp) → CAR, :INHERITED
 (shadow 'car 'temp) → T
 (find-symbol \"CAR\" 'temp) → TEMP::CAR, :INTERNAL
 (package-shadowing-symbols 'temp) → (TEMP::CAR)
")
     " " :PAR
     (:COMMENT NIL
      "!!! What is this \"should not error\" biz, and what does USE-PACKAGE return...?")
     (:ISSUE NIL "SHADOW-ALREADY-PRESENT") " "
     (:CODE NIL " (make-package 'test-1) → #<PACKAGE \"TEST-1\">
 (intern \"TEST\" (find-package 'test-1)) → TEST-1::TEST, NIL
 (shadow 'test-1::test (find-package 'test-1)) → T
 (shadow 'TEST (find-package 'test-1)) → T
 (assert (not (null (member 'test-1::test (package-shadowing-symbols
                                            (find-package 'test-1))))))
 
 (make-package 'test-2) → #<PACKAGE \"TEST-2\">
 (intern \"TEST\" (find-package 'test-2)) → TEST-2::TEST, NIL
 (export 'test-2::test (find-package 'test-2)) → T
 (use-package 'test-2 (find-package 'test-1))    ;should not error
 
")
     " " (:ENDISSUE NIL "SHADOW-ALREADY-PRESENT") " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR (:COMMENT NIL "% 11.2.0 35")
     (:FUNREF NIL "shadow")
     " changes the state of the package system in such a way that the package consistency rules do not hold across the change. "
     :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "Current state of the package system. " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:FUNREF NIL "package-shadowing-symbols") ", "
     (:COMMENT NIL "% ?? Ref ?? -kmp 22-Oct-91" "``Character Reader'',")
     (:SECREF NIL :PACKAGE-CONCEPTS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL "% 11.0.0 52"
      " \\funref{shadow} does name-conflict checking to the extent that it"
      " checks whether a distinct existing \\term{symbol} with the same name"
      " as one of \\param{symbol-names} is \\term{accessible} and, if so, whether "
      " it is directly \\term{present} in \\param{package} or inherited.  In the "
      " latter case, a new \\term{symbol} is created to shadow it.  ")
     :PAR "If a " (:TERM NIL "symbol") " with a name in "
     (:PARAM NIL "symbol-names") " already exists in " (:PARAM NIL "package")
     ", but by inheritance, the inherited symbol becomes "
     (:TERM NIL "shadowed") (:SUB NIL "3") " by a newly created "
     (:TERM NIL "internal symbol") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SHADOWING-IMPORT")
   (:COM (:NAME "shadowing-import" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "shadowing-import")
      (:ARGLIST NIL "symbols " (:KEYWORD NIL " &optional") " package")
      (:VALUES NIL (:MISC NIL "t")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbols") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "list") " of "
     (:TERM NIL "symbols") ". " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "package") " —a " (:TERM NIL "package designator") ". "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE")
     " The default is the " (:TERM NIL "current package") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 11.2.0 32")
     (:FUNREF NIL "shadowing-import") " is like " (:FUNREF NIL "import")
     ", but it does not signal an error even if the importation of a "
     (:TERM NIL "symbol") " would shadow some " (:TERM NIL "symbol")
     " already " (:TERM NIL "accessible") " in " (:PARAM NIL "package") ". "
     :PAR (:COMMENT NIL "% 11.0.0 38") (:FUNREF NIL "shadowing-import")
     " inserts each of " (:PARAM NIL "symbols") " into " (:PARAM NIL "package")
     " as an internal symbol, regardless of whether another "
     (:TERM NIL "symbol")
     " of the same name is shadowed by this action. If a different "
     (:TERM NIL "symbol") " of the same name is already " (:TERM NIL "present")
     " in " (:PARAM NIL "package") ", that " (:TERM NIL "symbol") " is first "
     (:TERM NIL "uninterned") " from " (:PARAM NIL "package") ". The new "
     (:TERM NIL "symbol") " is added to " (:PARAM NIL "package")
     "'s shadowing-symbols list. " :PAR (:COMMENT NIL "% 11.0.0 52")
     (:FUNREF NIL "shadowing-import")
     " does name-conflict checking to the extent that it checks whether a distinct existing "
     (:TERM NIL "symbol") " with the same name is " (:TERM NIL "accessible")
     "; if so, it is shadowed by the new " (:TERM NIL "symbol")
     ", which implies that it must be uninterned if it was "
     (:COMMENT NIL "directly") (:TERM NIL "present") " in "
     (:PARAM NIL "package") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL
      " (in-package \"COMMON-LISP-USER\") → #<PACKAGE \"COMMON-LISP-USER\">
 (setq sym (intern \"CONFLICT\")) → CONFLICT
 (intern \"CONFLICT\" (make-package 'temp)) → TEMP::CONFLICT, NIL
 (package-shadowing-symbols 'temp) → NIL
 (shadowing-import sym 'temp) → T 
 (package-shadowing-symbols 'temp) → (CONFLICT)
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR (:COMMENT NIL "% 11.2.0 33")
     (:FUNREF NIL "shadowing-import")
     " changes the state of the package system in such a way that the consistency rules do not hold across the change. "
     :PAR (:PARAM NIL "package") "'s shadowing-symbols list is modified. "
     :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "Current state of the package system. " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "import") ", "
     (:FUNREF NIL "unintern") ", " (:FUNREF NIL "package-shadowing-symbols")
     " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DELETE-PACKAGE")
   (:COM (:NAME "delete-package" :FTYPE "Function")
    (:ISSUE NIL "PACKAGE-DELETION:NEW-FUNCTION") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "delete-package")
      (:ARGLIST NIL "package") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "package") "—a " (:TERM NIL "package designator") ". "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " " :PAR
     (:PARAM NIL "generalized-boolean") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "delete-package")
     " deletes " (:PARAM NIL "package")
     " from all package system data structures. "
     (:COMMENT NIL "% KC addition") "If the operation is successful, "
     (:FUNREF NIL "delete-package") " returns true, otherwise "
     (:MISC NIL "nil") ". " (:COMMENT NIL "% end KC addition") "The effect of "
     (:FUNREF NIL "delete-package") " is that the name and nicknames of "
     (:PARAM NIL "package")
     " cease to be recognized package names. The package " (:TERM NIL "object")
     " is still a " (:TERM NIL "package") " (" (:I NIL "i.e.") ",  "
     (:FUNREF NIL "packagep") " is " (:TERM NIL "true") " of it) but "
     (:FUNREF NIL "package-name") " returns " (:MISC NIL "nil") ". "
     (:COMMENT NIL "% KC addition") "The consequences of deleting the "
     (:PACKREF NIL "common-lisp") " " (:TERM NIL "package") " or the "
     (:PACKREF NIL "keyword") " " (:TERM NIL "package") " are undefined. "
     (:COMMENT NIL "% end KC addition")
     "The consequences of invoking any other package operation on "
     (:PARAM NIL "package")
     " once it has been deleted are unspecified. In particular, the consequences of invoking "
     (:FUNREF NIL "find-symbol") ", " (:FUNREF NIL "intern")
     " and other functions that look for a symbol name in a "
     (:TERM NIL "package") " are unspecified if they are called with "
     (:VARREF NIL "*package*") " bound to the deleted " (:PARAM NIL "package")
     " or with the deleted " (:PARAM NIL "package") " as an argument. " :PAR
     "If " (:PARAM NIL "package") " is a " (:TERM NIL "package") " "
     (:TERM NIL "object") " that has already been deleted, "
     (:FUNREF NIL "delete-package") " immediately returns " (:MISC NIL "nil")
     ". " :PAR "After this operation completes, the "
     (:COMMENT NIL "contents of the \\funref{symbol-package} slot")
     (:TERM NIL "home package") " of any " (:TERM NIL "symbol") " whose "
     (:TERM NIL "home package") " " (:COMMENT NIL "is") "had previously been "
     (:PARAM NIL "package") " " (:COMMENT NIL "are") "is "
     (:COMMENT NIL "unspecified") (:TERM NIL "implementation-dependent")
     ". Except for this, " (:TERM NIL "symbols") " " (:TERM NIL "accessible")
     " in " (:PARAM NIL "package") " are not modified in any other way; "
     (:TERM NIL "symbols") " whose " (:TERM NIL "home package") " is not "
     (:PARAM NIL "package") " remain unchanged. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq *foo-package* (make-package \"FOO\" :use nil))
 (setq *foo-symbol*  (intern \"FOO\" *foo-package*))
 (export *foo-symbol* *foo-package*)

 (setq *bar-package* (make-package \"BAR\" :use '(\"FOO\")))
 (setq *bar-symbol*  (intern \"BAR\" *bar-package*))
 (export *foo-symbol* *bar-package*)
 (export *bar-symbol* *bar-package*)

 (setq *baz-package* (make-package \"BAZ\" :use '(\"BAR\")))

 (symbol-package *foo-symbol*) → #<PACKAGE \"FOO\">
 (symbol-package *bar-symbol*) → #<PACKAGE \"BAR\">

 (prin1-to-string *foo-symbol*) → \"FOO:FOO\"
 (prin1-to-string *bar-symbol*) → \"BAR:BAR\"

 (find-symbol \"FOO\" *bar-package*) → FOO:FOO, :EXTERNAL

 (find-symbol \"FOO\" *baz-package*) → FOO:FOO, :INHERITED
 (find-symbol \"BAR\" *baz-package*) → BAR:BAR, :INHERITED

 (packagep *foo-package*) → "
      (:TERM NIL "true") "
 (packagep *bar-package*) → "
      (:TERM NIL "true") "
 (packagep *baz-package*) → "
      (:TERM NIL "true") "

 (package-name *foo-package*) → \"FOO\"
 (package-name *bar-package*) → \"BAR\"
 (package-name *baz-package*) → \"BAZ\"

 (package-use-list *foo-package*) → ()
 (package-use-list *bar-package*) → (#<PACKAGE \"FOO\">)
 (package-use-list *baz-package*) → (#<PACKAGE \"BAR\">)

 (package-used-by-list *foo-package*) → (#<PACKAGE \"BAR\">)
 (package-used-by-list *bar-package*) → (#<PACKAGE \"BAZ\">)
 (package-used-by-list *baz-package*) → ()

 (delete-package *bar-package*)
⊳ Error: Package BAZ uses package BAR.
⊳ If continued, BAZ will be made to unuse-package BAR,
⊳ and then BAR will be deleted.
⊳ Type :CONTINUE to continue.
⊳ Debug> "
      (:IN NIL ":CONTINUE") "
→ T

 (symbol-package *foo-symbol*) → #<PACKAGE \"FOO\">
 (symbol-package *bar-symbol*) is unspecified

 (prin1-to-string *foo-symbol*) → \"FOO:FOO\"
 (prin1-to-string *bar-symbol*) is unspecified

 (find-symbol \"FOO\" *bar-package*) is unspecified

 (find-symbol \"FOO\" *baz-package*) → NIL, NIL
 (find-symbol \"BAR\" *baz-package*) → NIL, NIL

 (packagep *foo-package*) → T
 (packagep *bar-package*) → T
 (packagep *baz-package*) → T

 (package-name *foo-package*) → \"FOO\"
 (package-name *bar-package*) → NIL
 (package-name *baz-package*) → \"BAZ\"

 (package-use-list *foo-package*) → ()
 (package-use-list *bar-package*) is unspecified
 (package-use-list *baz-package*) → ()

 (package-used-by-list *foo-package*) → ()
 (package-used-by-list *bar-package*) is unspecified
 (package-used-by-list *baz-package*) → ()
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If the "
     (:PARAM NIL "package") " " (:TERM NIL "designator") " is a "
     (:TERM NIL "name") " that does not currently name a "
     (:TERM NIL "package") ", a " (:TERM NIL "correctable") " error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "package-error")
     " is signaled. If correction is attempted, no deletion action is attempted; instead, "
     (:FUNREF NIL "delete-package") " immediately returns " (:MISC NIL "nil")
     ". " :PAR "If " (:PARAM NIL "package") " is used by other "
     (:TERM NIL "packages") ", a " (:TERM NIL "correctable") " error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "package-error")
     " is signaled. If correction is attempted, " (:FUNREF NIL "unuse-package")
     " is effectively called to remove any dependencies, causing "
     (:PARAM NIL "package") "'s " (:TERM NIL "external symbols")
     " to cease being " (:TERM NIL "accessible") " to those "
     (:TERM NIL "packages") " that use " (:PARAM NIL "package") ". "
     (:FUNREF NIL "delete-package") " then deletes " (:PARAM NIL "package")
     " just as it would have had there been no " (:TERM NIL "packages")
     " that used it. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "unuse-package") " " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "PACKAGE-DELETION:NEW-FUNCTION") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MAKE-PACKAGE")
   (:COM (:NAME "make-package" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-package")
      (:ARGLIST NIL "package-name " (:KEYWORD NIL " &key") " nicknames use")
      (:VALUES NIL "package"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "package-name")
     "—a " (:TERM NIL "string designator") ". " :PAR (:PARAM NIL "nicknames")
     "—a " (:TERM NIL "list") " of " (:TERM NIL "string designators")
     ". The default is the " (:TERM NIL "empty list") ". " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:COMMENT NIL "% 11.2.0 9") (:PARAM NIL "use") "—"
     (:COMMENT NIL "a \\term{designator} for ") "a " (:TERM NIL "list") " of "
     (:TERM NIL "package designators") ". "
     (:ISSUE NIL "MAKE-PACKAGE-USE-DEFAULT:IMPLEMENTATION-DEPENDENT")
     " The default is " (:TERM NIL "implementation-defined") ". "
     (:ENDISSUE NIL "MAKE-PACKAGE-USE-DEFAULT:IMPLEMENTATION-DEPENDENT") " "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " " :PAR
     (:PARAM NIL "package") "—a " (:TERM NIL "package") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 11.2.0 8                                   ")
     "Creates a new " (:TERM NIL "package") " with the name "
     (:PARAM NIL "package-name") ". " :PAR (:PARAM NIL "Nicknames")
     " are additional " (:TERM NIL "names")
     " which may be used to refer to the new " (:TERM NIL "package") ". " :PAR
     (:PARAM NIL "use") " specifies zero or more " (:TERM NIL "packages")
     " the " (:TERM NIL "external symbols")
     " of which are to be inherited by the new " (:TERM NIL "package")
     ". See the " (:TERM NIL "function") " " (:FUNREF NIL "use-package") ". "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (make-package 'temporary :nicknames '(\"TEMP\" \"temp\")) → #<PACKAGE \"TEMPORARY\">
 (make-package \"OWNER\" :use '(\"temp\")) → #<PACKAGE \"OWNER\">
 (package-used-by-list 'temp) → (#<PACKAGE \"OWNER\">)
 (package-use-list 'owner) → (#<PACKAGE \"TEMPORARY\">)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The existence of other "
     (:TERM NIL "packages") " in the system. " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "The consequences are unspecified if " (:TERM NIL "packages")
     " denoted by " (:PARAM NIL "use") " do not exist. " :PAR "A "
     (:TERM NIL "correctable") " error is signaled if the "
     (:PARAM NIL "package-name") " or any of the " (:PARAM NIL "nicknames")
     " is already the " (:TERM NIL "name") " or " (:TERM NIL "nickname")
     " of an existing " (:TERM NIL "package") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "defpackage") ", "
     (:FUNREF NIL "use-package") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "In situations where the "
     (:TERM NIL "packages")
     " to be used contain symbols which would conflict, it is necessary to first create the package with "
     (:TT NIL ":use '()") ", then to use " (:FUNREF NIL "shadow") " or "
     (:FUNREF NIL "shadowing-import")
     " to address the conflicts, and then after that to use "
     (:FUNREF NIL "use-package") " once the conflicts have been addressed. "
     :PAR
     "When packages are being created as part of the static definition of a program rather than dynamically by the program, it is generally considered more stylistically appropriate to use "
     (:MACREF NIL "defpackage") " rather than " (:FUNREF NIL "make-package")
     ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== WITH-PACKAGE-ITERATOR")
   (:COM (:NAME "with-package-iterator" :FTYPE "Macro")
    (:ISSUE NIL "DECLS-AND-DOC") " " :PAR
    (:ISSUE NIL "HASH-TABLE-PACKAGE-GENERATORS:ADD-WITH-WRAPPER") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "with-package-iterator")
      (:ARGLIST NIL
       (:PAREN NIL "name package-list-form " (:KEYWORD NIL " &rest")
        " symbol-types")
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL " ughh.  -sjl 7 Mar 92"
      "\\param{name}---a name suitable for the first argument to \\specref{macrolet}.")
     (:PARAM NIL "name") "—a " (:TERM NIL "symbol") ". " :PAR
     (:PARAM NIL "package-list-form") "—a " (:TERM NIL "form")
     "; evaluated once to produce a " (:PARAM NIL "package-list") ". " :PAR
     (:PARAM NIL "package-list") "—a " (:TERM NIL "designator")
     " for a list of " (:TERM NIL "package designators") ". " :PAR
     (:PARAM NIL "symbol-type") "—one of the " (:TERM NIL "symbols") " "
     (:KWD NIL "internal") ", " (:KWD NIL "external") ", or "
     (:KWD NIL "inherited") ". " :PAR (:PARAM NIL "declaration") "—a "
     (:MISC NIL "declare") " " (:TERM NIL "expression") "; not evaluated. "
     :PAR (:PARAM NIL "forms") "—an " (:TERM NIL "implicit progn") ". " :PAR
     (:PARAM NIL "results") "—the " (:TERM NIL "values") " of the "
     (:PARAM NIL "forms") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "Within the lexical scope of the body " (:PARAM NIL "forms") ", the "
     (:PARAM NIL "name") " is defined via " (:SPECREF NIL "macrolet")
     " such that successive invocations of "
     (:TT NIL " (" (:PARAM NIL "name") ")") " will return the "
     (:TERM NIL "symbols") ", one by one, from the " (:TERM NIL "packages")
     " in " (:PARAM NIL "package-list") ". " :PAR "It is unspecified whether "
     (:TERM NIL "symbols") " inherited from multiple " (:TERM NIL "packages")
     " are returned more than once. The order of " (:TERM NIL "symbols")
     " returned does not necessarily reflect the order of "
     (:TERM NIL "packages") " in " (:PARAM NIL "package-list") ". When "
     (:PARAM NIL "package-list")
     " has more than one element, it is unspecified whether duplicate "
     (:TERM NIL "symbols") " are returned once or more than once. " :PAR
     (:PARAM NIL "Symbol-types") " controls which " (:TERM NIL "symbols")
     " that are " (:TERM NIL "accessible") " in a " (:TERM NIL "package")
     " are returned as follows: " :PAR
     (:LIST NIL
      (:ITEM NIL (:KWD NIL "internal") " " :PAR "The " (:TERM NIL "symbols")
       " that are " (:TERM NIL "present") " in the " (:TERM NIL "package")
       ", but that are not " (:TERM NIL "exported") ". " :PAR)
      (:ITEM NIL (:KWD NIL "external") " " :PAR "The " (:TERM NIL "symbols")
       " that are " (:TERM NIL "present") " in the " (:TERM NIL "package")
       " and are " (:TERM NIL "exported") ". " :PAR)
      (:ITEM NIL (:KWD NIL "inherited") " " :PAR "The " (:TERM NIL "symbols")
       " that are " (:TERM NIL "exported") " by used " (:TERM NIL "packages")
       " and that are not " (:TERM NIL "shadowed") ". "))
     " " :PAR "When more than one argument is supplied for "
     (:PARAM NIL "symbol-types") ", a " (:TERM NIL "symbol")
     " is returned if its " (:TERM NIL "accessibility")
     " matches any one of the " (:PARAM NIL "symbol-types")
     " supplied. Implementations may extend this syntax by recognizing additional symbol accessibility types. "
     :PAR "An invocation of " (:TT NIL " (" (:PARAM NIL "name") ")")
     " returns four values as follows: " :PAR
     (:LIST NIL
      (:ITEM NIL "1. A flag that indicates whether a " (:TERM NIL "symbol")
       " is returned (true means that a " (:TERM NIL "symbol")
       " is returned). ")
      (:ITEM NIL "2. A " (:TERM NIL "symbol") " that is "
       (:TERM NIL "accessible") " in one the indicated " (:TERM NIL "packages")
       ". ")
      (:ITEM NIL "3. The accessibility type for that " (:TERM NIL "symbol")
       "; " (:I NIL "i.e.") ",  one of the symbols " (:KWD NIL "internal") ", "
       (:KWD NIL "external") ", or " (:KWD NIL "inherited") ". ")
      (:ITEM NIL "4. The " (:TERM NIL "package") " from which the "
       (:TERM NIL "symbol") " was obtained. The " (:TERM NIL "package")
       " is one of the " (:TERM NIL "packages") " present or named in "
       (:PARAM NIL "package-list") ". "))
     " " :PAR "After all " (:TERM NIL "symbols")
     " have been returned by successive invocations of "
     (:TT NIL " (" (:PARAM NIL "name") ")")
     ", then only one value is returned, namely " (:MISC NIL "nil") ". " :PAR
     "The meaning of the second, third, and fourth " (:TERM NIL "values")
     " is that the returned " (:TERM NIL "symbol") " is "
     (:TERM NIL "accessible") " in the returned " (:TERM NIL "package")
     " in the way indicated by the second return value as follows: " :PAR
     (:LIST NIL
      (:ITEM NIL (:KWD NIL "internal") " " :PAR "Means " (:TERM NIL "present")
       " and not " (:TERM NIL "exported") ". " :PAR)
      (:ITEM NIL (:KWD NIL "external") " " :PAR "Means " (:TERM NIL "present")
       " and " (:TERM NIL "exported") ". " :PAR)
      (:ITEM NIL (:KWD NIL "inherited") " " :PAR "Means not "
       (:TERM NIL "present") " (thus not " (:TERM NIL "shadowed")
       ") but inherited from some used " (:TERM NIL "package") ". "))
     " " :PAR
     "It is unspecified what happens if any of the implicit interior state of an iteration is returned outside the dynamic extent of the "
     (:MACREF NIL "with-package-iterator") " form such as by returning some "
     (:TERM NIL "closure") " over the invocation " (:TERM NIL "form") ". " :PAR
     "Any number of invocations of " (:MACREF NIL "with-package-iterator")
     " can be nested, and the body of the innermost one can invoke all of the locally "
     (:TERM NIL "established") " " (:TERM NIL "macros") ", provided all those "
     (:TERM NIL "macros") " have distinct names. " :PAR)
    (:PART (:NAME "Examples") " " :PAR "The following function should return "
     (:MISC NIL "t") " on any " (:TERM NIL "package")
     ", and signal an error if the usage of "
     (:MACREF NIL "with-package-iterator")
     " does not agree with the corresponding usage of "
     (:MACREF NIL "do-symbols") ". " :PAR
     (:CODE NIL " (defun test-package-iterator (package)
   (unless (packagep package)
     (setq package (find-package package)))
   (let ((all-entries '())
         (generated-entries '()))
     (do-symbols (x package) 
       (multiple-value-bind (symbol accessibility) 
           (find-symbol (symbol-name x) package)
         (push (list symbol accessibility) all-entries)))
     (with-package-iterator (generator-fn package 
                             :internal :external :inherited)
       (loop     
         (multiple-value-bind (more? symbol accessibility pkg)
             (generator-fn)
           (unless more? (return))
           (let ((l (multiple-value-list (find-symbol (symbol-name symbol) 
                                                      package))))
             (unless (equal l (list symbol accessibility))
               (error \"Symbol ~S not found as ~S in package ~A [~S]\"
                      symbol accessibility (package-name package) l))
             (push l generated-entries)))))
     (unless (and (subsetp all-entries generated-entries :test #'equal)
                  (subsetp generated-entries all-entries :test #'equal))
      (error \"Generated entries and Do-Symbols entries don't correspond\"))
     t))
")
     " " :PAR "The following function prints out every " (:TERM NIL "present")
     " " (:TERM NIL "symbol") " (possibly more than once): " :PAR
     (:CODE NIL " (defun print-all-symbols () 
   (with-package-iterator (next-symbol (list-all-packages)
                           :internal :external)
     (loop
       (multiple-value-bind (more? symbol) (next-symbol)
         (if more? 
            (print symbol)
            (return))))))
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:MACREF NIL "with-package-iterator") " signals an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "program-error") " if no "
     (:PARAM NIL "symbol-types") " are supplied or if a "
     (:PARAM NIL "symbol-type")
     " is not recognized by the implementation is supplied. " :PAR
     "The consequences are undefined if the local function named "
     (:PARAM NIL "name") " " (:TERM NIL "established") " by "
     (:MACREF NIL "with-package-iterator") " is called after it has returned "
     (:TERM NIL "false") " as its " (:TERM NIL "primary value") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "HASH-TABLE-PACKAGE-GENERATORS:ADD-WITH-WRAPPER") " "
     (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== UNEXPORT")
   (:COM (:NAME "unexport" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "unexport")
      (:ARGLIST NIL "symbols " (:KEYWORD NIL " &optional") " package")
      (:VALUES NIL (:MISC NIL "t")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbols") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "list") " of "
     (:TERM NIL "symbols") ". " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "package") "—a " (:TERM NIL "package designator") ". "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE")
     " The default is the " (:TERM NIL "current package") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 11.2.0 30")
     (:FUNREF NIL "unexport") " reverts external " (:PARAM NIL "symbols")
     " in " (:PARAM NIL "package")
     " to internal status; it undoes the effect of " (:FUNREF NIL "export")
     ". " :PAR
     (:COMMENT NIL "% 11.0.0 45" "!!! Can this really be true? -kmp 25-Apr-91")
     (:FUNREF NIL "unexport") " works only on " (:TERM NIL "symbols") " "
     (:COMMENT NIL "directly") (:TERM NIL "present") " in "
     (:PARAM NIL "package") ", switching them back to internal status. If "
     (:FUNREF NIL "unexport") " is given a " (:TERM NIL "symbol")
     " that is already " (:TERM NIL "accessible") " as an "
     (:TERM NIL "internal symbol") " in " (:PARAM NIL "package")
     ", it does nothing. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (in-package \"COMMON-LISP-USER\") → #<PACKAGE \"COMMON-LISP-USER\">
 (export (intern \"CONTRABAND\" (make-package 'temp)) 'temp) → T
 (find-symbol \"CONTRABAND\") → NIL, NIL 
 (use-package 'temp) → T 
 (find-symbol \"CONTRABAND\") → CONTRABAND, :INHERITED
 (unexport 'contraband 'temp) → T
 (find-symbol \"CONTRABAND\") → NIL, NIL
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "Package system is modified. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "Current state of the package system. " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If "
     (:FUNREF NIL "unexport") " is given a " (:TERM NIL "symbol") " not "
     (:TERM NIL "accessible") " in " (:PARAM NIL "package")
     " at all, an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "package-error") " is signaled. " :PAR
     "The consequences are undefined if " (:PARAM NIL "package") " is the "
     (:PACKREF NIL "keyword") " " (:TERM NIL "package") " "
     (:COMMENT NIL "added for Sandra:") "or the " (:PACKREF NIL "common-lisp")
     " " (:TERM NIL "package") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "export") ", "
     (:SECREF NIL :PACKAGE-CONCEPTS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== UNINTERN")
   (:COM (:NAME "unintern" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "unintern")
      (:ARGLIST NIL "symbol " (:KEYWORD NIL " &optional") " package")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbol") "—a "
     (:TERM NIL "symbol") ". " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "package") "—a " (:TERM NIL "package designator") ". "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE")
     " The default is the " (:TERM NIL "current package") ". " :PAR
     (:PARAM NIL "generalized-boolean") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Description") " " (:FUNREF NIL "unintern") " removes "
     (:PARAM NIL "symbol") " from " (:PARAM NIL "package") ". "
     (:COMMENT NIL "% 11.2.0 25") "If " (:PARAM NIL "symbol") " is "
     (:TERM NIL "present") " in " (:PARAM NIL "package")
     ", it is removed from " (:PARAM NIL "package") " and also from "
     (:PARAM NIL "package") "'s " (:TERM NIL "shadowing symbols list")
     " if it is present there. If " (:PARAM NIL "package") " is the "
     (:TERM NIL "home package") " for " (:PARAM NIL "symbol") ", "
     (:PARAM NIL "symbol") " is made to have no " (:TERM NIL "home package")
     ". " (:PARAM NIL "Symbol") " may continue to be " (:TERM NIL "accessible")
     " in " (:PARAM NIL "package") " by inheritance. " :PAR "Use of "
     (:FUNREF NIL "unintern") " can result in a " (:TERM NIL "symbol")
     " that has no recorded " (:TERM NIL "home package")
     ", but that in fact is " (:TERM NIL "accessible") " in some "
     (:TERM NIL "package") ". " (:RM NIL " Common Lisp")
     " does not check for this pathological case, and such "
     (:TERM NIL "symbols") " are always printed preceded by " (:TT NIL "#:")
     ". " :PAR (:FUNREF NIL "unintern") " returns " (:TERM NIL "true")
     " if it removes " (:PARAM NIL "symbol") ", and " (:MISC NIL "nil")
     " otherwise. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (in-package \"COMMON-LISP-USER\") → #<PACKAGE \"COMMON-LISP-USER\">
 (setq temps-unpack (intern \"UNPACK\" (make-package 'temp))) → TEMP::UNPACK 
 (unintern temps-unpack 'temp) → T
 (find-symbol \"UNPACK\" 'temp) → NIL, NIL 
 temps-unpack → #:UNPACK 
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR (:COMMENT NIL "% 11.2.0 26")
     (:FUNREF NIL "unintern")
     " changes the state of the package system in such a way that the consistency rules do not hold across the change. "
     :PAR)
    (:PART (:NAME "Affected By") " Current state of the package system. " :PAR)
    (:PART (:NAME "Exceptional Situations") " " (:COMMENT NIL "% 11.0.0 54")
     "Giving a shadowing symbol to " (:FUNREF NIL "unintern")
     " can uncover a name conflict that had previously been resolved by the shadowing. If package A uses packages B and C, A contains a shadowing symbol "
     (:TT NIL "x") ", and B and C each contain external symbols named "
     (:TT NIL "x") ", then removing the shadowing symbol " (:TT NIL "x")
     " from A will reveal a name conflict between " (:TT NIL "b:x") " and "
     (:TT NIL "c:x") " if those two " (:TERM NIL "symbols")
     " are distinct. In this case " (:FUNREF NIL "unintern")
     " will signal an error. " (:COMMENT NIL "!!! Barmar: Of type??") :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :PACKAGE-CONCEPTS) " "
     :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== IN-PACKAGE")
   (:COM (:NAME "in-package" :FTYPE "Macro")
    (:ISSUE NIL "IN-PACKAGE-FUNCTIONALITY:MAR89-X3J13") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "in-package") (:ARGLIST NIL "name")
      (:VALUES NIL "package"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "string designator") "; not evaluated. " :PAR
     (:PARAM NIL "package") "—the " (:TERM NIL "package") " named by "
     (:PARAM NIL "name") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "%% 11.2.0 10" "%% 11.2.0 11"
      "%% Issue MAKE-PACKAGE-USE-DEFAULT IN-PACKAGE-FUNCTIONALITY:MAR89-X3J13.")
     :PAR "Causes the " (:TERM NIL "package") " named by " (:PARAM NIL "name")
     " to become the " (:TERM NIL "current package") "—that is, the "
     (:TERM NIL "value") " of " (:VARREF NIL "*package*") ". If no such "
     (:TERM NIL "package") " already exists, an error of " (:TERM NIL "type")
     " " (:TYPEREF NIL "package-error") " is signaled. " :PAR "Everything "
     (:MACREF NIL "in-package")
     " does is also performed at compile time if the call appears as a "
     (:TERM NIL "top level form") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR
     (:COMMENT NIL "Old examples removed as irrelevant."
      "Need to come up with something new. -kmp 25-Apr-91")
     :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:TERM NIL "variable") " "
     (:VARREF NIL "*package*") " is assigned. If the "
     (:MACREF NIL "in-package") " " (:TERM NIL "form") " is a "
     (:TERM NIL "top level form")
     ", this assignment also occurs at compile time. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "package-error")
     " is signaled if the specified " (:TERM NIL "package") " does not exist. "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:VARREF NIL "*package*") " " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "IN-PACKAGE-FUNCTIONALITY:MAR89-X3J13") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== UNUSE-PACKAGE")
   (:COM (:NAME "unuse-package" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "unuse-package")
      (:ARGLIST NIL "packages-to-unuse " (:KEYWORD NIL " &optional")
       " package")
      (:VALUES NIL (:MISC NIL "t")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "packages-to-unuse") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "list") " of " (:TERM NIL "package designators") ". "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " " :PAR
     (:COMMENT NIL
      " Issue PACKAGE-FUNCTION-CONSISTENCY is silent on whether a \"package designator\""
      " is really the right thing here, but KAB, Sandra, and KMP agree that this is what"
      " was probably intended.")
     (:PARAM NIL "package") "—a " (:TERM NIL "package designator")
     ". The default is the " (:TERM NIL "current package") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 11.2.0 37")
     (:FUNREF NIL "unuse-package") " causes " (:PARAM NIL "package")
     " to cease inheriting all the " (:TERM NIL "external symbols") " of "
     (:PARAM NIL "packages-to-unuse") "; " (:FUNREF NIL "unuse-package")
     " undoes the effects of " (:FUNREF NIL "use-package") ". The "
     (:PARAM NIL "packages-to-unuse") " are removed from the "
     (:TERM NIL "use list") " of " (:PARAM NIL "package") ". " :PAR
     (:COMMENT NIL "% Sandra: Redundant."
      " The \\term{external symbols} of the \\param{packages-to-unuse} are no longer inherited."
      " However,")
     "Any " (:TERM NIL "symbols") " that have been " (:TERM NIL "imported")
     " into " (:PARAM NIL "package") " continue to be " (:TERM NIL "present")
     " in " (:PARAM NIL "package") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (in-package \"COMMON-LISP-USER\") → #<PACKAGE \"COMMON-LISP-USER\">
 (export (intern \"SHOES\" (make-package 'temp)) 'temp) → T
 (find-symbol \"SHOES\") → NIL, NIL
 (use-package 'temp) → T
 (find-symbol \"SHOES\") → SHOES, :INHERITED
 (find (find-package 'temp) (package-use-list 'common-lisp-user)) → #<PACKAGE \"TEMP\">
 (unuse-package 'temp) → T
 (find-symbol \"SHOES\") → NIL, NIL
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:TERM NIL "use list") " of "
     (:PARAM NIL "package") " is modified. " :PAR)
    (:PART (:NAME "Affected By") " Current state of the package system. ")
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "use-package") ", "
     (:FUNREF NIL "package-use-list") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== USE-PACKAGE")
   (:COM (:NAME "use-package" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "use-package")
      (:ARGLIST NIL "packages-to-use " (:KEYWORD NIL " &optional") " package")
      (:VALUES NIL (:MISC NIL "t")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " (:COMMENT NIL "% 11.0.0 27") :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "packages-to-use") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "list") " of " (:TERM NIL "package designators") ". The "
     (:PACKREF NIL "keyword") " " (:TERM NIL "package")
     " may not be supplied. " :PAR
     (:COMMENT NIL
      " Issue PACKAGE-FUNCTION-CONSISTENCY is silent on whether a \"package designator\""
      " is really the right thing here, but KAB, Sandra, and KMP agree that this is what"
      " was probably intended.")
     (:PARAM NIL "package") "—a " (:TERM NIL "package designator")
     ". The default is the " (:TERM NIL "current package") ". "
     (:COMMENT NIL
      "% Next sentence reworded and moved per Boyer/Kaufmann/Moore #12"
      "% (by X3J13 vote at May 4-5, 1994 meeting)" "% -kmp 9-May-94"
      " \\Thepackage{keyword} cannot be supplied.")
     "The " (:PARAM NIL "package") " cannot be the " (:PACKREF NIL "keyword")
     " " (:TERM NIL "package") ". "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "use-package")
     " causes " (:PARAM NIL "package") " to inherit all the "
     (:TERM NIL "external symbols") " of " (:PARAM NIL "packages-to-use")
     ". The inherited " (:TERM NIL "symbols") " become "
     (:TERM NIL "accessible") " as " (:TERM NIL "internal symbols") " of "
     (:PARAM NIL "package") ". " :PAR (:COMMENT NIL "% 11.2.0 36")
     (:PARAM NIL "Packages-to-use") " are added to the " (:TERM NIL "use list")
     " of " (:PARAM NIL "package") " if they are not there already. All "
     (:TERM NIL "external symbols") " in " (:PARAM NIL "packages-to-use")
     " become " (:TERM NIL "accessible") " in " (:PARAM NIL "package") " as "
     (:TERM NIL "internal symbols") ". "
     (:COMMENT NIL "% 11.0.0 50"
      "% Sandra thinks this follows form what it is to be accessible as internal symbols."
      " The new \\term{symbols} can be referred to without a \\term{package prefix}"
      " while \\param{package} is current, but they are not passed along to any"
      " other \\term{package} that uses \\param{package}. ")
     (:FUNREF NIL "use-package") " does not cause any new "
     (:TERM NIL "symbols") " to be " (:TERM NIL "present") " in "
     (:PARAM NIL "package") " but only makes them " (:TERM NIL "accessible")
     " by inheritance. " :PAR (:COMMENT NIL "% 11.0.0 39")
     (:FUNREF NIL "use-package")
     " checks for name conflicts between the newly imported symbols and those already "
     (:TERM NIL "accessible") " in " (:PARAM NIL "package") ". "
     (:COMMENT NIL "% 11.0.0 58") "A name conflict in "
     (:FUNREF NIL "use-package") " between two external symbols inherited by "
     (:PARAM NIL "package") " from " (:PARAM NIL "packages-to-use")
     " may be resolved in favor of either " (:TERM NIL "symbol") " by "
     (:TERM NIL "importing") " one of them into " (:PARAM NIL "package")
     " and making it a shadowing symbol. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (export (intern \"LAND-FILL\" (make-package 'trash)) 'trash) → T
 (find-symbol \"LAND-FILL\" (make-package 'temp)) → NIL, NIL
 (package-use-list 'temp) → (#<PACKAGE \"TEMP\">)
 (use-package 'trash 'temp) → T
 (package-use-list 'temp) → (#<PACKAGE \"TEMP\"> #<PACKAGE \"TRASH\">)
 (find-symbol \"LAND-FILL\" 'temp) → TRASH:LAND-FILL, :INHERITED
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:TERM NIL "use list") " of "
     (:PARAM NIL "package") " may be modified. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T)
     (:COMMENT NIL "!!! Barmar: What about name conflicts?") :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "unuse-package") ", "
     (:FUNREF NIL "package-use-list") ", " (:SECREF NIL :PACKAGE-CONCEPTS) " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR "It is permissible for a "
     (:TERM NIL "package") " "
     (:MATH NIL (:MSUB NIL (:MI NIL "P") (:MN NIL "1"))) " to "
     (:TERM NIL "use") " a " (:TERM NIL "package") " "
     (:MATH NIL (:MSUB NIL (:MI NIL "P") (:MN NIL "2"))) " even if "
     (:MATH NIL (:MSUB NIL (:MI NIL "P") (:MN NIL "2"))) " already uses "
     (:MATH NIL (:MSUB NIL (:MI NIL "P") (:MN NIL "1"))) ". The using of "
     (:TERM NIL "packages")
     " is not transitive, so no problem results from the apparent circularity. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DEFPACKAGE")
   (:COM (:NAME "defpackage" :FTYPE "Macro") (:ISSUE NIL "DEFPACKAGE:ADDITION")
    " " :PAR
    (:COMMENT NIL
     "!!! Interchange param names \"defined-package-name\" and \"package-name\" here.")
    :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "defpackage")
      (:ARGLIST NIL "defined-package-name "
       (:INTERLEAVE NIL (:DOWN NIL "option")))
      (:VALUES NIL "package"))
     " " :PAR (:ISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " "
     (:COMMENT NIL " All options except :size can appear more than once.")
     (:BNF (:NAME "option")
      (:STAR NIL
       (:CURLY NIL
        (:PAREN NIL (:KWD NIL "nicknames") " "
         (:STAR NIL (:CURLY NIL (:PARAM NIL "nickname"))))))
      " | " (:BR NIL) " "
      (:PAREN NIL (:KWD NIL "documentation") " " (:I NIL "string")) " | "
      (:BR NIL) " "
      (:STAR NIL
       (:CURLY NIL
        (:PAREN NIL (:KWD NIL "use") " "
         (:STAR NIL (:CURLY NIL (:PARAM NIL "package-name"))))))
      " | " (:BR NIL) " "
      (:STAR NIL
       (:CURLY NIL
        (:PAREN NIL (:KWD NIL "shadow") " "
         (:STAR NIL (:CURLY NIL (:DOWN NIL "symbol-name"))))))
      " | " (:BR NIL) " "
      (:STAR NIL
       (:CURLY NIL
        (:PAREN NIL (:KWD NIL "shadowing-import-from") " "
         (:PARAM NIL "package-name") " "
         (:STAR NIL (:CURLY NIL (:DOWN NIL "symbol-name"))))))
      " | " (:BR NIL) " "
      (:STAR NIL
       (:CURLY NIL
        (:PAREN NIL (:KWD NIL "import-from") " " (:PARAM NIL "package-name")
         " " (:STAR NIL (:CURLY NIL (:DOWN NIL "symbol-name"))))))
      " | " (:BR NIL) " "
      (:STAR NIL
       (:CURLY NIL
        (:PAREN NIL (:KWD NIL "export") " "
         (:STAR NIL (:CURLY NIL (:DOWN NIL "symbol-name"))))))
      " | " (:BR NIL) " "
      (:STAR NIL
       (:CURLY NIL
        (:PAREN NIL (:KWD NIL "intern") " "
         (:STAR NIL (:CURLY NIL (:DOWN NIL "symbol-name"))))))
      " | " (:BR NIL) " "
      (:PAREN NIL (:KWD NIL "size") " " (:TERM NIL "integer")))
     " "
     (:COMMENT NIL
      "% Removed per Pitman #2 (by X3J13 vote at May 4-5, 1994 meeting)"
      "% -kmp 9-May-94"
      "\\auxbnf{symbol-name}{(\\term{symbol} | \\term{string})}")
     (:ENDISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "defined-package-name") "—a " (:TERM NIL "string designator")
     ". " :PAR
     (:COMMENT NIL
      "!!!! Sandra wonders if this shouldn't be renamed to just \"package\"."
      "     But be sure to see the argument named \"package\" below.")
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "package-name") "—a " (:TERM NIL "package designator") ". "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " " :PAR
     (:PARAM NIL "nickname") "—a " (:TERM NIL "string designator") ". " :PAR
     (:PARAM NIL "symbol-name") "—a " (:TERM NIL "string designator") ". " :PAR
     (:PARAM NIL "package") "—the " (:TERM NIL "package") " named "
     (:PARAM NIL "package-name") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "defpackage")
     " creates a " (:TERM NIL "package") " as specified and returns the "
     (:TERM NIL "package") ". " :PAR "If " (:PARAM NIL "defined-package-name")
     " already refers to an existing " (:TERM NIL "package")
     ", the name-to-package mapping for that name is not changed. If the new definition is at variance with the current state of that "
     (:TERM NIL "package")
     ", the consequences are undefined; an implementation might choose to modify the existing "
     (:TERM NIL "package") " to reflect the new definition. If "
     (:PARAM NIL "defined-package-name") " is a " (:TERM NIL "symbol") ", its "
     (:TERM NIL "name") " is used. " :PAR "The standard " (:I NIL "options")
     " are described below. "
     (:COMMENT NIL "% Sandra: Implied by package designator above. "
      " In the following"
      " descriptions, \\param{package-name} is a \\term{package}, "
      " a \\term{string} or a \\term{symbol} (whose \\term{name} is used)"
      " that names a \\term{package}.")
     :PAR
     (:LIST NIL
      (:ITEM NIL (:KWD NIL "nicknames") " " :PAR "The arguments to "
       (:KWD NIL "nicknames") " set the " (:TERM NIL "package")
       "'s nicknames to the supplied names. "
       (:COMMENT NIL "% Sandra: Implied by {\\symbolnamedesignator}."
        " If \\param{nicknames} are \\term{symbols}, their \\term{names} "
        " are used.")
       :PAR (:ISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " ")
      (:ITEM NIL (:KWD NIL "documentation") " " :PAR "The argument to "
       (:KWD NIL "documentation") " specifies a "
       (:TERM NIL "documentation string") "; it is attached as a "
       (:TERM NIL "documentation string") " to the " (:TERM NIL "package")
       ". At most one " (:KWD NIL "documentation")
       " option can appear in a single " (:MACREF NIL "defpackage") " "
       (:TERM NIL "form") ". "
       (:ENDISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " " :PAR)
      (:ITEM NIL (:KWD NIL "use") " " :PAR "The arguments to " (:KWD NIL "use")
       " set the " (:TERM NIL "packages") " that the " (:TERM NIL "package")
       " named by " (:PARAM NIL "package-name") " will inherit from. If "
       (:KWD NIL "use") " is not supplied, "
       (:ISSUE NIL "MAKE-PACKAGE-USE-DEFAULT:IMPLEMENTATION-DEPENDENT") " "
       (:COMMENT NIL
        " its value is \\term{implementation-dependent}, and must be the same as that"
        " for \\funref{make-package}." "% Rewritten for Sandra:")
       "it defaults to the same " (:TERM NIL "implementation-dependent")
       " value as the " (:KWD NIL "use") " " (:TERM NIL "argument") " to "
       (:FUNREF NIL "make-package") ". "
       (:ENDISSUE NIL "MAKE-PACKAGE-USE-DEFAULT:IMPLEMENTATION-DEPENDENT") " "
       (:COMMENT NIL "\\thepackage{common-lisp} only is inherited.") :PAR)
      (:ITEM NIL (:KWD NIL "shadow") " " :PAR "The arguments to "
       (:KWD NIL "shadow") ", " (:PARAM NIL "symbol-names") ", name "
       (:TERM NIL "symbols") " that are to be created in the "
       (:TERM NIL "package") " being defined. These " (:TERM NIL "symbols")
       " are added to the list of shadowing " (:TERM NIL "symbols")
       " effectively as if by " (:FUNREF NIL "shadow") ". " :PAR)
      (:ITEM NIL (:KWD NIL "shadowing-import-from") " " :PAR "The "
       (:TERM NIL "symbols") " named by the argument "
       (:PARAM NIL "symbol-names") " are found (involving a lookup as if by "
       (:FUNREF NIL "find-symbol") ") in the specified "
       (:PARAM NIL "package-name") ". The resulting " (:TERM NIL "symbols")
       " are " (:TERM NIL "imported") " into the " (:TERM NIL "package")
       " being defined, and placed on the shadowing symbols list as if by "
       (:FUNREF NIL "shadowing-import") ". In no case are "
       (:TERM NIL "symbols") " created in any " (:TERM NIL "package")
       " other than the one being defined. " :PAR)
      (:ITEM NIL (:KWD NIL "import-from") " " :PAR "The " (:TERM NIL "symbols")
       " named by the argument " (:PARAM NIL "symbol-names")
       " are found in the " (:TERM NIL "package") " named by "
       (:PARAM NIL "package-name") " and they are " (:TERM NIL "imported")
       " into the " (:TERM NIL "package") " being defined. In no case are "
       (:TERM NIL "symbols") " created in any " (:TERM NIL "package")
       " other than the one being defined. " :PAR)
      (:ITEM NIL (:KWD NIL "export") " " :PAR "The " (:TERM NIL "symbols")
       " named by the argument " (:PARAM NIL "symbol-names")
       " are found or created in the " (:TERM NIL "package")
       " being defined and " (:TERM NIL "exported") ". The "
       (:KWD NIL "export") " option interacts with the " (:KWD NIL "use")
       " option, since inherited " (:TERM NIL "symbols")
       " can be used rather than new ones created. The " (:KWD NIL "export")
       " option interacts with the " (:KWD NIL "import-from") " and "
       (:KWD NIL "shadowing-import-from") " options, since "
       (:TERM NIL "imported")
       " symbols can be used rather than new ones created. If an argument to the "
       (:KWD NIL "export") " option is " (:TERM NIL "accessible")
       " as an (inherited) " (:TERM NIL "internal symbol") " via "
       (:FUNREF NIL "use-package") ", that the " (:TERM NIL "symbol")
       " named by " (:PARAM NIL "symbol-name") " is first "
       (:TERM NIL "imported") " into the " (:TERM NIL "package")
       " being defined, and is then " (:TERM NIL "exported") " from that "
       (:TERM NIL "package") ". " :PAR)
      (:ITEM NIL (:KWD NIL "intern") " " :PAR "The " (:TERM NIL "symbols")
       " named by the argument " (:PARAM NIL "symbol-names")
       " are found or created in the " (:TERM NIL "package")
       " being defined. The " (:KWD NIL "intern") " option interacts with the "
       (:KWD NIL "use") " option, since inherited " (:TERM NIL "symbols")
       " can be used rather than new ones created. " :PAR)
      (:ITEM NIL (:KWD NIL "size") " " :PAR "The argument to the "
       (:KWD NIL "size") " option declares the approximate number of "
       (:TERM NIL "symbols") " expected in the " (:TERM NIL "package")
       ". This is an efficiency hint only and might be ignored by an implementation. "))
     " " :PAR "The order in which the options appear in a "
     (:MACREF NIL "defpackage")
     " form is irrelevant. The order in which they are executed is as follows: "
     (:LIST NIL
      (:ITEM NIL "1. " (:KWD NIL "shadow") " and "
       (:KWD NIL "shadowing-import-from") ". ")
      (:ITEM NIL "2. " (:KWD NIL "use") ". ")
      (:ITEM NIL "3. " (:KWD NIL "import-from") " and " (:KWD NIL "intern")
       ". ")
      (:ITEM NIL "4. " (:KWD NIL "export") ". "))
     " Shadows are established first, since they might be necessary to block spurious name conflicts when the "
     (:KWD NIL "use") " option is processed. The " (:KWD NIL "use")
     " option is executed next so that " (:KWD NIL "intern") " and "
     (:KWD NIL "export") " options can refer to normally inherited "
     (:TERM NIL "symbols") ". The " (:KWD NIL "export")
     " option is executed last so that it can refer to " (:TERM NIL "symbols")
     " created by any of the other options; in particular, "
     (:TERM NIL "shadowing symbols") " and " (:TERM NIL "imported") " "
     (:TERM NIL "symbols") " can be made external. " :PAR
     (:ISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     (:COMMENT NIL " added top-level clarification --sjl 7 Mar 92")
     "If a defpackage " (:TERM NIL "form") " appears as a "
     (:TERM NIL "top level form")
     ", all of the actions normally performed by this " (:TERM NIL "macro")
     " at load time must also be performed at compile time. "
     (:ENDISSUE NIL "COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:CLARIFY") " "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defpackage \"MY-PACKAGE\"
   (:nicknames \"MYPKG\" \"MY-PKG\")
   (:use \"COMMON-LISP\")
   (:shadow \"CAR\" \"CDR\")
   (:shadowing-import-from \"VENDOR-COMMON-LISP\"  \"CONS\")
   (:import-from \"VENDOR-COMMON-LISP\"  \"GC\")
   (:export \"EQ\" \"CONS\" \"FROBOLA\")
   )
 
 
 (defpackage my-package
   (:nicknames mypkg :MY-PKG)  ; remember Common Lisp conventions for case
   (:use common-lisp)          ; conversion on symbols
   (:shadow CAR :cdr #:cons)                              
   (:export \"CONS\")            ; this is the shadowed one.
   )
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "Existing " (:TERM NIL "packages")
     ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If one of the supplied "
     (:KWD NIL "nicknames") " already refers to an existing "
     (:TERM NIL "package") ", an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "package-error") " is signaled. " :PAR "An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "program-error")
     " should be signaled if " (:KWD NIL "size") " or "
     (:KWD NIL "documentation") " appears more than once. " :PAR "Since "
     (:TERM NIL "implementations") " might allow extended " (:I NIL "options")
     " an error of " (:TERM NIL "type") " " (:TYPEREF NIL "program-error")
     " should be signaled if an " (:I NIL "option")
     " is present that is not actually supported in the host "
     (:TERM NIL "implementation") ". " :PAR "The collection of "
     (:PARAM NIL "symbol-name") " arguments given to the options "
     (:KWD NIL "shadow") ", " (:KWD NIL "intern") ", " (:KWD NIL "import-from")
     ", and " (:KWD NIL "shadowing-import-from")
     " must all be disjoint; additionally, the " (:PARAM NIL "symbol-name")
     " arguments given to " (:KWD NIL "export") " and " (:KWD NIL "intern")
     " must be disjoint. Disjoint in this context is defined as no two of the "
     (:PARAM NIL "symbol-names") " being " (:FUNREF NIL "string=")
     " with each other. If either condition is violated, an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "program-error")
     " should be signaled. " :PAR "For the " (:KWD NIL "shadowing-import-from")
     " and " (:KWD NIL "import-from") " options, a " (:TERM NIL "correctable")
     " " (:TERM NIL "error") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "package-error") " is signaled if no " (:TERM NIL "symbol")
     " is " (:TERM NIL "accessible") " in the " (:TERM NIL "package")
     " named by " (:PARAM NIL "package-name") " for one of the argument "
     (:PARAM NIL "symbol-names") ". " :PAR
     "Name conflict errors are handled by the underlying calls to "
     (:FUNREF NIL "make-package") ", " (:FUNREF NIL "use-package") ", "
     (:FUNREF NIL "import") ", and " (:FUNREF NIL "export") ". See "
     (:SECREF NIL :PACKAGE-CONCEPTS) ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "documentation") ", "
     (:SECREF NIL :PACKAGE-CONCEPTS) ", " (:SECREF NIL :COMPILATION) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL
      "\\macref{defpackage} does not alter the \\term{current package}."
      "\\funref{compile-file} should treat \\macref{defpackage} \\term{forms}"
      "that are \\term{top level forms} in the same way"
      "as it treats the other \\term{package}-affecting functions.")
     :PAR "The " (:KWD NIL "intern") " option is useful if an "
     (:KWD NIL "import-from") " or a " (:KWD NIL "shadowing-import-from")
     " option in a subsequent call to " (:MACREF NIL "defpackage")
     " (for some other " (:TERM NIL "package") ") expects to find these "
     (:TERM NIL "symbols") " " (:TERM NIL "accessible")
     " but not necessarily external. " :PAR
     "It is recommended that the entire " (:TERM NIL "package")
     " definition is put in a single place, and that all the "
     (:TERM NIL "package")
     " definitions of a program are in a single file. This file can be "
     (:TERM NIL "loaded") " before " (:TERM NIL "loading")
     " or compiling anything else that depends on those "
     (:TERM NIL "packages") ". Such a file can be read in the "
     (:PACKREF NIL "common-lisp-user") " " (:TERM NIL "package")
     ", avoiding any initial state issues. " :PAR (:MACREF NIL "defpackage")
     " cannot be used to create two “mutually recursive” packages, such as: "
     :PAR
     (:CODE NIL " (defpackage my-package
   (:use common-lisp your-package)    ;requires your-package to exist first
   (:export \"MY-FUN\"))                
 (defpackage your-package
   (:use common-lisp)
   (:import-from my-package \"MY-FUN\") ;requires my-package to exist first
   (:export \"MY-FUN\"))
")
     " " :PAR "However, nothing prevents the user from using the "
     (:TERM NIL "package") "-affecting functions such as "
     (:FUNREF NIL "use-package") ", " (:FUNREF NIL "import") ", and "
     (:FUNREF NIL "export")
     " to establish such links after a more standard use of "
     (:MACREF NIL "defpackage") ". " :PAR "The macroexpansion of "
     (:MACREF NIL "defpackage") " could usefully canonicalize the names into "
     (:TERM NIL "strings") ", so that even if a source file has random "
     (:TERM NIL "symbols") " in the " (:MACREF NIL "defpackage")
     " form, the compiled file would only contain " (:TERM NIL "strings") ". "
     :PAR "Frequently additional " (:TERM NIL "implementation-dependent")
     " options take the form of a " (:TERM NIL "keyword")
     " standing by itself as an abbreviation for a list "
     (:TT NIL " (keyword T)")
     "; this syntax should be properly reported as an unrecognized option in implementations that do not support it. "
     :PAR (:ENDISSUE NIL "DEFPACKAGE:ADDITION") " "))
   " " :PAR
   (:COMMENT NIL "%% ========== DO-ALL-SYMBOLS"
    "%% ========== DO-EXTERNAL-SYMBOLS" "%% ========== DO-SYMBOLS")
   (:COM
    (:NAME "do-symbols, do-external-symbols, do-all-symbols" :FTYPE "Macro")
    (:ISSUE NIL "DECLS-AND-DOC") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "do-symbols")
      (:ARGLIST NIL
       (:PAREN NIL "var " (:BRAC NIL "package " (:BRAC NIL "result-form"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL "tag | statement")))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "do-external-symbols")
      (:ARGLIST NIL
       (:PAREN NIL "var " (:BRAC NIL "package " (:BRAC NIL "result-form"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL "tag | statement")))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "do-all-symbols")
      (:ARGLIST NIL (:PAREN NIL "var " (:BRAC NIL "result-form")) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL "tag | statement")))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "var") "—a "
     (:TERM NIL "variable") " " (:TERM NIL "name") "; not evaluated. " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "package") "—a " (:TERM NIL "package designator")
     "; evaluated. "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE")
     " The default in " (:MACREF NIL "do-symbols") " and "
     (:MACREF NIL "do-external-symbols") " is the "
     (:TERM NIL "current package") ". " :PAR (:PARAM NIL "result-form") "—a "
     (:TERM NIL "form") "; evaluated as described below. The default is "
     (:MISC NIL "nil") ". " :PAR (:PARAM NIL "declaration") "—a "
     (:MISC NIL "declare") " " (:TERM NIL "expression") "; not evaluated. "
     :PAR (:PARAM NIL "tag") "—a " (:TERM NIL "go tag") "; not evaluated. "
     :PAR (:PARAM NIL "statement") "—a " (:TERM NIL "compound form")
     "; evaluated as described below. " :PAR (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " returned by the " (:PARAM NIL "result-form")
     " if a " (:TERM NIL "normal return") " occurs, or else, if an "
     (:TERM NIL "explicit return") " occurs, the " (:TERM NIL "values")
     " that were transferred. " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "do-symbols") ", "
     (:MACREF NIL "do-external-symbols") ", and "
     (:MACREF NIL "do-all-symbols") " iterate over the " (:TERM NIL "symbols")
     " of " (:TERM NIL "packages") ". For each " (:TERM NIL "symbol")
     " in the set of " (:TERM NIL "packages") " chosen, the "
     (:PARAM NIL "var") " is bound to the " (:TERM NIL "symbol") ", and the "
     (:PARAM NIL "statements") " in the body are executed. When all the "
     (:TERM NIL "symbols") " have been processed, " (:PARAM NIL "result-form")
     " is evaluated and returned as the value of the macro. " :PAR
     (:COMMENT NIL
      "!!! Barmar: Is there a different lexical environment for each symbol??")
     :PAR (:COMMENT NIL "% 11.2.0 39") (:MACREF NIL "do-symbols")
     " iterates over the " (:TERM NIL "symbols") " " (:TERM NIL "accessible")
     " in " (:PARAM NIL "package") ". " (:ISSUE NIL "DO-SYMBOLS-DUPLICATES")
     " " (:PARAM NIL "Statements") " may execute more than once for "
     (:TERM NIL "symbols") " that are inherited from multiple "
     (:TERM NIL "packages") ". " (:ENDISSUE NIL "DO-SYMBOLS-DUPLICATES") " "
     :PAR (:COMMENT NIL "% 11.2.0 41") (:MACREF NIL "do-all-symbols")
     " iterates on every " (:TERM NIL "registered package") ". "
     (:MACREF NIL "do-all-symbols") " will not process every "
     (:TERM NIL "symbol") " whatsoever, because a " (:TERM NIL "symbol")
     " not " (:TERM NIL "accessible") " in any "
     (:TERM NIL "registered package") " will not be processed. "
     (:MACREF NIL "do-all-symbols") " may cause a " (:TERM NIL "symbol")
     " that is " (:TERM NIL "present") " in several " (:TERM NIL "packages")
     " to be processed more than once. " :PAR (:COMMENT NIL "% 11.2.0 40")
     (:MACREF NIL "do-external-symbols")
     " iterates on the external symbols of " (:PARAM NIL "package") ". " :PAR
     "When " (:PARAM NIL "result-form") " is evaluated, " (:PARAM NIL "var")
     " is bound and has the value " (:MISC NIL "nil") ". " :PAR
     (:ISSUE NIL "DO-SYMBOLS-BLOCK-SCOPE:ENTIRE-FORM") " An "
     (:TERM NIL "implicit block") " named " (:MISC NIL "nil")
     " surrounds the entire " (:MACREF NIL "do-symbols") ", "
     (:MACREF NIL "do-external-symbols") ", or " (:MACREF NIL "do-all-symbols")
     " " (:TERM NIL "form") ". "
     (:ENDISSUE NIL "DO-SYMBOLS-BLOCK-SCOPE:ENTIRE-FORM") " "
     (:MACREF NIL "return") " or " (:SPECREF NIL "return-from")
     " may be used to terminate the iteration prematurely. " :PAR
     "If execution of the body affects which " (:TERM NIL "symbols")
     " are contained in the set of " (:TERM NIL "packages")
     " over which iteration is occurring, other than to remove the "
     (:TERM NIL "symbol") " currently the value of " (:PARAM NIL "var")
     " by using " (:FUNREF NIL "unintern") ", the consequences are undefined. "
     :PAR "For each of these macros, the " (:TERM NIL "scope")
     " of the name binding does not include any initial value form, but the optional result forms are included. "
     :PAR (:COMMENT NIL "Better than nothing for now, I guess. -kmp 14-Feb-92")
     "Any " (:PARAM NIL "tag") " in the body is treated as with "
     (:SPECREF NIL "tagbody") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (make-package 'temp :use nil) → #<PACKAGE \"TEMP\">
 (intern \"SHY\" 'temp) → TEMP::SHY, NIL ;SHY will be an internal symbol
                                         ;in the package TEMP
 (export (intern \"BOLD\" 'temp) 'temp)  → T  ;BOLD will be external  
 (let ((lst ()))
   (do-symbols (s (find-package 'temp)) (push s lst))
   lst)
→ (TEMP::SHY TEMP:BOLD)
OR→ (TEMP:BOLD TEMP::SHY)
 (let ((lst ()))
   (do-external-symbols (s (find-package 'temp) lst) (push s lst))
   lst) 
→ (TEMP:BOLD)
 (let ((lst ()))                                                     
   (do-all-symbols (s lst)
     (when (eq (find-package 'temp) (symbol-package s)) (push s lst)))
   lst)
→ (TEMP::SHY TEMP:BOLD)
OR→ (TEMP:BOLD TEMP::SHY)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "intern") ", "
     (:FUNREF NIL "export") ", "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== INTERN")
   (:COM (:NAME "intern" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "intern")
      (:ARGLIST NIL "string " (:KEYWORD NIL " &optional") " package")
      (:VALUES NIL "symbol, status"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "string") "—a "
     (:TERM NIL "string") ". " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "package") "—a " (:TERM NIL "package designator") ". "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE")
     " The default is the " (:TERM NIL "current package") ". " :PAR
     (:PARAM NIL "symbol") "—a " (:TERM NIL "symbol") ". " :PAR
     (:PARAM NIL "status") "—one of " (:KWD NIL "inherited") ", "
     (:KWD NIL "external") ", " (:KWD NIL "internal") ", or " (:MISC NIL "nil")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 11.2.0 20")
     (:FUNREF NIL "intern") " enters a " (:TERM NIL "symbol") " named "
     (:PARAM NIL "string") " into " (:PARAM NIL "package") ". If a "
     (:TERM NIL "symbol") " whose name is the same as " (:PARAM NIL "string")
     " is already " (:TERM NIL "accessible") " in " (:PARAM NIL "package")
     ", it is returned. If no such " (:TERM NIL "symbol") " is "
     (:TERM NIL "accessible") " in " (:PARAM NIL "package") ", a new "
     (:TERM NIL "symbol") " with the given name is created and entered into "
     (:PARAM NIL "package") " as an " (:TERM NIL "internal symbol")
     ", or as an " (:TERM NIL "external symbol") " if the "
     (:PARAM NIL "package") " is the " (:PACKREF NIL "keyword") " "
     (:TERM NIL "package") "; " (:PARAM NIL "package") " becomes the "
     (:TERM NIL "home package") " of the created " (:TERM NIL "symbol") ". "
     :PAR (:COMMENT NIL "% 11.2.0 21" "% 11.2.0 22")
     "The first value returned by " (:FUNREF NIL "intern") ", "
     (:PARAM NIL "symbol") ", is the " (:TERM NIL "symbol")
     " that was found or created. "
     (:COMMENT NIL
      "% Sandra thinks, and I agree, that this is confused and doesn't belong here. -kmp 14-Feb-92"
      " \\issue{CHARACTER-PROPOSAL:2-1-1}"
      " It is \\term{implementation-dependent}"
      " %but consistent with \\funref{read},"
      " which \\term{implementation-defined} \\term{attributes} are removed."
      " \\endissue{CHARACTER-PROPOSAL:2-1-1}")
     "The meaning of the " (:TERM NIL "secondary value") ", "
     (:PARAM NIL "status") ", is as follows: "
     (:LIST NIL
      (:ITEM NIL (:KWD NIL "internal") " " :PAR "The " (:TERM NIL "symbol")
       " was found and is " (:COMMENT NIL "directly") (:TERM NIL "present")
       " in " (:PARAM NIL "package") " as an " (:TERM NIL "internal symbol")
       ". " :PAR)
      (:ITEM NIL (:KWD NIL "external") " " :PAR "The " (:TERM NIL "symbol")
       " was found and is " (:COMMENT NIL "directly") (:TERM NIL "present")
       " as an " (:TERM NIL "external symbol") ". " :PAR)
      (:ITEM NIL (:KWD NIL "inherited") " " :PAR "The " (:TERM NIL "symbol")
       " was found and is inherited via " (:FUNREF NIL "use-package")
       " (which implies that the " (:TERM NIL "symbol") " is internal). " :PAR)
      (:ITEM NIL (:MISC NIL "nil") " " :PAR "No pre-existing "
       (:TERM NIL "symbol") " was found, so one was created. " :PAR
       (:COMMENT NIL "% 10.3.0 6"
        "% On Sandra's advice, I stole this paragraph from MAKE-SYMBOL with mods to make"
        "% it fit better here. -kmp 14-Feb-92")
       "It is " (:TERM NIL "implementation-dependent") " whether the "
       (:TERM NIL "string") " that becomes the new " (:TERM NIL "symbol") "'s "
       (:TERM NIL "name") " is the given " (:PARAM NIL "string")
       " or a copy of it. Once a " (:TERM NIL "string")
       " has been given as the " (:PARAM NIL "string") " "
       (:TERM NIL "argument") " to " (:TERM NIL "intern")
       " in this situation where a new " (:TERM NIL "symbol")
       " is created, the consequences are undefined if a subsequent attempt is made to alter that "
       (:TERM NIL "string") ". " :PAR))
     " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:CODE NIL
      " (in-package \"COMMON-LISP-USER\") → #<PACKAGE \"COMMON-LISP-USER\">
 (intern \"Never-Before\") → |Never-Before|, NIL
 (intern \"Never-Before\") → |Never-Before|, :INTERNAL 
 (intern \"NEVER-BEFORE\" \"KEYWORD\") → :NEVER-BEFORE, NIL
 (intern \"NEVER-BEFORE\" \"KEYWORD\") → :NEVER-BEFORE, :EXTERNAL
")
     " " (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "find-symbol") ", "
     (:FUNREF NIL "read") ", " (:TYPEREF NIL "symbol") ", "
     (:FUNREF NIL "unintern") ", " (:SECREF NIL :SYMBOL-TOKENS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 11.0.0 51")
     (:FUNREF NIL "intern")
     " does not need to do any name conflict checking because it never creates a new "
     (:TERM NIL "symbol") " if there is already an " (:TERM NIL "accessible")
     " " (:TERM NIL "symbol") " with the name given. " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PACKAGE-NAME")
   (:COM (:NAME "package-name" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "package-name")
      (:ARGLIST NIL "package") (:VALUES NIL "name"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "package") "—a " (:TERM NIL "package designator") ". "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " " :PAR
     (:PARAM NIL "name") "—a " (:TERM NIL "string") " "
     (:ISSUE NIL "PACKAGE-DELETION:NEW-FUNCTION") " or " (:MISC NIL "nil") ". "
     (:ENDISSUE NIL "PACKAGE-DELETION:NEW-FUNCTION") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 11.2.0 13")
     (:FUNREF NIL "package-name") " returns the " (:TERM NIL "string")
     " that names " (:PARAM NIL "package") ", "
     (:ISSUE NIL "PACKAGE-DELETION:NEW-FUNCTION") " or " (:MISC NIL "nil")
     " if the " (:PARAM NIL "package") " " (:TERM NIL "designator") " is a "
     (:TERM NIL "package") " " (:TERM NIL "object")
     " that has no name (see the " (:TERM NIL "function") " "
     (:FUNREF NIL "delete-package") "). "
     (:ENDISSUE NIL "PACKAGE-DELETION:NEW-FUNCTION") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (in-package \"COMMON-LISP-USER\") → #<PACKAGE \"COMMON-LISP-USER\">
 (package-name *package*) → \"COMMON-LISP-USER\"
 (package-name (symbol-package :test)) → \"KEYWORD\"
 (package-name (find-package 'common-lisp)) → \"COMMON-LISP\"
")
     " " :PAR (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:CODE NIL " (defvar *foo-package* (make-package \"FOO\"))
 (rename-package \"FOO\" \"FOO0\")
 (package-name *foo-package*) → \"FOO0\"
")
     " " (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "package") " is not a "
     (:TERM NIL "package designator") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PACKAGE-NICKNAMES")
   (:COM (:NAME "package-nicknames" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "package-nicknames")
      (:ARGLIST NIL "package") (:VALUES NIL "nicknames"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "package") "—a " (:TERM NIL "package designator") ". "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " " :PAR
     (:PARAM NIL "nicknames") "—a " (:TERM NIL "list") " of "
     (:TERM NIL "strings") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 11.2.0 14")
     "Returns the " (:TERM NIL "list") " of nickname " (:TERM NIL "strings")
     " for " (:PARAM NIL "package") ", not including the name of "
     (:PARAM NIL "package") ". " :PAR
     (:COMMENT NIL
      "!!! Can it be \"a\" list instead of \"the\" list?  Must it be cached? -kmp 25-Apr-91")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (package-nicknames (make-package 'temporary
                                   :nicknames '(\"TEMP\" \"temp\")))
→ (\"temp\" \"TEMP\") 
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "package") " is not a "
     (:TERM NIL "package designator") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PACKAGE-SHADOWING-SYMBOLS")
   (:COM (:NAME "package-shadowing-symbols" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "package-shadowing-symbols")
      (:ARGLIST NIL "package") (:VALUES NIL "symbols"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL
      " Issue PACKAGE-FUNCTION-CONSISTENCY is silent on whether a \"package designator\""
      " is really the right thing here, but KAB, Sandra, and KMP agree that this is what"
      " was probably intended.")
     (:PARAM NIL "package") "—a " (:TERM NIL "package designator") ". " :PAR
     (:PARAM NIL "symbols") "—a " (:TERM NIL "list") " of "
     (:TERM NIL "symbols") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 11.2.0 18" "% Sandra: Must this list be freshly consed?"
      "Creates")
     "Returns a " (:TERM NIL "list") " of " (:TERM NIL "symbols")
     " that have been declared as " (:TERM NIL "shadowing symbols") " in "
     (:PARAM NIL "package") " by " (:FUNREF NIL "shadow") " or "
     (:FUNREF NIL "shadowing-import") " (or the equivalent "
     (:MACREF NIL "defpackage") " options). All " (:TERM NIL "symbols")
     " on this " (:TERM NIL "list") " are " (:TERM NIL "present") " in "
     (:PARAM NIL "package") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (package-shadowing-symbols (make-package 'temp)) → ()
 (shadow 'cdr 'temp) → T
 (package-shadowing-symbols 'temp) → (TEMP::CDR)
 (intern \"PILL\" 'temp) → TEMP::PILL, NIL
 (shadowing-import 'pill 'temp) → T
 (package-shadowing-symbols 'temp) → (PILL TEMP::CDR)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "package") " is not a "
     (:TERM NIL "package designator") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "shadow") ", "
     (:FUNREF NIL "shadowing-import") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL
      "Is the list fresh every time, or can it be cached? -kmp 25-Apr-91"
      "Sandra thinks it might be, so I added this not. -kmp 13-Feb-92")
     "Whether the list of " (:PARAM NIL "symbols") " is " (:TERM NIL "fresh")
     " is " (:TERM NIL "implementation-dependent") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PACKAGE-USE-LIST")
   (:COM (:NAME "package-use-list" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "package-use-list")
      (:ARGLIST NIL "package") (:VALUES NIL "use-list"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "package") "—a " (:TERM NIL "package designator") ". "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " " :PAR
     (:PARAM NIL "use-list") "—a " (:TERM NIL "list") " of "
     (:TERM NIL "package") " " (:TERM NIL "objects") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 11.2.0 16                                               "
      "!!! Is the word \"other\" really needed here? -kmp 25-Apr-91")
     "Returns a " (:TERM NIL "list") " of other " (:TERM NIL "packages")
     " used by " (:PARAM NIL "package") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (package-use-list (make-package 'temp)) → (#<PACKAGE \"COMMON-LISP\">)
 (use-package 'common-lisp-user 'temp) → T
 (package-use-list 'temp) → (#<PACKAGE \"COMMON-LISP\"> #<PACKAGE \"COMMON-LISP-USER\">)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "package") " is not a "
     (:TERM NIL "package designator") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "use-package") ", "
     (:FUNREF NIL "unuse-package") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PACKAGE-USED-BY-LIST")
   (:COM (:NAME "package-used-by-list" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "package-used-by-list")
      (:ARGLIST NIL "package") (:VALUES NIL "used-by-list"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " "
     (:PARAM NIL "package") "—a " (:TERM NIL "package designator") ". "
     (:ENDISSUE NIL "PACKAGE-FUNCTION-CONSISTENCY:MORE-PERMISSIVE") " " :PAR
     (:PARAM NIL "used-by-list") "—a " (:TERM NIL "list") " of "
     (:TERM NIL "package") " " (:TERM NIL "objects") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 11.2.0 17")
     (:FUNREF NIL "package-used-by-list") " returns a " (:TERM NIL "list")
     " of other " (:TERM NIL "packages") " that use " (:PARAM NIL "package")
     ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (package-used-by-list (make-package 'temp)) → ()
 (make-package 'trash :use '(temp)) → #<PACKAGE \"TRASH\">
 (package-used-by-list 'temp) → (#<PACKAGE \"TRASH\">)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "package") " is not a "
     (:TERM NIL "package") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "use-package") ", "
     (:FUNREF NIL "unuse-package") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PACKAGEP")
   (:COM (:NAME "packagep" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "packagep") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 25")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "package") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (packagep *package*) → " (:TERM NIL "true") " 
 (packagep 'common-lisp) → "
      (:TERM NIL "false") " 
 (packagep (find-package 'common-lisp)) → "
      (:TERM NIL "true") " 
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (packagep " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'package)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *PACKAGE*")
   (:COM (:NAME "*package*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "package") " "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR "the "
     (:PACKREF NIL "common-lisp-user") " " (:TERM NIL "package") ". " :PAR
     (:COMMENT NIL "% 11.2.0 6" "% 11.0.0 23"))
    (:PART (:NAME "Description") " " :PAR "Whatever " (:TERM NIL "package") " "
     (:TERM NIL "object") " is currently the " (:TERM NIL "value") " of "
     (:VARREF NIL "*package*") " is referred to as the "
     (:TERM NIL "current package") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (in-package \"COMMON-LISP-USER\") → #<PACKAGE \"COMMON-LISP-USER\">
 *package* → #<PACKAGE \"COMMON-LISP-USER\">
 (make-package \"SAMPLE-PACKAGE\" :use '(\"COMMON-LISP\"))
→ #<PACKAGE \"SAMPLE-PACKAGE\">
 (list 
   (symbol-package
     (let ((*package* (find-package 'sample-package)))
       (setq *some-symbol* (read-from-string \"just-testing\"))))
   *package*)
→ (#<PACKAGE \"SAMPLE-PACKAGE\"> #<PACKAGE \"COMMON-LISP-USER\">)
 (list (symbol-package (read-from-string \"just-testing\"))
       *package*)
→ (#<PACKAGE \"COMMON-LISP-USER\"> #<PACKAGE \"COMMON-LISP-USER\">)
 (eq 'foo (intern \"FOO\")) → "
      (:TERM NIL "true") "
 (eq 'foo (let ((*package* (find-package 'sample-package)))
            (intern \"FOO\")))
→ "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:FUNREF NIL "load") ", "
     (:FUNREF NIL "compile-file") ", " (:FUNREF NIL "in-package") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "compile-file") ", "
     (:MACREF NIL "in-package") ", " (:FUNREF NIL "load") ", "
     (:FUNREF NIL "package") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Package Errors --------------------")
   :PAR
   (:COM (:NAME "package-error" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "package-error")
     ", " (:TYPEREF NIL "error") ", " (:TYPEREF NIL "serious-condition") ", "
     (:TYPEREF NIL "condition") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "package-error") " consists of " (:TERM NIL "error") " "
     (:TERM NIL "conditions") " related to operations on "
     (:TERM NIL "packages") ". The offending " (:TERM NIL "package") " (or "
     (:TERM NIL "package") " " (:TERM NIL "name") ") is initialized by the "
     (:KWD NIL "package") " initialization argument to "
     (:FUNREF NIL "make-condition") ", and is " (:TERM NIL "accessed")
     " by the " (:TERM NIL "function") " "
     (:FUNREF NIL "package-error-package") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "package-error-package")
     ", " (:SECREF NIL :CONDITIONS) " " :PAR))
   :PAR (:COMMENT NIL "%% ========== PACKAGE-ERROR-PACKAGE")
   (:COM (:NAME "package-error-package" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "package-error-package")
      (:ARGLIST NIL "condition") (:VALUES NIL "package"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "condition")
     "—a " (:TERM NIL "condition") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "package-error") ". " :PAR (:PARAM NIL "package") "—a "
     (:TERM NIL "package designator") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns a " (:TERM NIL "designator")
     " for the offending " (:TERM NIL "package") " in the "
     (:TERM NIL "situation") " represented by the " (:PARAM NIL "condition")
     ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (package-error-package 
   (make-condition 'package-error
     :package (find-package \"COMMON-LISP\")))
→ #<Package \"COMMON-LISP\">
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:TYPEREF NIL "package-error") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL "% This shouldn't be needed."
      "It is an error to use \\macref{setf} with \\funref{package-error-package}.")
     :PAR))
   " ")
  " " :PAR)
 (:CHAPTER
  (:NUM "12" :TITLE ("Numbers") :NUMTAG :CHAP-TWELVE :NAMETAG :NUMBERS)
  (:SECTION (:TITLE ("Number Concepts")) :PAR
   (:SUBSECTION (:TITLE ("Numeric Operations") :TAGS (:NUMERIC-OPERATIONS)) " "
    :PAR (:RM NIL " Common Lisp")
    " provides a large variety of operations related to " (:TERM NIL "numbers")
    ". This section provides an overview of those operations by grouping them into categories that emphasize some of the relationships among them. "
    :PAR (:NEXTFIGURE (:CAPS T)) " shows " (:TERM NIL "operators")
    " relating to arithmetic operations. " :PAR
    (:TABLE (:NAME ("Operators relating to Arithmetic."))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " *")) (:CELL NIL (:FUNREF NIL "1+"))
      (:CELL NIL (:FUNREF NIL "gcd")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " +")) (:CELL NIL (:FUNREF NIL "1-"))
      (:CELL NIL (:FUNREF NIL "incf")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " -"))
      (:CELL NIL (:FUNREF NIL "conjugate")) (:CELL NIL (:FUNREF NIL "lcm")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " /")) (:CELL NIL (:FUNREF NIL "decf"))
      (:CELL NIL)))
    " " :PAR (:NEXTFIGURE (:CAPS T)) " shows " (:TERM NIL "defined names")
    " relating to exponential, logarithmic, and trigonometric operations. "
    :PAR
    (:TABLE
     (:NAME
      ("Defined names relating to Exponentials, Logarithms, and Trigonometry."))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " abs")) (:CELL NIL (:FUNREF NIL "cos"))
      (:CELL NIL (:FUNREF NIL "signum")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " acos"))
      (:CELL NIL (:FUNREF NIL "cosh")) (:CELL NIL (:FUNREF NIL "sin")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " acosh"))
      (:CELL NIL (:FUNREF NIL "exp")) (:CELL NIL (:FUNREF NIL "sinh")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " asin"))
      (:CELL NIL (:FUNREF NIL "expt")) (:CELL NIL (:FUNREF NIL "sqrt")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " asinh"))
      (:CELL NIL (:FUNREF NIL "isqrt")) (:CELL NIL (:FUNREF NIL "tan")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " atan"))
      (:CELL NIL (:FUNREF NIL "log")) (:CELL NIL (:FUNREF NIL "tanh")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " atanh"))
      (:CELL NIL (:FUNREF NIL "phase")) (:CELL NIL))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " cis")) (:CELL NIL (:FUNREF NIL "pi"))
      (:CELL NIL)))
    " " :PAR (:NEXTFIGURE (:CAPS T)) " shows " (:TERM NIL "operators")
    " relating to numeric comparison and predication. " :PAR
    (:TABLE (:NAME ("Operators for numeric comparison and predication."))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " /=")) (:CELL NIL (:FUNREF NIL ">="))
      (:CELL NIL (:FUNREF NIL "oddp")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " <")) (:CELL NIL (:FUNREF NIL "evenp"))
      (:CELL NIL (:FUNREF NIL "plusp")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " <=")) (:CELL NIL (:FUNREF NIL "max"))
      (:CELL NIL (:FUNREF NIL "zerop")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " =")) (:CELL NIL (:FUNREF NIL "min"))
      (:CELL NIL))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " >"))
      (:CELL NIL (:FUNREF NIL "minusp")) (:CELL NIL)))
    " " :PAR (:NEXTFIGURE (:CAPS T)) " shows " (:TERM NIL "defined names")
    " relating to numeric type manipulation and coercion. " :PAR
    (:TABLE
     (:NAME
      ("Defined names relating to numeric type manipulation and coercion."))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " ceiling"))
      (:CELL NIL (:FUNREF NIL "float-radix"))
      (:CELL NIL (:FUNREF NIL "rational")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " complex"))
      (:CELL NIL (:FUNREF NIL "float-sign"))
      (:CELL NIL (:FUNREF NIL "rationalize")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " decode-float"))
      (:CELL NIL (:FUNREF NIL "floor")) (:CELL NIL (:FUNREF NIL "realpart")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " denominator"))
      (:CELL NIL (:FUNREF NIL "fround")) (:CELL NIL (:FUNREF NIL "rem")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " fceiling"))
      (:CELL NIL (:FUNREF NIL "ftruncate")) (:CELL NIL (:FUNREF NIL "round")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " ffloor"))
      (:CELL NIL (:FUNREF NIL "imagpart"))
      (:CELL NIL (:FUNREF NIL "scale-float")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " float"))
      (:CELL NIL (:FUNREF NIL "integer-decode-float"))
      (:CELL NIL (:FUNREF NIL "truncate")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " float-digits"))
      (:CELL NIL (:FUNREF NIL "mod")) (:CELL NIL))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " float-precision"))
      (:CELL NIL (:FUNREF NIL "numerator")) (:CELL NIL)))
    " " :PAR
    (:SUBSUBSECTION
     (:TITLE ("Associativity and Commutativity in Numeric Operations"))
     "For functions that are mathematically associative (and possibly commutative), a "
     (:TERM NIL "conforming implementation") " may process the "
     (:TERM NIL "arguments")
     " in any manner consistent with associative (and possibly commutative) rearrangement. This does not affect the order in which the "
     (:TERM NIL "argument") " " (:TERM NIL "forms") " are "
     (:TERM NIL "evaluated") "; for a discussion of evaluation order, see "
     (:SECREF NIL :FUNCTION-FORMS)
     ". What is unspecified is only the order in which the "
     (:TERM NIL "parameter") " " (:TERM NIL "values")
     " are processed. This implies that " (:TERM NIL "implementations")
     " may differ in which automatic " (:TERM NIL "coercions")
     " are applied; see " (:SECREF NIL :NUMERIC-CONTAGION-RULES) ". " :PAR "A "
     (:TERM NIL "conforming program")
     " can control the order of processing explicitly by separating the operations into separate (possibly nested) "
     (:TERM NIL "function forms") ", or by writing explicit calls to "
     (:TERM NIL "functions") " that perform coercions. " :PAR
     (:SUBSUBSUBSECTION
      (:TITLE
       ("Examples of Associativity and Commutativity in Numeric Operations"))
      "Consider the following expression, in which we assume that "
      (:TT NIL "1.0") " and " (:TT NIL "1.0e-15") " both denote "
      (:TERM NIL "single floats") ": " :PAR
      (:CODE NIL " (+ 1/3 2/3 1.0d0 1.0 1.0e-15)
")
      " " :PAR "One " (:TERM NIL "conforming implementation")
      " might process the " (:TERM NIL "arguments")
      " from left to right, first adding " (:TT NIL "1/3") " and "
      (:TT NIL "2/3") " to get " (:TT NIL "1") ", then converting that to a "
      (:TERM NIL "double float") " for combination with " (:TT NIL "1.0d0")
      ", then successively converting and adding " (:TT NIL "1.0") " and "
      (:TT NIL "1.0e-15") ". " :PAR "Another "
      (:TERM NIL "conforming implementation") " might process the "
      (:TERM NIL "arguments") " from right to left, first performing a "
      (:TERM NIL "single float") " addition of " (:TT NIL "1.0") " and "
      (:TT NIL "1.0e-15")
      " (perhaps losing accuracy in the process), then converting the sum to a "
      (:TERM NIL "double float") " and adding " (:TT NIL "1.0d0")
      ", then converting " (:TT NIL "2/3") " to a " (:TERM NIL "double float")
      " and adding it, and then converting " (:TT NIL "1/3")
      " and adding that. " :PAR "A third "
      (:TERM NIL "conforming implementation") " might first scan all the "
      (:TERM NIL "arguments") ", process all the " (:TERM NIL "rationals")
      " first to keep that part of the computation exact, then find an "
      (:TERM NIL "argument")
      " of the largest floating-point format among all the "
      (:TERM NIL "arguments") " and add that, and then add in all other "
      (:TERM NIL "arguments")
      ", converting each in turn (all in a perhaps misguided attempt to make the computation as accurate as possible). "
      :PAR "In any case, all three strategies are legitimate. " :PAR "A "
      (:TERM NIL "conforming program")
      " could control the order by writing, for example, " :PAR
      (:CODE NIL " (+ (+ 1/3 2/3) (+ 1.0d0 1.0e-15) 1.0)
")
      " " :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Contagion in Numeric Operations") :TAGS
      (:NUMERIC-CONTAGION-RULES))
     " " :PAR
     "For information about the contagion rules for implicit coercions of "
     (:TERM NIL "arguments") " in numeric operations, see "
     (:SECREF NIL :RULE-OF-FLOAT-PRECISION-CONTAGION) ", "
     (:SECREF NIL :RULE-OF-FLOAT-AND-RATIONAL-CONTAGION) ", and "
     (:SECREF NIL :RULE-OF-COMPLEX-CONTAGION) ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Viewing Integers as Bits and Bytes"))
     (:SUBSUBSUBSECTION (:TITLE ("Logical Operations on Integers"))
      "Logical operations require " (:TERM NIL "integers") " as arguments; "
      (:COMMENT NIL
       "!!! Is this a formal use of \"should be signaled\"? -kmp 13-May-91")
      "an error of " (:TERM NIL "type") " " (:TYPEREF NIL "type-error")
      " should be signaled if an argument is supplied that is not an "
      (:TERM NIL "integer") ". " (:TERM NIL "Integer")
      " arguments to logical operations are treated as if they were represented in two's-complement notation. "
      (:COMMENT NIL "Internally an implementation "
       "might or might not use a two's-complement representation.")
      :PAR (:NEXTFIGURE (:CAPS T)) " shows " (:TERM NIL "defined names")
      " relating to logical operations on numbers. " :PAR
      (:TABLE
       (:NAME ("Defined names relating to logical operations on numbers."))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " ash"))
        (:CELL NIL (:FUNREF NIL "boole-ior"))
        (:CELL NIL (:FUNREF NIL "logbitp")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " boole"))
        (:CELL NIL (:FUNREF NIL "boole-nand"))
        (:CELL NIL (:FUNREF NIL "logcount")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " boole-1"))
        (:CELL NIL (:FUNREF NIL "boole-nor"))
        (:CELL NIL (:FUNREF NIL "logeqv")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " boole-2"))
        (:CELL NIL (:FUNREF NIL "boole-orc1"))
        (:CELL NIL (:FUNREF NIL "logior")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " boole-and"))
        (:CELL NIL (:FUNREF NIL "boole-orc2"))
        (:CELL NIL (:FUNREF NIL "lognand")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " boole-andc1"))
        (:CELL NIL (:FUNREF NIL "boole-set"))
        (:CELL NIL (:FUNREF NIL "lognor")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " boole-andc2"))
        (:CELL NIL (:FUNREF NIL "boole-xor"))
        (:CELL NIL (:FUNREF NIL "lognot")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " boole-c1"))
        (:CELL NIL (:FUNREF NIL "integer-length"))
        (:CELL NIL (:FUNREF NIL "logorc1")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " boole-c2"))
        (:CELL NIL (:FUNREF NIL "logand")) (:CELL NIL (:FUNREF NIL "logorc2")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " boole-clr"))
        (:CELL NIL (:FUNREF NIL "logandc1"))
        (:CELL NIL (:FUNREF NIL "logtest")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " boole-eqv"))
        (:CELL NIL (:FUNREF NIL "logandc2"))
        (:CELL NIL (:FUNREF NIL "logxor"))))
      " " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Byte Operations on Integers"))
      "The byte-manipulation " (:TERM NIL "functions") " use "
      (:TERM NIL "objects") " called " (:TERM NIL "byte specifiers")
      " to designate the size and position of a specific " (:TERM NIL "byte")
      " within an " (:TERM NIL "integer") ". The representation of a "
      (:TERM NIL "byte specifier") " is "
      (:TERM NIL "implementation-dependent") "; it might or might not be a "
      (:TERM NIL "number") ". The " (:TERM NIL "function") " "
      (:FUNREF NIL "byte") " will construct a " (:TERM NIL "byte specifier")
      ", which various other byte-manipulation " (:TERM NIL "functions")
      " will accept. " :PAR (:NEXTFIGURE (:CAPS T)) " shows "
      (:TERM NIL "defined names") " relating to manipulating "
      (:TERM NIL "bytes") " of " (:TERM NIL "numbers") ". " :PAR
      (:TABLE (:NAME ("Defined names relating to byte manipulation."))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " byte"))
        (:CELL NIL (:FUNREF NIL "deposit-field"))
        (:CELL NIL (:FUNREF NIL "ldb-test")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " byte-position"))
        (:CELL NIL (:FUNREF NIL "dpb")) (:CELL NIL (:FUNREF NIL "mask-field")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " byte-size"))
        (:CELL NIL (:FUNREF NIL "ldb")) (:CELL NIL)))
      " " :PAR)
     :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Implementation-Dependent Numeric Constants"))
    (:NEXTFIGURE (:CAPS T)) " shows " (:TERM NIL "defined names")
    " relating to " (:TERM NIL "implementation-dependent") " details about "
    (:TERM NIL "numbers") ". " :PAR
    (:TABLE
     (:NAME
      ("Defined names relating to implementation-dependent details about numbers."))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " double-float-epsilon"))
      (:CELL NIL (:FUNREF NIL "most-negative-fixnum")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " double-float-negative-epsilon"))
      (:CELL NIL (:FUNREF NIL "most-negative-long-float")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " least-negative-double-float"))
      (:CELL NIL (:FUNREF NIL "most-negative-short-float")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " least-negative-long-float"))
      (:CELL NIL (:FUNREF NIL "most-negative-single-float")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " least-negative-short-float"))
      (:CELL NIL (:FUNREF NIL "most-positive-double-float")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " least-negative-single-float"))
      (:CELL NIL (:FUNREF NIL "most-positive-fixnum")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " least-positive-double-float"))
      (:CELL NIL (:FUNREF NIL "most-positive-long-float")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " least-positive-long-float"))
      (:CELL NIL (:FUNREF NIL "most-positive-short-float")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " least-positive-short-float"))
      (:CELL NIL (:FUNREF NIL "most-positive-single-float")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " least-positive-single-float"))
      (:CELL NIL (:FUNREF NIL "short-float-epsilon")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " long-float-epsilon"))
      (:CELL NIL (:FUNREF NIL "short-float-negative-epsilon")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " long-float-negative-epsilon"))
      (:CELL NIL (:FUNREF NIL "single-float-epsilon")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " most-negative-double-float"))
      (:CELL NIL (:FUNREF NIL "single-float-negative-epsilon"))))
    " " :PAR)
   (:SUBSECTION
    (:TITLE ("Rational Computations") :TAGS (:RATIONAL-COMPUTATIONS)) " " :PAR
    (:COMMENT NIL "% 12.1.0 2") "The rules in this section apply to "
    (:TERM NIL "rational") " computations. " :PAR
    (:SUBSUBSECTION (:TITLE ("Rule of Unbounded Rational Precision"))
     "Rational computations cannot overflow in the usual sense (though there may not be enough storage to represent a result), since "
     (:TERM NIL "integers") " and " (:TERM NIL "ratios")
     " may in principle be of any magnitude. " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Rule of Canonical Representation for Rationals"))
     "If any computation produces a result that is a mathematical ratio of two integers such that the denominator evenly divides the numerator, then the result is converted to the equivalent "
     (:TERM NIL "integer") ". " :PAR
     (:COMMENT NIL "% 2.1.2 1         "
      "% This had been removed, but I couldn't figure out why,"
      "% so I reinstated it. -kmp 19-Oct-91")
     "If the denominator does not evenly divide the numerator, the canonical representation of a "
     (:TERM NIL "rational") " number is as the " (:TERM NIL "ratio")
     " that numerator and that denominator, where the greatest common divisor of the numerator and denominator is one, and where the denominator is positive and greater than one. "
     :PAR "When used as input (in the default syntax), the notation "
     (:TT NIL "-0") " always denotes the " (:TERM NIL "integer") " "
     (:TT NIL "0") ". A " (:TERM NIL "conforming implementation")
     " must not have a representation of “minus zero” for "
     (:TERM NIL "integers")
     " that is distinct from its representation of zero for "
     (:TERM NIL "integers") ". However, such a distinction is possible for "
     (:TERM NIL "floats") "; see the " (:TERM NIL "type") " "
     (:TYPEREF NIL "float") ". " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Rule of Float Substitutability") :TAGS
      (:FLOAT-SUBSTITUTABILITY))
     " " :PAR (:COMMENT NIL "% 12.5.0 4")
     "When the arguments to an irrational mathematical " (:TERM NIL "function")
     " " (:REVIEWER NIL "Barmar: There should be a table of these functions.")
     " are all " (:TERM NIL "rational")
     " and the true mathematical result is also (mathematically) rational, then unless otherwise noted an implementation is free to return either an accurate "
     (:TERM NIL "rational") " result or a " (:TERM NIL "single float")
     " approximation. If the arguments are all " (:TERM NIL "rational")
     " but the result cannot be expressed as a " (:TERM NIL "rational")
     " number, then a " (:TERM NIL "single float")
     " approximation is always returned. " :PAR
     (:ISSUE NIL "COMPLEX-RATIONAL-RESULT:EXTEND") " If the arguments to "
     (:COMMENT NIL
      "% Added \"irrational\" per Boyer/Kaufmann/Moore #14 (by X3J13 vote at May 4-5, 1994 meeting)"
      "% -kmp 9-May-94" "a")
     "an irrational mathematical " (:TERM NIL "function") " are all of type "
     (:TT NIL "(or rational (complex rational))")
     " and the true mathematical result is (mathematically) a complex number with rational real and imaginary parts, then unless otherwise noted an implementation is free to return either an accurate result of type "
     (:TT NIL "(or rational (complex rational))") " or a "
     (:TERM NIL "single float")
     " (permissible only if the imaginary part of the true mathematical result is zero) or "
     (:TT NIL "(complex single-float)") ". If the arguments are all of type "
     (:TT NIL "(or rational (complex rational))")
     " but the result cannot be expressed as a " (:TERM NIL "rational") " or "
     (:TERM NIL "complex rational") ", then the returned value will be of "
     (:TERM NIL "type") " " (:TYPEREF NIL "single-float")
     " (permissible only if the imaginary part of the true mathematical result is zero) or "
     (:TT NIL "(complex single-float)") ". "
     (:ENDISSUE NIL "COMPLEX-RATIONAL-RESULT:EXTEND") " " :PAR
     (:COMMENT NIL
      "% Added per Boyer/Kaufmann/Moore #14 (by X3J13 vote at May 4-5, 1994 meeting)"
      "% -kmp 9-May-94")
     "Float substitutability applies neither to the rational "
     (:TERM NIL "functions") " " (:FUNREF NIL "+") ", " (:FUNREF NIL "-") ", "
     (:FUNREF NIL "*") ", and " (:FUNREF NIL "/") " nor to the related "
     (:TERM NIL "operators") " " (:FUNREF NIL "1+") ", " (:FUNREF NIL "1-")
     ", " (:MACREF NIL "incf") ", " (:MACREF NIL "decf") ", and "
     (:FUNREF NIL "conjugate") ". For rational " (:TERM NIL "functions")
     ", if all arguments are " (:TERM NIL "rational") ", then the result is "
     (:TERM NIL "rational") "; if all arguments are of type "
     (:TT NIL "(or rational (complex rational))")
     ", then the result is of type "
     (:TT NIL "(or rational (complex rational))") ". " :PAR
     (:TABLE (:NAME ("Functions Affected by Rule of Float Substitutability"))
      (:ROW NIL (:CELL NIL "Function") (:CELL NIL "Sample Results"))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "abs"))
       (:CELL NIL (:TT NIL "(abs #c(3 4)) → 5 " (:I NIL "or") " 5.0")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "acos"))
       (:CELL NIL (:TT NIL "(acos 1) → 0 " (:I NIL "or") " 0.0")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "acosh"))
       (:CELL NIL (:TT NIL "(acosh 1) → 0 " (:I NIL "or") " 0.0")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "asin"))
       (:CELL NIL (:TT NIL "(asin 0) → 0 " (:I NIL "or") " 0.0")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "asinh"))
       (:CELL NIL (:TT NIL "(asinh 0) → 0 " (:I NIL "or") " 0.0")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "atan"))
       (:CELL NIL (:TT NIL "(atan 0) → 0 " (:I NIL "or") " 0.0")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "atanh"))
       (:CELL NIL (:TT NIL "(atanh 0) → 0 " (:I NIL "or") " 0.0")))
      (:ROW NIL
       (:CELL NIL
        (:COMMENT NIL
         "% #c(1 0) => 1 per Boyer/Kaufmann/Moore #14 (by X3J13 vote at May 4-5, 1994 meeting)"
         "% -kmp 9-May-94")
        (:FUNREF NIL "cis"))
       (:CELL NIL (:TT NIL "(cis 0) → 1 " (:I NIL "or") " #c(1.0 0.0)")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "cos"))
       (:CELL NIL (:TT NIL "(cos 0) → 1 " (:I NIL "or") " 1.0")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "cosh"))
       (:CELL NIL (:TT NIL "(cosh 0) → 1 " (:I NIL "or") " 1.0")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "exp"))
       (:CELL NIL (:TT NIL "(exp 0) → 1 " (:I NIL "or") " 1.0")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "expt"))
       (:CELL NIL (:TT NIL "(expt 8 1/3) → 2 " (:I NIL "or") " 2.0")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "log"))
       (:CELL NIL (:TT NIL "(log 1) → 0 " (:I NIL "or") " 0.0") (:BR NIL)
        (:TT NIL "(log 8 2) → 3 " (:I NIL "or") " 3.0")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "phase"))
       (:CELL NIL (:TT NIL "(phase 7) → 0 " (:I NIL "or") " 0.0")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "signum"))
       (:CELL NIL
        (:TT NIL "(signum #c(3 4)) → #c(3/5 4/5) " (:I NIL "or")
         " #c(0.6 0.8)")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "sin"))
       (:CELL NIL (:TT NIL "(sin 0) → 0 " (:I NIL "or") " 0.0")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "sinh"))
       (:CELL NIL (:TT NIL "(sinh 0) → 0 " (:I NIL "or") " 0.0")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "sqrt"))
       (:CELL NIL (:TT NIL "(sqrt 4) → 2 " (:I NIL "or") " 2.0") (:BR NIL)
        (:TT NIL "(sqrt 9/16) → 3/4 " (:I NIL "or") " 0.75")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "tan"))
       (:CELL NIL (:TT NIL "(tan 0) → 0 " (:I NIL "or") " 0.0")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "tanh"))
       (:CELL NIL (:TT NIL "(tanh 0) → 0 " (:I NIL "or") " 0.0"))))
     " " :PAR)
    :PAR)
   (:SUBSECTION
    (:TITLE ("Floating-point Computations") :TAGS
     (:FLOATING-POINT-COMPUTATIONS))
    " " :PAR "The following rules apply to floating point computations. " :PAR
    (:ISSUE NIL "CONTAGION-ON-NUMERICAL-COMPARISONS:TRANSITIVE") " "
    (:SUBSUBSECTION
     (:TITLE ("Rule of Float and Rational Contagion") :TAGS
      (:RULE-OF-FLOAT-AND-RATIONAL-CONTAGION))
     " "
     (:COMMENT NIL
      "% Barmar noted that the following was said in two different places."
      "%  I've removed the most casually worded of the two."
      "%  Hopefully no useful info was lost in the process. -kmp 19-Oct-91"
      " For \\term{functions} that combine arguments of different \\term{types},"
      " when one argument is a \\term{rational} and the other is a \\term{float},"
      " the \\term{rational} is first converted to a \\term{float} of the same format.  "
      " For \\term{functions} that compare arguments of different \\term{types},"
      " when one argument is a \\term{rational} and the other is "
      " a \\term{float}, \\thefunction{rational} is effectively"
      " called to convert the \\term{float} to a \\term{rational} and then an exact"
      " comparison is performed. In the case of \\term{complex} numbers, the real and "
      " imaginary parts are effectively handled individually.")
     :PAR (:COMMENT NIL "% 12.1.0 3") "When " (:TERM NIL "rationals") " and "
     (:TERM NIL "floats") " are combined by a numerical function, the "
     (:TERM NIL "rational") " is first converted to a " (:TERM NIL "float")
     " of the same format. For " (:TERM NIL "functions") " such as "
     (:FUNREF NIL "+")
     " that take more than two arguments, it is permitted that part of the operation be carried out exactly using "
     (:TERM NIL "rationals")
     " and the rest be done using floating-point arithmetic. " :PAR "When "
     (:TERM NIL "rationals") " and " (:TERM NIL "floats")
     " are compared by a numerical function, the " (:TERM NIL "function") " "
     (:FUNREF NIL "rational") " is effectively called to convert the "
     (:TERM NIL "float") " to a " (:TERM NIL "rational")
     " and then an exact comparison is performed. In the case of "
     (:TERM NIL "complex")
     " numbers, the real and imaginary parts are effectively handled individually. "
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Examples of Rule of Float and Rational Contagion"))
      (:CODE NIL " ;;;; Combining rationals with floats.
 ;;; This example assumes an implementation in which 
 ;;; (float-radix 0.5) is 2 (as in IEEE) or 16 (as in IBM/360),
 ;;; or else some other implementation in which 1/2 has an exact 
 ;;;  representation in floating point.
 (+ 1/2 0.5) → 1.0
 (- 1/2 0.5d0) → 0.0d0
 (+ 0.5 -0.5 1/2) → 0.5

 ;;;; Comparing rationals with floats.
 ;;; This example assumes an implementation in which the default float 
 ;;; format is IEEE single-float, IEEE double-float, or some other format
 ;;; in which 5/7 is rounded upwards by FLOAT.
 (< 5/7 (float 5/7)) → "
       (:TERM NIL "true") "
 (< 5/7 (rational (float 5/7))) → "
       (:TERM NIL "true") "
 (< (float 5/7) (float 5/7)) → "
       (:TERM NIL "false") "
")
      " "
      (:COMMENT NIL
       " (< 5/7 (rationalize (float 5/7))) \\EV \\term{implementation-dependent}"
       " Moon: The rationalize example is screwy since the two lines preceding it are also "
       " implementation-dependent.  Also I don't think it sheds any light on"
       " the issue at hand (see the name of the subsubsection), so flush it.")
      :PAR))
    :PAR (:ENDISSUE NIL "CONTAGION-ON-NUMERICAL-COMPARISONS:TRANSITIVE") " "
    :PAR :PAR
    (:SUBSUBSECTION (:TITLE ("Rule of Float Approximation"))
     "Computations with " (:TERM NIL "floats")
     " are only approximate, although they are described as if the results were mathematically accurate. Two mathematically identical expressions may be computationally different because of errors inherent in the floating-point approximation process. The precision of a "
     (:TERM NIL "float")
     " is not necessarily correlated with the accuracy of that number. For instance, 3.142857142857142857 is a more precise approximation to "
     (:MATH NIL (:MI NIL "π"))
     " than 3.14159, but the latter is more accurate. The precision refers to the number of bits retained in the representation. When an operation combines a "
     (:TERM NIL "short float") " with a " (:TERM NIL "long float")
     ", the result will be a " (:TERM NIL "long float") ". "
     (:RM NIL " Common Lisp")
     " functions assume that the accuracy of arguments to them does not exceed their precision. Therefore when two "
     (:TERM NIL "small floats") " are combined, the result is a "
     (:TERM NIL "small float") ". " (:RM NIL " Common Lisp")
     " functions never convert automatically from a larger size to a smaller one. ")
    :PAR
    (:SUBSUBSECTION (:TITLE ("Rule of Float Underflow and Overflow"))
     "An error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "floating-point-overflow") " or "
     (:TYPEREF NIL "floating-point-underflow")
     " should be signaled if a floating-point computation causes exponent overflow or underflow, respectively. "
     :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Rule of Float Precision Contagion") :TAGS
      (:RULE-OF-FLOAT-PRECISION-CONTAGION))
     " " :PAR
     (:COMMENT NIL "% The following was said in two different places."
      "%  I've removed the most casually worded of the two."
      "%  Hopefully no useful info was lost in the process. -kmp 19-Oct-91"
      " When a shorter \\term{float} is combined with a longer one in an operation,"
      " the result will be of the \\term{type} of the longer of the two \\term{floats}.")
     :PAR (:COMMENT NIL "% 12.1.0 5")
     "The result of a numerical function is a " (:TERM NIL "float")
     " of the largest format among all the floating-point arguments to the "
     (:TERM NIL "function") ". " :PAR)
    :PAR)
   (:SUBSECTION (:TITLE ("Complex Computations") :TAGS (:COMPLEX-COMPUTATIONS))
    " " :PAR (:COMMENT NIL "% 12.1.0 6") "The following rules apply to "
    (:TERM NIL "complex") " computations: " :PAR
    (:SUBSUBSECTION (:TITLE ("Rule of Complex Substitutability"))
     "Except during the execution of irrational and transcendental "
     (:TERM NIL "functions") ", no numerical " (:TERM NIL "function") " ever "
     (:TERM NIL "yields") " a " (:TERM NIL "complex")
     " unless one or more of its " (:TERM NIL "arguments") " is a "
     (:TERM NIL "complex") ". " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Rule of Complex Contagion") :TAGS (:RULE-OF-COMPLEX-CONTAGION))
     " "
     (:COMMENT NIL " When a " " \\issue{REAL-NUMBER-TYPE:X3J13-MAR-89}"
      " \\term{real}" " \\endissue{REAL-NUMBER-TYPE:X3J13-MAR-89}" " number "
      " \\reviewer{Barmar: I don't like the word `meets' here.}"
      " \\editornote{KMP: This is all said redundantly in \\secref\\ComplexComputations\\ below,"
      " 	         so maybe we can merge the two, somehow.} %!!! 26-Dec-90"
      " meets a \\term{complex} number, the "
      " \\issue{REAL-NUMBER-TYPE:X3J13-MAR-89}" " \\term{real}"
      " \\endissue{REAL-NUMBER-TYPE:X3J13-MAR-89}"
      " number is in effect first converted to a "
      " \\term{complex} number by providing an"
      " imaginary part of {\\tt $0$}.")
     "When a " (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " "
     (:TERM NIL "real") " " (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89")
     " and a " (:TERM NIL "complex") " are both part of a computation, the "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TERM NIL "real") " "
     (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89")
     " is first converted to a " (:TERM NIL "complex")
     " by providing an imaginary part of " (:TT NIL "0") ". ")
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Rule of Canonical Representation for Complex Rationals") :TAGS
      (:RULE-OF-CANON-REP-FOR-COMPLEX-RATIONALS))
     " " :PAR (:COMMENT NIL "% 12.1.0 8")
     "If the result of any computation would be a " (:TERM NIL "complex")
     " number whose real part is of " (:TERM NIL "type") " "
     (:TYPEREF NIL "rational")
     " and whose imaginary part is zero, the result is converted to the "
     (:TERM NIL "rational")
     " which is the real part. This rule does not apply to "
     (:TERM NIL "complex") " numbers whose parts are " (:TERM NIL "floats")
     ". For example, " (:TT NIL "#C(5 0)") " and " (:TT NIL "5") " are not "
     (:TERM NIL "different") " " (:TERM NIL "objects") " in "
     (:RM NIL " Common Lisp") " (they are always the " (:TERM NIL "same")
     " under " (:FUNREF NIL "eql") "); " (:TT NIL "#C(5.0 0.0)") " and "
     (:TT NIL "5.0") " are always " (:TERM NIL "different") " "
     (:TERM NIL "objects") " in " (:RM NIL " Common Lisp")
     " (they are never the " (:TERM NIL "same") " under " (:FUNREF NIL "eql")
     ", although they are the " (:TERM NIL "same") " under "
     (:FUNREF NIL "equalp") " and " (:FUNREF NIL "=") "). " :PAR
     (:SUBSUBSUBSECTION
      (:TITLE
       ("Examples of Rule of Canonical Representation for Complex Rationals"))
      (:CODE NIL " #c(1.0 1.0) → #C(1.0 1.0)
 #c(0.0 0.0) → #C(0.0 0.0)
 #c(1.0 1) → #C(1.0 1.0)
 #c(0.0 0) → #C(0.0 0.0)
 #c(1 1) → #C(1 1)
 #c(0 0) → 0
 (typep #c(1 1) '(complex (eql 1))) → "
       (:TERM NIL "true") "
 (typep #c(0 0) '(complex (eql 0))) → "
       (:TERM NIL "false") "
")
      " " :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Principal Values and Branch Cuts"))
     "Many of the irrational and transcendental functions are multiply defined in the complex domain; for example, there are in general an infinite number of complex values for the logarithm function. In each such case, a "
     (:TERM NIL "principal") " " (:TERM NIL "value")
     " must be chosen for the function to return. In general, such values cannot be chosen so as to make the range continuous; lines in the domain called branch cuts must be defined, which in turn define the discontinuities in the range. "
     (:COMMENT NIL "% 12.5.3 2") (:RM NIL " Common Lisp")
     " defines the branch cuts, " (:TERM NIL "principal") " "
     (:TERM NIL "values")
     ", and boundary conditions for the complex functions following “"
     (:BIB (:DOI "10.1145/800142.805368")
      "Principal Values and Branch Cuts in Complex APL")
     ".” The branch cut rules that apply to each function are located with the description of that function. "
     :PAR (:COMMENT NIL "% 12.5.3 17") (:NEXTFIGURE (:CAPS T))
     " lists the identities that are obeyed throughout the applicable portion of the complex domain, even on the branch cuts: "
     :PAR
     (:TABLE (:NAME ("Trigonometric Identities for Complex Domain"))
      (:ROW NIL (:CELL NIL " sin i z = i sinh z ")
       (:CELL NIL " sinh i z = i sin z ")
       (:CELL NIL " arctan i z = i arctanh z "))
      (:ROW NIL (:CELL NIL " cos i z = cosh z ")
       (:CELL NIL " cosh i z = cos z ")
       (:CELL NIL " arcsinh i z = i arcsin z "))
      (:ROW NIL (:CELL NIL " tan i z = i tanh z ")
       (:CELL NIL " arcsin i z = i arcsinh z ")
       (:CELL NIL " arctanh i z = i arctan z ")))
     " " :PAR
     "The quadrant numbers referred to in the discussions of branch cuts are as illustrated in "
     (:NEXTFIGURE NIL) ". " :PAR
     (:COMMENT NIL " JGA requested this."
      " This is amazingly low-tex and the spacing of dots isn't quite right,"
      " but I think it's good enough to be intelligible and will suffice until and"
      " unless something better is devised. -kmp 3-Feb-92")
     " "
     (:DISPLAYMATH NIL
      (:MTABLE NIL (:MTR NIL (:MTD NIL (:MI NIL "Positive")))
       (:MTR NIL
        (:MTD NIL (:MI NIL "Imaginary") (:MSPACE NIL) (:MI NIL "Axis")))
       (:MTR NIL
        (:MTD NIL
         (:MTABLE NIL (:MTR NIL (:MTD NIL) (:MTD NIL (:MO NIL "⋮")) (:MTD NIL))
          (:MTR NIL (:MTD NIL (:MTEXT (:FONT :TT) " II "))
           (:MTD NIL (:MO NIL "⋮")) (:MTD NIL (:MTEXT (:FONT :TT) "   I")))
          (:MTR NIL
           (:MTD NIL (:MI NIL "Negative") (:MSPACE NIL) (:MI NIL "Real")
            (:MSPACE NIL) (:MI NIL "Axis") (:MSPACE NIL)
            (:MROW NIL (:MO NIL "⋯") (:MO NIL "⋯") (:MO NIL "⋯")))
           (:MTD NIL)
           (:MTD NIL (:MROW NIL (:MO NIL "⋯") (:MO NIL "⋯") (:MO NIL "⋯"))
            (:MSPACE NIL) (:MI NIL "Positive") (:MSPACE NIL) (:MI NIL "Real")
            (:MSPACE NIL) (:MI NIL "Axis")))
          (:MTR NIL (:MTD NIL (:MTEXT (:FONT :TT) " III "))
           (:MTD NIL (:MO NIL "⋮")) (:MTD NIL (:MTEXT (:FONT :TT) "   IV")))
          (:MTR NIL (:MTD NIL) (:MTD NIL (:MO NIL "⋮")) (:MTD NIL)))))
       (:MTR NIL (:MTD NIL (:MI NIL "Negative")))
       (:MTR NIL
        (:MTD NIL (:MI NIL "Imaginary") (:MSPACE NIL) (:MI NIL "Axis")))))
     "  " (:CAPTION NIL "Quadrant Numbering for Branch Cuts") " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Interval Designators") :TAGS (:INTERVAL-DESIGNATORS))
    " " :PAR "The " (:TERM NIL "compound type specifier")
    " form of the numeric " (:TERM NIL "type specifiers") " "
    (:COMMENT NIL
     "% Removed per Boyer/Kaufmann/Moore #15 (by X3J13 vote at May 4-5, 1994 meeting)"
     "% -kmp 9-May-94" "in \\thenextfigure\\ ")
    "permit the user to specify an interval on the real number line which describe a "
    (:TERM NIL "subtype") " of the " (:TERM NIL "type")
    " which would be described by the corresponding "
    (:TERM NIL "atomic type specifier") ". A " (:TERM NIL "subtype")
    " of some " (:TERM NIL "type") " " (:PARAM NIL "T")
    " is specified using an ordered pair of " (:TERM NIL "objects") " called "
    (:TERM NIL "interval designators") " for " (:TERM NIL "type") " "
    (:PARAM NIL "T") ". " :PAR "The first of the two "
    (:TERM NIL "interval designators") " for " (:TERM NIL "type") " "
    (:PARAM NIL "T") " can be any of the following: " :PAR
    (:LIST NIL
     (:ITEM NIL "a number " (:PARAM NIL "N") " of " (:TERM NIL "type") " "
      (:PARAM NIL "T") " " :PAR "This denotes a lower inclusive bound of "
      (:PARAM NIL "N") ". That is, " (:TERM NIL "elements") " of the "
      (:TERM NIL "subtype") " of " (:PARAM NIL "T")
      " will be greater than or equal to " (:PARAM NIL "N") ". " :PAR)
     (:ITEM NIL "a " (:TERM NIL "singleton") " " (:TERM NIL "list") " whose "
      (:TERM NIL "element") " is a number " (:PARAM NIL "M") " of "
      (:TERM NIL "type") " " (:PARAM NIL "T") " " :PAR
      "This denotes a lower exclusive bound of " (:PARAM NIL "M") ". That is, "
      (:TERM NIL "elements") " of the " (:TERM NIL "subtype") " of "
      (:PARAM NIL "T") " will be greater than " (:PARAM NIL "M") ". " :PAR)
     (:ITEM NIL "the symbol " (:MISC NIL "*") " " :PAR
      "This denotes the absence of a lower bound on the interval. " :PAR))
    " " :PAR "The second of the two " (:TERM NIL "interval designators")
    " for " (:TERM NIL "type") " " (:PARAM NIL "T")
    " can be any of the following: " :PAR
    (:LIST NIL
     (:ITEM NIL "a number " (:PARAM NIL "N") " of " (:TERM NIL "type") " "
      (:PARAM NIL "T") " " :PAR "This denotes an upper inclusive bound of "
      (:PARAM NIL "N") ". That is, " (:TERM NIL "elements") " of the "
      (:TERM NIL "subtype") " of " (:PARAM NIL "T")
      " will be less than or equal to " (:PARAM NIL "N") ". " :PAR)
     (:ITEM NIL "a " (:TERM NIL "singleton") " " (:TERM NIL "list") " whose "
      (:TERM NIL "element") " is a number " (:PARAM NIL "M") " of "
      (:TERM NIL "type") " " (:PARAM NIL "T") " " :PAR
      "This denotes an upper exclusive bound of " (:PARAM NIL "M")
      ". That is, " (:TERM NIL "elements") " of the " (:TERM NIL "subtype")
      " of " (:PARAM NIL "T") " will be less than " (:PARAM NIL "M") ". " :PAR)
     (:ITEM NIL "the symbol " (:MISC NIL "*") " " :PAR
      "This denotes the absence of an upper bound on the interval. " :PAR))
    " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Random-State Operations")) (:NEXTFIGURE (:CAPS T))
    " lists some " (:TERM NIL "defined names") " that are applicable to "
    (:TERM NIL "random states") ". " :PAR
    (:TABLE (:NAME ("Random-state defined names"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " *random-state*"))
      (:CELL NIL (:FUNREF NIL "random")) (:CELL NIL))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " make-random-state"))
      (:CELL NIL (:FUNREF NIL "random-state-p")) (:CELL NIL)))
    " " :PAR))
  :PAR
  (:DICTIONARY NIL :PAR " " :PAR
   (:COMMENT NIL " Numbers" "  Numeric Comparison" "  Rounding" "  Trig"
    "  Hyperbolic Trig" "  Arithmetic" "  Random Numbers" "  Numeric Types"
    "   Complex" "   Real" "    Rational" "     Integer" "      Integer Bits"
    "      Integer Bytes" "       Fixnum" "     Ratio" "    Float"
    "     Float Subtypes")
   :PAR
   (:COMMENT NIL "-------------------- Numeric Types --------------------")
   (:COM (:NAME "number" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "number") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL
      "%The following seems to fluffy to me.  Besides you can find the same info elsewhere"
      "%in more rigorous form. -kmp 13-Nov-90"
      " There are \\term{real} and \\term{complex} \\term{numbers}."
      " \\term{Real} numbers are further divided into \\term{floats},"
      " \\term{rationals}, and \\term{integers}." "%Replaced by:")
     "The " (:TERM NIL "type") " " (:TYPEREF NIL "number") " contains "
     (:TERM NIL "objects") " which represent mathematical numbers. "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " The " (:TERM NIL "types")
     " " (:TYPEREF NIL "real") " and " (:TYPEREF NIL "complex") " are "
     (:TERM NIL "disjoint") " " (:TERM NIL "subtypes") " of "
     (:TYPEREF NIL "number") ". "
     (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " :PAR
     (:COMMENT NIL "I added this: -kmp 15-Nov-90") "The "
     (:TERM NIL "function") " " (:FUNREF NIL "=")
     " tests for numerical equality. The " (:TERM NIL "function") " "
     (:FUNREF NIL "eql") ", when its arguments are both " (:TERM NIL "numbers")
     ", tests that they have both the same " (:TERM NIL "type")
     " and numerical value. " (:COMMENT NIL "% 12.0.0 4") "Two "
     (:TERM NIL "numbers") " that are the " (:TERM NIL "same") " under "
     (:FUNREF NIL "eql") " or " (:FUNREF NIL "=") " are not necessarily the "
     (:TERM NIL "same") " under " (:FUNREF NIL "eq") ". " :PAR
     (:COMMENT NIL "% 2.1.4 1" "% 2.1.4 4") :PAR)
    (:PART (:NAME "Notes") " " :PAR (:RM NIL " Common Lisp")
     " differs from mathematics on some naming issues. In mathematics, the set of real numbers is traditionally described as a subset of the complex numbers, but in "
     (:RM NIL " Common Lisp") ", the " (:TERM NIL "type") " "
     (:TYPEREF NIL "real") " and the " (:TERM NIL "type") " "
     (:TYPEREF NIL "complex") " are disjoint. The " (:RM NIL " Common Lisp")
     " type which includes all mathematical complex numbers is called "
     (:TYPEREF NIL "number")
     ". The reasons for these differences include historical precedent, compatibility with most other popular computer languages, and various issues of time and space efficiency. "
     :PAR
     (:COMMENT NIL "RWK notes:"
      " Another way of describing this is that fundamental number types"
      " fixnum, bignum, xxx-float, ratio, complex, ... all name representations"
      " and are names for finite subsets of the corresponding mathematical concepts."
      " Thus, complex is a type which can represent complex numbers."
      " The extra capability of this type means that even if the imaginary part is 0.0,"
      " it is not a member of the more restrictive representation real."
      "Ultimately I didn't buy this because it presumes that types are only about"
      "how a number is represented.  But 1.0 is not represented as a real.  In fact,"
      "no number is.  Rather, they are represented as subtypes of reals, and so real"
      "is available only for categorization.  Anyway, I decided to just let things stand"
      "as they are for brevity and let others intuit other explanations that make them happy.")
     :PAR))
   (:COM (:NAME "complex" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "complex") ", "
     (:TYPEREF NIL "number") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL
      "RWK: Again, describe it as a representation which is -capable- of representing"
      "     complex numbers.  1.0 has a different, more restricted representation.")
     :PAR "The " (:TERM NIL "type") " " (:TYPEREF NIL "complex")
     " includes all mathematical complex numbers other than those included in the "
     (:TERM NIL "type") " " (:TYPEREF NIL "rational") ". "
     (:TERM NIL "Complexes") " are "
     (:COMMENT NIL
      "\"represented\" -> \"expressed\".  Some reviewer had problems with \"represented\". -kmp")
     "expressed in Cartesian form with a real part and an imaginary part, each of which is a "
     (:TERM NIL "real") ". The real part and imaginary part are either both "
     (:TERM NIL "rational") " or both of the same " (:TERM NIL "float") " "
     (:TERM NIL "type") ". The imaginary part can be a " (:TERM NIL "float")
     " zero, but can never be a " (:TERM NIL "rational")
     " zero, for such a number is always represented by "
     (:RM NIL " Common Lisp") " as a " (:TERM NIL "rational") " rather than a "
     (:TERM NIL "complex") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Specializing. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:COMMENT NIL "% 4.5.0 11")
     (:DEF (:KIND "type") (:NAMES NIL "complex")
      (:ARGLIST NIL (:BRAC NIL "typespec | " (:MISC NIL "*"))))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "typespec") "—a " (:TERM NIL "type specifier")
     " that denotes a " (:TERM NIL "subtype") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "real") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     (:EDITORNOTE NIL
      "KMP: If you ask me, this definition is a complete mess. Looking at issue ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING does not help me figure it out, either. Anyone got any suggestions?")
     " " :PAR "Every element of this " (:TERM NIL "type") " is a "
     (:TERM NIL "complex")
     " whose real part and imaginary part are each of type "
     (:ISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     (:TT NIL "(upgraded-complex-part-type " (:PARAM NIL "typespec") ")") ". "
     (:COMMENT NIL "The following will be left out:" "\\param{type}.")
     (:ENDISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING")
     " This " (:TERM NIL "type") " encompasses those " (:TERM NIL "complexes")
     " that can result by giving numbers of " (:TERM NIL "type") " "
     (:PARAM NIL "typespec") " to " (:FUNREF NIL "complex") ". "
     (:ISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     (:COMMENT NIL "The following will be deleted:" "This might be different"
      "from what the \\term{type} means for discrimination purposes."
      "For example, Gaussian integers might be   "
      "described as the type {\\tt (complex integer)}, even in implementations"
      "where giving two \\term{integers} to \\funref{complex} results"
      "in an \\term{object} of type {\\tt (complex rational)}." "%%% 2.1.4 3"
      "%The type of a specific \\term{complex} is indicated by a list"
      "%of the word \\misc{complex} and the type of the components; for example,"
      "%a specialized representation for \\typeref{complex} "
      "%numbers with \\term{short float}"
      "%parts would be of type {\\tt (complex short-float)}.  \\Thetype{complex}"
      "%encompasses all complex representations." "End of deletion.")
     :PAR (:TT NIL " (complex " (:PARAM NIL "type-specifier") ")")
     " refers to all " (:TERM NIL "complexes") " that can result from giving "
     (:TERM NIL "numbers") " of " (:PARAM NIL "type") " "
     (:PARAM NIL "type-specifier") " to the " (:TERM NIL "function") " "
     (:FUNREF NIL "complex") ", plus all other " (:TERM NIL "complexes")
     " of the same specialized representation. "
     (:COMMENT NIL "% Must fix the following according to Moon's 7-jul mail"
      "% will fix for next edition."
      "Both the real and the imaginary parts of any such "
      "\\term{complex} must satisfy:"
      "\\rbracket\\ '\\param{type-specifier})}")
     :PAR (:ENDISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING")
     " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:SECREF NIL :RULE-OF-CANON-REP-FOR-COMPLEX-RATIONALS) ", "
     (:SECREF NIL :NUMS-FROM-TOKENS) ", " (:SECREF NIL :PRINTING-COMPLEXES) " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR "The input syntax for a "
     (:TERM NIL "complex") " with real part " (:MATH NIL (:MI NIL "r"))
     " and imaginary part " (:MATH NIL (:MI NIL "i")) " is "
     (:TT NIL "#C(" (:MATH NIL (:MI NIL "r")) " " (:MATH NIL (:MI NIL "i"))
      ")")
     ". For further details, see " (:SECREF NIL :STANDARD-MACRO-CHARS) ". "
     :PAR "For every " (:TERM NIL "float") ", " (:MATH NIL (:MI NIL "n"))
     ", there is a " (:TERM NIL "complex")
     " which represents the same mathematical number and which can be obtained by "
     (:TT NIL " (COERCE " (:MATH NIL (:MI NIL "n")) " 'COMPLEX)") ". " :PAR))
   (:COM (:NAME "real" :FTYPE "System Class")
    (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " :PAR
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "real") ", "
     (:TYPEREF NIL "number") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "real") " includes all " (:TERM NIL "numbers")
     " that represent mathematical real numbers, though there are mathematical real numbers ("
     (:I NIL "e.g.")
     ",  irrational numbers) that do not have an exact representation in "
     (:RM NIL " Common Lisp") ". Only " (:TERM NIL "reals")
     " can be ordered using the " (:FUNREF NIL "<") ", " (:FUNREF NIL ">") ", "
     (:FUNREF NIL "<=") ", and " (:FUNREF NIL ">=") " functions. " :PAR
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " The " (:TERM NIL "types")
     " " (:TYPEREF NIL "rational") " and " (:TYPEREF NIL "float") " are "
     (:TERM NIL "disjoint") " " (:TERM NIL "subtypes") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "real") ". "
     (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " :PAR " ")
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Abbreviating. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:DEF (:KIND "type") (:NAMES NIL "real")
      (:ARGLIST NIL (:BRAC NIL "lower-limit " (:BRAC NIL "upper-limit"))))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "lower-limit") ", " (:PARAM NIL "upper-limit") "—"
     (:TERM NIL "interval designators") " for " (:TERM NIL "type") " "
     (:TYPEREF NIL "real") ". The defaults for each of "
     (:PARAM NIL "lower-limit") " and " (:PARAM NIL "upper-limit") " is the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     "This denotes the " (:TERM NIL "reals") " on the interval described by "
     (:PARAM NIL "lower-limit") " and " (:PARAM NIL "upper-limit") ".  " :PAR
     (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " :PAR))
   (:COM (:NAME "float" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "float") ", "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TYPEREF NIL "real")
     ", " (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " "
     (:TYPEREF NIL "number") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "float")
     " is a mathematical rational (but " (:I NIL "not") " a "
     (:RM NIL " Common Lisp") " " (:TERM NIL "rational") ") of the form "
     (:MATH NIL (:MI NIL "s") (:MO NIL "·") (:MI NIL "f") (:MO NIL "·")
      (:MSUP NIL (:MI NIL "b")
       (:MROW NIL (:MI NIL "e") (:MO NIL "-") (:MI NIL "p"))))
     ", where " (:MATH NIL (:MI NIL "s")) " is "
     (:MATH NIL (:MO NIL "+") (:MN NIL "1")) " or "
     (:MATH NIL (:MO NIL "-") (:MN NIL "1")) ", the " (:I NIL "sign") "; "
     (:MATH NIL (:MI NIL "b")) " is an " (:TERM NIL "integer")
     " greater than 1, the " (:I NIL "base") " or " (:I NIL "radix")
     " of the representation; " (:MATH NIL (:MI NIL "p")) " is a positive "
     (:TERM NIL "integer") ", the " (:I NIL "precision") " (in base-"
     (:MATH NIL (:MI NIL "b")) " digits) of the " (:TERM NIL "float") "; "
     (:MATH NIL (:MI NIL "f")) " is a positive " (:TERM NIL "integer")
     " between "
     (:MATH NIL
      (:MSUP NIL (:MI NIL "b")
       (:MROW NIL (:MI NIL "p") (:MO NIL "-") (:MN NIL "1"))))
     " and "
     (:MATH NIL (:MSUP NIL (:MI NIL "b") (:MI NIL "p")) (:MO NIL "-")
      (:MN NIL "1"))
     " (inclusive), the significand; and " (:MATH NIL (:MI NIL "e")) " is an "
     (:TERM NIL "integer") ", the exponent. The value of "
     (:MATH NIL (:MI NIL "p")) " and the range of " (:MATH NIL (:MI NIL "e"))
     " depends on the implementation and on the type of " (:TERM NIL "float")
     " within that implementation. In addition, there is a floating-point zero; depending on the implementation, there can also be a “minus zero”. If there is no minus zero, then "
     (:MATH NIL (:MN NIL "0") (:MO NIL ".") (:MN NIL "0")) " and "
     (:MATH NIL (:MO NIL "-") (:MN NIL "0") (:MO NIL ".") (:MN NIL "0"))
     " are both interpreted as simply a floating-point zero. "
     (:TT NIL " (= 0.0 -0.0)") " is always true. If there is a minus zero, "
     (:TT NIL " (eql -0.0 0.0)") " is " (:TERM NIL "false")
     ", otherwise it is " (:TERM NIL "true") ". " :PAR (:COMMENT NIL "!!!")
     (:REVIEWER NIL "Barmar: What about IEEE NaNs and infinities?") " " :PAR
     (:COMMENT NIL "!!!")
     (:REVIEWER NIL
      "RWK: In the following, what is the “ordering”? precision? range? Can there be additional subtypes of float or does “others” in the list of four?")
     " " :PAR (:COMMENT NIL "% 2.15.0 12") "The " (:TERM NIL "types") " "
     (:TYPEREF NIL "short-float") ", " (:TYPEREF NIL "single-float") ", "
     (:TYPEREF NIL "double-float") ", and " (:TYPEREF NIL "long-float") " are "
     (:TERM NIL "subtypes") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "float") ". Any two of them must be either "
     (:TERM NIL "disjoint") " " (:TERM NIL "types") " or the "
     (:TERM NIL "same") " " (:TERM NIL "type") "; if the " (:TERM NIL "same")
     " " (:TERM NIL "type") ", then any other " (:TERM NIL "types")
     " between them in the above ordering must also be the " (:TERM NIL "same")
     " " (:TERM NIL "type") ". For example, if the " (:TERM NIL "type") " "
     (:TYPEREF NIL "single-float") " and the " (:TERM NIL "type") " "
     (:TYPEREF NIL "long-float") " are the " (:TERM NIL "same") " "
     (:TERM NIL "type") ", then the " (:TERM NIL "type") " "
     (:TYPEREF NIL "double-float") " must be the " (:TERM NIL "same") " "
     (:TERM NIL "type") " also. " :PAR " ")
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Abbreviating. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:DEF (:KIND "type") (:NAMES NIL "float")
      (:ARGLIST NIL (:BRAC NIL "lower-limit " (:BRAC NIL "upper-limit"))))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "lower-limit") ", " (:PARAM NIL "upper-limit") "—"
     (:TERM NIL "interval designators") " for " (:TERM NIL "type") " "
     (:TYPEREF NIL "float") ". The defaults for each of "
     (:PARAM NIL "lower-limit") " and " (:PARAM NIL "upper-limit") " is the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     "This denotes the " (:TERM NIL "floats") " on the interval described by "
     (:PARAM NIL "lower-limit") " and " (:PARAM NIL "upper-limit") ".  " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FIGREF NIL :SYNTAX-FOR-NUMERIC-TOKENS)
     ", " (:SECREF NIL :NUMS-FROM-TOKENS) ", " (:SECREF NIL :PRINTING-FLOATS)
     " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "Note that all mathematical integers are representable not only as "
     (:RM NIL " Common Lisp") " " (:TERM NIL "reals") ", but also as "
     (:TERM NIL "complex floats")
     ". For example, possible representations of the mathematical number "
     (:MATH NIL (:MN NIL "1")) " include the " (:TERM NIL "integer") " "
     (:TT NIL "1") ", the " (:TERM NIL "float") " " (:TT NIL "1.0") ", or the "
     (:TERM NIL "complex") " " (:TT NIL "#C(1.0 0.0)") ". " :PAR))
   (:COM
    (:NAME "short-float, single-float, double-float, long-float" :FTYPE "Type")
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "short-float") ": "
     (:TYPEREF NIL "short-float") ", " (:TYPEREF NIL "float") ", "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TYPEREF NIL "real")
     ", " (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " "
     (:TYPEREF NIL "number") ", " (:TYPEREF NIL "t") " " :PAR
     (:TYPEREF NIL "single-float") ": " (:TYPEREF NIL "single-float") ", "
     (:TYPEREF NIL "float") ", " (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89")
     " " (:TYPEREF NIL "real") ", "
     (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " "
     (:TYPEREF NIL "number") ", " (:TYPEREF NIL "t") " " :PAR
     (:TYPEREF NIL "double-float") ": " (:TYPEREF NIL "double-float") ", "
     (:TYPEREF NIL "float") ", " (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89")
     " " (:TYPEREF NIL "real") ", "
     (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " "
     (:TYPEREF NIL "number") ", " (:TYPEREF NIL "t") " " :PAR
     (:TYPEREF NIL "long-float") ": " (:TYPEREF NIL "long-float") ", "
     (:TYPEREF NIL "float") ", " (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89")
     " " (:TYPEREF NIL "real") ", "
     (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " "
     (:TYPEREF NIL "number") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "For the four defined "
     (:TERM NIL "subtypes") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "float") ", it is true that " (:COMMENT NIL "% 2.1.3 6")
     "intermediate between the " (:TERM NIL "type") " "
     (:TYPEREF NIL "short-float") " and the " (:TERM NIL "type") " "
     (:TYPEREF NIL "long-float") " are the " (:TERM NIL "type") " "
     (:TYPEREF NIL "single-float") " and the " (:TERM NIL "type") " "
     (:TYPEREF NIL "double-float")
     ". The precise definition of these categories is "
     (:COMMENT NIL
      "Changed from CLtL \"\\term{implementation-dependent}\" by KMP per suggestion of Barmar."
      "Every implementation has to implement all the float-xxx inspection functions"
      "anyway, so it's not really possible for an implementation to be wishy-washy"
      "on this issue.")
     (:TERM NIL "implementation-defined")
     ". The precision (measured in “bits”, computed as "
     (:MATH NIL (:MSUB NIL (:MI NIL "plog") (:MN NIL "2")) (:MI NIL "b"))
     ") and the exponent size (also measured in “bits,” computed as "
     (:MATH NIL (:MSUB NIL (:MI NIL "log") (:MN NIL "2")) (:MO NIL "(")
      (:MI NIL "n") (:MO NIL "+") (:MN NIL "1") (:MO NIL ")"))
     ", where " (:MATH NIL (:MI NIL "n"))
     " is the maximum exponent value) is recommended to be at least as great as the values in "
     (:NEXTFIGURE NIL) ". Each of the defined " (:TERM NIL "subtypes") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "float")
     " might or might not have a minus zero. " :PAR
     (:TABLE
      (:NAME
       ("Recommended Minimum Floating-Point Precision and Exponent Size"))
      (:ROW NIL (:CELL NIL (:B NIL "Format"))
       (:CELL NIL (:B NIL "Minimum Precision"))
       (:CELL NIL (:B NIL "Minimum Exponent Size")))
      (:ROW (:RULE T :GAP 4) (:CELL NIL " Short ") (:CELL NIL " 13 bits ")
       (:CELL NIL " 5 bits"))
      (:ROW NIL (:CELL NIL " Single ") (:CELL NIL " 24 bits ")
       (:CELL NIL " 8 bits"))
      (:ROW NIL (:CELL NIL " Double ") (:CELL NIL " 50 bits ")
       (:CELL NIL " 8 bits"))
      (:ROW NIL (:CELL NIL " Long ") (:CELL NIL " 50 bits ")
       (:CELL NIL " 8 bits")))
     " " :PAR (:COMMENT NIL "% 2.1.3 10" "% 2.1.3 11" "% 2.1.3 18")
     "There can be fewer than four internal representations for "
     (:TERM NIL "floats")
     ". If there are fewer distinct representations, the following rules apply: "
     (:LIST NIL
      (:ITEM NIL "– If there is only one, it is "
       (:COMMENT NIL "\"of\" removed -kmp 6-Jan-91") "the " (:TERM NIL "type")
       " " (:TYPEREF NIL "single-float") ". In this representation, an "
       (:TERM NIL "object") " is simultaneously of " (:TERM NIL "types") " "
       (:TYPEREF NIL "single-float") ", " (:TYPEREF NIL "double-float") ", "
       (:TYPEREF NIL "short-float") ", and " (:TYPEREF NIL "long-float") ". ")
      (:ITEM NIL
       "– Two internal representations can be arranged in either of the following ways: "
       (:LIST NIL
        (:ITEM NIL " Two " (:TERM NIL "types") " are provided: "
         (:TYPEREF NIL "single-float") " and " (:TYPEREF NIL "short-float")
         ". An " (:TERM NIL "object") " is simultaneously of "
         (:TERM NIL "types") " " (:TYPEREF NIL "single-float") ", "
         (:TYPEREF NIL "double-float") ", and " (:TYPEREF NIL "long-float")
         ". ")
        (:ITEM NIL " Two " (:TERM NIL "types") " are provided: "
         (:TYPEREF NIL "single-float") " and " (:TYPEREF NIL "double-float")
         ". An " (:TERM NIL "object") " is simultaneously of "
         (:TERM NIL "types") " " (:TYPEREF NIL "single-float") " and "
         (:TYPEREF NIL "short-float") ", or " (:TYPEREF NIL "double-float")
         " and " (:TYPEREF NIL "long-float") ". "))
       " ")
      (:ITEM NIL
       "– Three internal representations can be arranged in either of the following ways: "
       (:LIST NIL
        (:ITEM NIL " Three " (:TERM NIL "types") " are provided: "
         (:TYPEREF NIL "short-float") ", " (:TYPEREF NIL "single-float")
         ", and " (:TYPEREF NIL "double-float") ". An " (:TERM NIL "object")
         " can simultaneously be of " (:TERM NIL "type") " "
         (:TYPEREF NIL "double-float") " and " (:TYPEREF NIL "long-float")
         ". ")
        (:ITEM NIL " Three " (:TERM NIL "types") " are provided: "
         (:TYPEREF NIL "single-float") ", " (:TYPEREF NIL "double-float")
         ", and " (:TYPEREF NIL "long-float") ". An " (:TERM NIL "object")
         " can simultaneously be of " (:TERM NIL "types") " "
         (:TYPEREF NIL "single-float") " and " (:TYPEREF NIL "short-float")
         ". "))
       " "))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Abbreviating. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:COMMENT NIL "% 4.6.0 8                         " "% 4.6.0 9") :PAR
     (:DEF (:KIND "type") (:NAMES NIL "short-float")
      (:ARGLIST NIL
       (:BRAC NIL "short-lower-limit " (:BRAC NIL "short-upper-limit"))))
     " "
     (:DEF (:KIND "type") (:NAMES NIL "single-float")
      (:ARGLIST NIL
       (:BRAC NIL "single-lower-limit " (:BRAC NIL "single-upper-limit"))))
     " "
     (:DEF (:KIND "type") (:NAMES NIL "double-float")
      (:ARGLIST NIL
       (:BRAC NIL "double-lower-limit " (:BRAC NIL "double-upper-limit"))))
     " "
     (:DEF (:KIND "type") (:NAMES NIL "long-float")
      (:ARGLIST NIL
       (:BRAC NIL "long-lower-limit " (:BRAC NIL "long-upper-limit"))))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "short-lower-limit") ", " (:PARAM NIL "short-upper-limit") "—"
     (:TERM NIL "interval designators") " for " (:TERM NIL "type") " "
     (:TYPEREF NIL "short-float") ". The defaults for each of "
     (:PARAM NIL "lower-limit") " and " (:PARAM NIL "upper-limit") " is the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". " :PAR
     (:PARAM NIL "single-lower-limit") ", " (:PARAM NIL "single-upper-limit")
     "—" (:TERM NIL "interval designators") " for " (:TERM NIL "type") " "
     (:TYPEREF NIL "single-float") ". The defaults for each of "
     (:PARAM NIL "lower-limit") " and " (:PARAM NIL "upper-limit") " is the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". " :PAR
     (:PARAM NIL "double-lower-limit") ", " (:PARAM NIL "double-upper-limit")
     "—" (:TERM NIL "interval designators") " for " (:TERM NIL "type") " "
     (:TYPEREF NIL "double-float") ". The defaults for each of "
     (:PARAM NIL "lower-limit") " and " (:PARAM NIL "upper-limit") " is the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". " :PAR
     (:PARAM NIL "long-lower-limit") ", " (:PARAM NIL "long-upper-limit") "—"
     (:TERM NIL "interval designators") " for " (:TERM NIL "type") " "
     (:TYPEREF NIL "long-float") ". The defaults for each of "
     (:PARAM NIL "lower-limit") " and " (:PARAM NIL "upper-limit") " is the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     "Each of these denotes the set of " (:TERM NIL "floats")
     " of the indicated " (:TERM NIL "type")
     " that are on the interval specified by the "
     (:TERM NIL "interval designators") ". " :PAR))
   (:COM (:NAME "rational" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "rational") ", "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TYPEREF NIL "real")
     ", " (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " "
     (:TYPEREF NIL "number") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The canonical representation of a "
     (:TERM NIL "rational") " is as an " (:TERM NIL "integer")
     " if its value is integral, and otherwise as a " (:TERM NIL "ratio") ". "
     :PAR (:COMMENT NIL "% 2.15.0 8            ") "The " (:TERM NIL "types")
     " " (:TYPEREF NIL "integer") " and " (:TYPEREF NIL "ratio") " are "
     (:TERM NIL "disjoint") " " (:TERM NIL "subtypes") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "rational") ". " :PAR " ")
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Abbreviating. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:DEF (:KIND "type") (:NAMES NIL "rational")
      (:ARGLIST NIL (:BRAC NIL "lower-limit " (:BRAC NIL "upper-limit"))))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "lower-limit") ", " (:PARAM NIL "upper-limit") "—"
     (:TERM NIL "interval designators") " for " (:TERM NIL "type") " "
     (:TYPEREF NIL "rational") ". The defaults for each of "
     (:PARAM NIL "lower-limit") " and " (:PARAM NIL "upper-limit") " is the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     "This denotes the " (:TERM NIL "rationals")
     " on the interval described by " (:PARAM NIL "lower-limit") " and "
     (:PARAM NIL "upper-limit") ".  " :PAR))
   (:COM (:NAME "ratio" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "ratio") ", "
     (:TYPEREF NIL "rational") ", "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TYPEREF NIL "real")
     ", " (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " "
     (:TYPEREF NIL "number") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "ratio") " is a "
     (:TERM NIL "number")
     " representing the mathematical ratio of two non-zero integers, the numerator and denominator, whose greatest common divisor is one, and of which the denominator is positive and greater than one. "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FIGREF NIL :SYNTAX-FOR-NUMERIC-TOKENS)
     ", " (:SECREF NIL :NUMS-FROM-TOKENS) ", " (:SECREF NIL :PRINTING-RATIOS)
     " " :PAR (:COMMENT NIL "% 2.1.1 1") :PAR))
   (:COM (:NAME "integer" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "integer") ", "
     (:TYPEREF NIL "rational") ", "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TYPEREF NIL "real")
     ", " (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " "
     (:TYPEREF NIL "number") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "An " (:TERM NIL "integer")
     " is a mathematical integer. There is no limit on the magnitude of an "
     (:TERM NIL "integer") ". " :PAR
     (:ISSUE NIL "FIXNUM-NON-PORTABLE:TIGHTEN-DEFINITION") " "
     (:COMMENT NIL "% 2.15.0 10                                ") "The "
     (:TERM NIL "types") " " (:TYPEREF NIL "fixnum") " and "
     (:TYPEREF NIL "bignum") " form an " (:TERM NIL "exhaustive partition")
     " of " (:TERM NIL "type") " " (:TYPEREF NIL "integer") ". "
     (:COMMENT NIL "are \\term{disjoint} \\subtypesof{integer}.")
     (:ENDISSUE NIL "FIXNUM-NON-PORTABLE:TIGHTEN-DEFINITION") " " :PAR
     (:COMMENT NIL "% 2.1.1 2") :PAR " ")
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Abbreviating. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:DEF (:KIND "type") (:NAMES NIL "integer")
      (:ARGLIST NIL (:BRAC NIL "lower-limit " (:BRAC NIL "upper-limit"))))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "lower-limit") ", " (:PARAM NIL "upper-limit") "—"
     (:TERM NIL "interval designators") " for " (:TERM NIL "type") " "
     (:TYPEREF NIL "integer") ". The defaults for each of "
     (:PARAM NIL "lower-limit") " and " (:PARAM NIL "upper-limit") " is the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     "This denotes the " (:TERM NIL "integers")
     " on the interval described by " (:PARAM NIL "lower-limit") " and "
     (:PARAM NIL "upper-limit") ".  " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FIGREF NIL :SYNTAX-FOR-NUMERIC-TOKENS)
     ", " (:SECREF NIL :NUMS-FROM-TOKENS) ", " (:SECREF NIL :PRINTING-INTEGERS)
     " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The " (:TERM NIL "type") " "
     (:TT NIL "(integer " (:I NIL "lower") " " (:I NIL "upper") ")") ", where "
     (:I NIL "lower") " and " (:I NIL "upper") " are "
     (:CONREF NIL "most-negative-fixnum") " and "
     (:CONREF NIL "most-positive-fixnum") ", respectively, is also called "
     (:TYPEREF NIL "fixnum") ". " :PAR "The " (:TERM NIL "type") " "
     (:TT NIL "(integer 0 1)") " is also called " (:TYPEREF NIL "bit") ". The "
     (:TERM NIL "type") " " (:TT NIL "(integer 0 *)") " is also called "
     (:TYPEREF NIL "unsigned-byte") ". " :PAR))
   (:COM (:NAME "signed-byte" :FTYPE "Type")
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "signed-byte") ", "
     (:TYPEREF NIL "integer") ", " (:TYPEREF NIL "rational") ", "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TYPEREF NIL "real")
     ", " (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " "
     (:TYPEREF NIL "number") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The atomic "
     (:TERM NIL "type specifier") " " (:TYPEREF NIL "signed-byte")
     " denotes the same type as is denoted by the "
     (:TERM NIL "type specifier") " " (:TYPEREF NIL "integer")
     "; however, the list forms of these two " (:TERM NIL "type specifiers")
     " have different semantics. " :PAR
     (:COMMENT NIL "!!! Barrett thinks this syntax spec needs work.") :PAR)
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Abbreviating. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:DEF (:KIND "type") (:NAMES NIL "signed-byte")
      (:ARGLIST NIL (:BRAC NIL "s | " (:MISC NIL "*"))))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "s") "—a positive " (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     (:COMMENT NIL "% 4.6.0 5                             "
      "\\itemitem{\\f{(signed-byte \\param{s})}}")
     :PAR "This denotes the set of " (:TERM NIL "integers")
     " that can be represented in two's-complement form in a "
     (:TERM NIL "byte") " of " (:PARAM NIL "s") " bits. This is equivalent to "
     (:TT NIL "(integer "
      (:MATH NIL (:MO NIL "-")
       (:MSUP NIL (:MN NIL "2")
        (:MROW NIL (:MI NIL "s") (:MO NIL "-") (:MN NIL "1"))))
      " "
      (:MATH NIL
       (:MSUP NIL (:MN NIL "2")
        (:MROW NIL (:MI NIL "s") (:MO NIL "-") (:MN NIL "1")))
       (:MO NIL "-") (:MN NIL "1"))
      ")")
     ". The type " (:TYPEREF NIL "signed-byte") " or the type "
     (:TT NIL "(signed-byte *)") " is the same as the " (:TERM NIL "type") " "
     (:TYPEREF NIL "integer") ". " :PAR))
   (:COM (:NAME "unsigned-byte" :FTYPE "Type")
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "unsigned-byte") ", "
     (:TYPEREF NIL "signed-byte") ", " (:TYPEREF NIL "integer") ", "
     (:TYPEREF NIL "rational") ", "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TYPEREF NIL "real")
     ", " (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " "
     (:TYPEREF NIL "number") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL
      "!!! Barrett thinks this should be more consistent with presentation of signed-byte."
      "!!! Barrett thinks we should be more careful about whitespace in the exponents here.")
     "The atomic " (:TERM NIL "type specifier") " "
     (:TYPEREF NIL "unsigned-byte")
     " denotes the same type as is denoted by the "
     (:TERM NIL "type specifier") " " (:TT NIL "(integer 0 *)") ". "
     (:COMMENT NIL
      "% Barmar notes that this is redundant with what's said below."
      " The \\term{type specifier} {\\tt (unsigned-byte \\param{s})} is equivalent to "
      " {\\tt (integer 0 $2^s-1$)}.")
     :PAR)
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Abbreviating. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:COMMENT NIL "% 4.6.0 6")
     (:DEF (:KIND "type") (:NAMES NIL "unsigned-byte")
      (:ARGLIST NIL (:BRAC NIL (:PARAM NIL "s") " | " (:MISC NIL "*"))))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:COMMENT NIL
      " The \"positive\" was suggested by Barmar, and seems consistent with signed-byte."
      "  -kmp 20-Oct-91")
     (:PARAM NIL "s") "—a positive " (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     "This denotes the set of non-negative " (:TERM NIL "integers")
     " that can be represented in a byte of size " (:PARAM NIL "s")
     " (bits). This is equivalent to " (:TT NIL "(mod " (:PARAM NIL "m") ")")
     " for "
     (:MATH NIL (:MI (:FONT :I) "m") (:MO NIL "=")
      (:MSUP NIL (:MN NIL "2") (:MI NIL "s")))
     ", or to " (:TT NIL "(integer 0 " (:PARAM NIL "n") ")") " for "
     (:MATH NIL (:MI (:FONT :I) "n") (:MO NIL "=")
      (:MSUP NIL (:MN NIL "2") (:MI NIL "s")) (:MO NIL "-") (:MN NIL "1"))
     ". The " (:TERM NIL "type") " " (:TYPEREF NIL "unsigned-byte")
     " or the type " (:TT NIL "(unsigned-byte *)") " is the same as the type "
     (:TT NIL "(integer 0 *)") ", the set of non-negative "
     (:TERM NIL "integers") ". " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The " (:TERM NIL "type") " "
     (:TT NIL "(unsigned-byte 1)") " is also called " (:TYPEREF NIL "bit") ". "
     :PAR))
   :PAR (:COMMENT NIL "%% ========== MOD")
   (:COM (:NAME "mod" :FTYPE "Type Specifier")
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Abbreviating. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:COMMENT NIL "% 4.6.0 4")
     (:DEF (:KIND "type") (:NAMES NIL "mod") (:ARGLIST NIL "n")) " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "n") "—a positive " (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     "This denotes the set of non-negative " (:TERM NIL "integers")
     " less than " (:PARAM NIL "n") ". This is equivalent to "
     (:TT NIL "(integer 0 (" (:PARAM NIL "n") "))") " or to "
     (:TT NIL "(integer 0 " (:PARAM NIL "m") ")") ", where "
     (:MATH NIL (:MI (:FONT :I) "m") (:MO NIL "=") (:MI (:FONT :I) "n")
      (:MO NIL "-") (:MN NIL "1"))
     ". " :PAR (:ISSUE NIL "TYPE-SPECIFIER-ABBREVIATION:X3J13-JUN90-GUESS")
     " The argument is required, and cannot be " (:MISC NIL "*") ". " :PAR
     "The symbol " (:TYPEREF NIL "mod") " is not valid as a "
     (:TERM NIL "type specifier") ". "
     (:ENDISSUE NIL "TYPE-SPECIFIER-ABBREVIATION:X3J13-JUN90-GUESS") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== BIT")
   (:COM (:NAME "bit" :FTYPE "Type")
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "bit") ", "
     (:TYPEREF NIL "unsigned-byte") ", " (:TYPEREF NIL "signed-byte") ", "
     (:TYPEREF NIL "integer") ", " (:TYPEREF NIL "rational") ", "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TYPEREF NIL "real")
     ", " (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " "
     (:TYPEREF NIL "number") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "bit") " is equivalent to the " (:TERM NIL "type") " "
     (:TT NIL "(integer 0 1)") " and " (:TT NIL "(unsigned-byte 1)") ". "
     :PAR))
   :PAR (:COMMENT NIL "%% ========== FIXNUM")
   (:COM (:NAME "fixnum" :FTYPE "Type")
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "fixnum") ", "
     (:TYPEREF NIL "integer") ", " (:TYPEREF NIL "rational") ", "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TYPEREF NIL "real")
     ", " (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " "
     (:TYPEREF NIL "number") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "fixnum") " is an "
     (:TERM NIL "integer") " whose value is between "
     (:CONREF NIL "most-negative-fixnum") " and "
     (:CONREF NIL "most-positive-fixnum") " inclusive. Exactly which "
     (:TERM NIL "integers") " are " (:TERM NIL "fixnums") " is "
     (:COMMENT NIL
      " CLtL said \"\\term{implementation-dependent}\" but Barmar suggested (and I agree)"
      " that implementations should say. -kmp 10-Oct-90")
     (:TERM NIL "implementation-defined") ". "
     (:ISSUE NIL "FIXNUM-NON-PORTABLE:TIGHTEN-DEFINITION") " The "
     (:TERM NIL "type") " " (:TYPEREF NIL "fixnum")
     " is required to be a supertype of " (:TT NIL "(signed-byte 16)") ". "
     (:ENDISSUE NIL "FIXNUM-NON-PORTABLE:TIGHTEN-DEFINITION") " " :PAR
     (:COMMENT NIL
      "Barrett thinks maybe some intentional information about fixnums"
      "(e.g., about efficiency) might belong here.  I don't that kind of thing is"
      "appropriate so I haven't added it. -kmp 23-Oct-90")
     :PAR))
   :PAR (:COMMENT NIL "%% ========== BIGNUM")
   (:COM (:NAME "bignum" :FTYPE "Type")
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "bignum") ", "
     (:TYPEREF NIL "integer") ", " (:TYPEREF NIL "rational") ", "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TYPEREF NIL "real")
     ", " (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " "
     (:TYPEREF NIL "number") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:ISSUE NIL "FIXNUM-NON-PORTABLE:TIGHTEN-DEFINITION") " The "
     (:TERM NIL "type") " " (:TYPEREF NIL "bignum")
     " is defined to be exactly " (:TT NIL "(and integer (not fixnum))") ". "
     (:ENDISSUE NIL "FIXNUM-NON-PORTABLE:TIGHTEN-DEFINITION") " " :PAR
     (:COMMENT NIL "% 2.2.4 1") :PAR))
   :PAR
   (:COMMENT NIL
    "-------------------- Numeric Comparison --------------------")
   :PAR
   (:COMMENT NIL "%% ========== =" "%% ========== /=" "%% ========== <"
    "%% ========== >" "%% ========== >=" "%% ========== <=")
   (:COM (:NAME "=, /=, <, >, <=, >=" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "=")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " " (:PLUS NIL "numbers"))
      (:VALUES NIL "generalized-boolean"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "/=")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " " (:PLUS NIL "numbers"))
      (:VALUES NIL "generalized-boolean"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "<")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " " (:PLUS NIL "numbers"))
      (:VALUES NIL "generalized-boolean"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL ">")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " " (:PLUS NIL "numbers"))
      (:VALUES NIL "generalized-boolean"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "<=")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " " (:PLUS NIL "numbers"))
      (:VALUES NIL "generalized-boolean"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL ">=")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " " (:PLUS NIL "numbers"))
      (:VALUES NIL "generalized-boolean"))
     " " :PAR
     (:COMMENT NIL
      "!!! Issue CONTAGION-ON-NUMERICAL-COMPARISONS still needs to be merged? -kmp 9-Aug-91")
     :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number")
     "—for " (:FUNREF NIL "<") ", " (:FUNREF NIL ">") ", " (:FUNREF NIL "<=")
     ", " (:FUNREF NIL ">=") ": a " (:TERM NIL "real") "; for "
     (:FUNREF NIL "=") ", " (:FUNREF NIL "/=") ": a " (:TERM NIL "number") ". "
     :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "=") ", "
     (:FUNREF NIL "/=") ", " (:FUNREF NIL "<") ", " (:FUNREF NIL ">") ", "
     (:FUNREF NIL "<=") ", and " (:FUNREF NIL ">=")
     " perform arithmetic comparisons on their arguments as follows: " :PAR
     (:LIST NIL
      (:ITEM NIL (:FUNREF NIL "=") " " :PAR "The value of " (:FUNREF NIL "=")
       " is " (:TERM NIL "true") " if all " (:PARAM NIL "numbers")
       " are the same in value; otherwise it is " (:TERM NIL "false") ". Two "
       (:TERM NIL "complexes") " are considered equal by " (:FUNREF NIL "=")
       " if their real and imaginary parts are equal according to "
       (:FUNREF NIL "=") ". " :PAR)
      (:ITEM NIL (:FUNREF NIL "/=") " " :PAR "The value of " (:FUNREF NIL "/=")
       " is " (:TERM NIL "true") " if no two " (:PARAM NIL "numbers")
       " are the same in value; otherwise it is " (:TERM NIL "false") ". "
       :PAR)
      (:ITEM NIL (:FUNREF NIL "<") " " :PAR "The value of " (:FUNREF NIL "<")
       " is " (:TERM NIL "true") " if the " (:PARAM NIL "numbers")
       " are in monotonically increasing order; otherwise it is "
       (:TERM NIL "false") ". " :PAR)
      (:ITEM NIL (:FUNREF NIL ">") " " :PAR "The value of " (:FUNREF NIL ">")
       " is " (:TERM NIL "true") " if the " (:PARAM NIL "numbers")
       " are in monotonically decreasing order; otherwise it is "
       (:TERM NIL "false") ". " :PAR)
      (:ITEM NIL (:FUNREF NIL "<=") " " :PAR "The value of " (:FUNREF NIL "<=")
       " is " (:TERM NIL "true") " if the " (:PARAM NIL "numbers")
       " are in monotonically nondecreasing order; otherwise it is "
       (:TERM NIL "false") ". " :PAR)
      (:ITEM NIL (:FUNREF NIL ">=") " " :PAR "The value of " (:FUNREF NIL ">=")
       " is " (:TERM NIL "true") " if the " (:PARAM NIL "numbers")
       " are in monotonically nonincreasing order; otherwise it is "
       (:TERM NIL "false") ". "))
     " " :PAR (:FUNREF NIL "=") ", " (:FUNREF NIL "/=") ", " (:FUNREF NIL "<")
     ", " (:FUNREF NIL ">") ", " (:FUNREF NIL "<=") ", and " (:FUNREF NIL ">=")
     " perform necessary type conversions. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     "The uses of these functions are illustrated in " (:NEXTFIGURE NIL) ". "
     (:COMMENT NIL "% 12.3.0 4") :PAR
     (:TABLE (:NAME ("Uses of /=, =, <, >, <=, and >="))
      (:ROW NIL (:CELL NIL (:TT NIL "(= 3 3)") " is " (:TERM NIL "true") ". ")
       (:CELL NIL (:TT NIL "(/= 3 3)") " is " (:TERM NIL "false") ". "))
      (:ROW NIL (:CELL NIL (:TT NIL "(= 3 5)") " is " (:TERM NIL "false") ". ")
       (:CELL NIL (:TT NIL "(/= 3 5)") " is " (:TERM NIL "true") ". "))
      (:ROW NIL
       (:CELL NIL (:TT NIL "(= 3 3 3 3)") " is " (:TERM NIL "true") ". ")
       (:CELL NIL (:TT NIL "(/= 3 3 3 3)") " is " (:TERM NIL "false") ". "))
      (:ROW NIL
       (:CELL NIL (:TT NIL "(= 3 3 5 3)") " is " (:TERM NIL "false") ". ")
       (:CELL NIL (:TT NIL "(/= 3 3 5 3)") " is " (:TERM NIL "false") ". "))
      (:ROW NIL
       (:CELL NIL (:TT NIL "(= 3 6 5 2)") " is " (:TERM NIL "false") ". ")
       (:CELL NIL (:TT NIL "(/= 3 6 5 2)") " is " (:TERM NIL "true") ". "))
      (:ROW NIL
       (:CELL NIL (:TT NIL "(= 3 2 3)") " is " (:TERM NIL "false") ". ")
       (:CELL NIL (:TT NIL "(/= 3 2 3)") " is " (:TERM NIL "false") ". "))
      (:ROW NIL (:CELL NIL (:TT NIL "(< 3 5)") " is " (:TERM NIL "true") ". ")
       (:CELL NIL (:TT NIL "(<= 3 5)") " is " (:TERM NIL "true") ". "))
      (:ROW NIL
       (:CELL NIL (:TT NIL "(< 3 -5)") " is " (:TERM NIL "false") ". ")
       (:CELL NIL (:TT NIL "(<= 3 -5)") " is " (:TERM NIL "false") ". "))
      (:ROW NIL (:CELL NIL (:TT NIL "(< 3 3)") " is " (:TERM NIL "false") ". ")
       (:CELL NIL (:TT NIL "(<= 3 3)") " is " (:TERM NIL "true") ". "))
      (:ROW NIL
       (:CELL NIL (:TT NIL "(< 0 3 4 6 7)") " is " (:TERM NIL "true") ". ")
       (:CELL NIL (:TT NIL "(<= 0 3 4 6 7)") " is " (:TERM NIL "true") ". "))
      (:ROW NIL
       (:CELL NIL (:TT NIL "(< 0 3 4 4 6)") " is " (:TERM NIL "false") ". ")
       (:CELL NIL (:TT NIL "(<= 0 3 4 4 6)") " is " (:TERM NIL "true") ". "))
      (:ROW NIL (:CELL NIL (:TT NIL "(> 4 3)") " is " (:TERM NIL "true") ". ")
       (:CELL NIL (:TT NIL "(>= 4 3)") " is " (:TERM NIL "true") ". "))
      (:ROW NIL
       (:CELL NIL (:TT NIL "(> 4 3 2 1 0)") " is " (:TERM NIL "true") ". ")
       (:CELL NIL (:TT NIL "(>= 4 3 2 1 0)") " is " (:TERM NIL "true") ". "))
      (:ROW NIL
       (:CELL NIL (:TT NIL "(> 4 3 3 2 0)") " is " (:TERM NIL "false") ". ")
       (:CELL NIL (:TT NIL "(>= 4 3 3 2 0)") " is " (:TERM NIL "true") ". "))
      (:ROW NIL
       (:CELL NIL (:TT NIL "(> 4 3 1 2 0)") " is " (:TERM NIL "false") ". ")
       (:CELL NIL (:TT NIL "(>= 4 3 1 2 0)") " is " (:TERM NIL "false") ". "))
      (:ROW NIL (:CELL NIL (:TT NIL "(= 3)") " is " (:TERM NIL "true") ". ")
       (:CELL NIL (:TT NIL "(/= 3)") " is " (:TERM NIL "true") ". "))
      (:ROW NIL (:CELL NIL (:TT NIL "(< 3)") " is " (:TERM NIL "true") ". ")
       (:CELL NIL (:TT NIL "(<= 3)") " is " (:TERM NIL "true") ". "))
      (:ROW NIL
       (:CELL NIL (:TT NIL "(= 3.0 #c(3.0 0.0))") " is " (:TERM NIL "true")
        ". ")
       (:CELL NIL (:TT NIL "(/= 3.0 #c(3.0 1.0))") " is " (:TERM NIL "true")
        "."))
      (:ROW NIL
       (:CELL NIL (:TT NIL "(= 3 3.0)") " is " (:TERM NIL "true") ". ")
       (:CELL NIL (:TT NIL "(= 3.0s0 3.0d0)") " is " (:TERM NIL "true") ". "))
      (:ROW NIL
       (:CELL NIL (:TT NIL "(= 0.0 -0.0)") " is " (:TERM NIL "true") ". ")
       (:CELL NIL (:TT NIL "(= 5/2 2.5)") " is " (:TERM NIL "true") ". "))
      (:ROW NIL
       (:CELL NIL (:TT NIL "(> 0.0 -0.0)") " is " (:TERM NIL "false") ". ")
       (:CELL NIL (:TT NIL "(= 0 -0.0)") " is " (:TERM NIL "true") ". "))
      (:ROW NIL
       (:CELL (:SPAN 2) (:TT NIL "(<= 0 x 9)") " is " (:TERM NIL "true") " if "
        (:TT NIL "x") " is between " (:TT NIL "0") " and " (:TT NIL "9")
        ", inclusive"))
      (:ROW NIL
       (:CELL (:SPAN 2) (:TT NIL "(< 0.0 x 1.0)") " is " (:TERM NIL "true")
        " if " (:TT NIL "x") " is between " (:TT NIL "0.0") " and "
        (:TT NIL "1.0") ", exclusive"))
      (:ROW NIL
       (:CELL (:SPAN 2) (:TT NIL "(< -1 j (length v))") " is "
        (:TERM NIL "true") " if " (:TT NIL "j") " is a "
        (:TERM NIL "valid array index") " for a " (:TERM NIL "vector")
        (:TT NIL "v"))))
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "Might signal "
     (:TYPEREF NIL "type-error") " if some " (:TERM NIL "argument")
     " is not a " (:TERM NIL "real") ". Might signal "
     (:TYPEREF NIL "arithmetic-error")
     " if otherwise unable to fulfill its contract. " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "=") " differs from "
     (:FUNREF NIL "eql") " in that " (:TT NIL "(= 0.0 -0.0)")
     " is always true, because " (:FUNREF NIL "=")
     " compares the mathematical values of its operands, whereas "
     (:FUNREF NIL "eql") " compares the representational values, so to speak. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MAX" "%% ========== MIN")
   (:COM (:NAME "max, min" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "max")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " " (:PLUS NIL "reals"))
      (:VALUES NIL "max-real"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "min")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " " (:PLUS NIL "reals"))
      (:VALUES NIL "min-real"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "real") "—a "
     (:TERM NIL "real") ". " :PAR (:PARAM NIL "max-real") ", "
     (:PARAM NIL "min-real") "—a " (:TERM NIL "real") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.3.0 8")
     (:FUNREF NIL "max") " returns the " (:PARAM NIL "real")
     " that is greatest (closest to positive infinity). " (:FUNREF NIL "min")
     " returns the " (:PARAM NIL "real")
     " that is least (closest to negative infinity). " :PAR "For "
     (:FUNREF NIL "max")
     ", the implementation has the choice of returning the largest argument as is or applying the rules of floating-point "
     (:TERM NIL "contagion")
     ", taking all the arguments into consideration for "
     (:TERM NIL "contagion")
     " purposes. Also, if one or more of the arguments are " (:FUNREF NIL "=")
     ", then any one of them may be chosen as the value to return. For example, if the "
     (:PARAM NIL "reals") " are a mixture of " (:TERM NIL "rationals") " and "
     (:TERM NIL "floats") ", and the largest argument is a "
     (:TERM NIL "rational")
     ", then the implementation is free to produce either that "
     (:TERM NIL "rational") " or its " (:TERM NIL "float")
     " approximation; if the largest argument is a " (:TERM NIL "float")
     " of a smaller format than the largest format of any " (:TERM NIL "float")
     " argument, then the implementation is free to return the argument in its given format or expanded to the larger format. Similar remarks apply to "
     (:FUNREF NIL "min")
     " (replacing “largest argument” by “smallest argument”). " :PAR)
    (:PART (:NAME "Examples") " " :PAR (:COMMENT NIL "% 12.3.0 9")
     (:CODE NIL " (max 3) → 3 
 (min 3) → 3
 (max 6 12) → 12 
 (min 6 12) → 6
 (max -6 -12) → -6 
 (min -6 -12) → -12
 (max 1 3 2 -7) → 3 
 (min 1 3 2 -7) → -7
 (max -2 3 0 7) → 7 
 (min -2 3 0 7) → -2
 (max 5.0 2) → 5.0 
 (min 5.0 2)
→ 2
OR→ 2.0
 (max 3.0 7 1)
→ 7
OR→ 7.0 
 (min 3.0 7 1)
→ 1
OR→ 1.0
 (max 1.0s0 7.0d0) → 7.0d0
 (min 1.0s0 7.0d0)
→ 1.0s0
OR→ 1.0d0
 (max 3 1 1.0s0 1.0d0)
→ 3
OR→ 3.0d0
 (min 3 1 1.0s0 1.0d0)
→ 1
OR→ 1.0s0 
OR→ 1.0d0
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if any " (:PARAM NIL "number") " is not a "
     (:TERM NIL "real") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MINUSP" "%% ========== PLUSP")
   (:COM (:NAME "minusp, plusp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "minusp") (:ARGLIST NIL "real")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "plusp") (:ARGLIST NIL "real")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "real") "—a "
     (:TERM NIL "real") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 12.2.0 4" "% 12.2.0 5") (:FUNREF NIL "minusp")
     " returns " (:TERM NIL "true") " if " (:PARAM NIL "real")
     " is less than zero; otherwise, returns " (:TERM NIL "false") ". " :PAR
     (:FUNREF NIL "plusp") " returns " (:TERM NIL "true") " if "
     (:PARAM NIL "real") " is greater than zero; otherwise, returns "
     (:TERM NIL "false") ". " :PAR "Regardless of whether an "
     (:TERM NIL "implementation")
     " provides distinct representations for positive and negative "
     (:TERM NIL "float") " zeros, " (:TT NIL "(minusp -0.0)")
     " always returns " (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (minusp -1) → " (:TERM NIL "true") "
 (plusp 0) → "
      (:TERM NIL "false") "
 (plusp least-positive-single-float) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "real") " is not a "
     (:TERM NIL "real") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ZEROP")
   (:COM (:NAME "zerop" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "zerop") (:ARGLIST NIL "number")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Pronunciation") " " :PAR
     (:PRONOUNCED NIL (:HI-STRESS NIL "zē") "(" (:LO-STRESS NIL) ")rō("
      (:LO-STRESS NIL) ")pē")
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") "—a "
     (:TERM NIL "number") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.2.0 3")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "number") " is zero ("
     (:TERM NIL "integer") ", " (:TERM NIL "float") ", or "
     (:TERM NIL "complex") "); otherwise, returns " (:TERM NIL "false") ". "
     :PAR "Regardless of whether an " (:TERM NIL "implementation")
     " provides distinct representations for positive and negative floating-point zeros, "
     (:TT NIL "(zerop -0.0)") " always returns " (:TERM NIL "true") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (zerop 0) → " (:TERM NIL "true") "
 (zerop 1) → "
      (:TERM NIL "false") "
 (zerop -0.0) → "
      (:TERM NIL "true") "
 (zerop 0/100) → "
      (:TERM NIL "true") "
 (zerop #c(0 0.0)) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "number") " is not a "
     (:TERM NIL "number") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (zerop " (:PARAM NIL "number") ") ≡ (= "
      (:PARAM NIL "number") " 0)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "-------------------- Rounding --------------------")
   :PAR
   (:COMMENT NIL "%% ========== FLOOR" "%% ========== CEILING"
    "%% ========== TRUNCATE" "%% ========== ROUND" "%% ========== FFLOOR"
    "%% ========== FCEILING" "%% ========== FTRUNCATE" "%% ========== FROUND")
   (:COM
    (:NAME
     "floor, ffloor, ceiling, fceiling, truncate, ftruncate, round, fround"
     :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function")
      (:NAMES NIL "floor" "ffloor" "ceiling" "fceiling" "truncate" "ftruncate"
       "round" "fround")
      (:ARGLIST NIL "number " (:KEYWORD NIL " &optional") " divisor")
      (:VALUES NIL "quotient, remainder"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") "—a "
     (:TERM NIL "real") ". " :PAR (:PARAM NIL "divisor") "—a non-zero "
     (:TERM NIL "real") ". The default is the " (:TERM NIL "integer") " "
     (:TT NIL "1") ". " :PAR (:PARAM NIL "quotient") "—for "
     (:FUNREF NIL "floor") ", " (:FUNREF NIL "ceiling") ", "
     (:FUNREF NIL "truncate") ", and " (:FUNREF NIL "round") ": an "
     (:TERM NIL "integer") "; for " (:FUNREF NIL "ffloor") ", "
     (:FUNREF NIL "fceiling") ", " (:FUNREF NIL "ftruncate") ", and "
     (:FUNREF NIL "fround") ": a " (:TERM NIL "float") ". " :PAR
     (:PARAM NIL "remainder") "—a " (:TERM NIL "real") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.6.0 16")
     "These functions divide " (:PARAM NIL "number") " by "
     (:PARAM NIL "divisor") ", returning a " (:PARAM NIL "quotient") " and "
     (:PARAM NIL "remainder") ", such that " :PAR " " (:PARAM NIL "quotient")
     "· " (:PARAM NIL "divisor") "+" (:PARAM NIL "remainder") "="
     (:PARAM NIL "number") " " :PAR "The " (:PARAM NIL "quotient")
     " always represents a mathematical integer. "
     (:COMMENT NIL
      " For \\funref{floor}, \\funref{ceiling}, \\funref{truncate}, and \\funref{floor},"
      " the \\param{quotient} is represented as an \\term{integer}."
      " For \\funref{ffloor}, \\funref{fceiling}, \\funref{ftruncate}, and \\funref{ffloor},"
      " the \\param{quotient} is represented as a \\term{float}.")
     "When more than one mathematical integer might be possible ("
     (:I NIL "i.e.")
     ",  when the remainder is not zero), the kind of rounding or truncation depends on the "
     (:TERM NIL "operator") ": " :PAR
     (:LIST NIL
      (:ITEM NIL (:FUNREF NIL "floor") ", " (:FUNREF NIL "ffloor") " " :PAR
       (:COMMENT NIL "% 12.6.0 11") (:FUNREF NIL "floor") " and "
       (:FUNREF NIL "ffloor") " produce a " (:PARAM NIL "quotient")
       " that has been truncated toward negative infinity; that is, the "
       (:PARAM NIL "quotient")
       " represents the largest mathematical integer that is not larger than the mathematical quotient. "
       :PAR)
      (:ITEM NIL (:FUNREF NIL "ceiling") ", " (:FUNREF NIL "fceiling") " " :PAR
       (:COMMENT NIL "% 12.6.0 12") (:FUNREF NIL "ceiling") " and "
       (:FUNREF NIL "fceiling") " produce a " (:PARAM NIL "quotient")
       " that has been truncated toward positive infinity; that is, the "
       (:PARAM NIL "quotient")
       " represents the smallest mathematical integer that is not smaller than the mathematical result. "
       :PAR)
      (:ITEM NIL (:FUNREF NIL "truncate") ", " (:FUNREF NIL "ftruncate") " "
       :PAR (:COMMENT NIL "% 12.6.0 13") (:FUNREF NIL "truncate") " and "
       (:FUNREF NIL "ftruncate") " produce a " (:PARAM NIL "quotient")
       " that has been truncated towards zero; that is, the "
       (:PARAM NIL "quotient")
       " represents the mathematical integer of the same sign as the mathematical quotient, and that has the greatest integral magnitude not greater than that of the mathematical quotient. "
       :PAR)
      (:ITEM NIL (:FUNREF NIL "round") ", " (:FUNREF NIL "fround") " " :PAR
       (:COMMENT NIL "% 12.6.0 14") (:FUNREF NIL "round") " and "
       (:FUNREF NIL "fround") " produce a " (:PARAM NIL "quotient")
       " that has been rounded to the nearest mathematical integer; if the mathematical quotient is exactly halfway between two integers, (that is, it has the form "
       (:I NIL "integer") "+"
       (:MATH NIL (:MFRAC NIL (:MN NIL "1") (:MN NIL "2"))) "), then the "
       (:PARAM NIL "quotient")
       " has been rounded to the even (divisible by two) integer. " :PAR))
     " " :PAR (:COMMENT NIL "!!! Cross reference")
     "All of these functions perform type conversion operations on "
     (:PARAM NIL "numbers") ". " :PAR "The " (:PARAM NIL "remainder") " is an "
     (:TERM NIL "integer") " if both " (:TT NIL "x") " and " (:TT NIL "y")
     " are " (:TERM NIL "integers") ", is a " (:TERM NIL "rational")
     " if both " (:TT NIL "x") " and " (:TT NIL "y") " are "
     (:TERM NIL "rationals") ", and is a " (:TERM NIL "float") " if either "
     (:TT NIL "x") " or " (:TT NIL "y") " is a " (:TERM NIL "float") ". " :PAR
     (:FUNREF NIL "ffloor") ", " (:FUNREF NIL "fceiling") ", "
     (:FUNREF NIL "ftruncate") ", and " (:FUNREF NIL "fround")
     " handle arguments of different " (:TERM NIL "types")
     " in the following way: If " (:PARAM NIL "number") " is a "
     (:TERM NIL "float") ", and " (:PARAM NIL "divisor") " is not a "
     (:TERM NIL "float") " of longer format, then the first result is a "
     (:TERM NIL "float") " of the same " (:TERM NIL "type") " as "
     (:PARAM NIL "number") ". Otherwise, the first result is of the "
     (:TERM NIL "type") " determined by " (:TERM NIL "contagion")
     " rules; see " (:SECREF NIL :NUMERIC-CONTAGION-RULES) ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (floor 3/2) → 1, 1/2
 (ceiling 3 2) → 2, -1
 (ffloor 3 2) → 1.0, 1
 (ffloor -4.7) → -5.0, 0.3
 (ffloor 3.5d0) → 3.0d0, 0.5d0
 (fceiling 3/2) → 2.0, -1/2
 (truncate 1) → 1, 0
 (truncate .5) → 0, 0.5
 (round .5) → 0, 0.5
 (ftruncate -7 2) → -3.0, -1
 (fround -7 2) → -4.0, 1
 (dolist (n '(2.6 2.5 2.4 0.7 0.3 -0.3 -0.7 -2.4 -2.5 -2.6))
   (format t \"~&~4,1@F ~2,' D ~2,' D ~2,' D ~2,' D\"
           n (floor n) (ceiling n) (truncate n) (round n)))
⊳ +2.6  2  3  2  3
⊳ +2.5  2  3  2  2
⊳ +2.4  2  3  2  2
⊳ +0.7  0  1  0  1
⊳ +0.3  0  1  0  0
⊳ -0.3 -1  0  0  0
⊳ -0.7 -1  0  0 -1
⊳ -2.4 -3 -2 -2 -2
⊳ -2.5 -3 -2 -2 -2
⊳ -2.6 -3 -2 -2 -3
→ NIL
")
     " " (:COMMENT NIL "% ^-- 12.6.0 15") :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 12.6.0 18") "When only "
     (:PARAM NIL "number")
     " is given, the two results are exact; the mathematical sum of the two results is always equal to the mathematical value of "
     (:PARAM NIL "number") ". " :PAR (:COMMENT NIL "% 12.6.0 17")
     (:TT NIL "(" (:I NIL "function") " " (:PARAM NIL "number") " "
      (:PARAM NIL "divisor") ")")
     " and "
     (:TT NIL "(" (:I NIL "function") " (/ " (:PARAM NIL "number") " "
      (:PARAM NIL "divisor") "))")
     " (where " (:I NIL "function") " is any of one of " (:FUNREF NIL "floor")
     ", " (:FUNREF NIL "ceiling") ", " (:FUNREF NIL "ffloor") ", "
     (:FUNREF NIL "fceiling") ", " (:FUNREF NIL "truncate") ", "
     (:FUNREF NIL "round") ", " (:FUNREF NIL "ftruncate") ", and "
     (:FUNREF NIL "fround")
     ") return the same first value, but they return different remainders as the second value. For example: "
     :PAR
     (:CODE NIL " (floor 5 2) → 2, 1
 (floor (/ 5 2)) → 2, 1/2
")
     " " :PAR "If an effect is desired that is similar to "
     (:FUNREF NIL "round")
     ", but that always rounds up or down (rather than toward the nearest even integer) if the mathematical quotient is exactly halfway between two integers, the programmer should consider a construction such as "
     (:TT NIL "(floor (+ x 1/2))") " or " (:TT NIL "(ceiling (- x 1/2))") ". "
     :PAR))
   " " :PAR (:COMMENT NIL "-------------------- Trig --------------------")
   :PAR
   (:COMMENT NIL "%% ========== SIN" "%% ========== COS" "%% ========== TAN")
   (:COM (:NAME "sin, cos, tan" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "sin") (:ARGLIST NIL "radians")
      (:VALUES NIL "number"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "cos") (:ARGLIST NIL "radians")
      (:VALUES NIL "number"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "tan") (:ARGLIST NIL "radians")
      (:VALUES NIL "number"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "radians") "—a "
     (:TERM NIL "number") " given in radians. " :PAR (:PARAM NIL "number")
     "—a " (:TERM NIL "number") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.5.2 14")
     (:FUNREF NIL "sin") ", " (:FUNREF NIL "cos") ", and " (:FUNREF NIL "tan")
     " return the sine, cosine, and tangent, respectively, of "
     (:PARAM NIL "radians") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (sin 0) → 0.0
 (cos 0.7853982) → 0.707107
 (tan #c(0 1)) → #C(0.0 0.761594)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "radians") " is not a "
     (:TERM NIL "number") ". Might signal " (:TYPEREF NIL "arithmetic-error")
     ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "asin") ", "
     (:FUNREF NIL "acos") ", " (:FUNREF NIL "atan") ", "
     (:SECREF NIL :FLOAT-SUBSTITUTABILITY) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== ACOS" "%% ========== ASIN"
    "%% ========== ATAN")
   (:COM (:NAME "asin, acos, atan" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "asin") (:ARGLIST NIL "number")
      (:VALUES NIL "radians"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "acos") (:ARGLIST NIL "number")
      (:VALUES NIL "radians"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "atan")
      (:ARGLIST NIL "number1 " (:KEYWORD NIL " &optional") " number2")
      (:VALUES NIL "radians"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") "—a "
     (:TERM NIL "number") ". " :PAR (:PARAM NIL "number1") "—a "
     (:TERM NIL "number") " if " (:PARAM NIL "number2")
     " is not supplied, or a " (:TERM NIL "real") " if " (:PARAM NIL "number2")
     " is supplied. " :PAR (:PARAM NIL "number2") "—a " (:TERM NIL "real") ". "
     :PAR (:PARAM NIL "radians") "—a " (:TERM NIL "number") " (of radians). "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.5.2 17")
     (:FUNREF NIL "asin") ", " (:FUNREF NIL "acos") ", and "
     (:FUNREF NIL "atan")
     " compute the arc sine, arc cosine, and arc tangent respectively. " :PAR
     (:COMMENT NIL "% 12.5.2 18")
     "The arc sine, arc cosine, and arc tangent (with only "
     (:PARAM NIL "number1")
     " supplied) functions can be defined mathematically for "
     (:PARAM NIL "number") " or " (:PARAM NIL "number1") " specified as "
     (:I NIL "x") " as in " (:NEXTFIGURE NIL) ". " :PAR
     (:ISSUE NIL "COMPLEX-ATANH-BOGUS-FORMULA:TWEAK-MORE") " "
     (:TABLE
      (:NAME
       ("Mathematical definition of arc sine, arc cosine, and arc tangent"))
      (:ROW NIL (:CELL NIL "Function") (:CELL NIL "Definition"))
      (:ROW NIL (:CELL NIL " Arc sine ")
       (:CELL NIL
        (:MATH NIL (:MO NIL "-") (:MI NIL "i") (:MSPACE NIL)
         (:MTEXT (:FONT :TT) "log") (:MO NIL "(") (:MI NIL "ix") (:MO NIL "+")
         (:MSQRT NIL (:MN NIL "1") (:MO NIL "-")
          (:MSUP NIL (:MI NIL "x") (:MN NIL "2")))
         (:MO NIL ")"))))
      (:ROW NIL
       (:CELL NIL
        (:COMMENT NIL " --sjl 4 Mar 92"
         "Arc cosine  & $ -i\\ \\ff{log} \\bigl(x+i\\    \\sqrt{1-x^2}     \\bigr) $ \\cr")
        "Arc cosine ")
       (:CELL NIL
        (:MATH NIL (:MO NIL "(") (:MI NIL "π") (:MO NIL "/") (:MN NIL "2")
         (:MO NIL ")") (:MO NIL "-") (:MTEXT (:FONT :TT) "arcsin")
         (:MSPACE NIL) (:MI NIL "x"))))
      (:ROW NIL (:CELL NIL " Arc tangent ")
       (:CELL NIL
        (:MATH NIL (:MO NIL "-") (:MI NIL "i") (:MSPACE NIL)
         (:MTEXT (:FONT :TT) "log") (:MO NIL "(") (:MO NIL "(") (:MN NIL "1")
         (:MO NIL "+") (:MI NIL "ix") (:MO NIL ")")
         (:MSQRT NIL (:MN NIL "1") (:MO NIL "/") (:MO NIL "(") (:MN NIL "1")
          (:MO NIL "+") (:MSUP NIL (:MI NIL "x") (:MN NIL "2")) (:MO NIL ")"))
         (:MO NIL ")")))))
     " " (:ENDISSUE NIL "COMPLEX-ATANH-BOGUS-FORMULA:TWEAK-MORE") " " :PAR
     (:COMMENT NIL
      "% Barmar points out that these definitions are already given in the definitions"
      "  of log and sqrt, so there's no need to repeat them here. -kmp 19-Dec-90"
      " where" " \\issue{IEEE-ATAN-BRANCH-CUT:SPLIT}"
      " \\f{(log \\i{x}) = (complex (log (abs \\i{x})) (phase \\i{x}))} and"
      " \\f{(sqrt \\i{x}) = (exp (/ (log \\i{x}) 2))}."
      " \\endissue{IEEE-ATAN-BRANCH-CUT:SPLIT}")
     :PAR (:COMMENT NIL "% 12.5.2 19")
     "These formulae are mathematically correct, assuming completely accurate computation. They are not necessarily the simplest ones for real-valued computations. "
     :PAR (:COMMENT NIL "% 12.5.2 21" "% 12.5.2 23") "If both "
     (:PARAM NIL "number1") " and " (:PARAM NIL "number2") " are supplied for "
     (:FUNREF NIL "atan") ", the result is the arc tangent of "
     (:PARAM NIL "number1") "/" (:PARAM NIL "number2") ". The value of "
     (:FUNREF NIL "atan") " is always between "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π")) " (exclusive) and "
     (:MATH NIL (:MI NIL "π")) " (inclusive) "
     (:ISSUE NIL "COMPLEX-ATAN-BRANCH-CUT:TWEAK")
     " when minus zero is not supported. The range of the two-argument arc tangent when minus zero is supported includes "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π")) ". "
     (:ENDISSUE NIL "COMPLEX-ATAN-BRANCH-CUT:TWEAK") " " :PAR "For a "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TERM NIL "real") " "
     (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:PARAM NIL "number1")
     ", the result is " (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " a "
     (:TERM NIL "real") " " (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89")
     " and lies between "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     " and " (:MATH NIL (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     " (both exclusive). " (:PARAM NIL "number1") " can be a "
     (:TERM NIL "complex") " if " (:PARAM NIL "number2")
     " is not supplied. If both are supplied, " (:PARAM NIL "number2")
     " can be zero provided " (:PARAM NIL "number1") " is not zero. "
     (:REVIEWER NIL
      "Barmar: Should add “However, if the implementation distinguishes positive and negative zero, both may be signed zeros, and limits are used to define the result.”")
     " " :PAR (:COMMENT NIL "% 12.5.3 11")
     "The following definition for arc sine determines the range and branch cuts: "
     :PAR
     (:DISPLAYMATH NIL (:MTEXT (:FONT :TT) "arcsin") (:MSPACE NIL)
      (:MI NIL "z") (:MO NIL "=") (:MO NIL "-") (:MI NIL "i") (:MSPACE NIL)
      (:MTEXT (:FONT :TT) "log") (:MO NIL "(") (:MI NIL "iz") (:MO NIL "+")
      (:MSQRT NIL (:MN NIL "1") (:MO NIL "-")
       (:MSUP NIL (:MI NIL "z") (:MN NIL "2")))
      (:MO NIL ")"))
     " " :PAR
     "The branch cut for the arc sine function is in two pieces: one along the negative real axis to the left of "
     (:MATH NIL (:MO NIL "-") (:MN NIL "1"))
     " (inclusive), continuous with quadrant II, and one along the positive real axis to the right of "
     (:MATH NIL (:MN NIL "1"))
     " (inclusive), continuous with quadrant IV. The range is that strip of the complex plane containing numbers whose real part is between "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     " and " (:MATH NIL (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     ". A number with real part equal to "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     " is in the range if and only if its imaginary part is non-negative; a number with real part equal to "
     (:MATH NIL (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     " is in the range if and only if its imaginary part is non-positive. "
     :PAR (:COMMENT NIL "% 12.5.3 12")
     "The following definition for arc cosine determines the range and branch cuts: "
     :PAR (:COMMENT NIL " --sjl 4 Mar 92")
     (:ISSUE NIL "COMPLEX-ATANH-BOGUS-FORMULA:TWEAK-MORE") " "
     (:COMMENT NIL
      " $$ \\ff{arccos} z = -i\\ \\ff{log} \\Bigl(z+i\\ \\sqrt{1-z^2}\\Bigr) $$"
      "or, which is equivalent,"
      " $$ \\ff{arccos} z = {\\pi\\over2}- \\ff{arcsin} z.$$")
     :PAR
     (:DISPLAYMATH NIL (:MTEXT (:FONT :TT) "arccos") (:MSPACE NIL)
      (:MI NIL "z") (:MO NIL "=") (:MFRAC NIL (:MI NIL "π") (:MN NIL "2"))
      (:MO NIL "-") (:MTEXT (:FONT :TT) "arcsin") (:MSPACE NIL) (:MI NIL "z"))
     " " :PAR "or, which are equivalent, " :PAR
     (:DISPLAYMATH NIL (:MTEXT (:FONT :TT) "arccos") (:MSPACE NIL)
      (:MI NIL "z") (:MO NIL "=") (:MO NIL "-") (:MI NIL "i") (:MSPACE NIL)
      (:MTEXT (:FONT :TT) "log") (:MO NIL "(") (:MI NIL "z") (:MO NIL "+")
      (:MI NIL "i") (:MSPACE NIL)
      (:MSQRT NIL (:MN NIL "1") (:MO NIL "-")
       (:MSUP NIL (:MI NIL "z") (:MN NIL "2")))
      (:MO NIL ")"))
     " " :PAR
     (:DISPLAYMATH NIL (:MTEXT (:FONT :TT) "arccos") (:MSPACE NIL)
      (:MI NIL "z") (:MO NIL "=")
      (:MFRAC NIL
       (:MROW NIL (:MN NIL "2") (:MSPACE NIL) (:MTEXT (:FONT :TT) "log")
        (:MO NIL "(")
        (:MSQRT NIL (:MO NIL "(") (:MN NIL "1") (:MO NIL "+") (:MI NIL "z")
         (:MO NIL ")") (:MO NIL "/") (:MN NIL "2"))
        (:MO NIL "+") (:MI NIL "i") (:MSPACE NIL)
        (:MSQRT NIL (:MO NIL "(") (:MN NIL "1") (:MO NIL "-") (:MI NIL "z")
         (:MO NIL ")") (:MO NIL "/") (:MN NIL "2"))
        (:MO NIL ")"))
       (:MI NIL "i")))
     " " (:ENDISSUE NIL "COMPLEX-ATANH-BOGUS-FORMULA:TWEAK-MORE") " " :PAR
     "The branch cut for the arc cosine function is in two pieces: one along the negative real axis to the left of "
     (:MATH NIL (:MO NIL "-") (:MN NIL "1"))
     " (inclusive), continuous with quadrant II, and one along the positive real axis to the right of "
     (:MATH NIL (:MN NIL "1"))
     " (inclusive), continuous with quadrant IV. This is the same branch cut as for arc sine. The range is that strip of the complex plane containing numbers whose real part is between 0 and "
     (:MATH NIL (:MI NIL "π"))
     ". A number with real part equal to 0 is in the range if and only if its imaginary part is non-negative; a number with real part equal to "
     (:MATH NIL (:MI NIL "π"))
     " is in the range if and only if its imaginary part is non-positive. "
     :PAR (:COMMENT NIL "% 12.5.3 13")
     "The following definition for (one-argument) arc tangent determines the range and branch cuts: "
     :PAR (:ISSUE NIL "COMPLEX-ATAN-BRANCH-CUT:TWEAK") " "
     (:DISPLAYMATH NIL (:MTEXT (:FONT :TT) "arctan") (:MSPACE NIL)
      (:MI NIL "z") (:MO NIL "=")
      (:MFRAC NIL
       (:MROW NIL (:MTEXT (:FONT :TT) "log") (:MO NIL "(") (:MN NIL "1")
        (:MO NIL "+") (:MI NIL "iz") (:MO NIL ")") (:MO NIL "-")
        (:MTEXT (:FONT :TT) "log") (:MO NIL "(") (:MN NIL "1") (:MO NIL "-")
        (:MI NIL "iz") (:MO NIL ")"))
       (:MROW NIL (:MN NIL "2") (:MI NIL "i"))))
     " " (:ENDISSUE NIL "COMPLEX-ATAN-BRANCH-CUT:TWEAK") " " :PAR
     "Beware of simplifying this formula; “obvious” simplifications are likely to alter the branch cuts or the values on the branch cuts incorrectly. The branch cut for the arc tangent function is in two pieces: one along the positive imaginary axis above "
     (:MATH NIL (:MI NIL "i"))
     " (exclusive), continuous with quadrant II, and one along the negative imaginary axis below "
     (:MATH NIL (:MO NIL "-") (:MI NIL "i"))
     " (exclusive), continuous with quadrant IV. The points "
     (:MATH NIL (:MI NIL "i")) " and " (:MATH NIL (:MO NIL "-") (:MI NIL "i"))
     " are excluded from the domain. The range is that strip of the complex plane containing numbers whose real part is between "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     " and " (:MATH NIL (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     ". A number with real part equal to "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     " is in the range if and only if its imaginary part is strictly positive; a number with real part equal to "
     (:MATH NIL (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     " is in the range if and only if its imaginary part is strictly negative. Thus the range of arc tangent is identical to that of arc sine with the points "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     " and " (:MATH NIL (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     " excluded. " :PAR "For " (:FUNREF NIL "atan") ", the signs of "
     (:PARAM NIL "number1") " (indicated as " (:I NIL "x") ") and "
     (:PARAM NIL "number2") " (indicated as " (:I NIL "y")
     ") are used to derive quadrant information. " (:NEXTFIGURE (:CAPS T))
     " details various special cases. "
     (:ISSUE NIL "IEEE-ATAN-BRANCH-CUT:SPLIT")
     " The asterisk (*) indicates that the entry in the figure applies to implementations that support minus zero. "
     :PAR "   "
     (:TABLE (:NAME ("Quadrant information for arc tangent"))
      (:ROW NIL (:CELL NIL " to 1pc" (:I NIL "y") " Condition")
       (:CELL NIL (:I NIL "x") " Condition") (:CELL NIL "Cartesian locus")
       (:CELL NIL "Range of result"))
      (:ROW NIL
       (:CELL NIL " to 1pc"
        (:MATH NIL (:MI NIL "y") (:MO NIL "=") (:MN NIL "0")))
       (:CELL NIL (:MATH NIL (:MI NIL "x") (:MO NIL ">") (:MN NIL "0")))
       (:CELL NIL " Positive x-axis ") (:CELL NIL (:MATH NIL (:MN NIL "0"))))
      (:ROW NIL
       (:CELL NIL " to 1pc*"
        (:MATH NIL (:MI NIL "y") (:MO NIL "=") (:MO NIL "+") (:MN NIL "0")))
       (:CELL NIL (:MATH NIL (:MI NIL "x") (:MO NIL ">") (:MN NIL "0")))
       (:CELL NIL " Positive x-axis ")
       (:CELL NIL (:MATH NIL (:MO NIL "+") (:MN NIL "0"))))
      (:ROW NIL
       (:CELL NIL " to 1pc*"
        (:MATH NIL (:MI NIL "y") (:MO NIL "=") (:MO NIL "-") (:MN NIL "0")))
       (:CELL NIL (:MATH NIL (:MI NIL "x") (:MO NIL ">") (:MN NIL "0")))
       (:CELL NIL " Positive x-axis ")
       (:CELL NIL (:MATH NIL (:MO NIL "-") (:MN NIL "0"))))
      (:ROW NIL
       (:CELL NIL " to 1pc"
        (:MATH NIL (:MI NIL "y") (:MO NIL ">") (:MN NIL "0")))
       (:CELL NIL (:MATH NIL (:MI NIL "x") (:MO NIL ">") (:MN NIL "0")))
       (:CELL NIL " Quadrant I ")
       (:CELL NIL
        (:MATH NIL (:MN NIL "0") (:MO NIL "<") (:MI NIL "result") (:MO NIL "<")
         (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))))
      (:ROW NIL
       (:CELL NIL " to 1pc"
        (:MATH NIL (:MI NIL "y") (:MO NIL ">") (:MN NIL "0")))
       (:CELL NIL (:MATH NIL (:MI NIL "x") (:MO NIL "=") (:MN NIL "0")))
       (:CELL NIL " Positive y-axis ")
       (:CELL NIL (:MATH NIL (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))))
      (:ROW NIL
       (:CELL NIL " to 1pc"
        (:MATH NIL (:MI NIL "y") (:MO NIL ">") (:MN NIL "0")))
       (:CELL NIL (:MATH NIL (:MI NIL "x") (:MO NIL "<") (:MN NIL "0")))
       (:CELL NIL " Quadrant II ")
       (:CELL NIL
        (:MATH NIL (:MI NIL "π") (:MO NIL "/") (:MN NIL "2") (:MO NIL "<")
         (:MI NIL "result") (:MO NIL "<") (:MI NIL "π"))))
      (:ROW NIL
       (:CELL NIL " to 1pc"
        (:MATH NIL (:MI NIL "y") (:MO NIL "=") (:MN NIL "0")))
       (:CELL NIL (:MATH NIL (:MI NIL "x") (:MO NIL "<") (:MN NIL "0")))
       (:CELL NIL " Negative x-axis ") (:CELL NIL (:MATH NIL (:MI NIL "π"))))
      (:ROW NIL
       (:CELL NIL " to 1pc*"
        (:MATH NIL (:MI NIL "y") (:MO NIL "=") (:MO NIL "+") (:MN NIL "0")))
       (:CELL NIL (:MATH NIL (:MI NIL "x") (:MO NIL "<") (:MN NIL "0")))
       (:CELL NIL " Negative x-axis ")
       (:CELL NIL (:MATH NIL (:MO NIL "+") (:MI NIL "π"))))
      (:ROW NIL
       (:CELL NIL " to 1pc*"
        (:MATH NIL (:MI NIL "y") (:MO NIL "=") (:MO NIL "-") (:MN NIL "0")))
       (:CELL NIL (:MATH NIL (:MI NIL "x") (:MO NIL "<") (:MN NIL "0")))
       (:CELL NIL " Negative x-axis ")
       (:CELL NIL (:MATH NIL (:MO NIL "-") (:MI NIL "π"))))
      (:ROW NIL
       (:CELL NIL " to 1pc"
        (:MATH NIL (:MI NIL "y") (:MO NIL "<") (:MN NIL "0")))
       (:CELL NIL (:MATH NIL (:MI NIL "x") (:MO NIL "<") (:MN NIL "0")))
       (:CELL NIL " Quadrant III ")
       (:CELL NIL
        (:MATH NIL (:MO NIL "-") (:MI NIL "π") (:MO NIL "<") (:MI NIL "result")
         (:MO NIL "<") (:MO NIL "-") (:MI NIL "π") (:MO NIL "/")
         (:MN NIL "2"))))
      (:ROW NIL
       (:CELL NIL " to 1pc"
        (:MATH NIL (:MI NIL "y") (:MO NIL "<") (:MN NIL "0")))
       (:CELL NIL (:MATH NIL (:MI NIL "x") (:MO NIL "=") (:MN NIL "0")))
       (:CELL NIL " Negative y-axis ")
       (:CELL NIL
        (:MATH NIL (:MO NIL "-") (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))))
      (:ROW NIL
       (:CELL NIL " to 1pc"
        (:MATH NIL (:MI NIL "y") (:MO NIL "<") (:MN NIL "0")))
       (:CELL NIL (:MATH NIL (:MI NIL "x") (:MO NIL ">") (:MN NIL "0")))
       (:CELL NIL " Quadrant IV ")
       (:CELL NIL
        (:MATH NIL (:MO NIL "-") (:MI NIL "π") (:MO NIL "/") (:MN NIL "2")
         (:MO NIL "<") (:MI NIL "result") (:MO NIL "<") (:MN NIL "0"))))
      (:ROW NIL
       (:CELL NIL " to 1pc"
        (:MATH NIL (:MI NIL "y") (:MO NIL "=") (:MN NIL "0")))
       (:CELL NIL (:MATH NIL (:MI NIL "x") (:MO NIL "=") (:MN NIL "0")))
       (:CELL NIL " Origin ") (:CELL NIL " undefined consequences "))
      (:ROW NIL
       (:CELL NIL " to 1pc*"
        (:MATH NIL (:MI NIL "y") (:MO NIL "=") (:MO NIL "+") (:MN NIL "0")))
       (:CELL NIL
        (:MATH NIL (:MI NIL "x") (:MO NIL "=") (:MO NIL "+") (:MN NIL "0")))
       (:CELL NIL " Origin ")
       (:CELL NIL (:MATH NIL (:MO NIL "+") (:MN NIL "0"))))
      (:ROW NIL
       (:CELL NIL " to 1pc*"
        (:MATH NIL (:MI NIL "y") (:MO NIL "=") (:MO NIL "-") (:MN NIL "0")))
       (:CELL NIL
        (:MATH NIL (:MI NIL "x") (:MO NIL "=") (:MO NIL "+") (:MN NIL "0")))
       (:CELL NIL " Origin ")
       (:CELL NIL (:MATH NIL (:MO NIL "-") (:MN NIL "0"))))
      (:ROW NIL
       (:CELL NIL " to 1pc*"
        (:MATH NIL (:MI NIL "y") (:MO NIL "=") (:MO NIL "+") (:MN NIL "0")))
       (:CELL NIL
        (:MATH NIL (:MI NIL "x") (:MO NIL "=") (:MO NIL "-") (:MN NIL "0")))
       (:CELL NIL " Origin ")
       (:CELL NIL (:MATH NIL (:MO NIL "+") (:MI NIL "π"))))
      (:ROW NIL
       (:CELL NIL " to 1pc*"
        (:MATH NIL (:MI NIL "y") (:MO NIL "=") (:MO NIL "-") (:MN NIL "0")))
       (:CELL NIL
        (:MATH NIL (:MI NIL "x") (:MO NIL "=") (:MO NIL "-") (:MN NIL "0")))
       (:CELL NIL " Origin ")
       (:CELL NIL (:MATH NIL (:MO NIL "-") (:MI NIL "π")))))
     " " (:ENDISSUE NIL "IEEE-ATAN-BRANCH-CUT:SPLIT") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:ISSUE NIL "COMPLEX-ATAN-BRANCH-CUT:TWEAK") " "
     (:CODE NIL " (asin 0) → 0.0 
 (acos #c(0 1))  → #C(1.5707963267948966 -0.8813735870195432)
 (/ (atan 1 (sqrt 3)) 6)  → 0.087266 
 (atan #c(0 2)) → #C(-1.5707964 0.54930615)
")
     " " (:ENDISSUE NIL "COMPLEX-ATAN-BRANCH-CUT:TWEAK") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR (:FUNREF NIL "acos")
     " and " (:FUNREF NIL "asin") " should signal an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error") " if "
     (:PARAM NIL "number") " is not a " (:TERM NIL "number") ". "
     (:FUNREF NIL "atan") " should signal " (:TYPEREF NIL "type-error")
     " if one argument is supplied and that argument is not a "
     (:TERM NIL "number")
     ", or if two arguments are supplied and both of those arguments are not "
     (:TERM NIL "reals") ". " :PAR (:FUNREF NIL "acos") ", "
     (:FUNREF NIL "asin") ", and " (:FUNREF NIL "atan") " might signal "
     (:TYPEREF NIL "arithmetic-error") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "log") ", "
     (:FUNREF NIL "sqrt") ", " (:SECREF NIL :FLOAT-SUBSTITUTABILITY) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The result of either "
     (:FUNREF NIL "asin") " or " (:FUNREF NIL "acos") " can be a "
     (:TERM NIL "complex") " even if " (:PARAM NIL "number") " is not a "
     (:TERM NIL "complex") "; this occurs when the absolute value of "
     (:PARAM NIL "number") " is greater than one. " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PI")
   (:COM (:NAME "pi" :FTYPE "Constant Variable")
    (:PART (:NAME "Value") " " :PAR "an "
     (:TERM NIL "implementation-dependent") " " (:TERM NIL "long float") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.5.2 28")
     "The best " (:TERM NIL "long float")
     " approximation to the mathematical constant " (:MATH NIL (:MI NIL "π"))
     ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " ;; In each of the following computations, the precision depends 
 ;; on the implementation.  Also, if `long float' is treated by 
 ;; the implementation as equivalent to some other float format 
 ;; (e.g., `double float') the exponent marker might be the marker
 ;; for that equivalent (e.g., `D' instead of `L').
 pi → 3.141592653589793L0
 (cos pi) → -1.0L0

 (defun sin-of-degrees (degrees)
   (let ((x (if (floatp degrees) degrees (float degrees pi))))
     (sin (* x (/ (float pi x) 180)))))
")
     " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "An approximation to "
     (:MATH NIL (:MI NIL "π"))
     " in some other precision can be obtained by writing "
     (:TT NIL "(float pi x)") ", where " (:TT NIL "x") " is a "
     (:TERM NIL "float") " of the desired precision, or by writing "
     (:TT NIL "(coerce pi " (:I NIL "type") ")") ", where " (:I NIL "type")
     " is the desired type, such as " (:TYPEREF NIL "short-float") ". " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Hyperbolic Trig --------------------")
   :PAR
   (:COMMENT NIL "%% ========== SINH" "%% ========== COSH" "%% ========== TANH"
    "%% ========== ASINH" "%% ========== ACOSH" "%% ========== ATANH")
   (:COM (:NAME "sinh, cosh, tanh, asinh, acosh, atanh" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "sinh") (:ARGLIST NIL "number")
      (:VALUES NIL "result"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "cosh") (:ARGLIST NIL "number")
      (:VALUES NIL "result"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "tanh") (:ARGLIST NIL "number")
      (:VALUES NIL "result"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "asinh") (:ARGLIST NIL "number")
      (:VALUES NIL "result"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "acosh") (:ARGLIST NIL "number")
      (:VALUES NIL "result"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "atanh") (:ARGLIST NIL "number")
      (:VALUES NIL "result"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") "—a "
     (:TERM NIL "number") ". " :PAR (:PARAM NIL "result") "—a "
     (:TERM NIL "number") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "These functions compute the hyperbolic sine, cosine, tangent, arc sine, arc cosine, and arc tangent functions, which are mathematically defined for an argument "
     (:I NIL "x") " as given in " (:NEXTFIGURE NIL) ". " :PAR
     (:ISSUE NIL "COMPLEX-ATANH-BOGUS-FORMULA:TWEAK-MORE") " "
     (:TABLE (:NAME ("Mathematical definitions for hyperbolic functions"))
      (:ROW NIL (:CELL NIL "Function") (:CELL NIL "Definition"))
      (:ROW NIL (:CELL NIL " Hyperbolic sine ")
       (:CELL NIL
        (:MATH NIL (:MO NIL "(") (:MSUP NIL (:MI NIL "e") (:MI NIL "x"))
         (:MO NIL "-")
         (:MSUP NIL (:MI NIL "e") (:MROW NIL (:MO NIL "-") (:MI NIL "x")))
         (:MO NIL ")") (:MO NIL "/") (:MN NIL "2"))))
      (:ROW NIL (:CELL NIL " Hyperbolic cosine ")
       (:CELL NIL
        (:MATH NIL (:MO NIL "(") (:MSUP NIL (:MI NIL "e") (:MI NIL "x"))
         (:MO NIL "+")
         (:MSUP NIL (:MI NIL "e") (:MROW NIL (:MO NIL "-") (:MI NIL "x")))
         (:MO NIL ")") (:MO NIL "/") (:MN NIL "2"))))
      (:ROW NIL (:CELL NIL " Hyperbolic tangent ")
       (:CELL NIL
        (:MATH NIL (:MO NIL "(") (:MSUP NIL (:MI NIL "e") (:MI NIL "x"))
         (:MO NIL "-")
         (:MSUP NIL (:MI NIL "e") (:MROW NIL (:MO NIL "-") (:MI NIL "x")))
         (:MO NIL ")") (:MO NIL "/") (:MO NIL "(")
         (:MSUP NIL (:MI NIL "e") (:MI NIL "x")) (:MO NIL "+")
         (:MSUP NIL (:MI NIL "e") (:MROW NIL (:MO NIL "-") (:MI NIL "x")))
         (:MO NIL ")"))))
      (:ROW NIL (:CELL NIL " Hyperbolic arc sine ")
       (:CELL NIL
        (:MATH NIL (:MTEXT (:FONT :TT) "log") (:MO NIL "(") (:MI NIL "x")
         (:MO NIL "+")
         (:MSQRT NIL (:MN NIL "1") (:MO NIL "+")
          (:MSUP NIL (:MI NIL "x") (:MN NIL "2")))
         (:MO NIL ")"))))
      (:ROW NIL
       (:CELL NIL
        (:COMMENT NIL " --sjl 4 Mar 92"
         "Hyperbolic arc cosine  & $ \\ff{log} (x+(x+1)\\sqrt{(x-1)/(x+1)}) $ \\cr")
        "Hyperbolic arc cosine ")
       (:CELL NIL
        (:MATH NIL (:MN NIL "2") (:MSPACE NIL) (:MTEXT (:FONT :TT) "log")
         (:MO NIL "(")
         (:MSQRT NIL (:MO NIL "(") (:MI NIL "x") (:MO NIL "+") (:MN NIL "1")
          (:MO NIL ")") (:MO NIL "/") (:MN NIL "2"))
         (:MO NIL "+")
         (:MSQRT NIL (:MO NIL "(") (:MI NIL "x") (:MO NIL "-") (:MN NIL "1")
          (:MO NIL ")") (:MO NIL "/") (:MN NIL "2"))
         (:MO NIL ")"))))
      (:ROW NIL
       (:CELL NIL
        (:COMMENT NIL " --sjl 4 Mar 92"
         "Hyperbolic arc tangent & $ \\ff{log} ((1+x)\\sqrt{1-1/x^2})       $ \\cr")
        "Hyperbolic arc tangent ")
       (:CELL NIL
        (:MATH NIL (:MO NIL "(") (:MTEXT (:FONT :TT) "log") (:MO NIL "(")
         (:MN NIL "1") (:MO NIL "+") (:MI NIL "x") (:MO NIL ")") (:MO NIL "-")
         (:MTEXT (:FONT :TT) "log") (:MO NIL "(") (:MN NIL "1") (:MO NIL "-")
         (:MI NIL "x") (:MO NIL ")") (:MO NIL ")") (:MO NIL "/")
         (:MN NIL "2")))))
     " " (:ENDISSUE NIL "COMPLEX-ATANH-BOGUS-FORMULA:TWEAK-MORE") " " :PAR
     (:COMMENT NIL
      "% Not needed. These are defined in the LOG and SQRT functions. -kmp 22-Jan-92"
      " where" " \\issue{IEEE-ATAN-BRANCH-CUT:SPLIT}"
      " \\f{(log \\i{x}) = (complex (log (abs \\i{x})) (phase \\i{x}))} and"
      " \\f{(sqrt \\i{x}) = (exp (/ (log \\i{x}) 2))}."
      " \\endissue{IEEE-ATAN-BRANCH-CUT:SPLIT}")
     :PAR (:COMMENT NIL "% 12.5.3 15")
     "The following definition for the inverse hyperbolic cosine determines the range and branch cuts: "
     :PAR (:COMMENT NIL " --sjl 4 mar 92")
     (:ISSUE NIL "COMPLEX-ATANH-BOGUS-FORMULA:TWEAK-MORE") " "
     (:COMMENT NIL
      "$$ \\ff{arccosh} z = \\ff{log} \\Bigl(z+(z+1)\\sqrt{{{(z-1)}/{(z+1)}}}\\Bigr). $$")
     (:DISPLAYMATH NIL (:MTEXT (:FONT :TT) "arccosh") (:MSPACE NIL)
      (:MI NIL "z") (:MO NIL "=") (:MN NIL "2") (:MSPACE NIL)
      (:MTEXT (:FONT :TT) "log") (:MO NIL "(")
      (:MSQRT NIL (:MO NIL "(") (:MI NIL "z") (:MO NIL "+") (:MN NIL "1")
       (:MO NIL ")") (:MO NIL "/") (:MN NIL "2"))
      (:MO NIL "+")
      (:MSQRT NIL (:MO NIL "(") (:MI NIL "z") (:MO NIL "-") (:MN NIL "1")
       (:MO NIL ")") (:MO NIL "/") (:MN NIL "2"))
      (:MO NIL ")") (:MO NIL "."))
     " " (:ENDISSUE NIL "COMPLEX-ATANH-BOGUS-FORMULA:TWEAK-MORE") " " :PAR
     (:COMMENT NIL
      "% This is said in the definitions of LOG and SQRT. -kmp 19-Jan-92"
      " where" " \\issue{IEEE-ATAN-BRANCH-CUT:SPLIT}"
      " \\f{(log \\i{x}) = (complex (log (abs \\i{x})) (phase \\i{x}))} and"
      " \\f{(sqrt \\i{x}) = (exp (/ (log \\i{x}) 2))}."
      " \\endissue{IEEE-ATAN-BRANCH-CUT:SPLIT}")
     :PAR
     "The branch cut for the inverse hyperbolic cosine function lies along the real axis to the left of "
     (:MATH NIL (:MN NIL "1"))
     " (inclusive), extending indefinitely along the negative real axis, continuous with quadrant II and (between "
     (:MATH NIL (:MN NIL "0")) " and " (:MATH NIL (:MN NIL "1"))
     ") with quadrant I. The range is that half-strip of the complex plane containing numbers whose real part is non-negative and whose imaginary part is between "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π")) " (exclusive) and "
     (:MATH NIL (:MI NIL "π"))
     " (inclusive). A number with real part zero is in the range if its imaginary part is between zero (inclusive) and "
     (:MATH NIL (:MI NIL "π")) " (inclusive). " :PAR
     (:COMMENT NIL "% 12.5.3 14")
     "The following definition for the inverse hyperbolic sine determines the range and branch cuts: "
     :PAR :PAR
     (:DISPLAYMATH NIL (:MTEXT (:FONT :TT) "arcsinh") (:MSPACE NIL)
      (:MI NIL "z") (:MO NIL "=") (:MTEXT (:FONT :TT) "log") (:MO NIL "(")
      (:MI NIL "z") (:MO NIL "+")
      (:MSQRT NIL (:MN NIL "1") (:MO NIL "+")
       (:MSUP NIL (:MI NIL "z") (:MN NIL "2")))
      (:MO NIL ")") (:MO NIL "."))
     " " :PAR
     (:COMMENT NIL
      "% This is said in the definitions of LOG and SQRT. -kmp 19-Jan-92"
      " where" " \\issue{IEEE-ATAN-BRANCH-CUT:SPLIT}"
      " {\\tt (log \\i{x}) = (complex (log (abs \\i{x})) (phase \\i{x}))\\/} and"
      " {\\tt (sqrt \\i{x}) = (exp (/ (log \\i{x}) 2))\\/}."
      " \\endissue{IEEE-ATAN-BRANCH-CUT:SPLIT}")
     :PAR
     "The branch cut for the inverse hyperbolic sine function is in two pieces: one along the positive imaginary axis above "
     (:MATH NIL (:MI NIL "i"))
     " (inclusive), continuous with quadrant I, and one along the negative imaginary axis below "
     (:MATH NIL (:MO NIL "-") (:MI NIL "i"))
     " (inclusive), continuous with quadrant III. The range is that strip of the complex plane containing numbers whose imaginary part is between "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     " and " (:MATH NIL (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     ". A number with imaginary part equal to "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     " is in the range if and only if its real part is non-positive; a number with imaginary part equal to "
     (:MATH NIL (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     " is in the range if and only if its imaginary part is non-negative. "
     :PAR (:COMMENT NIL "% 12.5.3 16")
     "The following definition for the inverse hyperbolic tangent determines the range and branch cuts: "
     :PAR (:COMMENT NIL " --sjl 4 mar 92")
     (:ISSUE NIL "COMPLEX-ATANH-BOGUS-FORMULA:TWEAK-MORE") " "
     (:COMMENT NIL
      "$$ \\ff{arctanh} z = \\ff{log} \\Bigl((1+z) \\sqrt{1-1/z^2}\\Bigr). $$ ")
     (:DISPLAYMATH NIL (:MTEXT (:FONT :TT) "arctanh") (:MSPACE NIL)
      (:MI NIL "z") (:MO NIL "=")
      (:MFRAC NIL
       (:MROW NIL (:MTEXT (:FONT :TT) "log") (:MO NIL "(") (:MN NIL "1")
        (:MO NIL "+") (:MI NIL "z") (:MO NIL ")") (:MO NIL "-")
        (:MTEXT (:FONT :TT) "log") (:MO NIL "(") (:MN NIL "1") (:MO NIL "-")
        (:MI NIL "z") (:MO NIL ")"))
       (:MN NIL "2"))
      (:MO NIL "."))
     " " :PAR "Note that: " :PAR
     (:DISPLAYMATH NIL (:MI NIL "i") (:MSPACE NIL)
      (:MTEXT (:FONT :TT) "arctan") (:MSPACE NIL) (:MI NIL "z") (:MO NIL "=")
      (:MTEXT (:FONT :TT) "arctanh") (:MSPACE NIL) (:MI NIL "iz")
      (:MO NIL "."))
     " " (:ENDISSUE NIL "COMPLEX-ATANH-BOGUS-FORMULA:TWEAK-MORE") " " :PAR
     (:COMMENT NIL
      "% This is said in the definitions of LOG and SQRT. -kmp 19-Jan-92"
      " where" " \\issue{IEEE-ATAN-BRANCH-CUT:SPLIT}"
      " \\f{(log \\i{x}) = (complex (log (abs \\i{x})) (phase \\i{x}))} and"
      " \\f{(sqrt \\i{x}) = (exp (/ (log \\i{x}) 2))}."
      " \\endissue{IEEE-ATAN-BRANCH-CUT:SPLIT}")
     :PAR
     (:COMMENT NIL
      " I believe this first sentence applied to the old, bogus formula."
      " -- sjl 4 mar 92"
      "Beware of simplifying this formula; ``obvious'' simplifications are"
      "likely to alter the branch cuts or the values on the branch cuts"
      "incorrectly.  ")
     "The branch cut for the inverse hyperbolic tangent function is in two pieces: one along the negative real axis to the left of "
     (:MATH NIL (:MO NIL "-") (:MN NIL "1"))
     " (inclusive), continuous with quadrant III, and one along the positive real axis to the right of "
     (:MATH NIL (:MN NIL "1"))
     " (inclusive), continuous with quadrant I. The points "
     (:MATH NIL (:MO NIL "-") (:MN NIL "1")) " and " (:MATH NIL (:MN NIL "1"))
     " are excluded from the domain. The range is that strip of the complex plane containing numbers whose imaginary part is between "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     " and " (:MATH NIL (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     ". A number with imaginary part equal to "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     " is in the range if and only if its real part is strictly negative; a number with imaginary part equal to "
     (:MATH NIL (:MI NIL "π") (:MO NIL "/") (:MN NIL "2"))
     " is in the range if and only if its imaginary part is strictly positive. Thus the range of the inverse hyperbolic tangent function is identical to that of the inverse hyperbolic sine function with the points "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π") (:MSPACE NIL) (:MI NIL "i")
      (:MO NIL "/") (:MN NIL "2"))
     " and "
     (:MATH NIL (:MI NIL "π") (:MSPACE NIL) (:MI NIL "i") (:MO NIL "/")
      (:MN NIL "2"))
     " excluded. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (sinh 0) → 0.0 
 (cosh (complex 0 -1)) → #C(0.540302 -0.0)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "number") " is not a "
     (:TERM NIL "number") ". Might signal " (:TYPEREF NIL "arithmetic-error")
     ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "log") ", "
     (:FUNREF NIL "sqrt") ", " (:SECREF NIL :FLOAT-SUBSTITUTABILITY) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The result of " (:FUNREF NIL "acosh")
     " may be a " (:TERM NIL "complex") " even if " (:PARAM NIL "number")
     " is not a " (:TERM NIL "complex") "; this occurs when "
     (:PARAM NIL "number") " is less than one. Also, the result of "
     (:FUNREF NIL "atanh") " may be a " (:TERM NIL "complex") " even if "
     (:PARAM NIL "number") " is not a " (:TERM NIL "complex")
     "; this occurs when the absolute value of " (:PARAM NIL "number")
     " is greater than one. " :PAR (:COMMENT NIL "% 12.5.2 29")
     "The branch cut formulae are mathematically correct, assuming completely accurate computation. Implementors should consult a good text on numerical analysis. The formulae given above are not necessarily the simplest ones for real-valued computations; they are chosen to define the branch cuts in desirable ways for the complex case. "
     :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Arithmetic --------------------") :PAR
   (:COMMENT NIL "%% ========== * (Function)")
   (:COM (:NAME "*" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "*")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " numbers")
      (:VALUES NIL "product"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") "—a "
     (:TERM NIL "number") ". " :PAR (:PARAM NIL "product") "—a "
     (:TERM NIL "number") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns the product of "
     (:PARAM NIL "numbers")
     ", performing any necessary type conversions in the process. If no "
     (:PARAM NIL "numbers") " are supplied, " (:TT NIL "1") " is returned. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (*) → 1
 (* 3 5) → 15
 (* 1.0 #c(22 33) 55/98) → #C(12.346938775510203 18.520408163265305)
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "Might signal "
     (:TYPEREF NIL "type-error") " if some " (:TERM NIL "argument")
     " is not a " (:TERM NIL "number") ". Might signal "
     (:TYPEREF NIL "arithmetic-error") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :NUMERIC-OPERATIONS) ", "
     (:SECREF NIL :RATIONAL-COMPUTATIONS) ", "
     (:SECREF NIL :FLOATING-POINT-COMPUTATIONS) ", "
     (:SECREF NIL :COMPLEX-COMPUTATIONS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== + (Function)")
   (:COM (:NAME "+" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "+")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " numbers") (:VALUES NIL "sum"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") "—a "
     (:TERM NIL "number") ". " :PAR (:PARAM NIL "sum") "—a "
     (:TERM NIL "number") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.4.0 3")
     "Returns the sum of " (:PARAM NIL "numbers")
     ", performing any necessary type conversions in the process. If no "
     (:PARAM NIL "numbers") " are supplied, " (:TT NIL "0") " is returned. "
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (+) → 0
 (+ 1) → 1
 (+ 31/100 69/100) → 1
 (+ 1/5 0.8) → 1.0
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "Might signal "
     (:TYPEREF NIL "type-error") " if some " (:TERM NIL "argument")
     " is not a " (:TERM NIL "number") ". Might signal "
     (:TYPEREF NIL "arithmetic-error") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :NUMERIC-OPERATIONS) ", "
     (:SECREF NIL :RATIONAL-COMPUTATIONS) ", "
     (:SECREF NIL :FLOATING-POINT-COMPUTATIONS) ", "
     (:SECREF NIL :COMPLEX-COMPUTATIONS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== - (Function)")
   (:COM (:NAME "-" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "-") (:ARGLIST NIL "number")
      (:VALUES NIL "negation"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "-")
      (:ARGLIST NIL "minuend " (:KEYWORD NIL " &rest") " "
       (:PLUS NIL "subtrahends"))
      (:VALUES NIL "difference"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") ", "
     (:PARAM NIL "minuend") ", " (:PARAM NIL "subtrahend") "—a "
     (:TERM NIL "number") ". " :PAR (:PARAM NIL "negation") ", "
     (:PARAM NIL "difference") "—a " (:TERM NIL "number") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "-") " performs arithmetic subtraction and negation. " :PAR
     (:COMMENT NIL "% 12.4.0 5") "If only one " (:PARAM NIL "number")
     " is supplied, the negation of that " (:PARAM NIL "number")
     " is returned. " :PAR (:COMMENT NIL "% 12.4.0 6") "If more than one "
     (:TERM NIL "argument") " is given, it subtracts all of the "
     (:PARAM NIL "subtrahends") " from the " (:PARAM NIL "minuend")
     " and returns the result. " :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "-") " performs necessary type conversions. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (- 55.55) → -55.55
 (- #c(3 -5)) → #C(-3 5)
 (- 0) → 0
 (eql (- 0.0) -0.0) → "
      (:TERM NIL "true") "
 (- #c(100 45) #c(0 45)) → 100
 (- 10 1 2 3 4) → 0
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "Might signal "
     (:TYPEREF NIL "type-error") " if some " (:TERM NIL "argument")
     " is not a " (:TERM NIL "number") ". Might signal "
     (:TYPEREF NIL "arithmetic-error") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :NUMERIC-OPERATIONS) ", "
     (:SECREF NIL :RATIONAL-COMPUTATIONS) ", "
     (:SECREF NIL :FLOATING-POINT-COMPUTATIONS) ", "
     (:SECREF NIL :COMPLEX-COMPUTATIONS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== / (Function)")
   (:COM (:NAME "/" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "/") (:ARGLIST NIL "number")
      (:VALUES NIL "reciprocal"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "/")
      (:ARGLIST NIL "numerator " (:KEYWORD NIL " &rest") " "
       (:PLUS NIL "denominators"))
      (:VALUES NIL "quotient"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") ", "
     (:PARAM NIL "denominator") "—a non-zero " (:TERM NIL "number") ". " :PAR
     (:PARAM NIL "numerator") ", " (:PARAM NIL "quotient") ", "
     (:PARAM NIL "reciprocal") "—a " (:TERM NIL "number") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.4.0 10") "The "
     (:TERM NIL "function") " " (:FUNREF NIL "/")
     " performs division or reciprocation. " :PAR (:COMMENT NIL "% 12.4.0 11")
     "If no " (:PARAM NIL "denominators") " are supplied, the "
     (:TERM NIL "function") " " (:FUNREF NIL "/") " returns the reciprocal of "
     (:PARAM NIL "number") ". " :PAR "If at least one "
     (:PARAM NIL "denominator") " is supplied, the " (:TERM NIL "function") " "
     (:FUNREF NIL "/") " divides the " (:PARAM NIL "numerator")
     " by all of the " (:PARAM NIL "denominators")
     " and returns the resulting " (:PARAM NIL "quotient") ". " :PAR
     (:COMMENT NIL "% 12.4.0 12") "If each " (:TERM NIL "argument")
     " is either an " (:TERM NIL "integer") " or a " (:TERM NIL "ratio")
     ", and the result is not an " (:TERM NIL "integer") ", then it is a "
     (:TERM NIL "ratio") ". " :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "/") " performs necessary type conversions. " :PAR
     (:COMMENT NIL "% 12.4.0 14") :PAR "If any " (:PARAM NIL "argument")
     " is a " (:TERM NIL "float")
     " then the rules of floating-point contagion apply; see "
     (:SECREF NIL :FLOATING-POINT-COMPUTATIONS) ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (/ 12 4) → 3
 (/ 13 4) → 13/4
 (/ -8) → -1/8
 (/ 3 4 5) → 3/20
 (/ 0.5) → 2.0
 (/ 20 5) → 4
 (/ 5 20) → 1/4
 (/ 60 -2 3 5.0) → -2.0
 (/ 2 #c(2 2)) → #C(1/2 -1/2)
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "The consequences are unspecified if any " (:TERM NIL "argument")
     " other than the first is zero. If there is only one "
     (:TERM NIL "argument")
     ", the consequences are unspecified if it is zero. " :PAR "Might signal "
     (:TYPEREF NIL "type-error") " if some " (:TERM NIL "argument")
     " is not a " (:TERM NIL "number") ". Might signal "
     (:TYPEREF NIL "division-by-zero")
     " if division by zero is attempted. Might signal "
     (:TYPEREF NIL "arithmetic-error") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "floor") ", "
     (:FUNREF NIL "ceiling") ", " (:FUNREF NIL "truncate") ", "
     (:FUNREF NIL "round") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== 1+" "%% ========== 1-")
   (:COM (:NAME "1+, 1-" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "1+") (:ARGLIST NIL "number")
      (:VALUES NIL "successor"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "1-") (:ARGLIST NIL "number")
      (:VALUES NIL "predecessor"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") "—a "
     (:TERM NIL "number") ". " :PAR (:PARAM NIL "successor") ", "
     (:PARAM NIL "predecessor") "—a " (:TERM NIL "number") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "%12.4.0 17")
     (:FUNREF NIL "1+") " returns a " (:TERM NIL "number")
     " that is one more than its argument " (:PARAM NIL "number") ". "
     (:FUNREF NIL "1-") " returns a " (:TERM NIL "number")
     " that is one less than its argument " (:PARAM NIL "number") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (1+ 99) → 100 
 (1- 100) → 99 
 (1+ (complex 0.0)) → #C(1.0 0.0) 
 (1- 5/3) → 2/3 
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "Might signal "
     (:TYPEREF NIL "type-error") " if its " (:TERM NIL "argument") " is not a "
     (:TERM NIL "number") ". Might signal " (:TYPEREF NIL "arithmetic-error")
     ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "incf") ", "
     (:MACREF NIL "decf") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (1+ " (:PARAM NIL "number") ") ≡ (+ " (:PARAM NIL "number")
      " 1)
 (1- "
      (:PARAM NIL "number") ") ≡ (- " (:PARAM NIL "number") " 1)
")
     " Implementors are encouraged to make the performance of both the previous expressions be the same. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ABS")
   (:COM (:NAME "abs" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "abs") (:ARGLIST NIL "number")
      (:VALUES NIL "absolute-value"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") "—a "
     (:TERM NIL "number") ". " :PAR (:PARAM NIL "absolute-value")
     "—a non-negative " (:TERM NIL "real") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.5.2 3")
     (:FUNREF NIL "abs") " returns the absolute value of "
     (:PARAM NIL "number") ". " (:COMMENT NIL "% 12.5.2 4") :PAR "If "
     (:PARAM NIL "number") " is " (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89")
     " a " (:TERM NIL "real") ", "
     (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89")
     " the result is of the same " (:TERM NIL "type") " as "
     (:PARAM NIL "number") ". " :PAR "If " (:PARAM NIL "number") " is a "
     (:TERM NIL "complex") ", the result is a positive "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TERM NIL "real") " "
     (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89")
     " with the same magnitude as " (:PARAM NIL "number")
     ". The result can be a " (:TERM NIL "float") " "
     (:REVIEWER NIL "Barmar: Single-float.")
     (:COMMENT NIL "!!! What to do here? -kmp 17-Dec-90") "even if "
     (:PARAM NIL "number") "'s components are " (:TERM NIL "rationals")
     " and an exact rational result would have been possible. "
     (:COMMENT NIL "% 12.5.2 7") "Thus the result of "
     (:TT NIL "(abs #c(3 4))") " can be either " (:TT NIL "5") " or "
     (:TT NIL "5.0") ", depending on the implementation. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:ISSUE NIL "COMPLEX-RATIONAL-RESULT:EXTEND") " "
     (:CODE NIL " (abs 0) → 0
 (abs 12/13) → 12/13
 (abs -1.09) → 1.09
 (abs #c(5.0 -5.0)) → 7.071068
 (abs #c(5 5)) → 7.071068
 (abs #c(3/5 4/5)) → 1 or approximately 1.0
 (eql (abs -0.0) -0.0) → "
      (:TERM NIL "true") "
")
     " " (:ENDISSUE NIL "COMPLEX-RATIONAL-RESULT:EXTEND") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :FLOAT-SUBSTITUTABILITY)
     " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 12.5.2 5") "If "
     (:PARAM NIL "number") " is a " (:TERM NIL "complex")
     ", the result is equivalent to the following: "
     (:COMMENT NIL "\\hfil\\break") :PAR
     (:TT NIL "(sqrt (+ (expt (realpart " (:PARAM NIL "number")
      ") 2) (expt (imagpart " (:PARAM NIL "number") ") 2)))")
     " "
     (:COMMENT NIL
      "%Barmar says ``SQRT is a defined name, so there's no need to redefine it here.''"
      " -kmp 17-Dec-90" " , where " " \\issue{IEEE-ATAN-BRANCH-CUT:SPLIT}"
      " \\f{(sqrt \\i{x}) = (exp (/ (log \\i{x}) 2))}"
      " \\endissue{IEEE-ATAN-BRANCH-CUT:SPLIT}")
     :PAR (:COMMENT NIL "% 12.5.2 6")
     "An implementation should not use this formula directly for all "
     (:TERM NIL "complexes")
     " but should handle very large or very small components specially to avoid intermediate overflow or underflow. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== EVENP" "%% ========== ODDP")
   (:COM (:NAME "evenp, oddp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "evenp") (:ARGLIST NIL "integer")
      (:VALUES NIL "generalized-boolean"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "oddp") (:ARGLIST NIL "integer")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "integer")
     "—an " (:TERM NIL "integer") ". " :PAR (:PARAM NIL "generalized-boolean")
     "—a " (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.2.0 7")
     (:FUNREF NIL "evenp") " returns " (:TERM NIL "true") " if "
     (:PARAM NIL "integer") " is even (divisible by two); otherwise, returns "
     (:TERM NIL "false") ". " :PAR (:COMMENT NIL "% 12.2.0 6")
     (:FUNREF NIL "oddp") " returns " (:TERM NIL "true") " if "
     (:PARAM NIL "integer")
     " is odd (not divisible by two); otherwise, returns " (:TERM NIL "false")
     ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (evenp 0) → " (:TERM NIL "true") "
 (oddp 10000000000000000000000) → "
      (:TERM NIL "false") "
 (oddp -1) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "integer") " is not an "
     (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (evenp " (:PARAM NIL "integer") ") ≡ (not (oddp "
      (:PARAM NIL "integer") "))
 (oddp "
      (:PARAM NIL "integer") ")  ≡ (not (evenp " (:PARAM NIL "integer") "))
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== EXP" "%% ========== EXPT")
   (:COM (:NAME "exp, expt" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "exp") (:ARGLIST NIL "number")
      (:VALUES NIL "result"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "expt")
      (:ARGLIST NIL "base-number power-number") (:VALUES NIL "result"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") "—a "
     (:TERM NIL "number") ". " :PAR (:PARAM NIL "base-number") "—a "
     (:TERM NIL "number") ". " :PAR (:PARAM NIL "power-number") "—a "
     (:TERM NIL "number") ". " :PAR (:PARAM NIL "result") "—a "
     (:TERM NIL "number") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "exp") " and "
     (:FUNREF NIL "expt") " perform exponentiation. " :PAR
     (:COMMENT NIL "% 12.5.1 2") (:FUNREF NIL "exp") " returns " (:I NIL "e")
     " raised to the power " (:PARAM NIL "number") ", where " (:I NIL "e")
     " is the base of the natural logarithms. " (:COMMENT NIL "% 12.5.3 9")
     (:FUNREF NIL "exp") " has no branch cut. " :PAR
     (:COMMENT NIL "% 12.5.0 5" "% 12.5.1 3") (:FUNREF NIL "expt") " returns "
     (:PARAM NIL "base-number") " raised to the power "
     (:PARAM NIL "power-number") ". If the " (:PARAM NIL "base-number")
     " is a " (:TERM NIL "rational") " and " (:PARAM NIL "power-number")
     " is an " (:TERM NIL "integer")
     ", the calculation is exact and the result will be of " (:TERM NIL "type")
     " " (:TYPEREF NIL "rational")
     "; otherwise a floating-point approximation might result. "
     (:ISSUE NIL "COMPLEX-RATIONAL-RESULT:EXTEND") " For " (:FUNREF NIL "expt")
     " of a " (:TERM NIL "complex rational") " to an " (:TERM NIL "integer")
     " power, the calculation must be exact and the result is of type "
     (:TT NIL "(or rational (complex rational))") ". "
     (:ENDISSUE NIL "COMPLEX-RATIONAL-RESULT:EXTEND") " " :PAR
     (:COMMENT NIL "% 12.5.1 6") "The result of " (:FUNREF NIL "expt")
     " can be a " (:TERM NIL "complex") ", even when neither argument is a "
     (:TERM NIL "complex") ", if " (:PARAM NIL "base-number")
     " is negative and " (:PARAM NIL "power-number") " is not an "
     (:TERM NIL "integer") ". The result is always the "
     (:TERM NIL "principal") " " (:TERM NIL "complex") " " (:TERM NIL "value")
     ". For example, " (:TT NIL "(expt -8 1/3)") " is not permitted to return "
     (:TT NIL "-2") ", even though " (:TT NIL "-2")
     " is one of the cube roots of " (:TT NIL "-8") ". The "
     (:TERM NIL "principal") " cube root is a " (:TERM NIL "complex")
     " approximately equal to " (:TT NIL "#C(1.0 1.73205)") ", not "
     (:TT NIL "-2") ". " :PAR (:COMMENT NIL "% 12.5.3 10") (:FUNREF NIL "expt")
     " is defined as "
     (:I NIL (:MATH NIL (:MSUP NIL (:MI NIL "b") (:MI NIL "x"))) " = "
      (:MATH NIL
       (:MSUP NIL (:MI NIL "e")
        (:MROW NIL (:MI NIL "x") (:MSPACE NIL) (:MI NIL "log") (:MSPACE NIL)
         (:MI NIL "b")))))
     ". "
     (:COMMENT NIL
      "%Barmar thinks this should just cross-reference the LOG function. (I agree.) -kmp 22-Jan-92"
      "% This is defined in LOG." " , where"
      " \\issue{IEEE-ATAN-BRANCH-CUT:SPLIT}"
      " \\f{(log \\i{b}) = (complex (log (abs \\i{b})) (phase \\i{b}))}."
      " \\endissue{IEEE-ATAN-BRANCH-CUT:SPLIT}")
     "This defines the " (:TERM NIL "principal") " " (:TERM NIL "values")
     " precisely. The range of " (:FUNREF NIL "expt")
     " is the entire complex plane. Regarded as a function of " (:I NIL "x")
     ", with " (:I NIL "b")
     " fixed, there is no branch cut. Regarded as a function of " (:I NIL "b")
     ", with " (:I NIL "x")
     " fixed, there is in general a branch cut along the negative real axis, continuous with quadrant II. The domain excludes the origin. By definition, "
     (:MATH NIL (:MSUP NIL (:MN NIL "0") (:MN NIL "0"))) "=1. If " (:I NIL "b")
     "=0 and the real part of " (:I NIL "x") " is strictly positive, then "
     (:I NIL (:MATH NIL (:MSUP NIL (:MI NIL "b") (:MI NIL "x"))))
     "=0. For all other values of " (:I NIL "x") ", "
     (:MATH NIL (:MSUP NIL (:MN NIL "0") (:MI (:FONT :I) "x")))
     " is an error. " :PAR (:COMMENT NIL "% 12.5.1 4") "When "
     (:PARAM NIL "power-number") " is an " (:TERM NIL "integer") " "
     (:TT NIL "0") ", then the result is always the value one in the "
     (:TERM NIL "type") " of " (:PARAM NIL "base-number") ", even if the "
     (:PARAM NIL "base-number") " is zero (of any " (:TERM NIL "type")
     "). That is: " :PAR
     (:CODE NIL " (expt x 0) ≡ (coerce 1 (type-of x))
")
     " If " (:PARAM NIL "power-number") " is a zero of any other "
     (:TERM NIL "type") ", then the result is also the value one, in the "
     (:TERM NIL "type")
     " of the arguments after the application of the contagion rules in "
     (:SECREF NIL :NUMERIC-CONTAGION-RULES)
     ", with one exception: the consequences are undefined if "
     (:PARAM NIL "base-number") " is zero when " (:PARAM NIL "power-number")
     " is zero and not of " (:TERM NIL "type") " " (:TYPEREF NIL "integer")
     ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:ISSUE NIL "COMPLEX-RATIONAL-RESULT:EXTEND") " "
     (:CODE NIL " (exp 0) → 1.0
 (exp 1) → 2.718282
 (exp (log 5)) → 5.0 
 (expt 2 8) → 256
 (expt 4 .5) → 2.0
 (expt #c(0 1) 2) → -1
 (expt #c(2 2) 3) → #C(-16 16)
 (expt #c(2 2) 4) → -64 
")
     " " (:ENDISSUE NIL "COMPLEX-RATIONAL-RESULT:EXTEND") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "log") ", "
     (:SECREF NIL :FLOAT-SUBSTITUTABILITY) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 12.5.1 5")
     "Implementations of " (:FUNREF NIL "expt")
     " are permitted to use different algorithms for the cases of a "
     (:PARAM NIL "power-number") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "rational") " and a " (:PARAM NIL "power-number") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "float") ". " :PAR
     (:ISSUE NIL "EXPT-RATIO:P.211") " " :PAR
     "Note that by the following logic, "
     (:TT NIL "(sqrt (expt " (:I NIL "x") " 3))") " is not equivalent to "
     (:TT NIL "(expt " (:I NIL "x") " 3/2)") ". " :PAR
     (:COMMENT NIL
      "!!! Figure out some way to notate these `precise approximations'")
     (:CODE NIL " (setq x (exp (/ (* 2 pi #c(0 1)) 3)))         ;exp(2.pi.i/3)
 (expt x 3) → 1 ;except for round-off error
 (sqrt (expt x 3)) → 1 ;except for round-off error
 (expt x 3/2) → -1 ;except for round-off error
")
     " " (:ENDISSUE NIL "EXPT-RATIO:P.211") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== GCD")
   (:COM (:NAME "gcd" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "gcd")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " integers")
      (:VALUES NIL "greatest-common-denominator"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "integer")
     "—an " (:TERM NIL "integer") ". " :PAR
     (:PARAM NIL "greatest-common-denominator") "—a non-negative "
     (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.4.0 22")
     "Returns the greatest common divisor of " (:PARAM NIL "integers")
     ". If only one " (:PARAM NIL "integer")
     " is supplied, its absolute value is returned. If no "
     (:PARAM NIL "integers") " are given, " (:FUNREF NIL "gcd") " returns "
     (:TT NIL "0") ", which is an identity for this operation. " :PAR)
    (:PART (:NAME "Examples") " " :PAR (:COMMENT NIL "% 12.4.0 23")
     (:CODE NIL " (gcd) → 0
 (gcd 60 42) → 6
 (gcd 3333 -33 101) → 1
 (gcd 3333 -33 1002001) → 11
 (gcd 91 -49) → 7
 (gcd 63 -42 35) → 7
 (gcd 5) → 5
 (gcd -4) → 4
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if any " (:PARAM NIL "integer")
     " is not an " (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "lcm") " " :PAR)
    (:PART (:NAME "Notes") " For three or more arguments, " :PAR
     (:CODE NIL " (gcd b c ... z) ≡ (gcd (gcd a b) c ... z)
")
     " "))
   " " :PAR (:COMMENT NIL "%% ========== INCF" "%% ========== DECF")
   (:COM (:NAME "incf, decf" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "incf")
      (:ARGLIST NIL "place " (:BRAC NIL "delta-form"))
      (:VALUES NIL "new-value"))
     " "
     (:DEF (:KIND "macro") (:NAMES NIL "decf")
      (:ARGLIST NIL "place " (:BRAC NIL "delta-form"))
      (:VALUES NIL "new-value"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "place") "—a "
     (:TERM NIL "place") ". " :PAR (:PARAM NIL "delta-form") "—a "
     (:TERM NIL "form") "; evaluated to produce a " (:PARAM NIL "delta")
     ". The default is " (:TT NIL "1") ". " :PAR (:PARAM NIL "delta") "—a "
     (:TERM NIL "number") ". " :PAR (:PARAM NIL "new-value") "—a "
     (:TERM NIL "number") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "incf") " and "
     (:MACREF NIL "decf") " are used for incrementing and decrementing the "
     (:TERM NIL "value") " of " (:PARAM NIL "place") ", respectively. " :PAR
     "The " (:PARAM NIL "delta") " is added to (in the case of "
     (:MACREF NIL "incf") ") or subtracted from (in the case of "
     (:MACREF NIL "decf") ") the number in " (:PARAM NIL "place")
     " and the result is stored in " (:PARAM NIL "place") ". " :PAR
     "Any necessary type conversions are performed automatically. " :PAR
     (:ISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM")
     " For information about the " (:TERM NIL "evaluation") " of "
     (:TERM NIL "subforms") " of " (:PARAM NIL "places") ", see "
     (:SECREF NIL :GEN-REF-SUB-FORM-EVAL) ". "
     (:ENDISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM") " " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (setq n 0)
 (incf n) → 1      
 n → 1
 (decf n 3) → -2   
 n → -2
 (decf n -5) → 3      
 (decf n) → 2      
 (incf n 0.5) → 2.5
 (decf n) → 1.5
 n → 1.5
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR (:PARAM NIL "Place")
     " is modified. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "+") ", " (:FUNREF NIL "-")
     ", " (:FUNREF NIL "1+") ", " (:FUNREF NIL "1-") ", " (:MACREF NIL "setf")
     " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL
      "% Removed in response to Kawabe's comment #, first public review."
      " The effect of \\f{(incf \\param{place} \\param{delta})} is roughly equivalent to"
      " " " \\code" "  (setf \\param{place} (+ \\param{place} \\param{delta}))"
      " \\endcode"
      " except that the latter would evaluate any \\term{subforms} of \\param{place}"
      " twice, whereas \\macref{incf} takes care to evaluate them only once.")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LCM")
   (:COM (:NAME "lcm" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "lcm")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " integers")
      (:VALUES NIL "least-common-multiple"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "integer")
     "—an " (:TERM NIL "integer") ". " :PAR
     (:PARAM NIL "least-common-multiple") "—a non-negative "
     (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.4.0 24")
     (:FUNREF NIL "lcm") " returns the least common multiple of the "
     (:PARAM NIL "integers") ". " :PAR (:ISSUE NIL "LCM-NO-ARGUMENTS:1") " "
     (:COMMENT NIL "% 12.4.0 27"
      "\\funref{lcm} requires at least one argument.")
     "If no " (:PARAM NIL "integer") " is supplied, the " (:TERM NIL "integer")
     " " (:TT NIL "1") " is returned. " (:ENDISSUE NIL "LCM-NO-ARGUMENTS:1")
     " " :PAR "If only one " (:PARAM NIL "integer")
     " is supplied, the absolute value of that " (:PARAM NIL "integer")
     " is returned. " :PAR "For two arguments that are not both zero, " :PAR
     (:CODE NIL " (lcm a b) ≡ (/ (abs (* a b)) (gcd a b))
")
     " " :PAR "If one or both arguments are zero, " :PAR
     (:CODE NIL " (lcm a 0) ≡ (lcm 0 a) ≡ 0
")
     " " :PAR (:COMMENT NIL "% 12.4.0 25") "For three or more arguments, " :PAR
     (:CODE NIL " (lcm a b c ... z) ≡ (lcm (lcm a b) c ... z)
")
     " " :PAR)
    (:PART (:NAME "Examples") " " (:COMMENT NIL "% 12.4.0 26")
     (:CODE NIL " (lcm 10) → 10
 (lcm 25 30) → 150
 (lcm -24 18 10) → 360
 (lcm 14 35) → 70
 (lcm 0 5) → 0
 (lcm 1 2 3 4 5 6) → 60
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "Should signal "
     (:TYPEREF NIL "type-error") " if any argument is not an "
     (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "gcd") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LOG")
   (:COM (:NAME "log" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "log")
      (:ARGLIST NIL "number " (:KEYWORD NIL " &optional") " base")
      (:VALUES NIL "logarithm"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number")
     "—a non-zero " (:TERM NIL "number") ". " :PAR (:PARAM NIL "base") "—a "
     (:TERM NIL "number") ". " :PAR (:PARAM NIL "logarithm") "—a "
     (:TERM NIL "number") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.5.1 7")
     (:FUNREF NIL "log") " returns the logarithm of " (:PARAM NIL "number")
     " in base " (:PARAM NIL "base") ". If " (:PARAM NIL "base")
     " is not supplied its value is " (:I NIL "e")
     ", the base of the natural logarithms. " :PAR (:COMMENT NIL "% 12.5.1 8")
     (:FUNREF NIL "log") " may return a " (:TERM NIL "complex")
     " when given a " (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " "
     (:TERM NIL "real") " " (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89")
     " negative " (:PARAM NIL "number") ". " :PAR
     (:CODE NIL " (log -1.0) ≡ (complex 0.0 (float pi 0.0))
")
     " " :PAR "If " (:PARAM NIL "base") " is zero, "
     (:COMMENT NIL
      "%Removed as unnecessary per Barmar since \\param{number} is described above as non-zero."
      "and \\param{number} is non-zero")
     (:FUNREF NIL "log") " returns zero. " :PAR "The result of "
     (:TT NIL "(log 8 2)") " may be either " (:TT NIL "3") " or "
     (:TT NIL "3.0")
     ", depending on the implementation. An implementation can use floating-point calculations even if an exact integer result is possible. "
     :PAR (:COMMENT NIL "% 12.5.3 7")
     "The branch cut for the logarithm function of one argument (natural logarithm) lies along the negative real axis, continuous with quadrant II. The domain excludes the origin. "
     :PAR
     (:COMMENT NIL
      "%Per Barmar, this is removed since the above note from IEEE-ATAN-BRANCH-CUT"
      "%already says the same thing."
      " When \\param{number} is a \\term{complex}," " "
      " %{\\tt log \\param{number}"
      " %  \\EQ\\ (log $\\vert$\\param{number}$\\vert$)+\\i{i} \\i{phase}(\\param{number})\\/}."
      " \\code" "  (log \\param{complex})"
      "  \\EQ (+ (log (abs \\param{complex})) (* (phase \\param{complex}) #c(0 1)))"
      " \\endcode")
     :PAR (:ISSUE NIL "IEEE-ATAN-BRANCH-CUT:SPLIT")
     " The mathematical definition of a complex logarithm is as follows, whether or not minus zero is supported by the implementation: "
     :PAR
     (:CODE NIL "(log " (:I NIL "x") ") ≡ (complex (log (abs " (:I NIL "x")
      ")) (phase " (:I NIL "x") "))
")
     " " (:ENDISSUE NIL "IEEE-ATAN-BRANCH-CUT:SPLIT") " " :PAR
     "Therefore the range of the one-argument logarithm function is that strip of the complex plane containing numbers with imaginary parts between "
     (:ISSUE NIL "IEEE-ATAN-BRANCH-CUT:SPLIT") " "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π")) " (exclusive) and "
     (:MATH NIL (:MI NIL "π"))
     " (inclusive) if minus zero is not supported, or "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π")) " (inclusive) and "
     (:MATH NIL (:MI NIL "π")) " (inclusive) if minus zero is supported. "
     (:ENDISSUE NIL "IEEE-ATAN-BRANCH-CUT:SPLIT") " " :PAR
     (:COMMENT NIL "% 12.5.3 8")
     "The two-argument logarithm function is defined as " :PAR
     (:CODE NIL " (log " (:PARAM NIL "base") " " (:PARAM NIL "number") ")
 ≡ (/ (log "
      (:PARAM NIL "number") ") (log " (:PARAM NIL "base") "))
")
     " " :PAR "This defines the " (:TERM NIL "principal") " "
     (:TERM NIL "values")
     " precisely. The range of the two-argument logarithm function is the entire complex plane. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (log 100 10)
→ 2.0
→ 2
 (log 100.0 10) → 2.0
 (log #c(0 1) #c(0 -1))
→ #C(-1.0 0.0)
OR→ #C(-1 0)
 (log 8.0 2) → 3.0
")
     " " :PAR (:ISSUE NIL "COMPLEX-RATIONAL-RESULT:EXTEND") " "
     (:COMMENT NIL
      "!!! Figure out some way to notate these `precise approximations'")
     (:CODE NIL " (log #c(-16 16) #c(2 2)) → 3 or approximately #c(3.0 0.0)
                               or approximately 3.0 (unlikely)
")
     " " (:ENDISSUE NIL "COMPLEX-RATIONAL-RESULT:EXTEND") " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The implementation. " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "exp") ", "
     (:FUNREF NIL "expt") ", " (:SECREF NIL :FLOAT-SUBSTITUTABILITY) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MOD" "%% ========== REM")
   (:COM (:NAME "mod, rem" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "mod")
      (:ARGLIST NIL "number divisor") (:VALUES NIL "modulus"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "rem")
      (:ARGLIST NIL "number divisor") (:VALUES NIL "remainder"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") "—a "
     (:TERM NIL "real") ". " :PAR (:PARAM NIL "divisor") "—a "
     (:TERM NIL "real") ". " :PAR (:PARAM NIL "modulus") ", "
     (:PARAM NIL "remainder") "—a " (:TERM NIL "real") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.6.0 22")
     (:FUNREF NIL "mod") " and " (:FUNREF NIL "rem")
     " are generalizations of the modulus and remainder functions respectively. "
     :PAR (:FUNREF NIL "mod") " performs the operation " (:FUNREF NIL "floor")
     " on " (:PARAM NIL "number") " and " (:PARAM NIL "divisor")
     " and returns the remainder of the " (:FUNREF NIL "floor") " operation. "
     :PAR (:FUNREF NIL "rem") " performs the operation "
     (:FUNREF NIL "truncate") " on " (:PARAM NIL "number") " and "
     (:PARAM NIL "divisor") " and returns the remainder of the "
     (:FUNREF NIL "truncate") " operation. " :PAR (:FUNREF NIL "mod") " and "
     (:FUNREF NIL "rem") " are "
     (:COMMENT NIL "!!! Is this something from mathematics?? -kmp 24-Apr-91")
     "the modulus and remainder functions when " (:PARAM NIL "number") " and "
     (:PARAM NIL "divisor") " are " (:TERM NIL "integers") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (rem -1 5) → -1
 (mod -1 5) → 4
 (mod 13 4) → 1
 (rem 13 4) → 1
 (mod -13 4) → 3
 (rem -13 4) → -1
 (mod 13 -4) → -3
 (rem 13 -4) → 1
 (mod -13 -4) → -1
 (rem -13 -4) → -1
 (mod 13.4 1) → 0.4
 (rem 13.4 1) → 0.4
 (mod -13.4 1) → 0.6
 (rem -13.4 1) → -0.4
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "floor") ", "
     (:FUNREF NIL "truncate") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The result of " (:FUNREF NIL "mod")
     " is either zero or a " (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " "
     (:TERM NIL "real") " " (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89")
     " with the same sign as " (:PARAM NIL "divisor") ". "))
   " " :PAR (:COMMENT NIL "%% ========== SIGNUM")
   (:COM (:NAME "signum" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "signum") (:ARGLIST NIL "number")
      (:VALUES NIL "signed-prototype"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") "—a "
     (:TERM NIL "number") ". " :PAR (:PARAM NIL "signed-prototype") "—a "
     (:TERM NIL "number") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "signum")
     " determines a numerical value that indicates whether "
     (:PARAM NIL "number") " is negative, zero, or positive. " :PAR
     (:COMMENT NIL "% 12.5.2 12") "For a " (:TERM NIL "rational") ", "
     (:FUNREF NIL "signum") " returns one of " (:TT NIL "-1") ", "
     (:TT NIL "0") ", or " (:TT NIL "1") " according to whether "
     (:PARAM NIL "number") " is negative, zero, or positive. For a "
     (:TERM NIL "float") ", the result is a " (:TERM NIL "float")
     " of the same format whose value is minus one, zero, or one. For a "
     (:TERM NIL "complex") " number " (:TT NIL "z") ", "
     (:TT NIL "(signum " (:I NIL "z") ")")
     " is a complex number of the same phase but with unit magnitude, unless "
     (:TT NIL "z") " is a complex zero, in which case the result is "
     (:TT NIL "z") ". " :PAR
     (:COMMENT NIL "% 12.5.2 13"
      "%Rewritten to avoid a suggestion that there might be complex rationals. -kmp 2-Jan-91"
      " For non-\\term{complex} \\term{rationals}, \\funref{signum} "
      " is a rational function, but it may be irrational for \\term{complex} arguments.")
     "For " (:TERM NIL "rational") " " (:TERM NIL "arguments") ", "
     (:FUNREF NIL "signum")
     " is a rational function, but it may be irrational for "
     (:TERM NIL "complex") " " (:TERM NIL "arguments") ". " :PAR "If "
     (:PARAM NIL "number") " is a " (:TERM NIL "float") ", the result is a "
     (:TERM NIL "float") ". If " (:PARAM NIL "number") " is a "
     (:TERM NIL "rational") ", the result is a " (:TERM NIL "rational") ". If "
     (:PARAM NIL "number") " is a " (:TERM NIL "complex float")
     ", the result is a " (:TERM NIL "complex float") ". If "
     (:PARAM NIL "number") " is a " (:TERM NIL "complex rational")
     ", the result is a " (:TERM NIL "complex") ", but it is "
     (:TERM NIL "implementation-dependent") " whether that result is a "
     (:TERM NIL "complex rational") " or a " (:TERM NIL "complex float") ". "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (signum 0) → 0
 (signum 99) → 1
 (signum 4/5) → 1
 (signum -99/100) → -1
 (signum 0.0) → 0.0
 (signum #c(0 33)) → #C(0.0 1.0)
 (signum #c(7.5 10.0)) → #C(0.6 0.8)
 (signum #c(0.0 -14.7)) → #C(0.0 -1.0)
 (eql (signum -0.0) -0.0) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :FLOAT-SUBSTITUTABILITY)
     " " :PAR)
    (:PART (:NAME "Notes") " " (:COMMENT NIL "% 12.5.2 11")
     (:CODE NIL " (signum x) ≡ (if (zerop x) x (/ x (abs x)))
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SQRT" "%% ========== ISQRT")
   (:COM (:NAME "sqrt, isqrt" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "sqrt") (:ARGLIST NIL "number")
      (:VALUES NIL "root"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "isqrt") (:ARGLIST NIL "natural")
      (:VALUES NIL "natural-root"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") ", "
     (:PARAM NIL "root") "—a " (:TERM NIL "number") ". " :PAR
     (:PARAM NIL "natural") ", " (:PARAM NIL "natural-root") "—a non-negative "
     (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.5.1 1")
     (:FUNREF NIL "sqrt") " and " (:FUNREF NIL "isqrt")
     " compute square roots. " :PAR
     (:COMMENT NIL "% 12.5.1 9                                        ")
     (:FUNREF NIL "sqrt") " returns the " (:TERM NIL "principal")
     " square root of " (:PARAM NIL "number") ". If the " (:PARAM NIL "number")
     " is not a " (:TERM NIL "complex")
     " but is negative, then the result is a " (:TERM NIL "complex") ". " :PAR
     (:COMMENT NIL "% 12.5.1 10") (:FUNREF NIL "isqrt")
     " returns the greatest " (:TERM NIL "integer")
     " less than or equal to the exact positive square root of "
     (:PARAM NIL "natural") ". " :PAR "If " (:PARAM NIL "number")
     " is a positive " (:TERM NIL "rational") ", it is "
     (:TERM NIL "implementation-dependent") " whether " (:PARAM NIL "root")
     " is a " (:TERM NIL "rational") " or a " (:TERM NIL "float") ". If "
     (:PARAM NIL "number") " is a negative " (:TERM NIL "rational") ", it is "
     (:TERM NIL "implementation-dependent") " whether " (:PARAM NIL "root")
     " is a " (:TERM NIL "complex rational") " or a "
     (:TERM NIL "complex float") ". " :PAR
     (:ISSUE NIL "IEEE-ATAN-BRANCH-CUT:SPLIT")
     " The mathematical definition of complex square root (whether or not minus zero is supported) follows: "
     :PAR
     (:TT NIL "(sqrt " (:I NIL "x") ") = (exp (/ (log " (:I NIL "x") ") 2))")
     " " :PAR
     (:COMMENT NIL "% This is said in the definition of LOG. -kmp 19-Jan-92"
      " where"
      " \\f{(log \\i{x}) = (complex (log (abs \\i{x})) (phase \\i{x}))}.")
     (:ENDISSUE NIL "IEEE-ATAN-BRANCH-CUT:SPLIT") " " :PAR
     "The branch cut for square root lies along the negative real axis, continuous with quadrant II. The range consists of the right half-plane, including the non-negative imaginary axis and excluding the negative imaginary axis. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (sqrt 9.0) → 3.0
 (sqrt -9.0) → #C(0.0 3.0)
 (isqrt 9) → 3
 (sqrt 12) → 3.4641016
 (isqrt 12) → 3
 (isqrt 300) → 17
 (isqrt 325) → 18
 (sqrt 25)
→ 5
OR→ 5.0
 (isqrt 25) → 5
 (sqrt -1) → #C(0.0 1.0)
 (sqrt #c(0 2)) → #C(1.0 1.0)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "The "
     (:TERM NIL "function") " " (:FUNREF NIL "sqrt") " should signal "
     (:TYPEREF NIL "type-error") " if its argument is not a "
     (:TERM NIL "number") ". " :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "isqrt") " should signal " (:TYPEREF NIL "type-error")
     " if its argument is not a non-negative " (:TERM NIL "integer") ". " :PAR
     "The functions " (:FUNREF NIL "sqrt") " and " (:FUNREF NIL "isqrt")
     " might signal " (:TYPEREF NIL "arithmetic-error") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "exp") ", "
     (:FUNREF NIL "log") ", " (:SECREF NIL :FLOAT-SUBSTITUTABILITY) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (isqrt x) ≡ (values (floor (sqrt x))) 
")
     " but it is potentially more efficient. " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Random Numbers --------------------")
   :PAR (:COMMENT NIL "% 2.11.0 1")
   (:COM (:NAME "random-state" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "random-state")
     ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "random state") " "
     (:TERM NIL "object")
     " contains state information used by the pseudo-random number generator. "
     (:COMMENT NIL "% 12.9.0 1" "The pseudo-random numbers "
      "in a random number series are \\term{implementation-dependent},"
      "but the distribution of the numbers should" "machine-independent.")
     "The nature of a " (:TERM NIL "random state") " " (:TERM NIL "object")
     " is " (:TERM NIL "implementation-dependent")
     ". It can be printed out and successfully read back in by the same "
     (:TERM NIL "implementation") ", but might not function correctly as a "
     (:TERM NIL "random state") " in another " (:TERM NIL "implementation")
     ". " :PAR
     (:COMMENT NIL "%% 12.9.0 20"
      "A recommended way to implement \\thetype{random-state}"
      "is effectively to use the machinery for \\macref{defstruct}.")
     :PAR (:COMMENT NIL "% 12.9.0 18") (:TERM NIL "Implementations")
     " are required to provide a read syntax for " (:TERM NIL "objects") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "random-state")
     ", but the specific nature of that syntax is "
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:VARREF NIL "*random-state*") ", "
     (:FUNREF NIL "random") ", " (:SECREF NIL :PRINTING-RANDOM-STATES) " "
     :PAR))
   :PAR (:COMMENT NIL "%% ========== MAKE-RANDOM-STATE")
   (:COM (:NAME "make-random-state" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-random-state")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " state")
      (:VALUES NIL "new-state"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL
      " This isn't quite susceptible to being called a designator, I think."
      " The uses are too idiosyncratic to the fact that this is a creation operator."
      " If another function took the same arguments, it would use them differently,"
      " so the ideas don't generalize well. -kmp 12-Sep-91")
     (:PARAM NIL "state") "—a " (:TERM NIL "random state") ", or "
     (:MISC NIL "nil") ", or " (:MISC NIL "t") ". The default is "
     (:MISC NIL "nil") ". " :PAR (:PARAM NIL "new-state") "—a "
     (:TERM NIL "random state") " " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.9.0 12")
     "Creates a " (:TERM NIL "fresh") " " (:TERM NIL "object") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "random-state")
     " suitable for use as the " (:TERM NIL "value") " of "
     (:VARREF NIL "*random-state*") ". " :PAR "If " (:PARAM NIL "state")
     " is a " (:TERM NIL "random state") " " (:TERM NIL "object") ", the "
     (:PARAM NIL "new-state") " is a " (:TERM NIL "copy") (:SUB NIL "5")
     " of that " (:TERM NIL "object") ". If " (:PARAM NIL "state") " is "
     (:MISC NIL "nil") ", the " (:PARAM NIL "new-state") " is a "
     (:TERM NIL "copy") (:SUB NIL "5") " of the "
     (:TERM NIL "current random state") ". If " (:PARAM NIL "state") " is "
     (:MISC NIL "t") ", the " (:PARAM NIL "new-state") " is a "
     (:TERM NIL "fresh") " " (:TERM NIL "random state") " "
     (:TERM NIL "object") " that has been randomly initialized by some means. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (let* ((rs1 (make-random-state nil))
        (rs2 (make-random-state t))
        (rs3 (make-random-state rs2))
        (rs4 nil))
   (list (loop for i from 1 to 10 
               collect (random 100)
               when (= i 5)
                do (setq rs4 (make-random-state)))
         (loop for i from 1 to 10 collect (random 100 rs1))
         (loop for i from 1 to 10 collect (random 100 rs2))
         (loop for i from 1 to 10 collect (random 100 rs3))
         (loop for i from 1 to 10 collect (random 100 rs4))))
→ ((29 25 72 57 55 68 24 35 54 65)
    (29 25 72 57 55 68 24 35 54 65)
    (93 85 53 99 58 62 2 23 23 59)
    (93 85 53 99 58 62 2 23 23 59)
    (68 24 35 54 65 54 55 50 59 49))
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "state") " is not a "
     (:TERM NIL "random state") ", or " (:MISC NIL "nil") ", or "
     (:MISC NIL "t") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "random") ", "
     (:VARREF NIL "*random-state*") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 12.9.0 19")
     "One important use of " (:FUNREF NIL "make-random-state")
     " is to allow the same series of pseudo-random " (:TERM NIL "numbers")
     " to be generated many times within a single program. " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== RANDOM")
   (:COM (:NAME "random" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "random")
      (:ARGLIST NIL "limit " (:KEYWORD NIL " &optional") " random-state")
      (:VALUES NIL "random-number"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "limit")
     "—a positive " (:TERM NIL "integer") ", or a positive "
     (:TERM NIL "float") ". " :PAR (:COMMENT NIL "% 12.9.0 3")
     (:PARAM NIL "random-state") "—a " (:TERM NIL "random state")
     ". The default is the " (:TERM NIL "current random state") ". " :PAR
     (:PARAM NIL "random-number") "—a non-negative " (:TERM NIL "number")
     " less than " (:PARAM NIL "limit") " and of the same " (:TERM NIL "type")
     " as " (:PARAM NIL "limit") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 12.9.0 2" "% 12.9.0 5" "% 12.9.0 6" "% 12.9.0 7"
      "% 12.9.0 8" "% 12.9.0 9" "% 12.9.0 10")
     :PAR "Returns a pseudo-random number that is a non-negative "
     (:TERM NIL "number") " less than " (:PARAM NIL "limit")
     " and of the same " (:TERM NIL "type") " as " (:PARAM NIL "limit") ". "
     :PAR "The " (:PARAM NIL "random-state")
     ", which is modified by this function, encodes the internal state maintained by the random number generator. "
     :PAR "An approximately uniform choice distribution is used. If "
     (:PARAM NIL "limit") " is an " (:TERM NIL "integer")
     ", each of the possible results occurs with (approximate) probability 1/"
     (:PARAM NIL "limit") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (<= 0 (random 1000) 1000) → " (:TERM NIL "true") "
 (let ((state1 (make-random-state))
       (state2 (make-random-state)))
   (= (random 1000 state1) (random 1000 state2))) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:PARAM NIL "random-state")
     " is modified. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "limit")
     " is not a positive " (:TERM NIL "integer") " or a positive "
     (:TERM NIL "real") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-random-state") ", "
     (:VARREF NIL "*random-state*") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "See "
     (:BIB
      (:URL "https://www.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html" :ISBN
       "1-55558-041-6")
      "Common Lisp: The Language")
     " for information about generating random numbers. " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== RANDOM-STATE-P")
   (:COM (:NAME "random-state-p" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "random-state-p")
      (:ARGLIST NIL "object") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.9.0 21")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "random-state")
     "; otherwise, returns " (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (random-state-p *random-state*) → " (:TERM NIL "true") "
 (random-state-p (make-random-state)) → "
      (:TERM NIL "true") "
 (random-state-p 'test-function) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-random-state") ", "
     (:VARREF NIL "*random-state*") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (random-state-p " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'random-state)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *RANDOM-STATE*")
   (:COM (:NAME "*random-state*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "random state") ". "
     :PAR)
    (:PART (:NAME "Initial Value") " " :PAR
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.9.0 11") "The "
     (:TERM NIL "current random state") ", which is used, for example, by the "
     (:TERM NIL "function") " " (:FUNREF NIL "random") " when a "
     (:TERM NIL "random state") " is not explicitly supplied. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (random-state-p *random-state*) → " (:TERM NIL "true") "
 (setq snap-shot (make-random-state))
 ;; The series from any given point is random,
 ;; but if you backtrack to that point, you get the same series.
 (list (loop for i from 1 to 10 collect (random))
       (let ((*random-state* snap-shot))
         (loop for i from 1 to 10 collect (random)))
       (loop for i from 1 to 10 collect (random))
       (let ((*random-state* snap-shot))
         (loop for i from 1 to 10 collect (random))))
→ ((19 16 44 19 96 15 76 96 13 61)
    (19 16 44 19 96 15 76 96 13 61)
    (16 67 0 43 70 79 58 5 63 50)
    (16 67 0 43 70 79 58 5 63 50))
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The " (:TERM NIL "implementation")
     ". " :PAR (:FUNREF NIL "random") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-random-state") ", "
     (:FUNREF NIL "random") ", " (:TYPEREF NIL "random-state") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:TERM NIL "Binding") " "
     (:VARREF NIL "*random-state*") " to a different "
     (:TERM NIL "random state") " " (:TERM NIL "object")
     " correctly saves and restores the old " (:TERM NIL "random state") " "
     (:TERM NIL "object") ". " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Numeric Types --------------------")
   :PAR (:COMMENT NIL "%% ========== NUMBERP")
   (:COM (:NAME "numberp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "numberp") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 11")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "number") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (numberp 12) → " (:TERM NIL "true") "
 (numberp (expt 2 130)) → "
      (:TERM NIL "true") "
 (numberp #c(5/3 7.2)) → "
      (:TERM NIL "true") "
 (numberp nil) → "
      (:TERM NIL "false") "
 (numberp (cons 1 2)) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (numberp " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'number)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "-------------------- Complex --------------------")
   :PAR (:COMMENT NIL "%% ========== CIS")
   (:COM (:NAME "cis" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "cis") (:ARGLIST NIL "radians")
      (:VALUES NIL "number"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "radians") "—a "
     (:TERM NIL "real") ". " :PAR (:PARAM NIL "number") "—a "
     (:TERM NIL "complex") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.5.2 15")
     (:FUNREF NIL "cis") " returns the value of "
     (:MATH NIL
      (:MSUP NIL (:MI (:FONT :I) "e")
       (:MROW NIL (:MI NIL "i") (:MO NIL "·") (:MI (:FONT :I) "radians"))))
     ", which is a " (:TERM NIL "complex")
     " in which the real part is equal to the cosine of "
     (:PARAM NIL "radians") ", and the imaginary part is equal to the sine of "
     (:PARAM NIL "radians") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (cis 0) → #C(1.0 0.0)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :FLOAT-SUBSTITUTABILITY)
     " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL "The result is a complex number whose"
      "phase is the equal to the argument (mod 2$\\pi$)"
      "and whose magnitude is unity.")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== COMPLEX")
   (:COM (:NAME "complex" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "complex")
      (:ARGLIST NIL "realpart " (:KEYWORD NIL " &optional") " imagpart")
      (:VALUES NIL "complex"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "realpart")
     "—a " (:TERM NIL "real") ". " :PAR (:PARAM NIL "imagpart") "—a "
     (:TERM NIL "real") ". " :PAR (:PARAM NIL "complex") "—a "
     (:TERM NIL "rational") " or a " (:TERM NIL "complex") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "complex") " returns a "
     (:TERM NIL "number") " whose real part is " (:PARAM NIL "realpart")
     " and whose imaginary part is " (:PARAM NIL "imagpart") ". " :PAR "If "
     (:PARAM NIL "realpart") " is a " (:TERM NIL "rational") " and "
     (:PARAM NIL "imagpart") " is the " (:TERM NIL "rational")
     " number zero, the result of " (:FUNREF NIL "complex") " is "
     (:PARAM NIL "realpart") ", a " (:TERM NIL "rational")
     ". Otherwise, the result is a " (:TERM NIL "complex") ". " :PAR
     (:COMMENT NIL "% 12.6.0 38") "If either " (:PARAM NIL "realpart") " or "
     (:PARAM NIL "imagpart") " is a " (:TERM NIL "float") ", the non-"
     (:TERM NIL "float") " is converted to a " (:TERM NIL "float")
     " before the " (:TERM NIL "complex") " is created. If "
     (:PARAM NIL "imagpart")
     " is not supplied, the imaginary part is a zero of the same "
     (:TERM NIL "type") " as " (:PARAM NIL "realpart") "; " (:I NIL "i.e.")
     ",  " (:TT NIL " (coerce 0 (type-of " (:PARAM NIL "realpart") "))")
     " is effectively used. " :PAR
     (:ISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " " :PAR
     "Type upgrading implies a movement upwards in the type hierarchy lattice. "
     (:COMMENT NIL
      "!!! Barmar asks: ``What type specifier are you talking about?''")
     "In the case of " (:TERM NIL "complexes") ", the "
     (:PARAM NIL "type-specifier") " "
     (:REVIEWER NIL "Barmar: What type specifier?") " must be a subtype of "
     (:TT NIL " (upgraded-complex-part-type " (:PARAM NIL "type-specifier")
      ")")
     ". If " (:PARAM NIL "type-specifier1") " is a subtype of "
     (:PARAM NIL "type-specifier2") ", then "
     (:TT NIL " (upgraded-complex-element-type '"
      (:PARAM NIL "type-specifier1") ")")
     " must also be a subtype of "
     (:TT NIL " (upgraded-complex-element-type '"
      (:PARAM NIL "type-specifier2") ")")
     ". Two disjoint types can be upgraded into the same thing. " :PAR
     (:ENDISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (complex 0) → 0
 (complex 0.0) → #C(0.0 0.0)
 (complex 1 1/2) → #C(1 1/2)
 (complex 1 .99) → #C(1.0 0.99)
 (complex 3/2 0.0) → #C(1.5 0.0)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "realpart") ", "
     (:FUNREF NIL "imagpart") ", "
     (:COMMENT NIL
      "% Added per Boyer/Kaufmann/Moore #15 (by X3J13 vote at May 4-5, 1994 meeting)"
      "% -kmp 9-May-94")
     (:SECREF NIL :SHARPSIGN-C) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL
      "% Removed per Boyer/Kaufmann/Moore #15 (by X3J13 vote at May 4-5, 1994 meeting)"
      "% -kmp 9-May-94" " \\code" "  #c(a b) \\EQ #.(complex a b)"
      " \\endcode")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== COMPLEXP")
   (:COM (:NAME "complexp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "complexp") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 16")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "complex") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (complexp 1.2d2) → " (:TERM NIL "false") "
 (complexp #c(5/3 7.2)) → "
      (:TERM NIL "true") "

")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "complex") " ("
     (:TERM NIL "function") " and " (:TERM NIL "type") "), "
     (:FUNREF NIL "typep") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (complexp " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'complex)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== CONJUGATE")
   (:COM (:NAME "conjugate" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "conjugate") (:ARGLIST NIL "number")
      (:VALUES NIL "conjugate"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") "—a "
     (:TERM NIL "number") ". " :PAR (:PARAM NIL "conjugate") "—a "
     (:TERM NIL "number") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.4.0 21")
     "Returns the complex conjugate of " (:PARAM NIL "number")
     ". The conjugate of a " (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " "
     (:TERM NIL "real") " " (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89")
     " number is itself. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (conjugate #c(0 -1)) → #C(0 1)
 (conjugate #c(1 1)) → #C(1 -1)
 (conjugate 1.5) → 1.5
 (conjugate #C(3/5 4/5)) → #C(3/5 -4/5)
 (conjugate #C(0.0D0 -1.0D0)) → #C(0.0D0 1.0D0)
 (conjugate 3.7) → 3.7
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "For a " (:TERM NIL "complex") " number "
     (:TT NIL "z") ", " :PAR
     (:CODE NIL " (conjugate z) ≡ (complex (realpart z) (- (imagpart z)))
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PHASE")
   (:COM (:NAME "phase" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "phase") (:ARGLIST NIL "number")
      (:VALUES NIL "phase"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") "—a "
     (:TERM NIL "number") ". " :PAR (:PARAM NIL "phase") "—a "
     (:TERM NIL "number") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 12.5.2 8" "% 12.5.2 9") (:FUNREF NIL "phase")
     " returns the phase of " (:PARAM NIL "number")
     " (the angle part of its polar representation) in radians, in the range "
     (:ISSUE NIL "IEEE-ATAN-BRANCH-CUT:SPLIT") " "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π"))
     " (exclusive) if minus zero is not supported, or "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π"))
     " (inclusive) if minus zero is supported, "
     (:ENDISSUE NIL "IEEE-ATAN-BRANCH-CUT:SPLIT") " to "
     (:MATH NIL (:MI NIL "π")) " (inclusive). The phase of a positive "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TERM NIL "real") " "
     (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89")
     " number is zero; that of a negative "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TERM NIL "real") " "
     (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " number is "
     (:MATH NIL (:MI NIL "π")) ". The phase of zero is defined to be zero. "
     :PAR (:COMMENT NIL "% 12.5.2 10") "If " (:PARAM NIL "number") " is a "
     (:TERM NIL "complex float") ", the result is a " (:TERM NIL "float")
     " of the same " (:TERM NIL "type") " as the components of "
     (:PARAM NIL "number") ". If " (:PARAM NIL "number") " is a "
     (:TERM NIL "float") ", the result is a " (:TERM NIL "float")
     " of the same " (:TERM NIL "type") ". If " (:PARAM NIL "number") " is a "
     (:TERM NIL "rational") " or a " (:TERM NIL "complex rational")
     ", the result is a " (:TERM NIL "single float") ". " :PAR
     (:COMMENT NIL "% 12.5.3 6") "The branch cut for " (:FUNREF NIL "phase")
     " lies along the negative real axis, continuous with quadrant II. The range consists of that portion of the real axis between "
     (:MATH NIL (:MO NIL "-") (:MI NIL "π")) " (exclusive) and "
     (:MATH NIL (:MI NIL "π")) " (inclusive). " :PAR
     (:ISSUE NIL "IEEE-ATAN-BRANCH-CUT:SPLIT")
     " The mathematical definition of " (:FUNREF NIL "phase")
     " is as follows: " :PAR
     (:TT NIL "(phase " (:I NIL "x") ") = (atan (imagpart " (:I NIL "x")
      ") (realpart " (:I NIL "x") "))")
     " " (:ENDISSUE NIL "IEEE-ATAN-BRANCH-CUT:SPLIT") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (phase 1) → 0.0s0
 (phase 0) → 0.0s0
 (phase (cis 30)) → -1.4159266
 (phase #c(0 1)) → 1.5707964
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "Should signal "
     (:TYPEREF NIL "type-error") " if its argument is not a "
     (:TERM NIL "number") ". Might signal " (:TYPEREF NIL "arithmetic-error")
     ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :FLOAT-SUBSTITUTABILITY)
     " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== REALPART" "%% ========== IMAGPART")
   (:COM (:NAME "realpart, imagpart" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "realpart") (:ARGLIST NIL "number")
      (:VALUES NIL "real"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "imagpart") (:ARGLIST NIL "number")
      (:VALUES NIL "real"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") "—a "
     (:TERM NIL "number") ". " :PAR (:PARAM NIL "real") "—a "
     (:TERM NIL "real") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "realpart") " and "
     (:FUNREF NIL "imagpart") " return the real and imaginary parts of "
     (:PARAM NIL "number") " respectively. " (:COMMENT NIL "% 12.6.0 39") "If "
     (:PARAM NIL "number") " is " (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89")
     " " (:TERM NIL "real") ", "
     (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " then "
     (:FUNREF NIL "realpart") " returns " (:PARAM NIL "number") " and "
     (:FUNREF NIL "imagpart") " returns "
     (:TT NIL "(* 0 " (:PARAM NIL "number") ")")
     ", which has the effect that the imaginary part of a "
     (:TERM NIL "rational") " is " (:TT NIL "0") " and that of a "
     (:TERM NIL "float") " is a floating-point zero of the same format. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (realpart #c(23 41)) → 23
 (imagpart #c(23 41.0)) → 41.0
 (realpart #c(23 41.0)) → 23.0
 (imagpart 23.0) → 0.0
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "number") " is not a "
     (:TERM NIL "number") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "complex") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== UPGRADED-COMPLEX-PART-TYPE")
   (:COM (:NAME "upgraded-complex-part-type" :FTYPE "Function")
    (:ISSUE NIL "SUBTYPEP-ENVIRONMENT:ADD-ARG") " "
    (:ISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "upgraded-complex-part-type")
      (:ARGLIST NIL "typespec " (:KEYWORD NIL " &optional") " environment")
      (:VALUES NIL "upgraded-typespec"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "typespec")
     "—a " (:TERM NIL "type specifier") ". " :PAR (:PARAM NIL "environment")
     "—an " (:TERM NIL "environment") " " (:TERM NIL "object")
     ". The default is " (:MISC NIL "nil") ", denoting the "
     (:TERM NIL "null lexical environment") " and the and current "
     (:TERM NIL "global environment") ". "
     (:COMMENT NIL "!!! Need to say what happens with the environment.") :PAR
     (:PARAM NIL "upgraded-typespec") "—a " (:TERM NIL "type specifier") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:FUNREF NIL "upgraded-complex-part-type")
     " returns the part type of the most specialized " (:TERM NIL "complex")
     " number representation that can hold parts of " (:TERM NIL "type") " "
     (:PARAM NIL "typespec") ". " :PAR
     (:COMMENT NIL
      "Added by KMP in response to a Barmar comment. -kmp 29-Jul-91")
     "The " (:PARAM NIL "typespec") " is a " (:TERM NIL "subtype")
     " of (and possibly " (:TERM NIL "type equivalent") " to) the "
     (:PARAM NIL "upgraded-typespec") ". " :PAR "The purpose of "
     (:FUNREF NIL "upgraded-complex-part-type")
     " is to reveal how an implementation does its " (:TERM NIL "upgrading")
     ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "complex") " ("
     (:TERM NIL "function") " and " (:TERM NIL "type") ") " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:ENDISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     (:ENDISSUE NIL "SUBTYPEP-ENVIRONMENT:ADD-ARG") " " :PAR))
   " " :PAR (:COMMENT NIL "-------------------- Real --------------------")
   :PAR (:COMMENT NIL "%% ========== REALP")
   (:COM (:NAME "realp" :FTYPE "Function")
    (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "realp") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 11")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "real") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (realp 12) → " (:TERM NIL "true") "
 (realp #c(5/3 7.2)) → "
      (:TERM NIL "false") "
 (realp nil) → "
      (:TERM NIL "false") "
 (realp (cons 1 2)) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (realp " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'real)
")
     " " :PAR (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " "))
   " " :PAR (:COMMENT NIL "-------------------- Rational --------------------")
   :PAR (:COMMENT NIL "%% ========== NUMERATOR" "%% ========== DENOMINATOR")
   (:COM (:NAME "numerator, denominator" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "numerator")
      (:ARGLIST NIL "rational") (:VALUES NIL "numerator"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "denominator")
      (:ARGLIST NIL "rational") (:VALUES NIL "denominator"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "rational")
     "—a " (:TERM NIL "rational") ". " :PAR (:PARAM NIL "numerator") "—an "
     (:TERM NIL "integer") ". " :PAR (:PARAM NIL "denominator") "—a positive "
     (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.6.0 8")
     (:FUNREF NIL "numerator") " and " (:FUNREF NIL "denominator") " reduce "
     (:PARAM NIL "rational")
     " to canonical form and compute the numerator or denominator of that number. "
     :PAR (:FUNREF NIL "numerator") " and " (:FUNREF NIL "denominator")
     " return the numerator or denominator of the canonical form of "
     (:PARAM NIL "rational") ". " :PAR "If " (:PARAM NIL "rational") " is an "
     (:TERM NIL "integer") ", " (:FUNREF NIL "numerator") " returns "
     (:PARAM NIL "rational") " and " (:FUNREF NIL "denominator") " returns 1. "
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (numerator 1/2) → 1
 (denominator 12/36) → 3
 (numerator -1) → -1
 (denominator (/ -33)) → 33
 (numerator (/ 8 -6)) → -4
 (denominator (/ 8 -6)) → 3
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "/") " " :PAR)
    (:PART (:NAME "Notes") " "
     (:CODE NIL " (gcd (numerator x) (denominator x)) → 1
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== RATIONAL" "%% ========== RATIONALIZE")
   (:COM (:NAME "rational, rationalize" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "rational") (:ARGLIST NIL "number")
      (:VALUES NIL "rational"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "rationalize")
      (:ARGLIST NIL "number") (:VALUES NIL "rational"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") "—a "
     (:TERM NIL "real") ". " :PAR (:PARAM NIL "rational") "—a "
     (:TERM NIL "rational") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.6.0 5")
     (:FUNREF NIL "rational") " and " (:FUNREF NIL "rationalize") " convert "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TERM NIL "reals") " "
     (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " to "
     (:TERM NIL "rationals") ". " :PAR "If " (:PARAM NIL "number")
     " is already " (:TERM NIL "rational") ", it is returned. " :PAR "If "
     (:PARAM NIL "number") " is a " (:TERM NIL "float") ", "
     (:FUNREF NIL "rational") " returns a " (:TERM NIL "rational")
     " that is mathematically equal in value to the " (:TERM NIL "float") ". "
     (:FUNREF NIL "rationalize") " returns a " (:TERM NIL "rational")
     " that approximates the " (:TERM NIL "float")
     " to the accuracy of the underlying floating-point representation. " :PAR
     (:FUNREF NIL "rational") " assumes that the " (:TERM NIL "float")
     " is completely accurate. " :PAR (:COMMENT NIL "% 12.6.0 6")
     (:FUNREF NIL "rationalize") " assumes that the " (:TERM NIL "float")
     " is accurate only to the precision of the floating-point representation. "
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (rational 0) → 0
 (rationalize -11/100) → -11/100
 (rational .1) → 13421773/134217728 ;implementation-dependent
 (rationalize .1) → 1/10
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The " (:TERM NIL "implementation")
     ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "number") " is not a "
     (:TERM NIL "real") ". Might signal " (:TYPEREF NIL "arithmetic-error")
     ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " (:COMMENT NIL "% 12.6.0 7") :PAR
     "It is always the case that " :PAR
     (:CODE NIL " (float (rational x) x) ≡ x
")
     " and " :PAR
     (:CODE NIL " (float (rationalize x) x) ≡ x
")
     " That is, rationalizing a " (:TERM NIL "float")
     " by either method and then converting it back to a " (:TERM NIL "float")
     " of the same format produces the original " (:PARAM NIL "number") ". "))
   " " :PAR (:COMMENT NIL "%% ========== RATIONALP")
   (:COM (:NAME "rationalp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "rationalp") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 14")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "rational") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (rationalp 12) → " (:TERM NIL "true") "
 (rationalp 6/5) → "
      (:TERM NIL "true") "
 (rationalp 1.212) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "rational") " " :PAR)
    (:PART (:NAME "Notes") " "
     (:CODE NIL " (rationalp " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'rational)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "-------------------- Integer --------------------")
   :PAR (:COMMENT NIL "%% ========== ASH")
   (:COM (:NAME "ash" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "ash") (:ARGLIST NIL "integer count")
      (:VALUES NIL "shifted-integer"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "integer")
     "—an " (:TERM NIL "integer") ". " :PAR (:PARAM NIL "count") "—an "
     (:TERM NIL "integer") ". " :PAR (:PARAM NIL "shifted-integer") "—an "
     (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.7.0 18")
     (:FUNREF NIL "ash")
     " performs the arithmetic shift operation on the binary representation of "
     (:PARAM NIL "integer") ", which is treated as if it were binary. " :PAR
     (:FUNREF NIL "ash") " shifts " (:PARAM NIL "integer")
     " arithmetically left by " (:PARAM NIL "count") " bit positions if "
     (:PARAM NIL "count") " is positive, or right " (:PARAM NIL "count")
     " bit positions if " (:PARAM NIL "count")
     " is negative. The shifted value of the same sign as "
     (:PARAM NIL "integer") " is returned. " :PAR "Mathematically speaking, "
     (:FUNREF NIL "ash") " performs the computation " (:TT NIL "floor") "("
     (:PARAM NIL "integer") "· "
     (:MATH NIL (:MSUP NIL (:MN NIL "2") (:MI (:FONT :I) "count"))) "). "
     (:COMMENT NIL "% 12.7.0 20") "Logically, " (:FUNREF NIL "ash")
     " moves all of the bits in " (:PARAM NIL "integer")
     " to the left, adding zero-bits at the right, or moves them to the right, discarding bits. "
     :PAR (:FUNREF NIL "ash") " is defined to behave as if "
     (:PARAM NIL "integer")
     " were represented in two's complement form, regardless of how "
     (:TERM NIL "integers") " are represented internally. ")
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (ash 16 1) → 32
 (ash 16 0) → 16
 (ash 16 -1) → 8
 (ash -100000000000000000000000000000000 -100) → -79
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "integer") " is not an "
     (:TERM NIL "integer") ". Should signal an error of " (:TERM NIL "type")
     " " (:TYPEREF NIL "type-error") " if " (:PARAM NIL "count") " is not an "
     (:TERM NIL "integer") ". Might signal " (:TYPEREF NIL "arithmetic-error")
     ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " (:COMMENT NIL "% 12.7.0 19") :PAR
     (:CODE NIL " (logbitp " (:PARAM NIL "j") " (ash " (:PARAM NIL "n") " "
      (:PARAM NIL "k") "))
 ≡ (and (>= "
      (:PARAM NIL "j") " " (:PARAM NIL "k") ") (logbitp (- " (:PARAM NIL "j")
      " " (:PARAM NIL "k") ") " (:PARAM NIL "n") "))
")
     " "))
   " " :PAR (:COMMENT NIL "%% ========== INTEGER-LENGTH")
   (:COM (:NAME "integer-length" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "integer-length")
      (:ARGLIST NIL "integer") (:VALUES NIL "number-of-bits"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "integer")
     "—an " (:TERM NIL "integer") ". " :PAR (:PARAM NIL "number-of-bits")
     "—a non-negative " (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.7.0 22")
     "Returns the number of bits needed to represent " (:PARAM NIL "integer")
     " in binary two's-complement format. " :PAR)
    (:PART (:NAME "Examples") " " :PAR (:COMMENT NIL "% 12.7.0 23")
     (:CODE NIL " (integer-length 0) → 0
 (integer-length 1) → 1
 (integer-length 3) → 2
 (integer-length 4) → 3
 (integer-length 7) → 3
 (integer-length -1) → 0
 (integer-length -4) → 2
 (integer-length -7) → 3
 (integer-length -8) → 3
 (integer-length (expt 2 9)) → 10
 (integer-length (1- (expt 2 9))) → 9
 (integer-length (- (expt 2 9))) → 9
 (integer-length (- (1+ (expt 2 9)))) → 10
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "integer") " is not an "
     (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "This function could have been defined by: " :PAR
     (:CODE NIL "(defun integer-length (integer)
  (ceiling (log (if (minusp integer)
                    (- integer)
                    (1+ integer))
                2)))
")
     " " :PAR "If " (:PARAM NIL "integer")
     " is non-negative, then its value can be represented in unsigned binary form in a field whose width in bits is no smaller than "
     (:TT NIL " (integer-length " (:PARAM NIL "integer") ")")
     ". Regardless of the sign of " (:PARAM NIL "integer")
     ", its value can be represented in signed binary two's-complement form in a field whose width in bits is no smaller than "
     (:TT NIL " (+ (integer-length " (:PARAM NIL "integer") ") 1)") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== INTEGERP")
   (:COM (:NAME "integerp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "integerp") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 12")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "integer") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (integerp 1) → " (:TERM NIL "true") "
 (integerp (expt 2 130)) → "
      (:TERM NIL "true") "
 (integerp 6/5) → "
      (:TERM NIL "false") "
 (integerp nil) → "
      (:TERM NIL "false") "

")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (integerp " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'integer)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PARSE-INTEGER")
   (:COM (:NAME "parse-integer" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "parse-integer")
      (:ARGLIST NIL "string " (:KEYWORD NIL " &key")
       " start end radix junk-allowed")
      (:VALUES NIL "integer, pos"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "string") "—a "
     (:TERM NIL "string") ". " :PAR (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " "
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start") ", " (:PARAM NIL "end") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "string")
     ". The defaults for " (:PARAM NIL "start") " and " (:PARAM NIL "end")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " " :PAR (:PARAM NIL "radix")
     "—a " (:TERM NIL "radix") ". The default is " (:TT NIL "10") ". " :PAR
     (:PARAM NIL "junk-allowed") "—a " (:TERM NIL "generalized boolean")
     ". The default is " (:TERM NIL "false") ". " :PAR (:PARAM NIL "integer")
     "—an " (:TERM NIL "integer") " or " (:TERM NIL "false") ". " :PAR
     (:PARAM NIL "pos") "—a " (:TERM NIL "bounding index") " of "
     (:PARAM NIL "string") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.2.1 45")
     (:FUNREF NIL "parse-integer") " parses an " (:TERM NIL "integer")
     " in the specified " (:PARAM NIL "radix") " from the substring of "
     (:PARAM NIL "string") " delimited by " (:PARAM NIL "start") " and "
     (:PARAM NIL "end") ". " :PAR (:COMMENT NIL "% 22.2.1 49")
     (:FUNREF NIL "parse-integer") " expects an optional sign (" (:TT NIL "+")
     " or " (:TT NIL "-")
     ") followed by a a non-empty sequence of digits to be interpreted in the specified "
     (:PARAM NIL "radix") ". Optional leading and trailing "
     (:TERM NIL "whitespace") (:SUB NIL "1") " is ignored. " :PAR
     (:FUNREF NIL "parse-integer")
     " does not recognize the syntactic radix-specifier prefixes "
     (:TT NIL "#O") ", " (:TT NIL "#B") ", " (:TT NIL "#X") ", and "
     (:TT NIL "#" (:I NIL "n") "R")
     ", nor does it recognize a trailing decimal point. " :PAR "If "
     (:PARAM NIL "junk-allowed") " is " (:TERM NIL "false") ", an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "parse-error")
     " is signaled if substring does not consist entirely of the representation of a signed "
     (:TERM NIL "integer") ", possibly surrounded on either side by "
     (:TERM NIL "whitespace") (:SUB NIL "1") " " (:TERM NIL "characters") ". "
     :PAR (:COMMENT NIL "% 22.2.1 46") "The first " (:TERM NIL "value")
     " returned is either the " (:TERM NIL "integer")
     " that was parsed, or else " (:MISC NIL "nil")
     " if no syntactically correct " (:TERM NIL "integer") " was seen but "
     (:PARAM NIL "junk-allowed") " was " (:TERM NIL "true") ". " :PAR
     (:COMMENT NIL "% 22.2.1 48") "The second " (:TERM NIL "value")
     " is either the index into the " (:TERM NIL "string")
     " of the delimiter that terminated the parse, or the upper "
     (:TERM NIL "bounding index")
     " of the substring if the parse terminated at the end of the substring (as is always the case if "
     (:PARAM NIL "junk-allowed") " is " (:TERM NIL "false") "). " :PAR
     (:COMMENT NIL " KMP:" "  This is actually somewhat ambiguous."
      "   A. (parse-integer \"3 5\" :junk-allowed nil :end 2) \\EV 3,1 or 3,2 ??"
      "   B. (parse-integer \"3 5\" :junk-allowed t :end 2)   \\EV 3,1 or 3,2 ??"
      "   C. (parse-integer \"3 a\" :junk-allowed t)          \\EV 3,1 or 3,2 ??"
      " Mail sent to Quinquevirate asking if anyone had any thoughts on this.")
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (parse-integer \"123\") → 123, 3
 (parse-integer \"123\" :start 1 :radix 5) → 13, 3
 (parse-integer \"no-integer\" :junk-allowed t) → NIL, 0
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If "
     (:PARAM NIL "junk-allowed") " is " (:TERM NIL "false")
     ", an error is signaled if substring does not consist entirely of the representation of an "
     (:TERM NIL "integer") ", possibly surrounded on either side by "
     (:TERM NIL "whitespace") (:SUB NIL "1") " characters. " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Integer Bits --------------------") :PAR
   (:COMMENT NIL "%% ========== BOOLE")
   (:COM (:NAME "boole" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "boole")
      (:ARGLIST NIL "op integer-1 integer-2") (:VALUES NIL "result-integer"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "Op") "—a "
     (:TERM NIL "bit-wise logical operation specifier") ". " :PAR
     (:PARAM NIL "integer-1") "—an " (:TERM NIL "integer") ". " :PAR
     (:PARAM NIL "integer-2") "—an " (:TERM NIL "integer") ". " :PAR
     (:PARAM NIL "result-integer") "—an " (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.7.0 12")
     (:FUNREF NIL "boole") " performs bit-wise logical operations on "
     (:PARAM NIL "integer-1") " and " (:PARAM NIL "integer-2")
     ", which are treated as if they were binary and in two's complement representation. "
     :PAR
     "The operation to be performed and the return value are determined by "
     (:PARAM NIL "op") ". " :PAR (:FUNREF NIL "boole")
     " returns the values specified for any " (:PARAM NIL "op") " in "
     (:NEXTFIGURE NIL) ". " :PAR "      " :PAR
     (:TABLE (:NAME ("Bit-Wise Logical Operations"))
      (:ROW NIL (:CELL NIL "Op") (:CELL NIL "Result"))
      (:ROW NIL (:CELL NIL (:VARREF NIL "boole-1"))
       (:CELL NIL (:PARAM NIL "integer-1")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "boole-2"))
       (:CELL NIL (:PARAM NIL "integer-2")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "boole-andc1"))
       (:CELL NIL " and complement of " (:PARAM NIL "integer-1") " with "
        (:PARAM NIL "integer-2")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "boole-andc2"))
       (:CELL NIL " and " (:PARAM NIL "integer-1") " with complement of "
        (:PARAM NIL "integer-2")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "boole-and")) (:CELL NIL " and "))
      (:ROW NIL (:CELL NIL (:VARREF NIL "boole-c1"))
       (:CELL NIL " complement of " (:PARAM NIL "integer-1")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "boole-c2"))
       (:CELL NIL " complement of " (:PARAM NIL "integer-2")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "boole-clr"))
       (:CELL NIL " always 0 (all zero bits) "))
      (:ROW NIL (:CELL NIL (:VARREF NIL "boole-eqv"))
       (:CELL NIL " equivalence (exclusive nor) "))
      (:ROW NIL (:CELL NIL (:VARREF NIL "boole-ior"))
       (:CELL NIL " inclusive or "))
      (:ROW NIL (:CELL NIL (:VARREF NIL "boole-nand")) (:CELL NIL " not-and "))
      (:ROW NIL (:CELL NIL (:VARREF NIL "boole-nor")) (:CELL NIL " not-or "))
      (:ROW NIL (:CELL NIL (:VARREF NIL "boole-orc1"))
       (:CELL NIL " or complement of " (:PARAM NIL "integer-1") " with "
        (:PARAM NIL "integer-2")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "boole-orc2"))
       (:CELL NIL " or " (:PARAM NIL "integer-1") " with complement of "
        (:PARAM NIL "integer-2")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "boole-set"))
       (:CELL NIL " always -1 (all one bits) "))
      (:ROW NIL (:CELL NIL (:VARREF NIL "boole-xor"))
       (:CELL NIL " exclusive or ")))
     "  " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (boole boole-ior 1 16) → 17
 (boole boole-and -2 5) → 4
 (boole boole-eqv 17 15) → -31

;;; These examples illustrate the result of applying BOOLE and each
;;; of the possible values of OP to each possible combination of bits.
 (progn
   (format t \"~&Results of (BOOLE <op> #b0011 #b0101) ...~
           ~%---Op-------Decimal-----Binary----Bits---~%\")
   (dolist (symbol '(boole-1     boole-2    boole-and  boole-andc1
                     boole-andc2 boole-c1   boole-c2   boole-clr
                     boole-eqv   boole-ior  boole-nand boole-nor
                     boole-orc1  boole-orc2 boole-set  boole-xor))
     (let ((result (boole (symbol-value symbol) #b0011 #b0101)))
       (format t \"~& ~A~13T~3,' D~23T~:*~5,' B~31T ...~4,'0B~%\" 
               symbol result (logand result #b1111)))))
⊳ Results of (BOOLE <op> #b0011 #b0101) ...
⊳ ---Op-------Decimal-----Binary----Bits---
⊳  BOOLE-1       3          11    ...0011
⊳  BOOLE-2       5         101    ...0101
⊳  BOOLE-AND     1           1    ...0001
⊳  BOOLE-ANDC1   4         100    ...0100
⊳  BOOLE-ANDC2   2          10    ...0010
⊳  BOOLE-C1     -4        -100    ...1100
⊳  BOOLE-C2     -6        -110    ...1010
⊳  BOOLE-CLR     0           0    ...0000
⊳  BOOLE-EQV    -7        -111    ...1001
⊳  BOOLE-IOR     7         111    ...0111
⊳  BOOLE-NAND   -2         -10    ...1110
⊳  BOOLE-NOR    -8       -1000    ...1000
⊳  BOOLE-ORC1   -3         -11    ...1101
⊳  BOOLE-ORC2   -5        -101    ...1011
⊳  BOOLE-SET    -1          -1    ...1111
⊳  BOOLE-XOR     6         110    ...0110
→ NIL
")
     " " :PAR (:COMMENT NIL "\\filbreak") :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "Should signal "
     (:TYPEREF NIL "type-error") " if its first argument is not a "
     (:TERM NIL "bit-wise logical operation specifier")
     " or if any subsequent argument is not an " (:TERM NIL "integer") ". "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "logand") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 12.7.0 14") "In general, "
     :PAR
     (:CODE NIL " (boole boole-and x y) ≡ (logand x y)
")
     " " :PAR
     (:COMMENT NIL
      "% The following example contributed by Dan Hoey (hoey@AIC.NRL.Navy.Mil)")
     (:TERM NIL "Programmers")
     " who would prefer to use numeric indices rather than "
     (:TERM NIL "bit-wise logical operation specifiers")
     " can get an equivalent effect by a technique such as the following: "
     :PAR
     (:CODE NIL ";; The order of the values in this `table' are such that
;; (logand (boole (elt boole-n-vector n) #b0101 #b0011) #b1111) => n
 (defconstant boole-n-vector
    (vector boole-clr   boole-and  boole-andc1 boole-2
            boole-andc2 boole-1    boole-xor   boole-ior
            boole-nor   boole-eqv  boole-c1    boole-orc1
            boole-c2    boole-orc2 boole-nand  boole-set))
→ BOOLE-N-VECTOR
 (proclaim '(inline boole-n))
→ "
      (:TERM NIL "implementation-dependent") "
 (defun boole-n (n integer &rest more-integers)
   (apply #'boole (elt boole-n-vector n) integer more-integers))
→ BOOLE-N
 (boole-n #b0111 5 3) → 7
 (boole-n #b0001 5 3) → 1
 (boole-n #b1101 5 3) → -3
 (loop for n from #b0000 to #b1111 collect (boole-n n 5 3))
→ (0 1 2 3 4 5 6 7 -8 -7 -6 -5 -4 -3 -2 -1)
")
     " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== BOOLE-1" "%% ========== BOOLE-2"
    "%% ========== BOOLE-AND" "%% ========== BOOLE-ANDC1"
    "%% ========== BOOLE-ANDC2" "%% ========== BOOLE-C1"
    "%% ========== BOOLE-C2" "%% ========== BOOLE-CLR"
    "%% ========== BOOLE-EQV" "%% ========== BOOLE-IOR"
    "%% ========== BOOLE-NAND" "%% ========== BOOLE-NOR"
    "%% ========== BOOLE-ORC1" "%% ========== BOOLE-ORC2"
    "%% ========== BOOLE-SET" "%% ========== BOOLE-XOR")
   (:COM
    (:NAME
     "boole-1, boole-2, boole-and, boole-andc1, boole-andc2, boole-c1, boole-c2, boole-clr, boole-eqv, boole-ior, boole-nand, boole-nor, boole-orc1, boole-orc2, boole-set, boole-xor"
     :FTYPE "Constant Variable")
    (:PART (:NAME "Constant Value") " " :PAR "The identity and nature of the "
     (:TERM NIL "values") " of each of these " (:TERM NIL "variables") " is "
     (:TERM NIL "implementation-dependent") ", except that it must be "
     (:TERM NIL "distinct") " from each of the " (:TERM NIL "values")
     " of the others, and it must be a valid first " (:TERM NIL "argument")
     " to the " (:TERM NIL "function") " " (:FUNREF NIL "boole") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Each of these "
     (:TERM NIL "constants") " has a " (:TERM NIL "value")
     " which is one of the sixteen possible "
     (:TERM NIL "bit-wise logical operation specifiers") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (boole boole-ior 1 16) → 17
 (boole boole-and -2 5) → 4
 (boole boole-eqv 17 15) → -31
")
     " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "boole") " " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== LOGNAND" "%% ========== LOGEQV"
    "%% ========== LOGNOT" "%% ========== LOGIOR" "%% ========== LOGXOR"
    "%% ========== LOGNAND" "%% ========== LOGNOR" "%% ========== LOGANDC1"
    "%% ========== LOGANDC2" "%% ========== LOGORC1" "%% ========== LOGORC2")
   (:COM
    (:NAME
     "logand, logandc1, logandc2, logeqv, logior, lognand, lognor, lognot, logorc1, logorc2, logxor"
     :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "logand")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " integers")
      (:VALUES NIL "result-integer"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "logandc1")
      (:ARGLIST NIL "integer-1 integer-2") (:VALUES NIL "result-integer"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "logandc2")
      (:ARGLIST NIL "integer-1 integer-2") (:VALUES NIL "result-integer"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "logeqv")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " integers")
      (:VALUES NIL "result-integer"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "logior")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " integers")
      (:VALUES NIL "result-integer"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "lognand")
      (:ARGLIST NIL "integer-1 integer-2") (:VALUES NIL "result-integer"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "lognor")
      (:ARGLIST NIL "integer-1 integer-2") (:VALUES NIL "result-integer"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "lognot") (:ARGLIST NIL "integer")
      (:VALUES NIL "result-integer"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "logorc1")
      (:ARGLIST NIL "integer-1 integer-2") (:VALUES NIL "result-integer"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "logorc2")
      (:ARGLIST NIL "integer-1 integer-2") (:VALUES NIL "result-integer"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "logxor")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " integers")
      (:VALUES NIL "result-integer"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "integers") "—"
     (:TERM NIL "integers") ". " :PAR (:PARAM NIL "integer") "—an "
     (:TERM NIL "integer") ". " :PAR (:PARAM NIL "integer-1") "—an "
     (:TERM NIL "integer") ". " :PAR (:PARAM NIL "integer-2") "—an "
     (:TERM NIL "integer") ". " :PAR (:PARAM NIL "result-integer") "—an "
     (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "functions") " "
     (:FUNREF NIL "logandc1") ", " (:FUNREF NIL "logandc2") ", "
     (:FUNREF NIL "logand") ", " (:FUNREF NIL "logeqv") ", "
     (:FUNREF NIL "logior") ", " (:FUNREF NIL "lognand") ", "
     (:FUNREF NIL "lognor") ", " (:FUNREF NIL "lognot") ", "
     (:FUNREF NIL "logorc1") ", " (:FUNREF NIL "logorc2") ", and "
     (:FUNREF NIL "logxor") " perform bit-wise logical operations on their "
     (:TERM NIL "arguments") ", that are treated as if they were binary. " :PAR
     (:NEXTFIGURE (:CAPS T)) " lists the meaning of each of the "
     (:TERM NIL "functions")
     ". Where an `identity' is shown, it indicates the " (:TERM NIL "value")
     " " (:TERM NIL "yielded") " by the " (:TERM NIL "function") " when no "
     (:TERM NIL "arguments") " are supplied. "
     (:COMMENT NIL "% 12.7.0 11" "% 12.7.0 8" "% 12.7.0 15" "% 12.7.0 5"
      "% 12.7.0 6" "% 12.7.0 7")
     :PAR
     (:TABLE (:NAME ("Bit-wise Logical Operations on Integers"))
      (:ROW NIL (:CELL NIL "Function") (:CELL NIL "Identity")
       (:CELL NIL "Operation performed"))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "logandc1")) (:CELL NIL " — ")
       (:CELL NIL " and complement of " (:PARAM NIL "integer-1") " with "
        (:PARAM NIL "integer-2")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "logandc2")) (:CELL NIL " — ")
       (:CELL NIL " and " (:PARAM NIL "integer-1") " with complement of "
        (:PARAM NIL "integer-2")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "logand")) (:CELL NIL (:TT NIL "-1"))
       (:CELL NIL " and "))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "logeqv")) (:CELL NIL (:TT NIL "-1"))
       (:CELL NIL " equivalence (exclusive nor) "))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "logior")) (:CELL NIL (:TT NIL "0"))
       (:CELL NIL " inclusive or "))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "lognand")) (:CELL NIL " — ")
       (:CELL NIL " complement of " (:PARAM NIL "integer-1") " and "
        (:PARAM NIL "integer-2")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "lognor")) (:CELL NIL " — ")
       (:CELL NIL " complement of " (:PARAM NIL "integer-1") " or "
        (:PARAM NIL "integer-2")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "lognot")) (:CELL NIL " — ")
       (:CELL NIL " complement "))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "logorc1")) (:CELL NIL " — ")
       (:CELL NIL " or complement of " (:PARAM NIL "integer-1") " with "
        (:PARAM NIL "integer-2")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "logorc2")) (:CELL NIL " — ")
       (:CELL NIL " or " (:PARAM NIL "integer-1") " with complement of "
        (:PARAM NIL "integer-2")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL "logxor")) (:CELL NIL (:TT NIL "0"))
       (:CELL NIL " exclusive or ")))
     " " :PAR "Negative " (:PARAM NIL "integers")
     " are treated as if they were in two's-complement notation. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (logior 1 2 4 8) → 15
 (logxor 1 3 7 15) → 10
 (logeqv) → -1
 (logand 16 31) → 16
 (lognot 0) → -1
 (lognot 1) → -2
 (lognot -1) → 0
 (lognot (1+ (lognot 1000))) → 999

;;; In the following example, m is a mask.  For each bit in
;;; the mask that is a 1, the corresponding bits in x and y are
;;; exchanged.  For each bit in the mask that is a 0, the 
;;; corresponding bits of x and y are left unchanged.
 (flet ((show (m x y)
          (format t \"~%m = #o~6,'0O~%x = #o~6,'0O~%y = #o~6,'0O~%\"
                  m x y)))
   (let ((m #o007750)
         (x #o452576)
         (y #o317407))
     (show m x y)
     (let ((z (logand (logxor x y) m)))
       (setq x (logxor z x))
       (setq y (logxor z y))
       (show m x y))))
⊳ m = #o007750
⊳ x = #o452576
⊳ y = #o317407
⊳ 
⊳ m = #o007750
⊳ x = #o457426
⊳ y = #o312557
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "Should signal "
     (:TYPEREF NIL "type-error") " if any argument is not an "
     (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "boole") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "Per Barmar.")
     (:TT NIL "(logbitp " (:PARAM NIL "k") " -1)") " returns "
     (:TERM NIL "true") " for all values of " (:PARAM NIL "k") ". " :PAR
     (:COMMENT NIL "% 12.7.0 9")
     "Because the following functions are not associative, they take exactly two arguments rather than any number of arguments. "
     :PAR
     (:CODE NIL " (lognand " (:PARAM NIL "n1") " " (:PARAM NIL "n2")
      ") ≡ (lognot (logand " (:PARAM NIL "n1") " " (:PARAM NIL "n2") "))
 (lognor "
      (:PARAM NIL "n1") " " (:PARAM NIL "n2") ") ≡ (lognot (logior "
      (:PARAM NIL "n1") " " (:PARAM NIL "n2") "))
 (logandc1 "
      (:PARAM NIL "n1") " " (:PARAM NIL "n2") ") ≡ (logand (lognot "
      (:PARAM NIL "n1") ") " (:PARAM NIL "n2") ")
 (logandc2 "
      (:PARAM NIL "n1") " " (:PARAM NIL "n2") ") ≡ (logand " (:PARAM NIL "n1")
      " (lognot " (:PARAM NIL "n2") "))
 (logiorc1 "
      (:PARAM NIL "n1") " " (:PARAM NIL "n2") ") ≡ (logior (lognot "
      (:PARAM NIL "n1") ") " (:PARAM NIL "n2") ")
 (logiorc2 "
      (:PARAM NIL "n1") " " (:PARAM NIL "n2") ") ≡ (logior " (:PARAM NIL "n1")
      " (lognot " (:PARAM NIL "n2") "))
 (logbitp "
      (:PARAM NIL "j") " (lognot " (:PARAM NIL "x") ")) ≡ (not (logbitp "
      (:PARAM NIL "j") " " (:PARAM NIL "x") "))
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LOGBITP")
   (:COM (:NAME "logbitp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "logbitp")
      (:ARGLIST NIL "index integer") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " " (:PARAM NIL "index")
     "—a non-negative " (:TERM NIL "integer") ". "
     (:ENDISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " " :PAR
     (:PARAM NIL "integer") "—an " (:TERM NIL "integer") ". " :PAR
     (:PARAM NIL "generalized-boolean") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "logbitp")
     " is used to test the value of a particular bit in "
     (:PARAM NIL "integer") ", that is treated as if it were binary. "
     (:COMMENT NIL "% 12.7.0 17") "The value of " (:FUNREF NIL "logbitp")
     " is " (:TERM NIL "true") " if the bit in " (:PARAM NIL "integer")
     " whose index is " (:PARAM NIL "index") " (that is, its weight is "
     (:MATH NIL (:MSUP NIL (:MN NIL "2") (:MI (:FONT :I) "index")))
     ") is a one-bit; otherwise it is " (:TERM NIL "false") ". " :PAR
     "Negative " (:PARAM NIL "integers")
     " are treated as if they were in two's-complement notation. " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (logbitp 1 1) → " (:TERM NIL "false") "
 (logbitp 0 1) → "
      (:TERM NIL "true") "
 (logbitp 3 10) → "
      (:TERM NIL "true") "
 (logbitp 1000000 -1) → "
      (:TERM NIL "true") "
 (logbitp 2 6) → "
      (:TERM NIL "true") "
 (logbitp 0 6) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "index")
     " is not a non-negative " (:TERM NIL "integer")
     ". Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "integer") " is not an "
     (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (logbitp " (:PARAM NIL "k") " " (:PARAM NIL "n")
      ") ≡ (ldb-test (byte 1 " (:PARAM NIL "k") ") " (:PARAM NIL "n") ")
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LOGCOUNT")
   (:COM (:NAME "logcount" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "logcount") (:ARGLIST NIL "integer")
      (:VALUES NIL "number-of-on-bits"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "integer")
     "—an " (:TERM NIL "integer") ". " :PAR (:PARAM NIL "number-of-on-bits")
     "—a non-negative " (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.7.0 21")
     "Computes and returns the number of bits in the two's-complement binary representation of "
     (:PARAM NIL "integer") " that are `on' or `set'. If "
     (:PARAM NIL "integer") " is negative, the " (:TT NIL "0")
     " bits are counted; otherwise, the " (:TT NIL "1") " bits are counted. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (logcount 0) → 0
 (logcount -1) → 0
 (logcount 7) → 3
 (logcount  13) → 3 ;Two's-complement binary: ...0001101
 (logcount -13) → 2 ;Two's-complement binary: ...1110011
 (logcount  30) → 4 ;Two's-complement binary: ...0011110
 (logcount -30) → 4 ;Two's-complement binary: ...1100010
 (logcount (expt 2 100)) → 1
 (logcount (- (expt 2 100))) → 100
 (logcount (- (1+ (expt 2 100)))) → 1
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "Should signal "
     (:TYPEREF NIL "type-error") " if its argument is not an "
     (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "Even if the " (:TERM NIL "implementation")
     " does not represent " (:TERM NIL "integers")
     " internally in two's complement binary, " (:FUNREF NIL "logcount")
     " behaves as if it did. " :PAR "The following identity always holds: "
     :PAR
     (:CODE NIL "    (logcount " (:PARAM NIL "x") ")
 ≡ (logcount (- (+ "
      (:PARAM NIL "x") " 1)))
 ≡ (logcount (lognot "
      (:PARAM NIL "x") "))
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LOGTEST")
   (:COM (:NAME "logtest" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "logtest")
      (:ARGLIST NIL "integer-1 integer-2") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "integer-1")
     "—an " (:TERM NIL "integer") ". " :PAR (:PARAM NIL "integer-2") "—an "
     (:TERM NIL "integer") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.7.0 16")
     "Returns " (:TERM NIL "true")
     " if any of the bits designated by the 1's in " (:PARAM NIL "integer-1")
     " is 1 in " (:PARAM NIL "integer-2") "; otherwise it is "
     (:TERM NIL "false") ". " (:PARAM NIL "integer-1") " and "
     (:PARAM NIL "integer-2") " are treated as if they were binary. " :PAR
     "Negative " (:PARAM NIL "integer-1") " and " (:PARAM NIL "integer-2")
     " are treated as if they were represented in two's-complement binary. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (logtest 1 7) → " (:TERM NIL "true") "
 (logtest 1 2) → "
      (:TERM NIL "false") "
 (logtest -2 -1) → "
      (:TERM NIL "true") "
 (logtest 0 -1) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "integer-1") " is not an "
     (:TERM NIL "integer") ". Should signal an error of " (:TERM NIL "type")
     " " (:TYPEREF NIL "type-error") " if " (:PARAM NIL "integer-2")
     " is not an " (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (logtest " (:PARAM NIL "x") " " (:PARAM NIL "y")
      ") ≡ (not (zerop (logand " (:PARAM NIL "x") " " (:PARAM NIL "y") ")))
")
     " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Integer Bytes --------------------")
   :PAR
   (:COMMENT NIL "%% ========== BYTE" "%% ========== BYTE-SIZE"
    "%% ========== BYTE-POSITION")
   (:COM (:NAME "byte, byte-size, byte-position" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "byte")
      (:ARGLIST NIL "size position") (:VALUES NIL "bytespec"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "byte-size")
      (:ARGLIST NIL "bytespec") (:VALUES NIL "size"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "byte-position")
      (:ARGLIST NIL "bytespec") (:VALUES NIL "position"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:COMMENT NIL "% 12.8.0 2")
     :PAR (:PARAM NIL "size") ", " (:PARAM NIL "position") "—a non-negative "
     (:TERM NIL "integer") ". " :PAR (:PARAM NIL "bytespec") "—a "
     (:TERM NIL "byte specifier") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 12.8.0 3" "% 12.8.0 2                 ")
     (:FUNREF NIL "byte") " returns a " (:TERM NIL "byte specifier")
     " that indicates a " (:TERM NIL "byte") " of width " (:PARAM NIL "size")
     " and whose bits have weights "
     (:MATH NIL
      (:MSUP NIL (:MN NIL "2")
       (:MROW NIL (:MI (:FONT :I) "position") (:MO NIL "+")
        (:MI (:FONT :I) "size") (:MO NIL "-") (:MN NIL "1"))))
     " through "
     (:MATH NIL (:MSUP NIL (:MN NIL "2") (:MI (:FONT :I) "position")))
     ", and whose representation is " (:TERM NIL "implementation-dependent")
     ". " :PAR (:FUNREF NIL "byte-size")
     " returns the number of bits specified by " (:PARAM NIL "bytespec") ". "
     :PAR (:FUNREF NIL "byte-position") " returns the position specified by "
     (:PARAM NIL "bytespec") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (setq b (byte 100 200)) → #<BYTE-SPECIFIER size 100 position 200>
 (byte-size b) → 100
 (byte-position b) → 200
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "ldb") ", "
     (:FUNREF NIL "dpb") " " :PAR)
    (:PART (:NAME "Notes") " " (:COMMENT NIL "% 12.8.0 4") :PAR
     (:CODE NIL " (byte-size (byte " (:PARAM NIL "j") " " (:PARAM NIL "k")
      ")) ≡ " (:PARAM NIL "j") "
 (byte-position (byte "
      (:PARAM NIL "j") " " (:PARAM NIL "k") ")) ≡ " (:PARAM NIL "k") "
")
     " " :PAR "A " (:TERM NIL "byte") " of " (:TERM NIL "size") " of "
     (:TT NIL "0") " is permissible; it refers to a " (:TERM NIL "byte")
     " of width zero. For example, " :PAR
     (:CODE NIL " (ldb (byte 0 3) #o7777) → 0
 (dpb #o7777 (byte 0 3) 0) → 0
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DEPOSIT-FIELD")
   (:COM (:NAME "deposit-field" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "deposit-field")
      (:ARGLIST NIL "newbyte bytespec integer") (:VALUES NIL "result-integer"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "newbyte")
     "—an " (:TERM NIL "integer") ". " :PAR (:PARAM NIL "bytespec") "—a "
     (:TERM NIL "byte specifier") ". " :PAR (:PARAM NIL "integer") "—an "
     (:TERM NIL "integer") ". " :PAR (:PARAM NIL "result-integer") "—an "
     (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.8.0 13")
     "Replaces a field of bits within " (:PARAM NIL "integer")
     "; specifically, returns an " (:TERM NIL "integer")
     " that contains the bits of " (:PARAM NIL "newbyte") " within the "
     (:TERM NIL "byte") " specified by " (:PARAM NIL "bytespec")
     ", and elsewhere contains the bits of " (:PARAM NIL "integer") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (deposit-field 7 (byte 2 1) 0) → 6
 (deposit-field -1 (byte 4 0) 0) → 15
 (deposit-field 0 (byte 2 1) -3) → -7
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "byte") ", "
     (:FUNREF NIL "dpb") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (logbitp " (:PARAM NIL "j") " (deposit-field "
      (:PARAM NIL "m") " (byte " (:PARAM NIL "s") " " (:PARAM NIL "p") ") "
      (:PARAM NIL "n") "))
 ≡ (if (and (>= "
      (:PARAM NIL "j") " " (:PARAM NIL "p") ") (< " (:PARAM NIL "j") " (+ "
      (:PARAM NIL "p") " " (:PARAM NIL "s") ")))
        (logbitp "
      (:PARAM NIL "j") " " (:PARAM NIL "m") ")
        (logbitp "
      (:PARAM NIL "j") " " (:PARAM NIL "n") "))
")
     " " :PAR (:FUNREF NIL "deposit-field") " is to "
     (:FUNREF NIL "mask-field") " as " (:FUNREF NIL "dpb") " is to "
     (:FUNREF NIL "ldb") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DPB")
   (:COM (:NAME "dpb" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "dpb")
      (:ARGLIST NIL "newbyte bytespec integer") (:VALUES NIL "result-integer"))
     " " :PAR)
    (:PART (:NAME "Pronunciation") " " :PAR
     (:PRONOUNCED NIL (:LO-STRESS NIL "də ") (:HI-STRESS NIL "pib")) " or "
     (:PRONOUNCED NIL (:LO-STRESS NIL "də ") (:HI-STRESS NIL "pə b")) " or "
     (:PRONOUNCED NIL (:HI-STRESS NIL "dē") (:HI-STRESS NIL "pē")
      (:HI-STRESS NIL "bē"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "newbyte")
     "—an " (:TERM NIL "integer") ". " :PAR (:PARAM NIL "bytespec") "—a "
     (:TERM NIL "byte specifier") ". " :PAR (:PARAM NIL "integer") "—an "
     (:TERM NIL "integer") ". " :PAR (:PARAM NIL "result-integer") "—an "
     (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.8.0 11")
     (:FUNREF NIL "dpb")
     " (deposit byte) is used to replace a field of bits within "
     (:PARAM NIL "integer") ". " (:FUNREF NIL "dpb") " returns an "
     (:TERM NIL "integer") " that is the same as " (:PARAM NIL "integer")
     " except in the bits specified by " (:PARAM NIL "bytespec") ". " :PAR
     "Let " (:TT NIL "s") " be the size specified by " (:PARAM NIL "bytespec")
     "; then the low " (:TT NIL "s") " bits of " (:PARAM NIL "newbyte")
     " appear in the result in the byte specified by " (:PARAM NIL "bytespec")
     ". " (:PARAM NIL "Newbyte")
     " is interpreted as being right-justified, as if it were the result of "
     (:FUNREF NIL "ldb") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (dpb 1 (byte 1 10) 0) → 1024
 (dpb -2 (byte 2 10) 0) → 2048
 (dpb 1 (byte 2 10) 2048) → 1024
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "byte") ", "
     (:FUNREF NIL "deposit-field") ", " (:FUNREF NIL "ldb") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (logbitp " (:PARAM NIL "j") " (dpb " (:PARAM NIL "m")
      " (byte " (:PARAM NIL "s") " " (:PARAM NIL "p") ") " (:PARAM NIL "n") "))
 ≡ (if (and (>= "
      (:PARAM NIL "j") " " (:PARAM NIL "p") ") (< " (:PARAM NIL "j") " (+ "
      (:PARAM NIL "p") " " (:PARAM NIL "s") ")))
        (logbitp (- "
      (:PARAM NIL "j") " " (:PARAM NIL "p") ") " (:PARAM NIL "m") ")
        (logbitp "
      (:PARAM NIL "j") " " (:PARAM NIL "n") "))
")
     " " :PAR "In general, " :PAR
     (:CODE NIL " (dpb " (:PARAM NIL "x") " (byte 0 " (:PARAM NIL "y") ") "
      (:PARAM NIL "z") ") → " (:PARAM NIL "z") "
")
     " " :PAR "for all valid values of " (:PARAM NIL "x") ", " (:PARAM NIL "y")
     ", and " (:PARAM NIL "z") ". " :PAR
     "Historically, the name “dpb” comes from a DEC PDP-10 assembly language instruction meaning “deposit byte.” "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LDB")
   (:COM (:NAME "ldb" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "ldb")
      (:ARGLIST NIL "bytespec integer") (:VALUES NIL "byte"))
     " " :PAR
     (:DEF (:KIND "setf") (:NAMES NIL "ldb") (:ARGLIST NIL "bytespec place")
      (:NEW-VALUE NIL "new-byte"))
     " " :PAR)
    (:PART (:NAME "Pronunciation") " " :PAR
     (:PRONOUNCED NIL (:HI-STRESS NIL "lid") "ib") " or "
     (:PRONOUNCED NIL (:HI-STRESS NIL "lid") "ə b") " or "
     (:PRONOUNCED NIL (:HI-STRESS NIL "el") (:HI-STRESS NIL "dē")
      (:HI-STRESS NIL "bē"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "bytespec")
     "—a " (:TERM NIL "byte specifier") ". " :PAR (:PARAM NIL "integer") "—an "
     (:TERM NIL "integer") ". " :PAR (:PARAM NIL "byte") ", "
     (:PARAM NIL "new-byte") "—a non-negative " (:TERM NIL "integer") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.8.0 5")
     (:FUNREF NIL "ldb") " extracts and returns the " (:TERM NIL "byte") " of "
     (:PARAM NIL "integer") " specified by " (:PARAM NIL "bytespec") ". " :PAR
     (:FUNREF NIL "ldb") " returns an " (:TERM NIL "integer")
     " in which the bits with weights "
     (:MATH NIL
      (:MSUP NIL (:MN NIL "2")
       (:MROW NIL (:MO NIL "(") (:MI (:FONT :I) "s") (:MO NIL "-")
        (:MN NIL "1") (:MO NIL ")"))))
     " through " (:MATH NIL (:MSUP NIL (:MN NIL "2") (:MN NIL "0")))
     " are the same as those in " (:PARAM NIL "integer") " with weights "
     (:MATH NIL
      (:MSUP NIL (:MN NIL "2")
       (:MROW NIL (:MO NIL "(") (:MI (:FONT :I) "p") (:MO NIL "+")
        (:MI (:FONT :I) "s") (:MO NIL "-") (:MN NIL "1") (:MO NIL ")"))))
     " through " (:MATH NIL (:MSUP NIL (:MN NIL "2") (:MI (:FONT :I) "p")))
     ", and all other bits zero; " (:I NIL "s") " is "
     (:TT NIL "(byte-size " (:PARAM NIL "bytespec") ")") " and " (:I NIL "p")
     " is " (:TT NIL "(byte-position " (:PARAM NIL "bytespec") ")") ". " :PAR
     (:COMMENT NIL "% 12.8.0 7") :PAR (:MACREF NIL "setf") " may be used with "
     (:FUNREF NIL "ldb") " to modify a byte within the " (:PARAM NIL "integer")
     " that is stored in a given " (:PARAM NIL "place") ". "
     (:ISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM")
     " The order of evaluation, when an " (:FUNREF NIL "ldb")
     " form is supplied to " (:MACREF NIL "setf")
     ", is exactly left-to-right. " (:IDXTEXT NIL "order of evaluation")
     (:IDXTEXT NIL "evaluation order")
     (:ENDISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM")
     " The effect is to perform a " (:FUNREF NIL "dpb")
     " operation and then store the result back into the " (:PARAM NIL "place")
     ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (ldb (byte 2 1) 10) → 1
 (setq a (list 8)) → (8)
 (setf (ldb (byte 2 1) (car a)) 1) → 1
 a → (10)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "byte") ", "
     (:FUNREF NIL "byte-position") ", " (:FUNREF NIL "byte-size") ", "
     (:FUNREF NIL "dpb") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (logbitp " (:PARAM NIL "j") " (ldb (byte " (:PARAM NIL "s")
      " " (:PARAM NIL "p") ") " (:PARAM NIL "n") "))
    ≡ (and (< "
      (:PARAM NIL "j") " " (:PARAM NIL "s") ") (logbitp (+ " (:PARAM NIL "j")
      " " (:PARAM NIL "p") ") " (:PARAM NIL "n") "))
")
     " " :PAR "In general, " :PAR
     (:CODE NIL " (ldb (byte 0 " (:PARAM NIL "x") ") " (:PARAM NIL "y") ") → 0
")
     " " :PAR "for all valid values of " (:PARAM NIL "x") " and "
     (:PARAM NIL "y") ". " :PAR
     "Historically, the name “ldb” comes from a DEC PDP-10 assembly language instruction meaning “load byte.” "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LDB-TEST")
   (:COM (:NAME "ldb-test" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "ldb-test")
      (:ARGLIST NIL "bytespec integer") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "bytespec")
     "—a " (:TERM NIL "byte specifier") ". " :PAR (:PARAM NIL "integer") "—an "
     (:TERM NIL "integer") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.8.0 8")
     "Returns " (:TERM NIL "true") " if any of the bits of the byte in "
     (:PARAM NIL "integer") " specified by " (:PARAM NIL "bytespec")
     " is non-zero; otherwise returns " (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (ldb-test (byte 4 1) 16) → " (:TERM NIL "true") "
 (ldb-test (byte 3 1) 16) → "
      (:TERM NIL "false") "
 (ldb-test (byte 3 2) 16) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "byte") ", "
     (:FUNREF NIL "ldb") ", " (:FUNREF NIL "zerop") " " :PAR)
    (:PART (:NAME "Notes") " "
     (:CODE NIL " (ldb-test bytespec n) ≡
 (not (zerop (ldb bytespec n))) ≡
 (logtest (ldb bytespec -1) n)
")
     " "
     (:COMMENT NIL
      "Item 3 of that equivalence contributed by Barmar. -kmp 16-Jul-91")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MASK-FIELD")
   (:COM (:NAME "mask-field" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "mask-field")
      (:ARGLIST NIL "bytespec integer") (:VALUES NIL "masked-integer"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "mask-field")
      (:ARGLIST NIL "bytespec place") (:NEW-VALUE NIL "new-masked-integer"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "bytespec")
     "—a " (:TERM NIL "byte specifier") ". " :PAR (:PARAM NIL "integer") "—an "
     (:TERM NIL "integer") ". " :PAR (:PARAM NIL "masked-integer") ", "
     (:PARAM NIL "new-masked-integer") "—a non-negative " (:TERM NIL "integer")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.8.0 9")
     (:FUNREF NIL "mask-field") " performs a “mask” operation on "
     (:PARAM NIL "integer") ". It returns an " (:TERM NIL "integer")
     " that has the same bits as " (:PARAM NIL "integer") " in the "
     (:TERM NIL "byte") " specified by " (:PARAM NIL "bytespec")
     ", but that has zero-bits everywhere else. " :PAR
     (:COMMENT NIL "% 12.8.0 10") (:MACREF NIL "setf") " may be used with "
     (:FUNREF NIL "mask-field") " to modify a byte within the "
     (:TERM NIL "integer") " that is stored in a given " (:PARAM NIL "place")
     ". The effect is to perform a " (:FUNREF NIL "deposit-field")
     " operation and then store the result back into the " (:PARAM NIL "place")
     ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (mask-field (byte 1 5) -1) → 32
 (setq a 15) → 15
 (mask-field (byte 2 0) a) → 3
 a → 15
 (setf (mask-field (byte 2 0) a) 1) → 1
 a → 13
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "byte") ", "
     (:FUNREF NIL "ldb") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (ldb " (:PARAM NIL "bs") " (mask-field " (:PARAM NIL "bs")
      " " (:PARAM NIL "n") ")) ≡ (ldb " (:PARAM NIL "bs") " " (:PARAM NIL "n")
      ")
 (logbitp "
      (:PARAM NIL "j") " (mask-field (byte " (:PARAM NIL "s") " "
      (:PARAM NIL "p") ") " (:PARAM NIL "n") "))
   ≡ (and (>= "
      (:PARAM NIL "j") " " (:PARAM NIL "p") ") (< " (:PARAM NIL "j") " "
      (:PARAM NIL "s") ") (logbitp " (:PARAM NIL "j") " " (:PARAM NIL "n") "))
 (mask-field "
      (:PARAM NIL "bs") " " (:PARAM NIL "n") ") ≡ (logand " (:PARAM NIL "n")
      " (dpb -1 " (:PARAM NIL "bs") " 0))
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "-------------------- Fixnum --------------------")
   :PAR
   (:COMMENT NIL "%% ========== MOST-POSITIVE-FIXNUM"
    "%% ========== MOST-NEGATIVE-FIXNUM")
   (:COM
    (:NAME "most-positive-fixnum, most-negative-fixnum" :FTYPE
     "Constant Variable")
    (:PART (:NAME "Constant Value") " " :PAR
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 12.10.0 1" "% 12.10.0 2")
     (:CONREF NIL "most-positive-fixnum") " is that " (:TERM NIL "fixnum")
     " closest in value to positive infinity provided by the implementation, "
     (:ISSUE NIL "FIXNUM-NON-PORTABLE:TIGHTEN-DEFINITION")
     " and greater than or equal to both "
     (:MATH NIL (:MSUP NIL (:MN NIL "2") (:MN NIL "15"))) " - 1 and "
     (:CONREF NIL "array-dimension-limit") ". "
     (:ENDISSUE NIL "FIXNUM-NON-PORTABLE:TIGHTEN-DEFINITION") " " :PAR
     (:COMMENT NIL "% 12.10.0 4") (:CONREF NIL "most-negative-fixnum")
     " is that " (:TERM NIL "fixnum")
     " closest in value to negative infinity provided by the implementation, "
     (:ISSUE NIL "FIXNUM-NON-PORTABLE:TIGHTEN-DEFINITION")
     " and less than or equal to "
     (:MATH NIL (:MO NIL "-") (:MSUP NIL (:MN NIL "2") (:MN NIL "15"))) ". "
     (:ENDISSUE NIL "FIXNUM-NON-PORTABLE:TIGHTEN-DEFINITION") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "-------------------- Ratio --------------------")
   :PAR (:COMMENT NIL "-------------------- Float --------------------") :PAR
   (:COMMENT NIL "%% ========== DECODE-FLOAT" "%% ========== SCALE-FLOAT"
    "%% ========== FLOAT-RADIX" "%% ========== FLOAT-SIGN"
    "%% ========== FLOAT-DIGITS" "%% ========== FLOAT-PRECISION"
    "%% ========== INTEGER-DECODE-FLOAT")
   (:COM
    (:NAME
     "decode-float, scale-float, float-radix, float-sign, float-digits, float-precision, integer-decode-float"
     :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "decode-float")
      (:ARGLIST NIL "float") (:VALUES NIL "significand, exponent, sign"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "scale-float")
      (:ARGLIST NIL "float integer") (:VALUES NIL "scaled-float"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "float-radix") (:ARGLIST NIL "float")
      (:VALUES NIL "float-radix"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "float-sign")
      (:ARGLIST NIL "float-1 " (:KEYWORD NIL " &optional") " float-2")
      (:VALUES NIL "signed-float"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "float-digits")
      (:ARGLIST NIL "float") (:VALUES NIL "digits1"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "float-precision")
      (:ARGLIST NIL "float") (:VALUES NIL "digits2"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "integer-decode-float")
      (:ARGLIST NIL "float")
      (:VALUES NIL "significand, exponent, integer-sign"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "digits1")
     "—a non-negative " (:TERM NIL "integer") ". " :PAR (:PARAM NIL "digits2")
     "—a non-negative " (:TERM NIL "integer") ". " :PAR (:PARAM NIL "exponent")
     "—an " (:TERM NIL "integer") ". " :PAR (:PARAM NIL "float") "—a "
     (:TERM NIL "float") ". " :PAR (:PARAM NIL "float-1") "—a "
     (:TERM NIL "float") ". " :PAR (:PARAM NIL "float-2") "—a "
     (:TERM NIL "float") ". " :PAR (:PARAM NIL "float-radix") "—an "
     (:TERM NIL "integer") ". " :PAR (:PARAM NIL "integer") "—a non-negative "
     (:TERM NIL "integer") ". " :PAR (:PARAM NIL "integer-sign") "—the "
     (:TERM NIL "integer") " " (:TT NIL "-1") ", or the " (:TERM NIL "integer")
     " " (:TT NIL "1") ". " :PAR (:PARAM NIL "scaled-float") "—a "
     (:TERM NIL "float") ". " :PAR (:PARAM NIL "sign") "—A "
     (:TERM NIL "float") " of the same " (:TERM NIL "type") " as "
     (:PARAM NIL "float") " but numerically equal to " (:TT NIL "1.0") " or "
     (:TT NIL "-1.0") ". " :PAR (:PARAM NIL "signed-float") "—a "
     (:TERM NIL "float") ". " :PAR (:PARAM NIL "significand") "—a "
     (:TERM NIL "float") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 12.6.0 27" "% 12.6.0 28") (:FUNREF NIL "decode-float")
     " computes three values that characterize " (:PARAM NIL "float")
     ". The first value is of the same " (:TERM NIL "type") " as "
     (:PARAM NIL "float")
     " and represents the significand. The second value represents the exponent to which the radix (notated in this description by "
     (:I NIL "b")
     ") must be raised to obtain the value that, when multiplied with the first result, produces the absolute value of "
     (:PARAM NIL "float") ". If " (:PARAM NIL "float") " is zero, any "
     (:TERM NIL "integer")
     " value may be returned, provided that the identity shown for "
     (:FUNREF NIL "scale-float") " holds. The third value is of the same "
     (:TERM NIL "type") " as " (:PARAM NIL "float") " and is 1.0 if "
     (:PARAM NIL "float")
     " is greater than or equal to zero or -1.0 otherwise. " :PAR
     (:FUNREF NIL "decode-float") " divides " (:PARAM NIL "float")
     " by an integral power of " (:I NIL "b")
     " so as to bring its value between "
     (:MATH NIL (:MN NIL "1") (:MO NIL "/") (:MI (:FONT :I) "b"))
     " (inclusive) and " (:MATH NIL (:MN NIL "1"))
     " (exclusive), and returns the quotient as the first value. If "
     (:PARAM NIL "float")
     " is zero, however, the result equals the absolute value of "
     (:PARAM NIL "float")
     " (that is, if there is a negative zero, its significand is considered to be a positive zero). "
     :PAR (:COMMENT NIL "% 12.6.0 29") (:FUNREF NIL "scale-float") " returns "
     (:TT NIL " (* " (:PARAM NIL "float") " (expt (float " (:I NIL "b") " "
      (:PARAM NIL "float") ") " (:PARAM NIL "integer") "))")
     ", where " (:I NIL "b")
     " is the radix of the floating-point representation. "
     (:PARAM NIL "float") " is not necessarily between "
     (:MATH NIL (:MN NIL "1") (:MO NIL "/") (:MI (:FONT :I) "b")) " and "
     (:MATH NIL (:MN NIL "1")) ". " :PAR
     (:COMMENT NIL "% 12.6.0 31              ") (:FUNREF NIL "float-radix")
     " returns the radix of " (:PARAM NIL "float") ". " :PAR
     (:COMMENT NIL "% 12.6.0 32") (:FUNREF NIL "float-sign")
     " returns a number " (:TT NIL "z") " such that " (:TT NIL "z") " and "
     (:PARAM NIL "float-1") " have the same sign and also such that "
     (:TT NIL "z") " and " (:PARAM NIL "float-2")
     " have the same absolute value. If " (:PARAM NIL "float-2")
     " is not supplied, its value is "
     (:TT NIL "(float 1 " (:PARAM NIL "float-1") ")") ". "
     (:COMMENT NIL "% Barmar says this is redundant. I agree. -kmp 28-Dec-90"
      " \\f{(float-sign x)} produces a \\f{1.0} or \\f{-1.0}"
      " of appropriate format"
      " according to the sign of \\f{x} if \\param{float-2} is not supplied.")
     "If an implementation has distinct representations for negative zero and positive zero, then "
     (:TT NIL "(float-sign -0.0)") " → " (:TT NIL "-1.0") ". " :PAR
     (:COMMENT NIL "% 12.6.0 33") (:FUNREF NIL "float-digits")
     " returns the number of radix " (:I NIL "b")
     " digits used in the representation of " (:PARAM NIL "float")
     " (including any implicit digits, such as a “hidden bit”). " :PAR
     (:FUNREF NIL "float-precision")
     " returns the number of significant radix " (:I NIL "b")
     " digits present in " (:PARAM NIL "float") "; if " (:PARAM NIL "float")
     " is a " (:TERM NIL "float") " zero, then the result is an "
     (:TERM NIL "integer") " zero. " :PAR "For " (:TERM NIL "normalized") " "
     (:TERM NIL "floats") ", the results of " (:FUNREF NIL "float-digits")
     " and " (:FUNREF NIL "float-precision")
     " are the same, but the precision is less than the number of representation digits for a "
     (:TERM NIL "denormalized") " or zero number. " :PAR
     (:COMMENT NIL "% 12.6.0 34" "% 12.6.0 35" "% 12.6.0 36")
     (:FUNREF NIL "integer-decode-float")
     " computes three values that characterize " (:PARAM NIL "float")
     " - the significand scaled so as to be an " (:TERM NIL "integer")
     ", and the same last two values that are returned by "
     (:FUNREF NIL "decode-float") ". If " (:PARAM NIL "float") " is zero, "
     (:FUNREF NIL "integer-decode-float")
     " returns zero as the first value. The second value bears the same relationship to the first value as for "
     (:FUNREF NIL "decode-float") ": " :PAR
     (:CODE NIL " (multiple-value-bind (signif expon sign)
                      (integer-decode-float f)
   (scale-float (float signif f) expon)) ≡ (abs f)
")
     " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " ;; Note that since the purpose of this functionality is to expose
 ;; details of the implementation, all of these examples are necessarily
 ;; very implementation-dependent.  Results may vary widely.
 ;; Values shown here are chosen consistently from one particular implementation.
 (decode-float .5) → 0.5, 0, 1.0
 (decode-float 1.0) → 0.5, 1, 1.0
 (scale-float 1.0 1) → 2.0
 (scale-float 10.01 -2) → 2.5025
 (scale-float 23.0 0) → 23.0
 (float-radix 1.0) → 2
 (float-sign 5.0) → 1.0
 (float-sign -5.0) → -1.0
 (float-sign 0.0) → 1.0
 (float-sign 1.0 0.0) → 0.0
 (float-sign 1.0 -10.0) → 10.0
 (float-sign -1.0 10.0) → -10.0
 (float-digits 1.0) → 24
 (float-precision 1.0) → 24
 (float-precision least-positive-single-float) → 1
 (integer-decode-float 1.0) → 8388608, -23, 1
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "The implementation's representation for " (:TERM NIL "floats") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "The functions "
     (:FUNREF NIL "decode-float") ", " (:FUNREF NIL "float-radix") ", "
     (:FUNREF NIL "float-digits") ", " (:FUNREF NIL "float-precision") ", and "
     (:FUNREF NIL "integer-decode-float")
     " should signal an error if their only argument is not a "
     (:TERM NIL "float") ". " :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "scale-float")
     " should signal an error if its first argument is not a "
     (:TERM NIL "float") " or if its second argument is not an "
     (:TERM NIL "integer") ". " :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "float-sign")
     " should signal an error if its first argument is not a "
     (:TERM NIL "float") " or if its second argument is supplied but is not a "
     (:TERM NIL "float") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The product of the first result of "
     (:FUNREF NIL "decode-float") " or " (:FUNREF NIL "integer-decode-float")
     ", of the radix raised to the power of the second result, and of the third result is exactly equal to the value of "
     (:PARAM NIL "float") ". " :PAR (:COMMENT NIL "% 12.6.0 30")
     (:CODE NIL " (multiple-value-bind (signif expon sign)
                      (decode-float f)
   (scale-float signif expon))
≡ (abs f)
")
     " and " :PAR
     (:CODE NIL " (multiple-value-bind (signif expon sign)
                      (decode-float f)
   (* (scale-float signif expon) sign))
≡ f
")
     " "))
   " " :PAR (:COMMENT NIL "%% ========== FLOAT")
   (:COM (:NAME "float" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "float")
      (:ARGLIST NIL "number " (:KEYWORD NIL " &optional") " prototype")
      (:VALUES NIL "float"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "number") "—a "
     (:TERM NIL "real") ". " :PAR (:PARAM NIL "prototype") "—a "
     (:TERM NIL "float") ". " :PAR (:PARAM NIL "float") "—a "
     (:TERM NIL "float") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 12.6.0 4")
     (:FUNREF NIL "float") " converts a "
     (:ISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " " (:TERM NIL "real") " "
     (:ENDISSUE NIL "REAL-NUMBER-TYPE:X3J13-MAR-89") " number to a "
     (:TERM NIL "float") ". " :PAR "If a " (:PARAM NIL "prototype")
     " is supplied, a " (:TERM NIL "float")
     " is returned that is mathematically equal to " (:PARAM NIL "number")
     " but has the same format as " (:PARAM NIL "prototype") ". " :PAR "If "
     (:PARAM NIL "prototype") " is not supplied, then if the "
     (:PARAM NIL "number") " is already a " (:TERM NIL "float")
     ", it is returned; otherwise, a " (:TERM NIL "float")
     " is returned that is mathematically equal to " (:PARAM NIL "number")
     " but is a " (:TERM NIL "single float") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (float 0) → 0.0
 (float 1 .5) → 1.0
 (float 1.0) → 1.0
 (float 1/2) → 0.5
→ 1.0d0
OR→ 1.0
 (eql (float 1.0 1.0d0) 1.0d0) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "coerce") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FLOATP")
   (:COM (:NAME "floatp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "floatp") (:ARGLIST NIL "object"))
     " generalized-boolean " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 15")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "float") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (floatp 1.2d2) → " (:TERM NIL "true") "
 (floatp 1.212) → "
      (:TERM NIL "true") "
 (floatp 1.2s2) → "
      (:TERM NIL "true") "
 (floatp (expt 2 130)) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (floatp " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'float)
")
     " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Float Subtypes --------------------")
   :PAR
   (:COMMENT NIL "%% ========== LEAST-NEGATIVE-DOUBLE-FLOAT"
    "%% ========== LEAST-NEGATIVE-NORMALIZED-DOUBLE-FLOAT"
    "%% ========== LEAST-NEGATIVE-LONG-FLOAT"
    "%% ========== LEAST-NEGATIVE-NORMALIZED-LONG-FLOAT"
    "%% ========== LEAST-NEGATIVE-SHORT-FLOAT"
    "%% ========== LEAST-NEGATIVE-NORMALIZED-SHORT-FLOAT"
    "%% ========== LEAST-NEGATIVE-SINGLE-FLOAT"
    "%% ========== LEAST-NEGATIVE-NORMALIZED-SINGLE-FLOAT"
    "%% ========== LEAST-POSITIVE-DOUBLE-FLOAT"
    "%% ========== LEAST-POSITIVE-NORMALIZED-DOUBLE-FLOAT"
    "%% ========== LEAST-POSITIVE-LONG-FLOAT"
    "%% ========== LEAST-POSITIVE-NORMALIZED-LONG-FLOAT"
    "%% ========== LEAST-POSITIVE-SHORT-FLOAT"
    "%% ========== LEAST-POSITIVE-NORMALIZED-SHORT-FLOAT"
    "%% ========== LEAST-POSITIVE-SINGLE-FLOAT"
    "%% ========== LEAST-POSITIVE-NORMALIZED-SINGLE-FLOAT"
    "%% ========== MOST-NEGATIVE-DOUBLE-FLOAT"
    "%% ========== MOST-NEGATIVE-LONG-FLOAT"
    "%% ========== MOST-NEGATIVE-SHORT-FLOAT"
    "%% ========== MOST-NEGATIVE-SINGLE-FLOAT"
    "%% ========== MOST-POSITIVE-DOUBLE-FLOAT"
    "%% ========== MOST-POSITIVE-LONG-FLOAT"
    "%% ========== MOST-POSITIVE-SHORT-FLOAT"
    "%% ========== MOST-POSITIVE-SINGLE-FLOAT")
   (:COM
    (:NAME
     "most-positive-short-float, least-positive-short-float, least-positive-normalized-short-float, most-positive-double-float, least-positive-double-float, least-positive-normalized-double-float, most-positive-long-float, least-positive-long-float, least-positive-normalized-long-float, most-positive-single-float, least-positive-single-float, least-positive-normalized-single-float, most-negative-short-float, least-negative-short-float, least-negative-normalized-short-float, most-negative-single-float, least-negative-single-float, least-negative-normalized-single-float, most-negative-double-float, least-negative-double-float, least-negative-normalized-double-float, most-negative-long-float, least-negative-long-float, least-negative-normalized-long-float"
     :FTYPE "Constant Variable")
    (:ISSUE NIL "FLOAT-UNDERFLOW:ADD-VARIABLES") " " :PAR
    (:PART (:NAME "Constant Value") " " :PAR
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Description") " " (:COMMENT NIL "% 12.10.0 9") :PAR "These "
     (:TERM NIL "constant variables")
     " provide a way for programs to examine the "
     (:TERM NIL "implementation-defined")
     " limits for the various float formats. " :PAR "Of these "
     (:TERM NIL "variables") ", each which has “" (:TT NIL "-normalized")
     "” in its " (:TERM NIL "name") " must have a " (:TERM NIL "value")
     " which is a " (:TERM NIL "normalized") " " (:TERM NIL "float")
     ", and each which does not have “" (:TT NIL "-normalized")
     "” in its name may have a " (:TERM NIL "value") " which is either a "
     (:TERM NIL "normalized") " " (:TERM NIL "float") " or a "
     (:TERM NIL "denormalized") " " (:TERM NIL "float") ", as appropriate. "
     :PAR "Of these " (:TERM NIL "variables") ", each which has “"
     (:TT NIL "short-float") "” in its name must have a " (:TERM NIL "value")
     " which is a " (:TERM NIL "short float") ", each which has “"
     (:TT NIL "single-float") "” in its name must have a " (:TERM NIL "value")
     " which is a " (:TERM NIL "single float") ", each which has “"
     (:TT NIL "double-float") "” in its name must have a " (:TERM NIL "value")
     " which is a " (:TERM NIL "double float") ", and each which has “"
     (:TT NIL "long-float") "” in its name must have a " (:TERM NIL "value")
     " which is a " (:TERM NIL "long float") ". " :PAR
     (:LIST NIL
      (:ITEM NIL " " (:CONREF NIL "most-positive-short-float") ", "
       (:CONREF NIL "most-positive-single-float") ", "
       (:CONREF NIL "most-positive-double-float") ", "
       (:CONREF NIL "most-positive-long-float") " " :PAR " " :PAR
       "Each of these " (:TERM NIL "constant variables") " has as its "
       (:TERM NIL "value") " the positive " (:TERM NIL "float")
       " of the largest magnitude (closest in value to, but not equal to, positive infinity) for the float format implied by its name. "
       :PAR)
      (:ITEM NIL " " (:CONREF NIL "least-positive-short-float") ", "
       (:CONREF NIL "least-positive-normalized-short-float") ", "
       (:CONREF NIL "least-positive-single-float") ", "
       (:CONREF NIL "least-positive-normalized-single-float") ", "
       (:CONREF NIL "least-positive-double-float") ", "
       (:CONREF NIL "least-positive-normalized-double-float") ", "
       (:CONREF NIL "least-positive-long-float") ", "
       (:CONREF NIL "least-positive-normalized-long-float") " " :PAR " " :PAR
       "Each of these " (:TERM NIL "constant variables") " has as its "
       (:TERM NIL "value") " the smallest positive (nonzero) "
       (:TERM NIL "float") " for the float format implied by its name. " :PAR)
      (:ITEM NIL " " (:CONREF NIL "least-negative-short-float") ", "
       (:CONREF NIL "least-negative-normalized-short-float") ", "
       (:CONREF NIL "least-negative-single-float") ", "
       (:CONREF NIL "least-negative-normalized-single-float") ", "
       (:CONREF NIL "least-negative-double-float") ", "
       (:CONREF NIL "least-negative-normalized-double-float") ", "
       (:CONREF NIL "least-negative-long-float") ", "
       (:CONREF NIL "least-negative-normalized-long-float") " " :PAR " " :PAR
       "Each of these " (:TERM NIL "constant variables") " has as its "
       (:TERM NIL "value") " the negative (nonzero) " (:TERM NIL "float")
       " of the smallest magnitude for the float format implied by its name. (If an implementation supports minus zero as a "
       (:TERM NIL "different") " " (:TERM NIL "object")
       " from positive zero, this value must not be minus zero.) " :PAR)
      (:ITEM NIL " " (:CONREF NIL "most-negative-short-float") ", "
       (:CONREF NIL "most-negative-single-float") ", "
       (:CONREF NIL "most-negative-double-float") ", "
       (:CONREF NIL "most-negative-long-float") " " :PAR " " :PAR
       "Each of these " (:TERM NIL "constant variables") " has as its "
       (:TERM NIL "value") " the negative " (:TERM NIL "float")
       " of the largest magnitude (closest in value to, but not equal to, negative infinity) for the float format implied by its name. "
       :PAR))
     " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:ENDISSUE NIL "FLOAT-UNDERFLOW:ADD-VARIABLES") " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== SHORT-FLOAT-EPSILON"
    "%% ========== SHORT-FLOAT-NEGATIVE-EPSILON"
    "%% ========== SINGLE-FLOAT-EPSILON"
    "%% ========== SINGLE-FLOAT-NEGATIVE-EPSILON"
    "%% ========== DOUBLE-FLOAT-EPSILON"
    "%% ========== DOUBLE-FLOAT-NEGATIVE-EPSILON"
    "%% ========== LONG-FLOAT-EPSILON"
    "%% ========== LONG-FLOAT-NEGATIVE-EPSILON")
   (:COM
    (:NAME
     "short-float-epsilon, short-float-negative-epsilon, single-float-epsilon, single-float-negative-epsilon, double-float-epsilon, double-float-negative-epsilon, long-float-epsilon, long-float-negative-epsilon"
     :FTYPE "Constant Variable")
    (:PART (:NAME "Constant Value") " " :PAR (:COMMENT NIL "% 12.10.0 10")
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The value of each of the constants "
     (:CONREF NIL "short-float-epsilon") ", "
     (:CONREF NIL "single-float-epsilon") ", "
     (:CONREF NIL "double-float-epsilon") ", and "
     (:CONREF NIL "long-float-epsilon") " is the smallest positive "
     (:TERM NIL "float") " " (:MATH NIL (:MI NIL "ε"))
     " of the given format, such that the following expression is "
     (:TERM NIL "true") " when evaluated: " :PAR
     (:TT NIL " (not (= (float 1 " (:MATH NIL (:MI NIL "ε")) ") (+ (float 1 "
      (:MATH NIL (:MI NIL "ε")) ") " (:MATH NIL (:MI NIL "ε")) ")))")
     " " :PAR "The value of each of the constants "
     (:CONREF NIL "short-float-negative-epsilon") ", "
     (:CONREF NIL "single-float-negative-epsilon") ", "
     (:CONREF NIL "double-float-negative-epsilon") ", and "
     (:CONREF NIL "long-float-negative-epsilon") " is the smallest positive "
     (:TERM NIL "float") " " (:MATH NIL (:MI NIL "ε"))
     " of the given format, such that the following expression is "
     (:TERM NIL "true") " when evaluated: " :PAR
     (:TT NIL " (not (= (float 1 " (:MATH NIL (:MI NIL "ε")) ") (- (float 1 "
      (:MATH NIL (:MI NIL "ε")) ") " (:MATH NIL (:MI NIL "ε")) ")))")
     " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ARITHMETIC-ERROR")
   (:COM (:NAME "arithmetic-error" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " "
     (:TYPEREF NIL "arithmetic-error") ", " (:TYPEREF NIL "error") ", "
     (:TYPEREF NIL "serious-condition") ", " (:TYPEREF NIL "condition") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "arithmetic-error")
     " consists of error conditions that occur during arithmetic operations. The operation and operands are initialized with the initialization arguments named "
     (:KWD NIL "operation") " and " (:KWD NIL "operands") " to "
     (:FUNREF NIL "make-condition") ", and are " (:TERM NIL "accessed")
     " by the functions " (:FUNREF NIL "arithmetic-error-operation") " and "
     (:FUNREF NIL "arithmetic-error-operands") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:FUNREF NIL "arithmetic-error-operation") ", "
     (:FUNREF NIL "arithmetic-error-operands") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== ARITHMETIC-ERROR-OPERANDS")
   (:COM
    (:NAME "arithmetic-error-operands, arithmetic-error-operation" :FTYPE
     "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "arithmetic-error-operands")
      (:ARGLIST NIL "condition") (:VALUES NIL "operands"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "arithmetic-error-operation")
      (:ARGLIST NIL "condition") (:VALUES NIL "operation"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "condition")
     "—a " (:TERM NIL "condition") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "arithmetic-error") ". " :PAR (:PARAM NIL "operands") "—a "
     (:TERM NIL "list") ". " :PAR (:PARAM NIL "operation") "—a "
     (:TERM NIL "function designator") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:FUNREF NIL "arithmetic-error-operands") " returns a " (:TERM NIL "list")
     " of the operands which were used in the offending call to the operation that signaled the "
     (:PARAM NIL "condition") ". " :PAR
     (:FUNREF NIL "arithmetic-error-operation") " returns a "
     (:TERM NIL "list")
     " of the offending operation in the offending call that signaled the "
     (:PARAM NIL "condition") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:TYPEREF NIL "arithmetic-error") ", "
     (:CHAPREF NIL :CONDITIONS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL "%Shouldn't be needed any more. -kmp 1-Sep-91"
      "It is an error to use \\macref{setf} with \\funref{arithmetic-error-operands}.")
     :PAR))
   " " :PAR
   (:COM (:NAME "division-by-zero" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " "
     (:TYPEREF NIL "division-by-zero") ", " (:TYPEREF NIL "arithmetic-error")
     ", " (:TYPEREF NIL "error") ", " (:TYPEREF NIL "serious-condition") ", "
     (:TYPEREF NIL "condition") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "division-by-zero")
     " consists of error conditions that occur because of division by zero. "
     :PAR))
   :PAR
   (:COMMENT NIL "!!! ACW: A statement of the intended difference between"
    "         FLOATING-POINT-INVALID-OPERATION and FLOATING-POINT-INEXACT would be helpful.")
   (:COM (:NAME "floating-point-invalid-operation" :FTYPE "Condition Type")
    (:ISSUE NIL "FLOATING-POINT-CONDITION-NAMES:X3J13-NOV-89") " " :PAR
    (:PART (:NAME "Class Precedence List") " "
     (:TYPEREF NIL "floating-point-invalid-operation") ", "
     (:TYPEREF NIL "arithmetic-error") ", " (:TYPEREF NIL "error") ", "
     (:TYPEREF NIL "serious-condition") ", " (:TYPEREF NIL "condition") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "floating-point-invalid-operation")
     " consists of error conditions that occur because of certain "
     (:COMMENT NIL "!!! Barmar: which?") "floating point traps. " :PAR "It is "
     (:TERM NIL "implementation-dependent")
     " whether floating point traps occur, and whether or how they may be enabled or disabled. Therefore, conforming code may establish handlers for this condition, but must not depend on its being "
     (:TERM NIL "signaled") ". " :PAR
     (:ENDISSUE NIL "FLOATING-POINT-CONDITION-NAMES:X3J13-NOV-89") " " :PAR))
   :PAR
   (:COM (:NAME "floating-point-inexact" :FTYPE "Condition Type")
    (:ISSUE NIL "FLOATING-POINT-CONDITION-NAMES:X3J13-NOV-89") " " :PAR
    (:PART (:NAME "Class Precedence List") " "
     (:TYPEREF NIL "floating-point-inexact") ", "
     (:TYPEREF NIL "arithmetic-error") ", " (:TYPEREF NIL "error") ", "
     (:TYPEREF NIL "serious-condition") ", " (:TYPEREF NIL "condition") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "floating-point-inexact")
     " consists of error conditions that occur because of certain "
     (:COMMENT NIL "!!! Barmar: Which?") "floating point traps. " :PAR "It is "
     (:TERM NIL "implementation-dependent")
     " whether floating point traps occur, and whether or how they may be enabled or disabled. Therefore, conforming code may establish handlers for this condition, but must not depend on its being "
     (:TERM NIL "signaled") ". " :PAR
     (:ENDISSUE NIL "FLOATING-POINT-CONDITION-NAMES:X3J13-NOV-89") " " :PAR))
   :PAR
   (:COM (:NAME "floating-point-overflow" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " "
     (:TYPEREF NIL "floating-point-overflow") ", "
     (:TYPEREF NIL "arithmetic-error") ", " (:TYPEREF NIL "error") ", "
     (:TYPEREF NIL "serious-condition") ", " (:TYPEREF NIL "condition") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "floating-point-overflow")
     " consists of error conditions that occur because of floating-point overflow. "
     :PAR))
   :PAR
   (:COM (:NAME "floating-point-underflow" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " "
     (:TYPEREF NIL "floating-point-underflow") ", "
     (:TYPEREF NIL "arithmetic-error") ", " (:TYPEREF NIL "error") ", "
     (:TYPEREF NIL "serious-condition") ", " (:TYPEREF NIL "condition") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "floating-point-underflow")
     " consists of error conditions that occur because of floating-point underflow. "
     :PAR))
   :PAR)
  " " :PAR)
 (:CHAPTER
  (:NUM "13" :TITLE ("Characters") :NUMTAG :CHAP-THIRTEEN :NAMETAG :CHARACTERS)
  (:SECTION (:TITLE ("Character Concepts") :TAGS (:CHARACTER-CONCEPTS)) " "
   :PAR
   (:SUBSECTION (:TITLE ("Introduction to Characters") :TAGS (:INTRO-TO-CHARS))
    " " :PAR "A " (:NEWTERM NIL "character") " is an " (:TERM NIL "object")
    " that represents a unitary token (" (:I NIL "e.g.")
    ",  a letter, a special symbol, or a “control character”) in an aggregate quantity of text ("
    (:I NIL "e.g.") ",  a " (:TERM NIL "string") " or a text "
    (:TERM NIL "stream") "). " :PAR (:ISSUE NIL "CHARACTER-PROPOSAL:2-6-1") " "
    (:RM NIL " Common Lisp")
    " allows an implementation to provide support for international language "
    (:TERM NIL "characters") " as well as " (:TERM NIL "characters")
    " used in specialized arenas (" (:I NIL "e.g.") ",  mathematics). "
    (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-6-1") " " :PAR
    "The following figures contain lists of " (:TERM NIL "defined names")
    " applicable to " (:TERM NIL "characters") ". " :PAR
    (:NEXTFIGURE (:CAPS T)) " lists some " (:TERM NIL "defined names")
    " relating to " (:TERM NIL "character") " " (:TERM NIL "attributes")
    " and " (:TERM NIL "character") " " (:TERM NIL "predicates") ". " :PAR
    (:TABLE (:NAME ("Character defined names – 1"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " alpha-char-p"))
      (:CELL NIL (:FUNREF NIL "char-not-equal"))
      (:CELL NIL (:FUNREF NIL "char>")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " alphanumericp"))
      (:CELL NIL (:FUNREF NIL "char-not-greaterp"))
      (:CELL NIL (:FUNREF NIL "char>=")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " both-case-p"))
      (:CELL NIL (:FUNREF NIL "char-not-lessp"))
      (:CELL NIL (:FUNREF NIL "digit-char-p")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " char-code-limit"))
      (:CELL NIL (:FUNREF NIL "char/="))
      (:CELL NIL (:FUNREF NIL "graphic-char-p")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " char-equal"))
      (:CELL NIL (:FUNREF NIL "char<"))
      (:CELL NIL (:FUNREF NIL "lower-case-p")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " char-greaterp"))
      (:CELL NIL (:FUNREF NIL "char<="))
      (:CELL NIL (:FUNREF NIL "standard-char-p")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " char-lessp"))
      (:CELL NIL (:FUNREF NIL "char="))
      (:CELL NIL (:FUNREF NIL "upper-case-p"))))
    " " :PAR (:NEXTFIGURE (:CAPS T)) " lists some " (:TERM NIL "character")
    " construction and conversion " (:TERM NIL "defined names") ". " :PAR
    (:TABLE (:NAME ("Character defined names – 2"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " char-code"))
      (:CELL NIL (:FUNREF NIL "char-name"))
      (:CELL NIL (:FUNREF NIL "code-char")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " char-downcase"))
      (:CELL NIL (:FUNREF NIL "char-upcase"))
      (:CELL NIL (:FUNREF NIL "digit-char")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " char-int"))
      (:CELL NIL (:FUNREF NIL "character"))
      (:CELL NIL (:FUNREF NIL "name-char"))))
    " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Introduction to Scripts and Repertoires"))
    (:SUBSUBSECTION (:TITLE ("Character Scripts") :TAGS (:CHAR-SCRIPTS)) " "
     :PAR "A " (:TERM NIL "script")
     " is one of possibly several sets that form an "
     (:TERM NIL "exhaustive partition") " of the type "
     (:TYPEREF NIL "character") ". " :PAR
     "The number of such sets and boundaries between them is "
     (:TERM NIL "implementation-defined") ". " (:RM NIL " Common Lisp")
     " does not require these sets to be " (:TERM NIL "types") ", but an "
     (:TERM NIL "implementation") " is permitted to define such "
     (:TERM NIL "types") " as an extension. Since no " (:TERM NIL "character")
     " from one " (:TERM NIL "script") " can ever be a member of another "
     (:TERM NIL "script") ", it is generally more useful to speak about "
     (:TERM NIL "character") " " (:TERM NIL "repertoires") ". " :PAR
     (:ISSUE NIL "LINDEN-COMMENTS-ON-CHARACTERS:X3J13-APR-92") " "
     (:COMMENT NIL
      " For some examples of \\term{repertoires}, see the coded character standards"
      " ISO 8859/1, ISO 8859/2, and ISO 6937/2."
      " Note, however, that although")
     "Although the term “" (:TERM NIL "script") "” is chosen for "
     (:COMMENT NIL "naming")
     "definitional compatibility with ISO terminology, no "
     (:TERM NIL "conforming implementation")
     " is required to use any particular " (:TERM NIL "scripts")
     " standardized by ISO or by any other standards organization. "
     (:ENDISSUE NIL "LINDEN-COMMENTS-ON-CHARACTERS:X3J13-APR-92") " " :PAR
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-4-1") " Whether and how the "
     (:TERM NIL "script") " or " (:TERM NIL "scripts") " used by any given "
     (:TERM NIL "implementation") " are named is "
     (:TERM NIL "implementation-dependent") ". "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-4-1") " " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Character Repertoires") :TAGS (:CHAR-REPERTOIRES)) " " :PAR
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-4-3") " A " (:NEWTERM NIL "repertoire")
     " is a " (:TERM NIL "type specifier") " for a " (:TERM NIL "subtype")
     " of " (:TERM NIL "type") " " (:TYPEREF NIL "character") ". "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-4-3")
     " This term is generally used when describing a collection of "
     (:TERM NIL "characters") " independent of their coding. "
     (:TERM NIL "Characters") " in " (:TERM NIL "repertoires")
     " are only identified by name, by " (:TERM NIL "glyph")
     ", or by character description. " :PAR "A " (:TERM NIL "repertoire")
     " can contain " (:TERM NIL "characters") " from several "
     (:TERM NIL "scripts") ", and a " (:TERM NIL "character")
     " can appear in more than one " (:TERM NIL "repertoire") ". " :PAR
     (:ISSUE NIL "LINDEN-COMMENTS-ON-CHARACTERS:X3J13-APR-92")
     " For some examples of " (:TERM NIL "repertoires")
     ", see the coded character standards ISO 8859/1, ISO 8859/2, and ISO 6937/2. Note, however, that although "
     (:COMMENT NIL "Although") "the term “" (:TERM NIL "repertoire")
     "” is chosen for " (:COMMENT NIL "naming")
     "definitional compatibility with ISO terminology, no "
     (:TERM NIL "conforming implementation") " is required to use "
     (:TERM NIL "repertoires")
     " standardized by ISO or any other standards organization. "
     (:ENDISSUE NIL "LINDEN-COMMENTS-ON-CHARACTERS:X3J13-APR-92") " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Character Attributes") :TAGS (:CHARACTER-ATTRIBUTES))
    " " :PAR (:COMMENT NIL "% 13.1.0 1")
    (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " (:TERM NIL "Characters")
    " have only one " (:TERM NIL "standardized") " " (:TERM NIL "attribute")
    ": a " (:TERM NIL "code") ". A " (:TERM NIL "character") "'s "
    (:TERM NIL "code") " is a non-negative " (:TERM NIL "integer") ". This "
    (:TERM NIL "code") " is composed from a character " (:TERM NIL "script")
    " and a character label in an " (:TERM NIL "implementation-dependent")
    " way. See the " (:TERM NIL "functions") " " (:FUNREF NIL "char-code")
    " and " (:FUNREF NIL "code-char") ". "
    (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR
    (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " "
    (:COMMENT NIL " %% 13.5.0 1"
     " Remarks about the bits and font \\term{attributes} removed. -kmp")
    (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR "Additional, "
    (:TERM NIL "implementation-defined") " " (:TERM NIL "attributes") " of "
    (:TERM NIL "characters") " are also permitted so that, for example, two "
    (:TERM NIL "characters") " with the same " (:TERM NIL "code")
    " may differ in some other, " (:TERM NIL "implementation-defined") " way. "
    :PAR "For any " (:TERM NIL "implementation-defined") " "
    (:TERM NIL "attribute") " there is a distinguished value called the "
    (:NEWTERM NIL "null") " value for that " (:TERM NIL "attribute") ". A "
    (:TERM NIL "character") " for which each "
    (:TERM NIL "implementation-defined") " " (:TERM NIL "attribute")
    " has the null value for that " (:TERM NIL "attribute") " is called a "
    (:TERM NIL "simple") " " (:TERM NIL "character") ". If the "
    (:TERM NIL "implementation") " has no "
    (:TERM NIL "implementation-defined") " " (:TERM NIL "attributes")
    ", then all " (:TERM NIL "characters") " are " (:TERM NIL "simple") " "
    (:TERM NIL "characters") ". " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Character Categories"))
    "There are several (overlapping) categories of " (:TERM NIL "characters")
    " that have no formally associated " (:TERM NIL "type")
    " but that are nevertheless useful to name. They include "
    (:TERM NIL "graphic") " " (:TERM NIL "characters") ", "
    (:TERM NIL "alphabetic") (:SUB NIL "1") " " (:TERM NIL "characters") ", "
    (:TERM NIL "characters") " with " (:TERM NIL "case") " ("
    (:TERM NIL "uppercase") " and " (:TERM NIL "lowercase") " "
    (:TERM NIL "characters") "), " (:TERM NIL "numeric") " "
    (:TERM NIL "characters") ", " (:TERM NIL "alphanumeric") " "
    (:TERM NIL "characters") ", and " (:TERM NIL "digits") " (in a given "
    (:TERM NIL "radix") "). " :PAR "For each "
    (:TERM NIL "implementation-defined") " " (:TERM NIL "attribute") " of a "
    (:TERM NIL "character") ", the documentation for that "
    (:TERM NIL "implementation") " must specify whether "
    (:TERM NIL "characters") " that differ only in that "
    (:TERM NIL "attribute")
    " are permitted to differ in whether or not they are members of one of the aforementioned categories. "
    :PAR
    "Note that these terms are defined independently of any special syntax which might have been enabled in the "
    (:TERM NIL "current readtable") ". " :PAR
    (:SUBSUBSECTION (:TITLE ("Graphic Characters") :TAGS (:GRAPHIC-CHARS)) " "
     :PAR (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " (:TERM NIL "Characters")
     " that are classified as " (:NEWTERM NIL "graphic")
     ", or displayable, are each associated with a glyph, a visual representation of the "
     (:TERM NIL "character") ". " (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1")
     " " :PAR (:COMMENT NIL "% 13.2.0 7") :PAR "A " (:TERM NIL "graphic") " "
     (:TERM NIL "character")
     " is one that has a standard textual representation as a single "
     (:TERM NIL "glyph") ", such as " (:TT NIL "A") " or " (:TT NIL "*") " or "
     (:TT NIL "=") ". " (:TERM NIL "Space") ", which effectively has a blank "
     (:TERM NIL "glyph") ", is defined to be a " (:TERM NIL "graphic") ". "
     :PAR "Of the " (:TERM NIL "standard characters") ", "
     (:TERM NIL "newline") " is " (:TERM NIL "non-graphic")
     " and all others are " (:TERM NIL "graphic") "; see "
     (:SECREF NIL :STANDARD-CHARS) ". " :PAR
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " (:TERM NIL "Characters")
     " that are not " (:TERM NIL "graphic") " are called "
     (:NEWTERM NIL "non-graphic") ". "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " (:TERM NIL "Non-graphic")
     " " (:TERM NIL "characters")
     " are sometimes informally called “formatting characters” or “control characters.” "
     :PAR (:TT NIL "#\\Backspace") ", " (:TT NIL "#\\Tab") ", "
     (:TT NIL "#\\Rubout") ", " (:TT NIL "#\\Linefeed") ", "
     (:TT NIL "#\\Return") ", and " (:TT NIL "#\\Page")
     ", if they are supported by the " (:TERM NIL "implementation") ", are "
     (:TERM NIL "non-graphic") ". " :PAR
     (:COMMENT NIL
      "!!! I'm not completely sure it was proper for whoever removed this to have done so."
      "     -kmp 16-Oct-91" "% 13.2.0 6"
      "\\term{Graphic characters} of font 0 are all of the same width when printed."
      "Every implementation of \\clisp\\ must provide some mode of operation"
      "in which font 0 is a fixed-pitch font.")
     :PAR
     (:COMMENT NIL "% 13.2.0 7"
      "Any character with a non-zero bits \\term{attribute} is \\term{non-graphic}.")
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Alphabetic Characters")) "The "
     (:TERM NIL "alphabetic") (:SUB NIL "1") " " (:TERM NIL "characters")
     " are a subset of the " (:TERM NIL "graphic") " " (:TERM NIL "characters")
     ". Of the " (:TERM NIL "standard characters") ", only these are the "
     (:TERM NIL "alphabetic") (:SUB NIL "1") " " (:TERM NIL "characters") ": "
     :PAR (:TT NIL "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z") " "
     :PAR (:TT NIL "a b c d e f g h i j k l m n o p q r s t u v w x y z") " "
     :PAR (:COMMENT NIL "% 13.2.0 16") "Any "
     (:TERM NIL "implementation-defined") " " (:TERM NIL "character")
     " that has " (:TERM NIL "case") " must be " (:TERM NIL "alphabetic")
     (:SUB NIL "1") ". For each " (:TERM NIL "implementation-defined") " "
     (:TERM NIL "graphic") " " (:TERM NIL "character") " that has no "
     (:TERM NIL "case") ", it is " (:TERM NIL "implementation-defined")
     " whether that " (:TERM NIL "character") " is " (:TERM NIL "alphabetic")
     (:SUB NIL "1") ". " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Characters With Case") :TAGS (:CHARACTERS-WITH-CASE)) " " :PAR
     "The " (:TERM NIL "characters") " with " (:TERM NIL "case")
     " are a subset of the " (:TERM NIL "alphabetic") (:SUB NIL "1") " "
     (:TERM NIL "characters") ". A " (:TERM NIL "character") " with "
     (:TERM NIL "case") " has the property of being either "
     (:TERM NIL "uppercase") " or " (:TERM NIL "lowercase") ". Every "
     (:TERM NIL "character") " with " (:TERM NIL "case")
     " is in one-to-one correspondence with some other "
     (:TERM NIL "character") " with the opposite " (:TERM NIL "case") ". " :PAR
     (:COMMENT NIL "% 13.2.0 17") :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Uppercase Characters")) "An uppercase "
      (:TERM NIL "character") " is one that has a corresponding "
      (:TERM NIL "lowercase") " " (:TERM NIL "character") " that is "
      (:TERM NIL "different") " (and can be obtained using "
      (:FUNREF NIL "char-downcase") "). " :PAR "Of the "
      (:TERM NIL "standard characters") ", only these are "
      (:TERM NIL "uppercase") " " (:TERM NIL "characters") ": " :PAR
      (:TT NIL "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z") " " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Lowercase Characters")) "A lowercase "
      (:TERM NIL "character") " is one that has a corresponding "
      (:TERM NIL "uppercase") " " (:TERM NIL "character") " that is "
      (:TERM NIL "different") " (and can be obtained using "
      (:FUNREF NIL "char-upcase") "). " :PAR "Of the "
      (:TERM NIL "standard characters") ", only these are "
      (:TERM NIL "lowercase") " " (:TERM NIL "characters") ": " :PAR
      (:TT NIL "a b c d e f g h i j k l m n o p q r s t u v w x y z") " " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Corresponding Characters in the Other Case"))
      "The " (:TERM NIL "uppercase") " " (:TERM NIL "standard characters") " "
      (:TT NIL "A") " through " (:TT NIL "Z")
      " mentioned above respectively correspond to the "
      (:TERM NIL "lowercase") " " (:TERM NIL "standard characters") " "
      (:TT NIL "a") " through " (:TT NIL "z")
      " mentioned above. For example, the " (:TERM NIL "uppercase") " "
      (:TERM NIL "character") " " (:TT NIL "E") " corresponds to the "
      (:TERM NIL "lowercase") " " (:TERM NIL "character") " " (:TT NIL "e")
      ", and vice versa. " :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Case of Implementation-Defined Characters"))
      "An " (:TERM NIL "implementation") " may define that other "
      (:TERM NIL "implementation-defined") " " (:TERM NIL "graphic") " "
      (:TERM NIL "characters") " have " (:TERM NIL "case")
      ". Such definitions must always be done in pairs—one "
      (:TERM NIL "uppercase") " " (:TERM NIL "character") " in one-to-one "
      (:TERM NIL "correspondence") " with one " (:TERM NIL "lowercase") " "
      (:TERM NIL "character") ". " :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Numeric Characters")) "The "
     (:TERM NIL "numeric") " " (:TERM NIL "characters") " are a subset of the "
     (:TERM NIL "graphic") " " (:TERM NIL "characters") ". Of the "
     (:TERM NIL "standard characters") ", only these are "
     (:TERM NIL "numeric") " " (:TERM NIL "characters") ": " :PAR
     (:TT NIL "0 1 2 3 4 5 6 7 8 9") " " :PAR "For each "
     (:TERM NIL "implementation-defined") " " (:TERM NIL "graphic") " "
     (:TERM NIL "character") " that has no " (:TERM NIL "case") ", the "
     (:TERM NIL "implementation") " must define whether or not it is a "
     (:TERM NIL "numeric") " " (:TERM NIL "character") ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Alphanumeric Characters")) "The set of "
     (:TERM NIL "alphanumeric") " " (:TERM NIL "characters")
     " is the union of the set of " (:TERM NIL "alphabetic") (:SUB NIL "1") " "
     (:TERM NIL "characters") " and the set of " (:TERM NIL "numeric") " "
     (:TERM NIL "characters") ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Digits in a Radix") :TAGS (:DIGITS)) " " :PAR
     "What qualifies as a " (:TERM NIL "digit") " depends on the "
     (:TERM NIL "radix") " (an " (:TERM NIL "integer") " between "
     (:TT NIL "2") " and " (:TT NIL "36") ", inclusive). The potential "
     (:TERM NIL "digits") " are: " :PAR
     (:TT NIL
      "0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z")
     " " :PAR "Their respective weights are " (:TT NIL "0") ", " (:TT NIL "1")
     ", " (:TT NIL "2") ", " (:MATH NIL (:MO NIL "…")) " " (:TT NIL "35")
     ". In any given radix " (:MATH NIL (:MI NIL "n")) ", only the first "
     (:MATH NIL (:MI NIL "n")) " potential " (:TERM NIL "digits")
     " are considered to be " (:TERM NIL "digits")
     ". For example, the digits in radix " (:TT NIL "2") " are " (:TT NIL "0")
     " and " (:TT NIL "1") ", the digits in radix " (:TT NIL "10") " are "
     (:TT NIL "0") " through " (:TT NIL "9") ", and the digits in radix "
     (:TT NIL "16") " are " (:TT NIL "0") " through " (:TT NIL "F") ". " :PAR
     (:TERM NIL "Case") " is not significant in " (:TERM NIL "digits")
     "; for example, in radix " (:TT NIL "16") ", both " (:TT NIL "F") " and "
     (:TT NIL "f") " are " (:TERM NIL "digits") " with weight " (:TT NIL "15")
     ". " :PAR
     (:COMMENT NIL "!!! KMP: I couldn't figure out whether there can be "
      "         implementation-defined digits.  "
      "         It doesn't seem like a good idea because the obvious choices"
      "         are things like ``\\~n'' which comes in the middle of the Spanish"
      "         alphabet, not at the end, and hence might confuse people about"
      "         the weight of ``o''.  The answer to this has impact on"
      "         \\funref{digit-char-p} and \\funref{digit-weight}.}")
     :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Identity of Characters")) "Two "
    (:TERM NIL "characters") " that are " (:FUNREF NIL "eql") ", "
    (:FUNREF NIL "char=") ", or " (:FUNREF NIL "char-equal")
    " are not necessarily " (:FUNREF NIL "eq") ". " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Ordering of Characters")) "The total ordering on "
    (:TERM NIL "characters")
    " is guaranteed to have the following properties: " :PAR
    (:LIST NIL
     (:ITEM NIL " If two " (:TERM NIL "characters") " have the same "
      (:TERM NIL "implementation-defined") " " (:TERM NIL "attributes")
      ", then their ordering by " (:FUNREF NIL "char<")
      " is consistent with the numerical ordering by the predicate "
      (:FUNREF NIL "<") " on their code " (:TERM NIL "attributes") ". " :PAR
      (:COMMENT NIL "% 13.2.0 28"))
     (:ITEM NIL " If two " (:TERM NIL "characters") " differ in any "
      (:TERM NIL "attribute") ", then they " (:COMMENT NIL "are different.")
      "are not " (:FUNREF NIL "char=") ". "
      (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR
      (:REVIEWER NIL
       "Barmar: I wonder if we should say that the ordering may be dependent on the "
       (:TERM NIL "implementation-defined") " " (:TERM NIL "attributes") ".")
      " " :PAR (:COMMENT NIL "% 13.2.0 29"))
     (:ITEM NIL
      " The total ordering is not necessarily the same as the total ordering on the "
      (:TERM NIL "integers") " produced by applying " (:FUNREF NIL "char-int")
      " to the " (:TERM NIL "characters") ". " :PAR
      (:COMMENT NIL "% 13.2.0 30")
      (:ISSUE NIL "LINDEN-COMMENTS-ON-CHARACTERS:X3J13-APR-92") " ")
     (:ITEM NIL " While " (:TERM NIL "alphabetic") (:SUB NIL "1") " "
      (:TERM NIL "standard characters") " of a given " (:TERM NIL "case")
      " must " (:COMMENT NIL " be properly ordered, ")
      "obey a partial ordering, they need not be contiguous; it is permissible for "
      (:TERM NIL "uppercase") " and " (:TERM NIL "lowercase") " "
      (:TERM NIL "characters") " to be interleaved. Thus "
      (:TT NIL "(char<= #\\a x #\\z)")
      " is not a valid way of determining whether or not " (:TT NIL "x")
      " is a " (:TERM NIL "lowercase") " " (:TERM NIL "character") ". "
      (:ENDISSUE NIL "LINDEN-COMMENTS-ON-CHARACTERS:X3J13-APR-92") " " :PAR
      (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " "
      (:COMMENT NIL
       " Discussion omitted about how the ordering might depend on font information.")
      (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR))
    " " :PAR (:ISSUE NIL "LINDEN-COMMENTS-ON-CHARACTERS:X3J13-APR-92") " "
    (:COMMENT NIL "% 13.2.0 25" "% 13.2.0 26"
     "The standard \\term{alphanumeric} \\term{characters} obey the following partial ordering:")
    "Of the " (:TERM NIL "standard characters") ", those which are "
    (:TERM NIL "alphanumeric") " obey the following partial ordering: "
    (:ENDISSUE NIL "LINDEN-COMMENTS-ON-CHARACTERS:X3J13-APR-92") " " :PAR
    (:CODE NIL " A<B<C<D<E<F<G<H<I<J<K<L<M<N<O<P<Q<R<S<T<U<V<W<X<Y<Z
 a<b<c<d<e<f<g<h<i<j<k<l<m<n<o<p<q<r<s<t<u<v<w<x<y<z
 0<1<2<3<4<5<6<7<8<9
 either 9<A or Z<0
 either 9<a or z<0                                                      
")
    " " (:ISSUE NIL "LINDEN-COMMENTS-ON-CHARACTERS:X3J13-APR-92")
    " This implies that, for " (:TERM NIL "standard characters") ", "
    (:TERM NIL "alphabetic") (:SUB NIL "1") " ordering holds within each "
    (:TERM NIL "case") " (" (:TERM NIL "uppercase") " and "
    (:TERM NIL "lowercase") "), and that the " (:TERM NIL "numeric") " "
    (:TERM NIL "characters") " as a group are not interleaved with "
    (:TERM NIL "alphabetic") " " (:TERM NIL "characters")
    ". However, the ordering or possible interleaving of "
    (:TERM NIL "uppercase") " " (:TERM NIL "characters") " and "
    (:TERM NIL "lowercase") " " (:TERM NIL "characters") " is "
    (:TERM NIL "implementation-defined") ". "
    (:ENDISSUE NIL "LINDEN-COMMENTS-ON-CHARACTERS:X3J13-APR-92") " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Character Names") :TAGS (:CHARACTER-NAMES)) " " :PAR
    "The following " (:TERM NIL "character") " " (:TERM NIL "names")
    " must be present in all " (:TERM NIL "conforming implementations") ": "
    :PAR (:COMMENT NIL "% 22.1.4 9")
    (:LIST NIL
     (:ITEM NIL (:TT NIL "Newline") " " :PAR (:COMMENT NIL "% 2.2.2 3")
      "The character that represents the division between lines. An implementation must translate between "
      (:TT NIL "#\\Newline")
      ", a single-character representation, and whatever external representation(s) may be used. "
      :PAR (:COMMENT NIL "% 22.1.4 10"))
     (:ITEM NIL (:TT NIL "Space") " " :PAR "The space or blank character. "))
    " " :PAR "The following names are " (:TERM NIL "semi-standard") "; if an "
    (:TERM NIL "implementation")
    " supports them, they should be used for the described "
    (:TERM NIL "characters") " and no others. " :PAR
    (:LIST NIL
     (:ITEM NIL (:TT NIL "Rubout") " " :PAR "The rubout or delete character. "
      :PAR (:COMMENT NIL "% 22.1.4 11"))
     (:ITEM NIL (:TT NIL "Page") " " :PAR
      "The form-feed or page-separator character. " :PAR
      (:COMMENT NIL "% 22.1.4 12"))
     (:ITEM NIL (:TT NIL "Tab") " " :PAR "The tabulate character. " :PAR
      (:COMMENT NIL "% 22.1.4 13"))
     (:ITEM NIL (:TT NIL "Backspace") " " :PAR "The backspace character. " :PAR
      (:COMMENT NIL "% 22.1.4 14"))
     (:ITEM NIL (:TT NIL "Return") " " :PAR "The carriage return character. "
      :PAR (:COMMENT NIL "% 22.1.4 15"))
     (:ITEM NIL (:TT NIL "Linefeed") " " :PAR "The line-feed character. "))
    " " :PAR "In some " (:TERM NIL "implementations") ", one or more of these "
    (:TERM NIL "character") " " (:TERM NIL "names") " might denote a "
    (:TERM NIL "standard character") "; for example, " (:TT NIL "#\\Linefeed")
    " and " (:TT NIL "#\\Newline") " might be the " (:TERM NIL "same") " "
    (:TERM NIL "character") " in some " (:TERM NIL "implementations") ". "
    :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Treatment of Newline during Input and Output") :TAGS
     (:TREATMENT-OF-NEWLINE))
    " " :PAR (:COMMENT NIL "% 2.2.2 6") "When the character "
    (:TT NIL "#\\Newline")
    " is written to an output file, the implementation must take the appropriate action to produce a line division. This might involve writing out a record or translating "
    (:TT NIL "#\\Newline")
    " to a CR/LF sequence. When reading, a corresponding reverse transformation must take place. "
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Character Encodings") :TAGS (:CHAR-ENCODINGS)) " "
    :PAR (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " "
    (:COMMENT NIL
     " \\editornote{KMP: This next paragraph is somewhat tentative."
     "  Maybe a glossary term for this would be good if I decide it should stay."
     "  Do reviewers think this concept is worth naming, and is ``encoding'' ok as a name?}%!!!")
    "A " (:TERM NIL "character") " is sometimes represented merely by its "
    (:TERM NIL "code") ", and sometimes by another " (:TERM NIL "integer")
    " value which is composed from the " (:TERM NIL "code") " and all "
    (:TERM NIL "implementation-defined") " " (:TERM NIL "attributes")
    " (in an " (:TERM NIL "implementation-defined")
    " way that might vary between " (:TERM NIL "Lisp images")
    " even in the same " (:TERM NIL "implementation") "). This "
    (:TERM NIL "integer") ", returned by the function "
    (:FUNREF NIL "char-int")
    ", is called the character's “encoding.” There is no corresponding function from a character's encoding back to the "
    (:TERM NIL "character")
    ", since its primary intended uses include things like hashing where an inverse operation is not really called for. "
    (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR)
   :PAR (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " "
   (:COMMENT NIL "% 2.2.5 1" "Discussion of STRING-CHAR deleted.")
   (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR
   (:SUBSECTION
    (:TITLE ("Documentation of Implementation-Defined Scripts") :TAGS
     (:IMPLEMENTATION-DEFINED-SCRIPTS))
    " " :PAR (:ISSUE NIL "CHARACTER-PROPOSAL:2-4-2") " An "
    (:TERM NIL "implementation") " must document the " (:TERM NIL "character")
    " " (:TERM NIL "scripts") " it supports. For each " (:TERM NIL "character")
    " " (:TERM NIL "script")
    " supported, the documentation must describe at least the following: "
    (:LIST NIL
     (:ITEM NIL
      " Character labels, glyphs, and descriptions. Character labels must be uniquely named using only Latin capital letters A–Z, hyphen (-), and digits 0–9. ")
     (:ITEM NIL " Reader canonicalization. Any mechanisms by which "
      (:FUNREF NIL "read") " treats " (:TERM NIL "different")
      " characters as equivalent must be documented. ")
     (:ITEM NIL " The impact on " (:FUNREF NIL "char-upcase") ", "
      (:FUNREF NIL "char-downcase") ", and the case-sensitive "
      (:TERM NIL "format directives") ". In particular, for each "
      (:TERM NIL "character") " with " (:TERM NIL "case") ", whether it is "
      (:TERM NIL "uppercase") " or " (:TERM NIL "lowercase") ", and which "
      (:TERM NIL "character") " is its equivalent in the opposite case. ")
     (:ITEM NIL " The behavior of the case-insensitive "
      (:TERM NIL "functions") " " (:FUNREF NIL "char-equal") ", "
      (:FUNREF NIL "char-not-equal") ", " (:FUNREF NIL "char-lessp") ", "
      (:FUNREF NIL "char-greaterp") ", " (:FUNREF NIL "char-not-greaterp")
      ", and " (:FUNREF NIL "char-not-lessp") ". ")
     (:ITEM NIL " The behavior of any " (:TERM NIL "character") " "
      (:TERM NIL "predicates") "; in particular, the effects of "
      (:FUNREF NIL "alpha-char-p") ", " (:FUNREF NIL "lower-case-p") ", "
      (:FUNREF NIL "upper-case-p") ", " (:FUNREF NIL "both-case-p") ", "
      (:FUNREF NIL "graphic-char-p") ", and " (:FUNREF NIL "alphanumericp")
      ". ")
     (:ITEM NIL
      " The interaction with file I/O, in particular, the supported coded character sets (for example, ISO8859/1-1987) and external encoding schemes supported are documented. "))
    " " (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-4-2") " " :PAR))
  :PAR
  (:DICTIONARY NIL :PAR
   (:COMMENT NIL " Character Comparison" " Character Types" " Character Roles"
    " Character Casification" " Character Codes" " Character Names")
   :PAR
   (:COMMENT NIL "-------------------- Character Types --------------------")
   :PAR (:COMMENT NIL "%% ========== CHARACTER (System Class)")
   (:COM (:NAME "character" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "character") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "character")
     " is an " (:TERM NIL "object")
     " that represents a unitary token in an aggregate quantity of text; see "
     (:SECREF NIL :CHARACTER-CONCEPTS) ". " :PAR
     (:ISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " "
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-3-1") " The " (:TERM NIL "types") " "
     (:TYPEREF NIL "base-char") " and " (:TYPEREF NIL "extended-char")
     " form an " (:TERM NIL "exhaustive partition") " of the "
     (:TERM NIL "type") " " (:TYPEREF NIL "character") ". "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-3-1") " "
     (:ENDISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :CHARACTER-CONCEPTS) ", "
     (:SECREF NIL :SHARPSIGN-BACKSLASH) ", " (:SECREF NIL :PRINTING-CHARACTERS)
     " " :PAR))
   (:COM (:NAME "base-char" :FTYPE "Type")
    (:ISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " " :PAR
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "base-char") ", "
     (:TYPEREF NIL "character") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "base-char") " is defined as the "
     (:TERM NIL "upgraded array element type") " of "
     (:TYPEREF NIL "standard-char") ". An " (:TERM NIL "implementation")
     " can support additional " (:TERM NIL "subtypes") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "character")
     " (besides the ones listed in this standard) that might or might not be "
     (:TERM NIL "supertypes") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "base-char") ". In addition, an "
     (:TERM NIL "implementation") " can define " (:TYPEREF NIL "base-char")
     " to be the " (:TERM NIL "same") " " (:TERM NIL "type") " as "
     (:TYPEREF NIL "character") ". " :PAR (:TERM NIL "Base characters")
     " are distinguished in the following respects: "
     (:LIST NIL
      (:ITEM NIL "1. The " (:TERM NIL "type") " "
       (:TYPEREF NIL "standard-char") " is a " (:TERM NIL "subrepertoire")
       " of the " (:TERM NIL "type") " " (:TYPEREF NIL "base-char") ". ")
      (:ITEM NIL "2. The selection of " (:TERM NIL "base characters")
       " that are not " (:TERM NIL "standard characters")
       " is implementation defined. ")
      (:ITEM NIL "3. Only " (:TERM NIL "objects") " of the " (:TERM NIL "type")
       " " (:TYPEREF NIL "base-char") " can be " (:TERM NIL "elements")
       " of a " (:TERM NIL "base string") ". ")
      (:ITEM NIL
       "4. No upper bound is specified for the number of characters in the "
       (:TYPEREF NIL "base-char") " " (:TERM NIL "repertoire")
       "; the size of that " (:TERM NIL "repertoire") " is "
       (:COMMENT NIL "\\term{implementation-dependent}")
       (:TERM NIL "implementation-defined")
       ". The lower bound is 96, the number of "
       (:TERM NIL "standard characters") ". "
       (:COMMENT NIL "defined for \\clisp. ")))
     " " :PAR
     (:COMMENT NIL "The distinction of base characters is largely a pragmatic"
      "choice.  It permits efficient handling of common situations, may"
      "be privileged for host system I/O, and can serve as an"
      "intermediate basis for portability, less general than the standard"
      "characters, but possibly more useful across a narrower range of"
      "implementations." " "
      "Many computers have some \"base\" character representation which"
      "is a function of hardware instructions for dealing with characters,"
      "as well as the organization of the file system.  The base character"
      "representation is likely to be the smallest transaction unit permitted"
      "for text file and terminal I/O operations.  On a system with a record"
      "based I/O paradigm, the base character representation is likely to"
      "be the smallest record quantum.  On many computer systems,"
      "this representation is a byte.")
     :PAR "Whether a character is a " (:TERM NIL "base character")
     " depends on the way that an " (:TERM NIL "implementation") " represents "
     (:TERM NIL "strings") ", and not any other properties of the "
     (:TERM NIL "implementation")
     " or the host operating system. For example, one implementation might encode all "
     (:TERM NIL "strings")
     " as characters having 16-bit encodings, and another might have two kinds of "
     (:TERM NIL "strings")
     ": those with characters having 8-bit encodings and those with characters having 16-bit encodings. In the first "
     (:TERM NIL "implementation") ", the " (:TERM NIL "type") " "
     (:TYPEREF NIL "base-char") " is equivalent to the " (:TERM NIL "type") " "
     (:TYPEREF NIL "character") ": there is only one kind of "
     (:TERM NIL "string") ". In the second " (:TERM NIL "implementation")
     ", the " (:TERM NIL "base characters") " might be those "
     (:TERM NIL "characters") " that could be stored in a "
     (:TERM NIL "string") " of " (:TERM NIL "characters")
     " having 8-bit encodings. In such an implementation, the "
     (:TERM NIL "type") " " (:TYPEREF NIL "base-char") " is a "
     (:TERM NIL "proper subtype") " of the " (:TERM NIL "type") " "
     (:TYPEREF NIL "character") ". "
     (:COMMENT NIL
      "KMP: Note that I think there could be implementations in which the 8-bit strings"
      "are -not- base characters, if all the standard-chars were not "
      "representable using the 8-bit encoding scheme.  In such a case,"
      "it might be that (upgraded-array-element-type 'standard-char) returned"
      "the 16-bit representation.  It might be that the 8-bit representation"
      "was something else entirely.")
     :PAR (:COMMENT NIL "% 2.15.0 15              ") "The " (:TERM NIL "type")
     " " (:TYPEREF NIL "standard-char") " is a "
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-3-1") " " (:TERM NIL "subtype") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "base-char") ". "
     (:COMMENT NIL "This text will be deleted:"
      "subtype of \\typeref{character}.")
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-3-1") " "
     (:COMMENT NIL "\\thetype{string-char} is a \\subtypeof{character}.") :PAR
     (:ENDISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " " :PAR))
   (:COM (:NAME "standard-char" :FTYPE "Type")
    (:ISSUE NIL "STANDARD-REPERTOIRE-GRATUITOUS:RENAME") " " :PAR
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "standard-char") ", "
     (:ISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " "
     (:TYPEREF NIL "base-char") ", "
     (:ENDISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " "
     (:TYPEREF NIL "character") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A fixed set of 96 "
     (:TERM NIL "characters") " required to be present in all "
     (:TERM NIL "conforming implementations") ". "
     (:TERM NIL "Standard characters") " are defined in "
     (:SECREF NIL :STANDARD-CHARS) ". " :PAR (:COMMENT NIL "%% 13.2.0 4") :PAR
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " Any " (:TERM NIL "character")
     " that is not " (:TERM NIL "simple") " is not a "
     (:TERM NIL "standard character") ". "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR
     (:ENDISSUE NIL "STANDARD-REPERTOIRE-GRATUITOUS:RENAME") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :STANDARD-CHARS) " " :PAR))
   (:COM (:NAME "extended-char" :FTYPE "Type")
    (:ISSUE NIL "CHARACTER-PROPOSAL:2-3-1") " "
    (:ISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " " :PAR
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "extended-char") ", "
     (:TYPEREF NIL "character") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "extended-char") " is equivalent to the " (:TERM NIL "type")
     " " (:TT NIL "(and character (not base-char))") ". " :PAR
     (:COMMENT NIL "% 2.3.0 1" "% 2.3.0 2") :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL "This next paragraph as added per Barrett's suggestion:")
     "The " (:TERM NIL "type") " " (:TYPEREF NIL "extended-char") " might "
     (:COMMENT NIL "be equivalent to \\thetype{nil}"
      "% Replaced as controversial. -kmp 4-Feb-92")
     "have no " (:TERM NIL "elements") (:SUB NIL "4") " in "
     (:TERM NIL "implementations") " in which all " (:TERM NIL "characters")
     " are of " (:TERM NIL "type") " " (:TYPEREF NIL "base-char") ". " :PAR
     (:ENDISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-3-1") " " :PAR))
   :PAR
   (:COMMENT NIL
    "-------------------- Character Comparison --------------------")
   :PAR
   (:COMMENT NIL "%% ========== CHAR-EQUAL" "%% ========== CHAR-NOT-EQUAL"
    "%% ========== CHAR-LESSP" "%% ========== CHAR-GREATERP"
    "%% ========== CHAR-NOT-LESSP" "%% ========== CHAR-NOT-GREATERP"
    "%% ========== CHAR=" "%% ========== CHAR/=" "%% ========== CHAR<"
    "%% ========== CHAR>" "%% ========== CHAR>=" "%% ========== CHAR<=")
   (:COM
    (:NAME
     "char=, char/=, char<, char>, char<=, char>=, char-equal, char-not-equal, char-lessp, char-greaterp, char-not-greaterp, char-not-lessp"
     :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function")
      (:NAMES NIL "char=" "char/=" "char<" "char>" "char<=" "char>="
       "char-equal" "char-not-equal" "char-lessp" "char-greaterp"
       "char-not-greaterp" "char-not-lessp")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " " (:PLUS NIL "characters"))
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "character")
     "—a " (:TERM NIL "character") ". " :PAR (:PARAM NIL "generalized-boolean")
     "—a " (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "These predicates compare "
     (:TERM NIL "characters") ". " :PAR (:FUNREF NIL "char=") " returns "
     (:TERM NIL "true") " if all " (:PARAM NIL "characters") " are the "
     (:TERM NIL "same") "; otherwise, it returns " (:TERM NIL "false") ". "
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " If two "
     (:PARAM NIL "characters") " differ in any "
     (:TERM NIL "implementation-defined") " " (:TERM NIL "attributes")
     ", then they are not " (:FUNREF NIL "char=") ". "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR (:FUNREF NIL "char/=")
     " returns " (:TERM NIL "true") " if all " (:PARAM NIL "characters")
     " are different; otherwise, it returns " (:TERM NIL "false") ". " :PAR
     (:FUNREF NIL "char<") " returns " (:TERM NIL "true") " if the "
     (:PARAM NIL "characters")
     " are monotonically increasing; otherwise, it returns "
     (:TERM NIL "false") ". " (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1")
     " If two " (:TERM NIL "characters") " have " (:TERM NIL "identical") " "
     (:TERM NIL "implementation-defined") " " (:TERM NIL "attributes")
     ", then their ordering by " (:FUNREF NIL "char<")
     " is consistent with the numerical ordering by the predicate "
     (:TT NIL "<") " on their " (:TERM NIL "codes") ". "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR (:FUNREF NIL "char>")
     " returns " (:TERM NIL "true") " if the " (:PARAM NIL "characters")
     " are monotonically decreasing; otherwise, it returns "
     (:TERM NIL "false") ". " (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1")
     " If two " (:TERM NIL "characters") " have " (:TERM NIL "identical") " "
     (:TERM NIL "implementation-defined") " " (:TERM NIL "attributes")
     ", then their ordering by " (:FUNREF NIL "char>")
     " is consistent with the numerical ordering by the predicate "
     (:TT NIL ">") " on their " (:TERM NIL "codes") ". "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR (:FUNREF NIL "char<=")
     " returns " (:TERM NIL "true") " if the " (:PARAM NIL "characters")
     " are monotonically nondecreasing; otherwise, it returns "
     (:TERM NIL "false") ". " (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1")
     " If two " (:TERM NIL "characters") " have " (:TERM NIL "identical") " "
     (:TERM NIL "implementation-defined") " " (:TERM NIL "attributes")
     ", then their ordering by " (:FUNREF NIL "char<=")
     " is consistent with the numerical ordering by the predicate "
     (:TT NIL "<=") " on their " (:TERM NIL "codes") ". "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR (:FUNREF NIL "char>=")
     " returns " (:TERM NIL "true") " if the " (:PARAM NIL "characters")
     " are monotonically nonincreasing; otherwise, it returns "
     (:TERM NIL "false") ". " (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1")
     " If two " (:TERM NIL "characters") " have " (:TERM NIL "identical") " "
     (:TERM NIL "implementation-defined") " " (:TERM NIL "attributes")
     ", then their ordering by " (:FUNREF NIL "char>=")
     " is consistent with the numerical ordering by the predicate "
     (:TT NIL ">=") " on their " (:TERM NIL "codes") ". "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR
     (:FUNREF NIL "char-equal") ", " (:FUNREF NIL "char-not-equal") ", "
     (:FUNREF NIL "char-lessp") ", " (:FUNREF NIL "char-greaterp") ", "
     (:FUNREF NIL "char-not-greaterp") ", and " (:FUNREF NIL "char-not-lessp")
     " are similar to " (:FUNREF NIL "char=") ", " (:FUNREF NIL "char/=") ", "
     (:FUNREF NIL "char<") ", " (:FUNREF NIL "char>") ", "
     (:FUNREF NIL "char<=") ", " (:FUNREF NIL "char>=")
     ", respectively, except that they ignore differences in "
     (:TERM NIL "case") " and " (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " "
     (:COMMENT NIL
      " that the effect, if any, of each \\term{implementation-defined} \\term{attribute} "
      " must be specified as part of the definition of that \\term{attribute}."
      "% Sandra thought the above was awkward. Trying again. -kmp 26-Jan-92")
     "might have an " (:TERM NIL "implementation-defined") " behavior for "
     (:TERM NIL "non-simple") " " (:TERM NIL "characters") ". "
     (:COMMENT NIL " For example, an implementation might define that certain "
      " \\term{implementation-defined} \\term{attributes} are ignored by"
      " \\funref{char-equal}, \\i{etc.}"
      "% More rewording to soothe awkwardness. -kmp 26-Jan-92")
     "For example, an " (:TERM NIL "implementation") " might define that "
     (:FUNREF NIL "char-equal") ", " (:I NIL "etc.") " ignore certain "
     (:TERM NIL "implementation-defined") " " (:TERM NIL "attributes")
     ". The effect, if any, of each " (:TERM NIL "implementation-defined") " "
     (:TERM NIL "attribute")
     " upon these functions must be specified as part of the definition of that "
     (:TERM NIL "attribute") ". "
     (:COMMENT NIL "% This part has been moved to the notes."
      " %% 13.2.0 char-equal"
      " This means that for the \\term{standard characters}, the ordering used by"
      " \\funref{char-equal}, \\etc. is such that"
      " \\f{A=a}, \\f{B=b}, and so on, up to \\f{Z=z}, and furthermore either"
      " \\f{9<A} or \\f{Z<0}.")
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR
     (:COMMENT NIL "% 13.2.0 31") :PAR)
    (:PART (:NAME "Examples") " " :PAR (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1")
     " "
     (:CODE NIL " (char= #\\d #\\d) → " (:TERM NIL "true") "
 (char= #\\A #\\a) → "
      (:TERM NIL "false") "
 (char= #\\d #\\x) → "
      (:TERM NIL "false") "
 (char= #\\d #\\D) → "
      (:TERM NIL "false") "
 (char/= #\\d #\\d) → "
      (:TERM NIL "false") "
 (char/= #\\d #\\x) → "
      (:TERM NIL "true") "
 (char/= #\\d #\\D) → "
      (:TERM NIL "true") "
 (char= #\\d #\\d #\\d #\\d) → "
      (:TERM NIL "true") "
 (char/= #\\d #\\d #\\d #\\d) → "
      (:TERM NIL "false") "
 (char= #\\d #\\d #\\x #\\d) → "
      (:TERM NIL "false") "
 (char/= #\\d #\\d #\\x #\\d) → "
      (:TERM NIL "false") "
 (char= #\\d #\\y #\\x #\\c) → "
      (:TERM NIL "false") "
 (char/= #\\d #\\y #\\x #\\c) → "
      (:TERM NIL "true") "
 (char= #\\d #\\c #\\d) → "
      (:TERM NIL "false") "
 (char/= #\\d #\\c #\\d) → "
      (:TERM NIL "false") "
 (char< #\\d #\\x) → "
      (:TERM NIL "true") "
 (char<= #\\d #\\x) → "
      (:TERM NIL "true") "
 (char< #\\d #\\d) → "
      (:TERM NIL "false") "
 (char<= #\\d #\\d) → "
      (:TERM NIL "true") "
 (char< #\\a #\\e #\\y #\\z) → "
      (:TERM NIL "true") "
 (char<= #\\a #\\e #\\y #\\z) → "
      (:TERM NIL "true") "
 (char< #\\a #\\e #\\e #\\y) → "
      (:TERM NIL "false") "
 (char<= #\\a #\\e #\\e #\\y) → "
      (:TERM NIL "true") "
 (char> #\\e #\\d) → "
      (:TERM NIL "true") "
 (char>= #\\e #\\d) → "
      (:TERM NIL "true") "
 (char> #\\d #\\c #\\b #\\a) → "
      (:TERM NIL "true") "
 (char>= #\\d #\\c #\\b #\\a) → "
      (:TERM NIL "true") "
 (char> #\\d #\\d #\\c #\\a) → "
      (:TERM NIL "false") "
 (char>= #\\d #\\d #\\c #\\a) → "
      (:TERM NIL "true") "
 (char> #\\e #\\d #\\b #\\c #\\a) → "
      (:TERM NIL "false") "
 (char>= #\\e #\\d #\\b #\\c #\\a) → "
      (:TERM NIL "false") "
 (char> #\\z #\\A) → "
      (:TERM NIL "implementation-dependent") "
 (char> #\\Z #\\a) → "
      (:TERM NIL "implementation-dependent") "
 (char-equal #\\A #\\a) → "
      (:TERM NIL "true") "
 (stable-sort (list #\\b #\\A #\\B #\\a #\\c #\\C) #'char-lessp)
→ (#\\A #\\a #\\b #\\B #\\c #\\C)
 (stable-sort (list #\\b #\\A #\\B #\\a #\\c #\\C) #'char<)
→ (#\\A #\\B #\\C #\\a #\\b #\\c) ;Implementation A
→ (#\\a #\\b #\\c #\\A #\\B #\\C) ;Implementation B
→ (#\\a #\\A #\\b #\\B #\\c #\\C) ;Implementation C
→ (#\\A #\\a #\\B #\\b #\\C #\\c) ;Implementation D
→ (#\\A #\\B #\\a #\\b #\\C #\\c) ;Implementation E
")
     " "
     (:COMMENT NIL "GLS observes that there are 15 other possibilities here:"
      " (#\\\\A #\\\\a #\\\\b #\\\\c #\\\\B #\\\\C)"
      " (#\\\\A #\\\\B #\\\\a #\\\\b #\\\\c #\\\\C)"
      " (#\\\\a #\\\\A #\\\\b #\\\\B #\\\\C #\\\\c)"
      " (#\\\\a #\\\\A #\\\\B #\\\\b #\\\\C #\\\\c)"
      " (#\\\\a #\\\\A #\\\\b #\\\\c #\\\\B #\\\\C)"
      " (#\\\\a #\\\\A #\\\\B #\\\\b #\\\\c #\\\\C)"
      " (#\\\\a #\\\\A #\\\\B #\\\\C #\\\\b #\\\\c)"
      " (#\\\\A #\\\\a #\\\\B #\\\\b #\\\\c #\\\\C)"
      " (#\\\\A #\\\\a #\\\\B #\\\\C #\\\\b #\\\\c)"
      " (#\\\\A #\\\\B #\\\\a #\\\\C #\\\\b #\\\\c)"
      " (#\\\\a #\\\\b #\\\\A #\\\\c #\\\\B #\\\\C)"
      " (#\\\\a #\\\\b #\\\\A #\\\\B #\\\\c #\\\\C)"
      " (#\\\\a #\\\\b #\\\\A #\\\\B #\\\\C #\\\\c)"
      " (#\\\\A #\\\\a #\\\\b #\\\\B #\\\\c #\\\\C)"
      " (#\\\\A #\\\\a #\\\\b #\\\\B #\\\\C #\\\\c)"
      "But I think readers will get the idea from those I've specified. -kmp 27-May-91")
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "program-error") " if at least one "
     (:PARAM NIL "character") " is not supplied. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :CHARACTER-SYNTAX) ", "
     (:SECREF NIL :IMPLEMENTATION-DEFINED-SCRIPTS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "If characters differ in their "
     (:TERM NIL "code") " " (:TERM NIL "attribute") " or any "
     (:TERM NIL "implementation-defined") " " (:TERM NIL "attribute")
     ", they are considered to be different by " (:FUNREF NIL "char=") ". "
     :PAR (:COMMENT NIL "% 13.2.0 33") "There is no requirement that "
     (:TT NIL "(eq c1 c2)") " be true merely because "
     (:TT NIL "(char= c1 c2)") " is " (:TERM NIL "true") ". While "
     (:FUNREF NIL "eq") " can distinguish two " (:TERM NIL "characters")
     " that " (:FUNREF NIL "char=")
     " does not, it is distinguishing them not as " (:TERM NIL "characters")
     ", but in some sense on the basis of a lower level implementation characteristic. If "
     (:TT NIL "(eq c1 c2)") " is " (:TERM NIL "true") ", then "
     (:TT NIL "(char= c1 c2)") " is also true. " (:FUNREF NIL "eql") " and "
     (:FUNREF NIL "equal") " compare " (:TERM NIL "characters")
     " in the same way that " (:FUNREF NIL "char=") " does. " :PAR
     "The manner in which " (:TERM NIL "case") " is used by "
     (:FUNREF NIL "char-equal") ", " (:FUNREF NIL "char-not-equal") ", "
     (:FUNREF NIL "char-lessp") ", " (:FUNREF NIL "char-greaterp") ", "
     (:FUNREF NIL "char-not-greaterp") ", and " (:FUNREF NIL "char-not-lessp")
     " implies an ordering for " (:TERM NIL "standard characters")
     " such that " (:TT NIL "A=a") ", " (:TT NIL "B=b") ", and so on, up to "
     (:TT NIL "Z=z") ", and furthermore either " (:TT NIL "9<A") " or "
     (:TT NIL "Z<0") ". " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Character Types --------------------")
   :PAR (:COMMENT NIL "%% ========== CHARACTER (Function)")
   (:COM (:NAME "character" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "character")
      (:ARGLIST NIL "character") (:VALUES NIL "denoted-character"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " (:PARAM NIL "character") "—a "
     (:TERM NIL "character designator") ". "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR
     (:PARAM NIL "denoted-character") "—a " (:TERM NIL "character") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 13.4.0 3")
     "Returns the " (:TERM NIL "character") " denoted by the "
     (:PARAM NIL "character") " " (:TERM NIL "designator") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (character #\\a) → #\\a
 (character \"a\") → #\\a
 (character 'a) → #\\A
 (character '\\a) → #\\a
 (character 65.) is an error.
 (character 'apple) is an error.
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "object") " is not a "
     (:TERM NIL "character designator") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "coerce") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (character " (:PARAM NIL "object") ") ≡ (coerce "
      (:PARAM NIL "object") " 'character)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== CHARACTERP")
   (:COM (:NAME "characterp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "characterp") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 17")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "character") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (characterp #\\a) → " (:TERM NIL "true") "
 (characterp 'a) → "
      (:TERM NIL "false") "
 (characterp \"a\") → "
      (:TERM NIL "false") "
 (characterp 65.) → "
      (:TERM NIL "false") "
 (characterp #\\Newline) → "
      (:TERM NIL "true") "
 ;; This next example presupposes an implementation 
 ;; in which #\\Rubout is an implementation-defined character.
 (characterp #\\Rubout) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "character") " ("
     (:TERM NIL "type") " and " (:TERM NIL "function") "), "
     (:FUNREF NIL "typep") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (characterp " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'character)
")
     " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Character Roles --------------------")
   :PAR (:COMMENT NIL "%% ========== ALPHA-CHAR-P")
   (:COM (:NAME "alpha-char-p" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "alpha-char-p")
      (:ARGLIST NIL "character") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "character")
     "—a " (:TERM NIL "character") ". " :PAR (:PARAM NIL "generalized-boolean")
     "—a " (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 13.2.0 9")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "character") " is an "
     (:TERM NIL "alphabetic") (:SUB NIL "1") " " (:TERM NIL "character")
     "; otherwise, returns " (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR " "
     (:CODE NIL " (alpha-char-p #\\a) → " (:TERM NIL "true") "
 (alpha-char-p #\\5) → "
      (:TERM NIL "false") "
 (alpha-char-p #\\Newline) → "
      (:TERM NIL "false") "
 ;; This next example presupposes an implementation
 ;; in which #\\"
      (:MATH NIL (:MI NIL "α")) " is a defined character.
 (alpha-char-p #\\"
      (:MATH NIL (:MI NIL "α")) ") → " (:TERM NIL "implementation-dependent") "
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "None. (In particular, the results of this predicate are independent of any special syntax which might have been enabled in the "
     (:TERM NIL "current readtable") ".) " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "character") " is not a "
     (:TERM NIL "character") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "alphanumericp") ", "
     (:SECREF NIL :IMPLEMENTATION-DEFINED-SCRIPTS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ALPHANUMERICP")
   (:COM (:NAME "alphanumericp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "alphanumericp")
      (:ARGLIST NIL "character") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "character")
     "—a " (:TERM NIL "character") ". " :PAR (:PARAM NIL "generalized-boolean")
     "—a " (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 13.2.0 22")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "character") " is an "
     (:TERM NIL "alphabetic") (:SUB NIL "1") " " (:TERM NIL "character")
     " or a " (:TERM NIL "numeric") " " (:TERM NIL "character")
     "; otherwise, returns " (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (alphanumericp #\\Z) → " (:TERM NIL "true") "
 (alphanumericp #\\9) → "
      (:TERM NIL "true") "
 (alphanumericp #\\Newline) → "
      (:TERM NIL "false") "
 (alphanumericp #\\#) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "None. (In particular, the results of this predicate are independent of any special syntax which might have been enabled in the "
     (:TERM NIL "current readtable") ".) " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "character") " is not a "
     (:TERM NIL "character") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "alpha-char-p") ", "
     (:FUNREF NIL "graphic-char-p") ", " (:FUNREF NIL "digit-char-p") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "Alphanumeric characters are graphic as defined by "
     (:FUNREF NIL "graphic-char-p")
     ". The alphanumeric characters are a subset of the graphic characters. "
     (:COMMENT NIL
      "The bits \\term{attribute} of any alphanumeric character is 0."
      "% 13.2.0 24")
     "The standard characters " (:TT NIL "A") " through " (:TT NIL "Z") ", "
     (:TT NIL "a") " through " (:TT NIL "z") ", and " (:TT NIL "0") " through "
     (:TT NIL "9") " are alphanumeric characters. " :PAR
     (:CODE NIL " (alphanumericp x)
   ≡ (or (alpha-char-p x) (not (null (digit-char-p x))))
")
     " "))
   " " :PAR (:COMMENT NIL "%% ========== DIGIT-CHAR")
   (:COM (:NAME "digit-char" :FTYPE "Function")
    (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR
    (:COMMENT NIL "% 13.4.0 7")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "digit-char")
      (:ARGLIST NIL "weight " (:KEYWORD NIL " &optional") " radix")
      (:VALUES NIL "char"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "weight")
     "—a non-negative " (:TERM NIL "integer") ". " :PAR (:PARAM NIL "radix")
     "—a " (:TERM NIL "radix") ". The default is " (:TT NIL "10") ". " :PAR
     (:PARAM NIL "char") "—a " (:TERM NIL "character") " or "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 13.4.0 8" "% 13.4.0 9" "% 13.4.0 10") :PAR
     (:COMMENT NIL
      " I reorganized this description in a major way because once bits "
      " were removed, it seemed to have a simpler description. -kmp 23-Apr-91")
     :PAR "If " (:PARAM NIL "weight") " is less than " (:PARAM NIL "radix")
     ", " (:FUNREF NIL "digit-char") " returns a " (:TERM NIL "character")
     " which has that " (:PARAM NIL "weight")
     " when considered as a digit in the specified radix. If the resulting "
     (:TERM NIL "character") " is to be an " (:TERM NIL "alphabetic")
     (:SUB NIL "1") " " (:TERM NIL "character") ", it will be an uppercase "
     (:TERM NIL "character") ". " :PAR "If " (:PARAM NIL "weight")
     " is greater than or equal to " (:PARAM NIL "radix") ", "
     (:FUNREF NIL "digit-char") " returns " (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (digit-char 0) → #\\0
 (digit-char 10 11) → #\\A
 (digit-char 10 10) → "
      (:TERM NIL "false") "
 (digit-char 7) → #\\7
 (digit-char 12) → "
      (:TERM NIL "false") "
 (digit-char 12 16) → #\\C  ;not #\\c
 (digit-char 6 2) → "
      (:TERM NIL "false") "
 (digit-char 1 2) → #\\1
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "digit-char-p") ", "
     (:FUNREF NIL "graphic-char-p") ", " (:SECREF NIL :CHARACTER-SYNTAX) " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DIGIT-CHAR-P")
   (:COM (:NAME "digit-char-p" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "digit-char-p")
      (:ARGLIST NIL "char " (:KEYWORD NIL " &optional") " radix")
      (:VALUES NIL "weight"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "char") "—a "
     (:TERM NIL "character") ". " :PAR (:PARAM NIL "radix") "—a "
     (:TERM NIL "radix") ". The default is " (:TT NIL "10") ". " :PAR
     (:PARAM NIL "weight") "—either a non-negative " (:TERM NIL "integer")
     " less than " (:PARAM NIL "radix") ", or " (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Tests whether " (:PARAM NIL "char")
     " is a digit in the specified " (:PARAM NIL "radix") " "
     (:COMMENT NIL "% 13.2.0 20") "(" (:I NIL "i.e.")
     ",  with a weight less than " (:PARAM NIL "radix")
     "). If it is a digit in that " (:PARAM NIL "radix")
     ", its weight is returned as an " (:TERM NIL "integer") "; otherwise "
     (:MISC NIL "nil") " is returned. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (digit-char-p #\\5)    → 5
 (digit-char-p #\\5 2)  → "
      (:TERM NIL "false") "
 (digit-char-p #\\A)    → "
      (:TERM NIL "false") "
 (digit-char-p #\\a)    → "
      (:TERM NIL "false") "
 (digit-char-p #\\A 11) → 10
 (digit-char-p #\\a 11) → 10
 (mapcar #'(lambda (radix) 
             (map 'list #'(lambda (x) (digit-char-p x radix)) 
                  \"059AaFGZ\"))
         '(2 8 10 16 36))
 → ((0 NIL NIL NIL NIL NIL NIL NIL)
     (0 5 NIL NIL NIL NIL NIL NIL)
     (0 5 9 NIL NIL NIL NIL NIL)
     (0 5 9 10 10 15 NIL NIL)
     (0 5 9 10 10 15 16 35))
")
     " "
     (:COMMENT NIL
      "In the above, recall that \\EV's arrow takes up about two column positions,"
      "rather than three characters \"\\EV\" -- so the grinding looks funny here in"
      "the source, but better on paper.")
     :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "None. (In particular, the results of this predicate are independent of any special syntax which might have been enabled in the "
     (:TERM NIL "current readtable") ".) " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "alphanumericp") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL "% 13.2.0 19                   ") "Digits are "
     (:TERM NIL "graphic") " " (:TERM NIL "characters") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== GRAPHIC-CHAR-P")
   (:COM (:NAME "graphic-char-p" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "graphic-char-p")
      (:ARGLIST NIL "char") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "char") "—a "
     (:TERM NIL "character") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 13.2.0 5")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "character") " is a "
     (:TERM NIL "graphic") " " (:TERM NIL "character") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (graphic-char-p #\\G) → " (:TERM NIL "true") "
 (graphic-char-p #\\#) → "
      (:TERM NIL "true") "
 (graphic-char-p #\\Space) → "
      (:TERM NIL "true") "
 (graphic-char-p #\\Newline) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "character") " is not a "
     (:TERM NIL "character") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "read") ", "
     (:SECREF NIL :CHARACTER-SYNTAX) ", "
     (:SECREF NIL :IMPLEMENTATION-DEFINED-SCRIPTS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== STANDARD-CHAR-P")
   (:COM (:NAME "standard-char-p" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "standard-char-p")
      (:ARGLIST NIL "character") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "character")
     "—a " (:TERM NIL "character") ". " :PAR (:PARAM NIL "generalized-boolean")
     "—a " (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 13.2.0 3")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "character") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "standard-char")
     "; otherwise, returns " (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (standard-char-p #\\Space) → " (:TERM NIL "true") "
 (standard-char-p #\\~) → "
      (:TERM NIL "true") "
 ;; This next example presupposes an implementation
 ;; in which #\\Bell is a defined character.
 (standard-char-p #\\Bell) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "character") " is not a "
     (:TERM NIL "character") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL
    "-------------------- Character Casification --------------------")
   :PAR
   (:COMMENT NIL "%% ========== CHAR-DOWNCASE" "%% ========== CHAR-UPCASE")
   (:COM (:NAME "char-upcase, char-downcase" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "char-upcase" "char-downcase")
      (:ARGLIST NIL "character") (:VALUES NIL "corresponding-character"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "character")
     ", " (:PARAM NIL "corresponding-character") "—a " (:TERM NIL "character")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 13.4.0 5") :PAR
     "If " (:PARAM NIL "character") " is a " (:TERM NIL "lowercase") " "
     (:TERM NIL "character") ", " (:FUNREF NIL "char-upcase")
     " returns the corresponding " (:TERM NIL "uppercase") " "
     (:TERM NIL "character") ". Otherwise, " (:FUNREF NIL "char-upcase")
     " just returns the given " (:PARAM NIL "character") ". " :PAR "If "
     (:PARAM NIL "character") " is an " (:TERM NIL "uppercase") " "
     (:TERM NIL "character") ", " (:FUNREF NIL "char-downcase")
     " returns the corresponding " (:TERM NIL "lowercase") " "
     (:TERM NIL "character") ". Otherwise, " (:FUNREF NIL "char-downcase")
     " just returns the given " (:PARAM NIL "character") ". " :PAR
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1")
     " The result only ever differs from " (:PARAM NIL "character") " in its "
     (:TERM NIL "code") " " (:TERM NIL "attribute") "; all "
     (:TERM NIL "implementation-defined") " " (:TERM NIL "attributes")
     " are preserved. " (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (char-upcase #\\a) → #\\A
 (char-upcase #\\A) → #\\A
 (char-downcase #\\a) → #\\a
 (char-downcase #\\A) → #\\a
 (char-upcase #\\9) → #\\9
 (char-downcase #\\9) → #\\9
 (char-upcase #\\@) → #\\@
 (char-downcase #\\@) → #\\@
 ;; Note that this next example might run for a very long time in 
 ;; some implementations if CHAR-CODE-LIMIT happens to be very large
 ;; for that implementation.
 (dotimes (code char-code-limit)
   (let ((char (code-char code)))
     (when char
       (unless (cond ((upper-case-p char) (char= (char-upcase (char-downcase char)) char))
                     ((lower-case-p char) (char= (char-downcase (char-upcase char)) char))
                     (t (and (char= (char-upcase (char-downcase char)) char)
                             (char= (char-downcase (char-upcase char)) char))))
         (return char)))))
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "character") " is not a "
     (:TERM NIL "character") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "upper-case-p") ", "
     (:FUNREF NIL "alpha-char-p") ", " (:SECREF NIL :CHARACTERS-WITH-CASE) ", "
     (:SECREF NIL :IMPLEMENTATION-DEFINED-SCRIPTS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "If the " (:PARAM NIL "corresponding-char")
     " is " (:TERM NIL "different") " than " (:PARAM NIL "character")
     ", then both the " (:PARAM NIL "character") " and the "
     (:PARAM NIL "corresponding-char") " have " (:TERM NIL "case") ". " :PAR
     "Since " (:FUNREF NIL "char-equal") " ignores the " (:TERM NIL "case")
     " of the " (:TERM NIL "characters") " it compares, the "
     (:PARAM NIL "corresponding-character") " is always the "
     (:TERM NIL "same") " as " (:PARAM NIL "character") " under "
     (:FUNREF NIL "char-equal") ". " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== LOWER-CASE-P" "%% ========== BOTH-CASE-P"
    "%% ========== UPPER-CASE-P")
   (:COM (:NAME "upper-case-p, lower-case-p, both-case-p" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function")
      (:NAMES NIL "upper-case-p" "lower-case-p" "both-case-p")
      (:ARGLIST NIL "character") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "character")
     "—a " (:TERM NIL "character") ". " :PAR (:PARAM NIL "generalized-boolean")
     "—a " (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "These functions test the case of a given " (:PARAM NIL "character") ". "
     :PAR (:COMMENT NIL "% 13.2.0 13") (:FUNREF NIL "upper-case-p") " returns "
     (:TERM NIL "true") " if " (:PARAM NIL "character") " is an "
     (:TERM NIL "uppercase") " " (:TERM NIL "character")
     "; otherwise, returns " (:TERM NIL "false") ". " :PAR
     (:COMMENT NIL "% 13.2.0 14") (:FUNREF NIL "lower-case-p") " returns "
     (:TERM NIL "true") " if " (:PARAM NIL "character") " is a "
     (:TERM NIL "lowercase") " " (:TERM NIL "character")
     "; otherwise, returns " (:TERM NIL "false") ". " :PAR
     (:COMMENT NIL "% 13.2.0 15") (:FUNREF NIL "both-case-p") " returns "
     (:TERM NIL "true") " if " (:PARAM NIL "character") " is a "
     (:TERM NIL "character") " with " (:TERM NIL "case")
     "; otherwise, returns " (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (upper-case-p #\\A) → " (:TERM NIL "true") "
 (upper-case-p #\\a) → "
      (:TERM NIL "false") "
 (both-case-p #\\a) → "
      (:TERM NIL "true") "
 (both-case-p #\\5) → "
      (:TERM NIL "false") "
 (lower-case-p #\\5) → "
      (:TERM NIL "false") "
 (upper-case-p #\\5) → "
      (:TERM NIL "false") "
 ;; This next example presupposes an implementation 
 ;; in which #\\Bell is an implementation-defined character.
 (lower-case-p #\\Bell) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "character") " is not a "
     (:TERM NIL "character") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "char-upcase") ", "
     (:FUNREF NIL "char-downcase") ", " (:SECREF NIL :CHARACTERS-WITH-CASE)
     ", " (:SECREF NIL :IMPLEMENTATION-DEFINED-SCRIPTS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Character Codes --------------------")
   :PAR (:COMMENT NIL "%% ========== CHAR-CODE")
   (:COM (:NAME "char-code" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "char-code")
      (:ARGLIST NIL "character") (:VALUES NIL "code"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "character")
     "—a " (:TERM NIL "character") ". " :PAR (:PARAM NIL "code") "—a "
     (:TERM NIL "character code") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 13.3.0 3")
     (:FUNREF NIL "char-code") " returns the " (:TERM NIL "code") " "
     (:TERM NIL "attribute") " of " (:PARAM NIL "character") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL ";; An implementation using ASCII character encoding 
;; might return these values:
(char-code #\\$) → 36
(char-code #\\a) → 97
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "character") " is not a "
     (:TERM NIL "character") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:CONREF NIL "char-code-limit") " "
     :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== CHAR-INT")
   (:COM (:NAME "char-int" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "char-int")
      (:ARGLIST NIL "character") (:VALUES NIL "integer"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "character")
     "—a " (:TERM NIL "character") ". " :PAR (:PARAM NIL "integer")
     "—a non-negative " (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 13.4.0 11")
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-2") " Returns a non-negative "
     (:TERM NIL "integer") " encoding the " (:PARAM NIL "character")
     " object. The manner in which the " (:TERM NIL "integer")
     " is computed is " (:TERM NIL "implementation-dependent")
     ". In contrast to " (:FUNREF NIL "sxhash")
     ", the result is not guaranteed to be independent of the particular "
     (:TERM NIL "Lisp image") ". " (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-2")
     " " :PAR (:COMMENT NIL "% 13.4.0 12") "If " (:PARAM NIL "character")
     " has no " (:TERM NIL "implementation-defined") " "
     (:TERM NIL "attributes") ", the results of " (:FUNREF NIL "char-int")
     " and " (:FUNREF NIL "char-code") " are the same. " :PAR
     (:CODE NIL " (char= " (:I NIL "c1") " " (:I NIL "c2") ") ≡ (= (char-int "
      (:I NIL "c1") ") (char-int " (:I NIL "c2") "))
")
     " for characters " (:I NIL "c1") " and " (:I NIL "c2") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (char-int #\\A) → 65       ; implementation A
 (char-int #\\A) → 577      ; implementation B
 (char-int #\\A) → 262145   ; implementation C
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "char-code") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== CODE-CHAR")
   (:COM (:NAME "code-char" :FTYPE "Function")
    (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "code-char") (:ARGLIST NIL "code")
      (:VALUES NIL "char-p"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "code") "—a "
     (:TERM NIL "character code") ". " :PAR (:PARAM NIL "char-p") "—a "
     (:TERM NIL "character") " or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 13.3.0 6")
     "Returns a " (:TERM NIL "character") " with the " (:TERM NIL "code") " "
     (:TERM NIL "attribute") " given by " (:PARAM NIL "code") ". If no such "
     (:TERM NIL "character") " exists and one cannot be created, "
     (:MISC NIL "nil") " is returned. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL "(code-char 65.) → #\\A  ;in an implementation using ASCII codes
(code-char (char-code #\\Space)) → #\\Space  ;in any implementation
")
     " " :PAR
     (:COMMENT NIL "% 13.3.0 7"
      " Removed per suggestion of Barmar -- used old-style bits/fonts.")
     :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The " (:TERM NIL "implementation")
     "'s character encoding. " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "char-code") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== CHAR-CODE-LIMIT")
   (:COM (:NAME "char-code-limit" :FTYPE "Constant Variable")
    (:PART (:NAME "Constant Value") " " :PAR "A non-negative "
     (:TERM NIL "integer") ", the exact magnitude of which is "
     (:TERM NIL "implementation-dependent") ", but which is not less than "
     (:TT NIL "96") " (the number of " (:TERM NIL "standard characters") "). "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 13.1.0 2")
     "The upper exclusive bound on the " (:TERM NIL "value")
     " returned by the " (:TERM NIL "function") " " (:FUNREF NIL "char-code")
     ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "char-code") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL " Sandra wanted this added.")
     "The " (:TERM NIL "value") " of " (:VARREF NIL "char-code-limit")
     " might be larger than the actual number of " (:TERM NIL "characters")
     " supported by the " (:TERM NIL "implementation") ". " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Character Names --------------------")
   :PAR (:COMMENT NIL "%% ========== CHAR-NAME")
   (:COM (:NAME "char-name" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "char-name")
      (:ARGLIST NIL "character") (:VALUES NIL "name"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "character")
     "—a " (:TERM NIL "character") ". " :PAR (:PARAM NIL "name") "—a "
     (:TERM NIL "string") " or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns a " (:TERM NIL "string")
     " that is the " (:TERM NIL "name") " of the " (:PARAM NIL "character")
     ", or " (:MISC NIL "nil") " if the " (:PARAM NIL "character") " has no "
     (:TERM NIL "name") ". " :PAR
     (:COMMENT NIL "% 13.4.0 20"
      " \\funref{char-name} will only locate ``simple'' character names;"
      " it will not construct names on the basis of"
      " the \\param{character}'s \\term{implementation-dependent} \\term{attributes}.")
     :PAR "All " (:TERM NIL "non-graphic") " characters are required to have "
     (:TERM NIL "names") " unless they have some "
     (:TERM NIL "implementation-defined") " " (:TERM NIL "attribute")
     " which is not " (:TERM NIL "null") ". Whether or not other "
     (:TERM NIL "characters") " have " (:TERM NIL "names") " is "
     (:TERM NIL "implementation-dependent") ". " :PAR
     (:ISSUE NIL "CHAR-NAME-CASE:X3J13-MAR-91") " "
     (:COMMENT NIL
      "% I added this next phrase to highlight why there are two lists here. -kmp 14-May-93")
     "The " (:TERM NIL "standard characters") " " (:ANG NIL "Newline") " and "
     (:ANG NIL "Space") " have the respective names " (:TT NIL "\"Newline\"")
     " and " (:TT NIL "\"Space\"") ". "
     (:COMMENT NIL "% Ditto. -kmp 14-May-93") "The "
     (:TERM NIL "semi-standard") " " (:TERM NIL "characters") " "
     (:ANG NIL "Tab") ", " (:ANG NIL "Page") ", " (:ANG NIL "Rubout") ", "
     (:ANG NIL "Linefeed") ", " (:ANG NIL "Return") ", and "
     (:ANG NIL "Backspace") " "
     (:COMMENT NIL
      "% Next parenthetical remark added for emphasis. -kmp 14-May-93")
     "(if they are supported by the " (:TERM NIL "implementation")
     ") have the respective names " (:TT NIL "\"Tab\"") ", "
     (:TT NIL "\"Page\"") ", " (:TT NIL "\"Rubout\"") ", "
     (:TT NIL "\"Linefeed\"") ", " (:TT NIL "\"Return\"") ", and "
     (:TT NIL "\"Backspace\"")
     " (in the indicated case, even though name lookup by “" (:TT NIL "#\\")
     "” and by the " (:TERM NIL "function") " " (:FUNREF NIL "name-char")
     " is not case sensitive). " (:ENDISSUE NIL "CHAR-NAME-CASE:X3J13-MAR-91")
     " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (char-name #\\ ) → \"Space\"
 (char-name #\\Space) → \"Space\"
 (char-name #\\Page) → \"Page\"

 (char-name #\\a)
→ NIL
OR→ \"LOWERCASE-a\"
OR→ \"Small-A\"
OR→ \"LA01\"

 (char-name #\\A)
→ NIL
OR→ \"UPPERCASE-A\"
OR→ \"Capital-A\"
OR→ \"LA02\"

 ;; Even though its CHAR-NAME can vary, #\\A prints as #\\A
 (prin1-to-string (read-from-string (format nil \"#\\\\~A\" (or (char-name #\\A) \"A\"))))
→ \"#\\\\A\"
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "character") " is not a "
     (:TERM NIL "character") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "name-char") ", "
     (:SECREF NIL :PRINTING-CHARACTERS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL "% Added \"non-graphic\" to cover objection by Sandra:"
      "%  Does this mean that if (char-name #\\A) = \"Capital-A\""
      "%   (print #\\A) prints" "%   #\\Capital-A" "%  instead of #\\A ???"
      "%  Or does this apply only to non-standard characters.")
     (:TERM NIL "Non-graphic") " " (:TERM NIL "characters") " having "
     (:TERM NIL "names") " are written by the " (:TERM NIL "Lisp printer")
     " as “" (:TT NIL "#\\") "” followed by the their " (:TERM NIL "name")
     "; see " (:SECREF NIL :PRINTING-CHARACTERS) ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== NAME-CHAR")
   (:COM (:NAME "name-char" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "name-char") (:ARGLIST NIL "name")
      (:VALUES NIL "char-p"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL "% 13.4.0 17" "% 13.4.0 18") (:PARAM NIL "name") "—a "
     (:TERM NIL "string designator") ". " :PAR (:PARAM NIL "char-p") "—a "
     (:TERM NIL "character") " or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 13.4.0 21                          ") "Returns the "
     (:TERM NIL "character") " " (:TERM NIL "object") " whose "
     (:TERM NIL "name") " is " (:PARAM NIL "name") " (as determined by "
     (:FUNREF NIL "string-equal") "—" (:I NIL "i.e.")
     ",  lookup is not case sensitive). If such a " (:TERM NIL "character")
     " does not exist, " (:MISC NIL "nil") " is returned. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL "(name-char 'space) → #\\Space
(name-char \"space\") → #\\Space
(name-char \"Space\") → #\\Space
(let ((x (char-name #\\a)))
  (or (not x) (eql (name-char x) #\\a))) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "name") " is not a "
     (:TERM NIL "string designator") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "char-name") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " ")
  " " :PAR)
 (:CHAPTER
  (:NUM "14" :TITLE ("Conses") :NUMTAG :CHAP-FOURTEEN :NAMETAG :CONSES)
  (:SECTION (:TITLE ("Cons Concepts")) :PAR "A " (:NEWTERM NIL "cons")
   " is a compound data " (:TERM NIL "object")
   " having two components called the " (:TERM NIL "car") " and the "
   (:TERM NIL "cdr") ". " :PAR
   (:TABLE (:NAME ("Some defined names relating to conses."))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " car")) (:CELL NIL (:FUNREF NIL "cons"))
     (:CELL NIL (:FUNREF NIL "rplacd")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " cdr"))
     (:CELL NIL (:FUNREF NIL "rplaca")) (:CELL NIL)))
   " " :PAR "Depending on context, a group of connected " (:TERM NIL "conses")
   " can be viewed in a variety of different ways. A variety of operations is provided to support each of these various views. "
   :PAR
   (:SUBSECTION (:TITLE ("Conses as Trees")) "A " (:NEWTERM NIL "tree")
    " is a binary recursive data structure made up of " (:TERM NIL "conses")
    " and " (:TERM NIL "atoms") ": the " (:TERM NIL "conses")
    " are themselves also " (:TERM NIL "trees")
    " (sometimes called “subtrees” or “branches”), and the "
    (:TERM NIL "atoms") " are terminal nodes (sometimes called "
    (:NEWTERM NIL "leaves") "). Typically, the " (:TERM NIL "leaves")
    " represent data while the branches establish some relationship among that data. "
    :PAR
    (:TABLE (:NAME ("Some defined names relating to trees."))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " caaaar"))
      (:CELL NIL (:FUNREF NIL "caddar")) (:CELL NIL (:FUNREF NIL "cdar"))
      (:CELL NIL (:FUNREF NIL "nsubst")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " caaadr"))
      (:CELL NIL (:FUNREF NIL "cadddr")) (:CELL NIL (:FUNREF NIL "cddaar"))
      (:CELL NIL (:FUNREF NIL "nsubst-if")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " caaar"))
      (:CELL NIL (:FUNREF NIL "caddr")) (:CELL NIL (:FUNREF NIL "cddadr"))
      (:CELL NIL (:FUNREF NIL "nsubst-if-not")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " caadar"))
      (:CELL NIL (:FUNREF NIL "cadr")) (:CELL NIL (:FUNREF NIL "cddar"))
      (:CELL NIL (:FUNREF NIL "nthcdr")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " caaddr"))
      (:CELL NIL (:FUNREF NIL "cdaaar")) (:CELL NIL (:FUNREF NIL "cdddar"))
      (:CELL NIL (:FUNREF NIL "sublis")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " caadr"))
      (:CELL NIL (:FUNREF NIL "cdaadr")) (:CELL NIL (:FUNREF NIL "cddddr"))
      (:CELL NIL (:FUNREF NIL "subst")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " caar"))
      (:CELL NIL (:FUNREF NIL "cdaar")) (:CELL NIL (:FUNREF NIL "cdddr"))
      (:CELL NIL (:FUNREF NIL "subst-if")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " cadaar"))
      (:CELL NIL (:FUNREF NIL "cdadar")) (:CELL NIL (:FUNREF NIL "cddr"))
      (:CELL NIL (:FUNREF NIL "subst-if-not")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " cadadr"))
      (:CELL NIL (:FUNREF NIL "cdaddr")) (:CELL NIL (:FUNREF NIL "copy-tree"))
      (:CELL NIL (:FUNREF NIL "tree-equal")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " cadar"))
      (:CELL NIL (:FUNREF NIL "cdadr")) (:CELL NIL (:FUNREF NIL "nsublis"))
      (:CELL NIL)))
    " " :PAR
    (:SUBSUBSECTION
     (:TITLE ("General Restrictions on Parameters that must be Trees"))
     (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY")
     " Except as explicitly stated otherwise, for any "
     (:TERM NIL "standardized") " " (:TERM NIL "function") " that takes a "
     (:TERM NIL "parameter") " that is required to be a " (:TERM NIL "tree")
     ", the consequences are undefined if that " (:TERM NIL "tree")
     " is circular. " (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Conses as Lists")) "A " (:NEWTERM NIL "list")
    " is a chain of " (:TERM NIL "conses") " in which the " (:TERM NIL "car")
    " of each " (:TERM NIL "cons") " is an " (:TERM NIL "element") " of the "
    (:TERM NIL "list") ", and the " (:TERM NIL "cdr") " of each "
    (:TERM NIL "cons")
    " is either the next link in the chain or a terminating "
    (:TERM NIL "atom") ". " :PAR "A " (:NEWTERM NIL "proper list") " is a "
    (:TERM NIL "list") " terminated by the " (:TERM NIL "empty list") ". The "
    (:TERM NIL "empty list") " is a " (:TERM NIL "proper list")
    ", but is not a " (:TERM NIL "cons") ". " :PAR "An "
    (:NEWTERM NIL "improper list") " is a " (:TERM NIL "list")
    " that is not a " (:TERM NIL "proper list") "; that is, it is a "
    (:TERM NIL "circular list") " or a " (:TERM NIL "dotted list") ". " :PAR
    "A " (:NEWTERM NIL "dotted list") " is a " (:TERM NIL "list")
    " that has a terminating " (:TERM NIL "atom") " that is not the "
    (:TERM NIL "empty list") ". A " (:TERM NIL "non-nil") " "
    (:TERM NIL "atom") " by itself is not considered to be a "
    (:TERM NIL "list") " of any kind—not even a " (:TERM NIL "dotted list")
    ". " :PAR "A " (:NEWTERM NIL "circular list") " is a chain of "
    (:TERM NIL "conses") " that has no termination because some "
    (:TERM NIL "cons") " in the chain is the " (:TERM NIL "cdr") " of a later "
    (:TERM NIL "cons") ". " :PAR
    (:TABLE (:NAME ("Some defined names relating to lists."))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " append"))
      (:CELL NIL (:FUNREF NIL "last")) (:CELL NIL (:FUNREF NIL "nbutlast"))
      (:CELL NIL (:FUNREF NIL "rest")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " butlast"))
      (:CELL NIL (:FUNREF NIL "ldiff")) (:CELL NIL (:FUNREF NIL "nconc"))
      (:CELL NIL (:FUNREF NIL "revappend")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " copy-alist"))
      (:CELL NIL (:FUNREF NIL "list")) (:CELL NIL (:FUNREF NIL "ninth"))
      (:CELL NIL (:FUNREF NIL "second")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " copy-list"))
      (:CELL NIL (:FUNREF NIL "list*")) (:CELL NIL (:FUNREF NIL "nreconc"))
      (:CELL NIL (:FUNREF NIL "seventh")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " eighth"))
      (:CELL NIL (:FUNREF NIL "list-length")) (:CELL NIL (:FUNREF NIL "nth"))
      (:CELL NIL (:FUNREF NIL "sixth")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " endp"))
      (:CELL NIL (:FUNREF NIL "make-list")) (:CELL NIL (:FUNREF NIL "nthcdr"))
      (:CELL NIL (:FUNREF NIL "tailp")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " fifth"))
      (:CELL NIL (:FUNREF NIL "member")) (:CELL NIL (:FUNREF NIL "pop"))
      (:CELL NIL (:FUNREF NIL "tenth")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " first"))
      (:CELL NIL (:FUNREF NIL "member-if")) (:CELL NIL (:FUNREF NIL "push"))
      (:CELL NIL (:FUNREF NIL "third")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " fourth"))
      (:CELL NIL (:FUNREF NIL "member-if-not"))
      (:CELL NIL (:FUNREF NIL "pushnew")) (:CELL NIL)))
    " " :PAR
    (:SUBSUBSECTION (:TITLE ("Lists as Association Lists")) "An "
     (:NEWTERM NIL "association list") " is a " (:TERM NIL "list") " of "
     (:TERM NIL "conses") " representing an association of " (:TERM NIL "keys")
     " with " (:TERM NIL "values") ", where the " (:TERM NIL "car") " of each "
     (:TERM NIL "cons") " is the " (:TERM NIL "key") " and the "
     (:TERM NIL "cdr") " is the " (:TERM NIL "value") " associated with that "
     (:TERM NIL "key") ". " :PAR
     (:TABLE (:NAME ("Some defined names related to assocation lists."))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " acons"))
       (:CELL NIL (:FUNREF NIL "assoc-if")) (:CELL NIL (:FUNREF NIL "pairlis"))
       (:CELL NIL (:FUNREF NIL "rassoc-if")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " assoc"))
       (:CELL NIL (:FUNREF NIL "assoc-if-not"))
       (:CELL NIL (:FUNREF NIL "rassoc"))
       (:CELL NIL (:FUNREF NIL "rassoc-if-not"))))
     " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Lists as Sets")) (:TERM NIL "Lists")
     " are sometimes viewed as sets by considering their elements unordered and by assuming there is no duplication of elements. "
     :PAR
     (:TABLE (:NAME ("Some defined names related to sets."))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " adjoin"))
       (:CELL NIL (:FUNREF NIL "nset-difference"))
       (:CELL NIL (:FUNREF NIL "set-difference"))
       (:CELL NIL (:FUNREF NIL "union")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " intersection"))
       (:CELL NIL (:FUNREF NIL "nset-exclusive-or"))
       (:CELL NIL (:FUNREF NIL "set-exclusive-or")) (:CELL NIL))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " nintersection"))
       (:CELL NIL (:FUNREF NIL "nunion")) (:CELL NIL (:FUNREF NIL "subsetp"))
       (:CELL NIL)))
     " " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("General Restrictions on Parameters that must be Lists"))
     "Except as explicitly specified otherwise, any "
     (:TERM NIL "standardized") " " (:TERM NIL "function") " that takes a "
     (:TERM NIL "parameter") " that is required to be a " (:TERM NIL "list")
     " should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if the " (:TERM NIL "value")
     " received is a " (:TERM NIL "dotted list") ". " :PAR
     (:COMMENT NIL " Sandra complained that this was only said a few places, "
      " and needed to be said more."
      " This is a stopgap while we make sure we mean it everywhere.")
     "Except as explicitly specified otherwise, for any "
     (:TERM NIL "standardized") " " (:TERM NIL "function") " that takes a "
     (:TERM NIL "parameter") " that is required to be a " (:TERM NIL "list")
     ", the consequences are undefined if that " (:TERM NIL "list") " is "
     (:TERM NIL "circular") ". " :PAR)
    :PAR))
  :PAR
  (:DICTIONARY NIL :PAR " " :PAR
   (:COMMENT NIL " Cons" "  Trees" "  Lists" "   List Elements" "   List Tails"
    "   List Mapping" "   Alists" "   Plists" "   Sets")
   :PAR
   (:COMMENT NIL
    "-------------------- Conses, lists, atoms, ... --------------------")
   :PAR
   (:COM (:NAME "list" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " :PAR (:TYPEREF NIL "list") ", "
     (:TYPEREF NIL "sequence") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:NEWTERM NIL "list")
     " is a chain of " (:TERM NIL "conses") " in which the " (:TERM NIL "car")
     " of each " (:TERM NIL "cons") " is an " (:TERM NIL "element") " of the "
     (:TERM NIL "list") ", and the " (:TERM NIL "cdr") " of each "
     (:TERM NIL "cons")
     " is either the next link in the chain or a terminating "
     (:TERM NIL "atom") ". " :PAR "A " (:NEWTERM NIL "proper list")
     " is a chain of " (:TERM NIL "conses") " terminated by the "
     (:NEWTERM NIL "empty list") ", " (:TT NIL " ()") ", which is itself a "
     (:TERM NIL "proper list") ". A " (:NEWTERM NIL "dotted list") " is a "
     (:TERM NIL "list") " which has a terminating " (:TERM NIL "atom")
     " that is not the " (:TERM NIL "empty list") ". A "
     (:NEWTERM NIL "circular list") " is a chain of " (:TERM NIL "conses")
     " that has no termination because some " (:TERM NIL "cons")
     " in the chain is the " (:TERM NIL "cdr") " of a later "
     (:TERM NIL "cons") ". " :PAR (:TERM NIL "Dotted lists") " and "
     (:TERM NIL "circular lists") " are also " (:TERM NIL "lists")
     ", but usually the unqualified term “list” within this specification means "
     (:TERM NIL "proper list") ". Nevertheless, the " (:TERM NIL "type") " "
     (:TYPEREF NIL "list") " unambiguously includes "
     (:TERM NIL "dotted lists") " and " (:TERM NIL "circular lists") ". " :PAR
     "For each " (:TERM NIL "element") " of a " (:TERM NIL "list")
     " there is a " (:TERM NIL "cons") ". The " (:TERM NIL "empty list")
     " has no " (:TERM NIL "elements") " and is not a " (:TERM NIL "cons") ". "
     :PAR (:COMMENT NIL "% 2.15.0 14") "The " (:TERM NIL "types") " "
     (:TYPEREF NIL "cons") " and " (:TYPEREF NIL "null") " form an "
     (:TERM NIL "exhaustive partition") " of the " (:TERM NIL "type") " "
     (:TYPEREF NIL "list") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :LEFT-PAREN) ", "
     (:SECREF NIL :PRINTING-LISTS-AND-CONSES) " " :PAR))
   :PAR
   (:COM (:NAME "null" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "null") ", "
     (:TYPEREF NIL "symbol") ", " (:TYPEREF NIL "list") ", "
     (:TYPEREF NIL "sequence") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 2.15.0 13")
     "The only " (:TERM NIL "object") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "null") " is " (:MISC NIL "nil") ", which represents the "
     (:TERM NIL "empty list") " and can also be notated " (:TT NIL " ()") ". "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :SYMBOL-TOKENS) ", "
     (:SECREF NIL :LEFT-PAREN) ", " (:SECREF NIL :PRINTING-SYMBOLS) " " :PAR))
   (:COM (:NAME "cons" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "cons") ", "
     (:TYPEREF NIL "list") ", " (:TYPEREF NIL "sequence") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "cons")
     " is a compound " (:TERM NIL "object")
     " having two components, called the " (:TERM NIL "car") " and "
     (:TERM NIL "cdr") ". These form a " (:TERM NIL "dotted pair")
     ". Each component can be any " (:TERM NIL "object") ". " :PAR
     (:ISSUE NIL "CONS-TYPE-SPECIFIER:ADD") " " :PAR)
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Specializing. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:DEF (:KIND "type") (:NAMES NIL "cons")
      (:ARGLIST NIL (:BRAC NIL "car-typespec " (:BRAC NIL "cdr-typespec"))))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "car-typespec") "—a " (:TERM NIL "type specifier") ", or the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". The default is the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". " :PAR
     (:PARAM NIL "cdr-typespec") "—a " (:TERM NIL "type specifier") ", or the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". The default is the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     "This denotes the set of " (:TERM NIL "conses") " whose "
     (:TERM NIL "car") " is constrained to be of " (:TERM NIL "type") " "
     (:PARAM NIL "car-typespec") " and whose " (:TERM NIL "cdr")
     " is constrained to be of " (:TERM NIL "type") " "
     (:PARAM NIL "cdr-typespec") ". (If either " (:PARAM NIL "car-typespec")
     " or " (:PARAM NIL "cdr-typespec") " is " (:MISC NIL "*")
     ", it is as if the " (:TERM NIL "type") " " (:TYPEREF NIL "t")
     " had been denoted.) " :PAR (:ENDISSUE NIL "CONS-TYPE-SPECIFIER:ADD") " "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :LEFT-PAREN) ", "
     (:SECREF NIL :PRINTING-LISTS-AND-CONSES) " " :PAR))
   (:COM (:NAME "atom" :FTYPE "Type")
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "atom") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "It is equivalent to "
     (:TT NIL " (not cons)") ". " :PAR))
   :PAR (:COMMENT NIL "-------------------- Cons --------------------") :PAR
   (:COMMENT NIL "%% ========== CONS")
   (:COM (:NAME "cons" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "cons")
      (:ARGLIST NIL "object-1 object-2") (:VALUES NIL "cons"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object-1")
     "—an " (:TERM NIL "object") ". " :PAR (:PARAM NIL "object-2") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "cons") "—a "
     (:TERM NIL "cons") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.1.0 8")
     "Creates a " (:TERM NIL "fresh") " " (:TERM NIL "cons") ", the "
     (:TERM NIL "car") " of which is " (:PARAM NIL "object-1") " and the "
     (:TERM NIL "cdr") " of which is " (:PARAM NIL "object-2") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (cons 1 2) → (1 . 2)
 (cons 1 nil) → (1)
 (cons nil 2) → (NIL . 2)
 (cons nil nil) → (NIL)
 (cons 1 (cons 2 (cons 3 (cons 4 nil)))) → (1 2 3 4)
 (cons 'a 'b) → (A . B)
 (cons 'a (cons 'b (cons 'c '"
      (:TT NIL " ()") "))) → (A B C)
 (cons 'a '(b c d)) → (A B C D)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR
     (:COMMENT NIL "% Sandra thinks this is excessive."
      "Creates an \\term{object}.")
     :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR
     (:COMMENT NIL "% Sandra thinks this is excessive."
      "Might signal \\typeref{storage-condition}.")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "list") " " :PAR)
    (:PART (:NAME "Notes") " If " (:PARAM NIL "object-2") " is a "
     (:TERM NIL "list") ", " (:FUNREF NIL "cons")
     " can be thought of as producing a new " (:TERM NIL "list")
     " which is like it but has " (:PARAM NIL "object-1") " prepended. "))
   " " :PAR (:COMMENT NIL "%% ========== CONSP")
   (:COM (:NAME "consp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "consp") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 8") "Returns "
     (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "cons") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (consp nil) → " (:TERM NIL "false") "
 (consp (cons 1 2)) → "
      (:TERM NIL "true") "
")
     " " :PAR "The " (:TERM NIL "empty list") " is not a " (:TERM NIL "cons")
     ", so " :PAR
     (:CODE NIL " (consp '()) ≡ (consp 'nil) → " (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "listp") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (consp " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'cons) ≡ (not (typep " (:PARAM NIL "object")
      " 'atom)) ≡ (typep " (:PARAM NIL "object") " '(not atom))
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ATOM")
   (:COM (:NAME "atom" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "atom") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 6") "Returns "
     (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "atom") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (atom 'sss) → " (:TERM NIL "true") "
 (atom (cons 1 2)) → "
      (:TERM NIL "false") "
 (atom nil) → "
      (:TERM NIL "true") "
 (atom '()) → "
      (:TERM NIL "true") "
 (atom 3) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (atom " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'atom) ≡ (not (consp " (:PARAM NIL "object") "))
 ≡ (not (typep "
      (:PARAM NIL "object") " 'cons)) ≡ (typep " (:PARAM NIL "object")
      " '(not cons))
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== RPLACA" "%% ========== RPLACD")
   (:COM (:NAME "rplaca, rplacd" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "rplaca" "rplacd")
      (:ARGLIST NIL "cons object") (:VALUES NIL "cons"))
     " " :PAR)
    (:PART (:NAME "Pronunciation") " " :PAR (:FUNREF NIL "rplaca") ": "
     (:PRONOUNCED NIL (:LO-STRESS NIL "rē") (:HI-STRESS NIL "plak") "ə") " or "
     (:PRONOUNCED NIL (:LO-STRESS NIL "rə") (:HI-STRESS NIL "plak") "ə") " "
     :PAR (:FUNREF NIL "rplacd") ": "
     (:PRONOUNCED NIL (:LO-STRESS NIL "rē") (:HI-STRESS NIL "plak") "də")
     " or "
     (:PRONOUNCED NIL (:LO-STRESS NIL "rə") (:HI-STRESS NIL "plak") "də")
     " or "
     (:PRONOUNCED NIL (:LO-STRESS NIL "rē") (:HI-STRESS NIL "plak") "dē")
     " or "
     (:PRONOUNCED NIL (:LO-STRESS NIL "rə") (:HI-STRESS NIL "plak") "dē") " "
     :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "cons") "—a "
     (:TERM NIL "cons") ". " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.3.0 4")
     (:FUNREF NIL "rplaca") " replaces the " (:TERM NIL "car") " of the "
     (:PARAM NIL "cons") " with " (:PARAM NIL "object") ". "
     (:COMMENT NIL "and then returns the modified \\param{cons}.") :PAR
     (:FUNREF NIL "rplacd") " replaces the " (:TERM NIL "cdr") " of the "
     (:PARAM NIL "cons") " with " (:PARAM NIL "object") ". "
     (:COMMENT NIL "and then returns the modified \\param{cons}.") :PAR)
    (:PART (:NAME "Examples") " " (:COMMENT NIL "% 15.3.0 3")
     (:CODE NIL
      " (defparameter *some-list* (list* 'one 'two 'three 'four)) → *some-list*
 *some-list* → (ONE TWO THREE . FOUR)
 (rplaca *some-list* 'uno) → (UNO TWO THREE . FOUR)
 *some-list* → (UNO TWO THREE . FOUR)
 (rplacd (last *some-list*) (list 'IV)) → (THREE IV)
 *some-list* → (UNO TWO THREE IV)
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " (:COMMENT NIL "% 15.3.0 1" "% 15.3.0 2")
     :PAR "The " (:PARAM NIL "cons") " is modified. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR
     (:COMMENT NIL "!!! Issue: read-only structure might be enforced. -kmp")
     :PAR "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "cons") " is not a "
     (:TERM NIL "cons") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL "%What else would they be used for? -kmp 15-Feb-91"
      " \\funref{rplaca} and \\funref{rplacd} may be used to make alterations "
      " in an already existing list structure, that is, "
      " to change the \\term{car} or \\term{cdr} of an existing \\term{cons}.")
     :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== CAR" "%% ========== CDR" "%% ========== CAAR"
    "%% ========== CADR" "%% ========== CDAR" "%% ========== CDDR"
    "%% ========== CAAAR" "%% ========== CAADR" "%% ========== CADAR"
    "%% ========== CADDR" "%% ========== CDAAR" "%% ========== CDADR"
    "%% ========== CDDAR" "%% ========== CDDDR" "%% ========== CAAAAR"
    "%% ========== CAAADR" "%% ========== CAADAR" "%% ========== CAADDR"
    "%% ========== CADAAR" "%% ========== CADADR" "%% ========== CADDAR"
    "%% ========== CADDDR" "%% ========== CDAAAR" "%% ========== CDAADR"
    "%% ========== CDADAR" "%% ========== CDADDR" "%% ========== CDDAAR"
    "%% ========== CDDADR" "%% ========== CDDDAR " "%% ========== CDDDDR ")
   (:COM
    (:NAME
     "car, cdr, caar, cadr, cdar, cddr, caaar, caadr, cadar, caddr, cdaar, cdadr, cddar, cdddr, caaaar, caaadr, caadar, caaddr, cadaar, cadadr, caddar, cadddr, cdaaar, cdaadr, cdadar, cdaddr, cddaar, cddadr, cdddar, cddddr"
     :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "accessor")
      (:NAMES NIL "car" "cdr" "caar" "cadr" "cdar" "cddr" "caaar" "caadr"
       "cadar" "caddr" "cdaar" "cdadr" "cddar" "cdddr" "caaaar" "caaadr"
       "caadar" "caaddr" "cadaar" "cadadr" "caddar" "cadddr" "cdaaar" "cdaadr"
       "cdadar" "cdaddr" "cddaar" "cddadr" "cdddar" "cddddr")
      (:ARGLIST NIL "x") (:VALUES NIL "object") (:NEW-VALUE NIL "new-object"))
     " " :PAR)
    (:PART (:NAME "Pronunciation") " " :PAR (:FUNREF NIL "cadr") ": "
     (:PRONOUNCED NIL (:HI-STRESS NIL "ka") (:LO-STRESS NIL "də r")) " " :PAR
     (:FUNREF NIL "caddr") ": "
     (:PRONOUNCED NIL (:HI-STRESS NIL "kad") "ə " (:LO-STRESS NIL "də r"))
     " or " (:PRONOUNCED NIL (:HI-STRESS NIL "ka") (:LO-STRESS NIL "d.udə r"))
     " " :PAR (:FUNREF NIL "cdr") ": "
     (:PRONOUNCED NIL (:HI-STRESS NIL "k.u") (:LO-STRESS NIL "də r")) " " :PAR
     (:FUNREF NIL "cddr") ": "
     (:PRONOUNCED NIL (:HI-STRESS NIL "k.ud") "ə " (:LO-STRESS NIL "də r"))
     " or " (:PRONOUNCED NIL (:HI-STRESS NIL "kə") (:LO-STRESS NIL "d.udə r"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "x") "—a "
     (:TERM NIL "list") ". " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "new-object") "—an "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.1.0 3") "If "
     (:PARAM NIL "x") " is a " (:TERM NIL "cons") ", " (:FUNREF NIL "car")
     " returns the " (:TERM NIL "car") " of that " (:TERM NIL "cons") ". If "
     (:PARAM NIL "x") " is " (:MISC NIL "nil") ", " (:FUNREF NIL "car")
     " returns " (:MISC NIL "nil") ". " :PAR (:COMMENT NIL "% 15.1.0 4") "If "
     (:PARAM NIL "x") " is a " (:TERM NIL "cons") ", " (:FUNREF NIL "cdr")
     " returns the " (:TERM NIL "cdr") " of that " (:TERM NIL "cons") ". If "
     (:PARAM NIL "x") " is " (:MISC NIL "nil") ", " (:FUNREF NIL "cdr")
     " returns " (:MISC NIL "nil") ". " :PAR (:TERM NIL "Functions")
     " are provided which perform compositions of up to four "
     (:FUNREF NIL "car") " and " (:FUNREF NIL "cdr") " operations. Their "
     (:TERM NIL "names") " consist of a " (:TT NIL "C")
     ", followed by two, three, or four occurrences of " (:TT NIL "A") " or "
     (:TT NIL "D") ", and finally an " (:TT NIL "R") ". The series of "
     (:TT NIL "A") "'s and " (:TT NIL "D") "'s in each " (:TERM NIL "function")
     "'s " (:TERM NIL "name") " is chosen to identify the series of "
     (:FUNREF NIL "car") " and " (:FUNREF NIL "cdr")
     " operations that is performed by the function. The order in which the "
     (:TT NIL "A") "'s and " (:TT NIL "D")
     "'s appear is the inverse of the order in which the corresponding operations are performed. "
     (:NEXTFIGURE (:CAPS T)) " defines the relationships precisely. " :PAR
     (:TABLE (:NAME ("CAR and CDR variants"))
      (:ROW NIL
       (:CELL NIL "This " (:TERM NIL "place") " " (:MATH NIL (:MO NIL "…")))
       (:CELL NIL "Is equivalent to this " (:TERM NIL "place") " "
        (:MATH NIL (:MO NIL "…"))))
      (:ROW NIL (:CELL NIL (:TT NIL "(caar " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(car (car " (:PARAM NIL "x") "))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cadr " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(car (cdr " (:PARAM NIL "x") "))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cdar " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(cdr (car " (:PARAM NIL "x") "))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cddr " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(cdr (cdr " (:PARAM NIL "x") "))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(caaar " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(car (car (car " (:PARAM NIL "x") ")))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(caadr " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(car (car (cdr " (:PARAM NIL "x") ")))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cadar " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(car (cdr (car " (:PARAM NIL "x") ")))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(caddr " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(car (cdr (cdr " (:PARAM NIL "x") ")))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cdaar " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(cdr (car (car " (:PARAM NIL "x") ")))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cdadr " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(cdr (car (cdr " (:PARAM NIL "x") ")))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cddar " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(cdr (cdr (car " (:PARAM NIL "x") ")))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cdddr " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(cdr (cdr (cdr " (:PARAM NIL "x") ")))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(caaaar " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(car (car (car (car " (:PARAM NIL "x") "))))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(caaadr " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(car (car (car (cdr " (:PARAM NIL "x") "))))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(caadar " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(car (car (cdr (car " (:PARAM NIL "x") "))))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(caaddr " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(car (car (cdr (cdr " (:PARAM NIL "x") "))))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cadaar " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(car (cdr (car (car " (:PARAM NIL "x") "))))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cadadr " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(car (cdr (car (cdr " (:PARAM NIL "x") "))))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(caddar " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(car (cdr (cdr (car " (:PARAM NIL "x") "))))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cadddr " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(car (cdr (cdr (cdr " (:PARAM NIL "x") "))))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cdaaar " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(cdr (car (car (car " (:PARAM NIL "x") "))))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cdaadr " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(cdr (car (car (cdr " (:PARAM NIL "x") "))))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cdadar " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(cdr (car (cdr (car " (:PARAM NIL "x") "))))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cdaddr " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(cdr (car (cdr (cdr " (:PARAM NIL "x") "))))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cddaar " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(cdr (cdr (car (car " (:PARAM NIL "x") "))))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cddadr " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(cdr (cdr (car (cdr " (:PARAM NIL "x") "))))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cdddar " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(cdr (cdr (cdr (car " (:PARAM NIL "x") "))))")))
      (:ROW NIL (:CELL NIL (:TT NIL "(cddddr " (:PARAM NIL "x") ")"))
       (:CELL NIL (:TT NIL "(cdr (cdr (cdr (cdr " (:PARAM NIL "x") "))))"))))
     " " :PAR (:MACREF NIL "setf")
     " can also be used with any of these functions to change an existing component of "
     (:PARAM NIL "x") ", but " (:MACREF NIL "setf")
     " will not make new components. So, for example, the " (:TERM NIL "car")
     " of a " (:TERM NIL "cons") " can be assigned with " (:MACREF NIL "setf")
     " of " (:FUNREF NIL "car") ", but the " (:TERM NIL "car") " of "
     (:MISC NIL "nil") " cannot be assigned with " (:MACREF NIL "setf") " of "
     (:FUNREF NIL "car") ". Similarly, the " (:TERM NIL "car") " of the "
     (:TERM NIL "car") " of a " (:TERM NIL "cons") " whose " (:TERM NIL "car")
     " is a " (:TERM NIL "cons") " can be assigned with " (:MACREF NIL "setf")
     " of " (:FUNREF NIL "caar") ", but neither " (:MISC NIL "nil") " nor a "
     (:TERM NIL "cons") " whose car is " (:MISC NIL "nil")
     " can be assigned with " (:MACREF NIL "setf") " of " (:FUNREF NIL "caar")
     ". " :PAR (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " The argument "
     (:PARAM NIL "x") " is permitted to be a " (:TERM NIL "dotted list")
     " or a " (:TERM NIL "circular list") ". "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (car nil) → NIL  
 (cdr '(1 . 2)) → 2
 (cdr '(1 2)) → (2)
 (cadr '(1 2)) → 2 
 (car '(a b c)) → A
 (cdr '(a b c)) → (B C)
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "The functions "
     (:FUNREF NIL "car") " and " (:FUNREF NIL "cdr") " should signal "
     (:TYPEREF NIL "type-error") " if they receive an argument which is not a "
     (:TERM NIL "list") ". The other functions (" (:FUNREF NIL "caar") ", "
     (:FUNREF NIL "cadr") ", " (:MATH NIL (:MO NIL "…")) " "
     (:FUNREF NIL "cddddr")
     ") should behave for the purpose of error checking as if defined by appropriate calls to "
     (:FUNREF NIL "car") " and " (:FUNREF NIL "cdr") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "rplaca") ", "
     (:FUNREF NIL "first") ", " (:FUNREF NIL "rest") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 15.1.0 7") "The "
     (:TERM NIL "car") " of a " (:TERM NIL "cons")
     " can also be altered by using " (:FUNREF NIL "rplaca") ", and the "
     (:TERM NIL "cdr") " of a " (:TERM NIL "cons") " can be altered by using "
     (:FUNREF NIL "rplacd") ". " :PAR
     (:CODE NIL "(car " (:I NIL "x") ")    ≡ (first " (:I NIL "x") ")
(cadr "
      (:I NIL "x") ")   ≡ (second " (:I NIL "x") ") ≡ (car (cdr " (:I NIL "x")
      "))
(caddr "
      (:I NIL "x") ")  ≡ (third " (:I NIL "x") ")  ≡ (car (cdr (cdr "
      (:I NIL "x") ")))
(cadddr "
      (:I NIL "x") ") ≡ (fourth " (:I NIL "x") ") ≡ (car (cdr (cdr (cdr "
      (:I NIL "x") "))))
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "-------------------- Trees --------------------")
   :PAR (:COMMENT NIL "%% ========== COPY-TREE")
   (:COM (:NAME "copy-tree" :FTYPE "Function")
    (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "copy-tree") (:ARGLIST NIL "tree")
      (:VALUES NIL "new-tree"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "tree") "—a "
     (:TERM NIL "tree") ". " :PAR (:PARAM NIL "new-tree") "—a "
     (:TERM NIL "tree") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.2.0 25")
     "Creates a " (:TERM NIL "copy") " of a " (:TERM NIL "tree") " of "
     (:TERM NIL "conses") ". " :PAR "If " (:PARAM NIL "tree") " is not a "
     (:TERM NIL "cons") ", it is returned; otherwise, the result is a new "
     (:TERM NIL "cons") " of the results of calling " (:FUNREF NIL "copy-tree")
     " on the " (:TERM NIL "car") " and " (:TERM NIL "cdr") " of "
     (:PARAM NIL "tree") ". In other words, all " (:TERM NIL "conses")
     " in the " (:TERM NIL "tree") " represented by " (:PARAM NIL "tree")
     " are copied recursively, stopping only when non-" (:TERM NIL "conses")
     " are encountered. " :PAR (:FUNREF NIL "copy-tree")
     " does not preserve circularities and the sharing of substructure. "
     (:COMMENT NIL
      "!!! And consequently might fail to return in the case of circularity? -kmp 09-Apr-91")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq object (list (cons 1 \"one\")
                    (cons 2 (list 'a 'b 'c))))
→ ((1 . \"one\") (2 A B C))
 (setq object-too object) → ((1 . \"one\") (2 A B C))
 (setq copy-as-list (copy-list object))
 (setq copy-as-alist (copy-alist object))
 (setq copy-as-tree (copy-tree object))
 (eq object object-too) → "
      (:TERM NIL "true") "
 (eq copy-as-tree object) → "
      (:TERM NIL "false") "
 (eql copy-as-tree object) → "
      (:TERM NIL "false") "
 (equal copy-as-tree object) → "
      (:TERM NIL "true") "
 (setf (first (cdr (second object))) \"a\"
       (car (second object)) \"two\"
       (car object) '(one . 1)) → (ONE . 1)
 object → ((ONE . 1) (\"two\" \"a\" B C))
 object-too → ((ONE . 1) (\"two\" \"a\" B C))
 copy-as-list → ((1 . \"one\") (\"two\" \"a\" B C))
 copy-as-alist → ((1 . \"one\") (2 \"a\" B C))
 copy-as-tree → ((1 . \"one\") (2 A B C)) 
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "tree-equal") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== NSUBLIS" "%% ========== SUBLIS")
   (:COM (:NAME "sublis, nsublis" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "sublis")
      (:ARGLIST NIL "alist tree " (:KEYWORD NIL " &key") " key test test-not")
      (:VALUES NIL "new-tree"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "nsublis")
      (:ARGLIST NIL "alist tree " (:KEYWORD NIL " &key") " key test test-not")
      (:VALUES NIL "new-tree"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "alist") "—an "
     (:TERM NIL "association list") ". " :PAR
     (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " (:PARAM NIL "tree") "—a "
     (:TERM NIL "tree") ". " (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY")
     " " :PAR (:PARAM NIL "test") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "test-not") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "key") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of one argument, or " (:MISC NIL "nil") ". " :PAR
     (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " (:PARAM NIL "new-tree")
     "—a " (:TERM NIL "tree") ". "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.4.0 9")
     (:FUNREF NIL "sublis") " makes substitutions for " (:TERM NIL "objects")
     " in " (:PARAM NIL "tree") " (a structure of " (:TERM NIL "conses") "). "
     (:COMMENT NIL "% 15.4.0 10") (:FUNREF NIL "nsublis") " is like "
     (:FUNREF NIL "sublis")
     " but destructively modifies the relevant parts of the "
     (:PARAM NIL "tree") ". " :PAR (:FUNREF NIL "sublis")
     " looks at all subtrees and leaves of " (:PARAM NIL "tree")
     "; if a subtree or leaf appears as a key in " (:PARAM NIL "alist")
     " (that is, the key and the subtree or leaf "
     (:TERM NIL "satisfy the test") "), it is replaced by the "
     (:TERM NIL "object")
     " with which that key is associated. This operation is non-destructive. In effect, "
     (:FUNREF NIL "sublis") " can perform several " (:FUNREF NIL "subst")
     " operations simultaneously. " :PAR
     (:COMMENT NIL "% Implied by \"satisfy the test.\" -kmp 15-Feb-92"
      " The first argument to the \\kwd{test} or \\kwd{test-not}"
      " function is a key appearing in \\param{alist};"
      " the second argument is"
      " the part of an element of \\param{tree} extracted by the"
      " \\kwd{key} function (if supplied)." " "
      " The argument to the \\kwd{key} "
      " function is a \\param{tree} element; the return value is part of"
      " the supplied \\param{tree} element."
      " If \\kwd{key} is not supplied or \\nil, "
      " the \\param{tree} element itself is "
      " supplied to the \\kwd{test} or \\kwd{test-not}" " function.")
     :PAR "If " (:FUNREF NIL "sublis") " succeeds, a new copy of "
     (:PARAM NIL "tree")
     " is returned in which each occurrence of such a subtree or leaf is replaced by the "
     (:TERM NIL "object")
     " with which it is associated. If no changes are made, the original tree is returned. The original "
     (:PARAM NIL "tree")
     " is left unchanged, but the result tree may share cells with it. " :PAR
     (:FUNREF NIL "nsublis") " is permitted to modify " (:PARAM NIL "tree")
     " but otherwise returns the same values as " (:FUNREF NIL "sublis") ". "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (sublis '((x . 100) (z . zprime))
         '(plus x (minus g z x p) 4 . x))
→ (PLUS 100 (MINUS G ZPRIME 100 P) 4 . 100)
 (sublis '(((+ x y) . (- x y)) ((- x y) . (+ x y)))
         '(* (/ (+ x y) (+ x p)) (- x y))
         :test #'equal)
→ (* (/ (- X Y) (+ X P)) (+ X Y))
 (setq tree1 '(1 (1 2) ((1 2 3)) (((1 2 3 4)))))
→ (1 (1 2) ((1 2 3)) (((1 2 3 4))))
 (sublis '((3 . \"three\")) tree1) 
→ (1 (1 2) ((1 2 \"three\")) (((1 2 \"three\" 4))))
 (sublis '((t . \"string\"))
          (sublis '((1 . \"\") (4 . 44)) tree1)
          :key #'stringp)
→ (\"string\" (\"string\" 2) ((\"string\" 2 3)) (((\"string\" 2 3 44))))
 tree1 → (1 (1 2) ((1 2 3)) (((1 2 3 4))))
 (setq tree2 '(\"one\" (\"one\" \"two\") ((\"one\" \"Two\" \"three\"))))
→ (\"one\" (\"one\" \"two\") ((\"one\" \"Two\" \"three\"))) 
 (sublis '((\"two\" . 2)) tree2) 
→ (\"one\" (\"one\" \"two\") ((\"one\" \"Two\" \"three\"))) 
 tree2 → (\"one\" (\"one\" \"two\") ((\"one\" \"Two\" \"three\"))) 
 (sublis '((\"two\" . 2)) tree2 :test 'equal) 
→ (\"one\" (\"one\" 2) ((\"one\" \"Two\" \"three\"))) 

 (nsublis '((t . 'temp))
           tree1
           :key #'(lambda (x) (or (atom x) (< (list-length x) 3))))
→ ((QUOTE TEMP) (QUOTE TEMP) QUOTE TEMP) 
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR (:FUNREF NIL "nsublis") " modifies "
     (:PARAM NIL "tree") ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "subst") ", "
     (:ISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:SECREF NIL :CONSTANT-MODIFICATION) ", "
     (:ENDISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL")
     " The " (:KWD NIL "test-not") " parameter is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
     "Because the side-effecting variants (" (:I NIL "e.g.") ",  "
     (:FUNREF NIL "nsublis")
     ") potentially change the path that is being traversed, their effects in the presence of shared or circular structure structure may vary in surprising ways when compared to their non-side-effecting alternatives. To see this, consider the following side-effect behavior, which might be exhibited by some implementations: "
     :PAR
     (:CODE NIL " (defun test-it (fn)
   (let* ((shared-piece (list 'a 'b))
          (data (list shared-piece shared-piece)))
     (funcall fn '((a . b) (b . a)) data)))
 (test-it #'sublis) → ((B A) (B A))
 (test-it #'nsublis) → ((A B) (A B))
")
     " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== NSUBST" "%% ========== NSUBST-IF"
    "%% ========== NSUBST-IF-NOT" "%% ========== SUBST"
    "%% ========== SUBST-IF" "%% ========== SUBST-IF-NOT")
   (:COM
    (:NAME "subst, subst-if, subst-if-not, nsubst, nsubst-if, nsubst-if-not"
     :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "subst")
      (:ARGLIST NIL "new old tree " (:KEYWORD NIL " &key")
       " key test test-not")
      (:VALUES NIL "new-tree"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "subst-if")
      (:ARGLIST NIL "new predicate tree " (:KEYWORD NIL " &key") " key")
      (:VALUES NIL "new-tree"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "subst-if-not")
      (:ARGLIST NIL "new predicate tree " (:KEYWORD NIL " &key") " key")
      (:VALUES NIL "new-tree"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "nsubst")
      (:ARGLIST NIL "new old tree " (:KEYWORD NIL " &key")
       " key test test-not")
      (:VALUES NIL "new-tree"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "nsubst-if")
      (:ARGLIST NIL "new predicate tree " (:KEYWORD NIL " &key") " key")
      (:VALUES NIL "new-tree"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "nsubst-if-not")
      (:ARGLIST NIL "new predicate tree " (:KEYWORD NIL " &key") " key")
      (:VALUES NIL "new-tree"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "new") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "old") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "predicate") "—a "
     (:TERM NIL "symbol") " that names a " (:TERM NIL "function") ", or a "
     (:TERM NIL "function") " of one argument that returns a "
     (:TERM NIL "generalized boolean") " value. " :PAR
     (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " (:PARAM NIL "tree") "—a "
     (:TERM NIL "tree") ". " (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY")
     " " :PAR (:PARAM NIL "test") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "test-not") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "key") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of one argument, or " (:MISC NIL "nil") ". " :PAR
     (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " (:PARAM NIL "new-tree")
     "—a " (:TERM NIL "tree") ". "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "subst") ", "
     (:FUNREF NIL "subst-if") ", and " (:FUNREF NIL "subst-if-not")
     " perform substitution operations on " (:PARAM NIL "tree")
     ". Each function searches " (:PARAM NIL "tree")
     " for occurrences of a particular " (:PARAM NIL "old")
     " item of an element or subexpression that "
     (:TERM NIL "satisfies the test") ". " :PAR (:FUNREF NIL "nsubst") ", "
     (:FUNREF NIL "nsubst-if") ", and " (:FUNREF NIL "nsubst-if-not")
     " are like " (:FUNREF NIL "subst") ", " (:FUNREF NIL "subst-if") ", and "
     (:FUNREF NIL "subst-if-not") " respectively, except that the original "
     (:PARAM NIL "tree") " is modified. " :PAR (:COMMENT NIL "% 15.4.0 4")
     (:FUNREF NIL "subst") " makes a copy of " (:PARAM NIL "tree")
     ", substituting " (:PARAM NIL "new") " for every subtree or leaf of "
     (:PARAM NIL "tree") " (whether the subtree or leaf is a "
     (:TERM NIL "car") " or a " (:TERM NIL "cdr") " of its parent) such that "
     (:PARAM NIL "old") " and the subtree or leaf "
     (:TERM NIL "satisfy the test") ". " :PAR (:COMMENT NIL "% 15.4.0 7")
     (:FUNREF NIL "nsubst") " is a destructive version of "
     (:FUNREF NIL "subst") ". The list structure of " (:PARAM NIL "tree")
     " is altered by destructively replacing with " (:PARAM NIL "new")
     " each leaf of the " (:PARAM NIL "tree") " such that " (:PARAM NIL "old")
     " and the leaf " (:TERM NIL "satisfy the test") ". " :PAR
     (:COMMENT NIL "% Implied by \"satisfy the test\"."
      " Either \\kwd{test} or \\kwd{test-not} can"
      " be used to supply a test function other than the default."
      " The first argument to the \\kwd{test} or \\kwd{test-not} function"
      " is \\param{old};" " the second argument is "
      " the part of an element of \\param{tree} "
      " extracted by the \\kwd{key} function (if supplied)."
      " The argument to the \\kwd{key} function is an"
      " element of \\param{tree}; the return value is part of the supplied"
      " argument." " If \\kwd{key} is not supplied, the element from"
      " \\param{tree} is supplied to the \\kwd{test} or \\kwd{test-not} function.")
     :PAR "For " (:FUNREF NIL "subst") ", " (:FUNREF NIL "subst-if") ", and "
     (:FUNREF NIL "subst-if-not")
     ", if the functions succeed, a new copy of the tree is returned in which each occurrence of such an element is replaced by the "
     (:PARAM NIL "new")
     " element or subexpression. If no changes are made, the original "
     (:PARAM NIL "tree") " may be returned. The original " (:PARAM NIL "tree")
     " is left unchanged, but the result tree may share storage with it. " :PAR
     "For " (:FUNREF NIL "nsubst") ", " (:FUNREF NIL "nsubst-if") ", and "
     (:FUNREF NIL "nsubst-if-not") " the original " (:PARAM NIL "tree")
     " is modified and returned as the function result, but the result may not be "
     (:FUNREF NIL "eq") " to " (:PARAM NIL "tree") ". "
     (:COMMENT NIL "!!! Barmar: Huh??? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR (:COMMENT NIL "% 15.4.0 6")
     (:CODE NIL
      " (setq tree1 '(1 (1 2) (1 2 3) (1 2 3 4))) → (1 (1 2) (1 2 3) (1 2 3 4))
 (subst \"two\" 2 tree1) → (1 (1 \"two\") (1 \"two\" 3) (1 \"two\" 3 4))
 (subst \"five\" 5 tree1) → (1 (1 2) (1 2 3) (1 2 3 4))
 (eq tree1 (subst \"five\" 5 tree1)) → "
      (:TERM NIL "implementation-dependent") "
 (subst 'tempest 'hurricane
        '(shakespeare wrote (the hurricane)))
→ (SHAKESPEARE WROTE (THE TEMPEST))
 (subst 'foo 'nil '(shakespeare wrote (twelfth night)))
→ (SHAKESPEARE WROTE (TWELFTH NIGHT . FOO) . FOO)
 (subst '(a . cons) '(old . pair)
        '((old . spice) ((old . shoes) old . pair) (old . pair))
        :test #'equal)
→ ((OLD . SPICE) ((OLD . SHOES) A . CONS) (A . CONS))

 (subst-if 5 #'listp tree1) → 5
 (subst-if-not '(x) #'consp tree1) 
→ (1 X)

 tree1 → (1 (1 2) (1 2 3) (1 2 3 4))
 (nsubst 'x 3 tree1 :key #'(lambda (y) (and (listp y) (third y)))) 
→ (1 (1 2) X X)
 tree1 → (1 (1 2) X X)
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR (:COMMENT NIL "% 15.4.0 7")
     (:FUNREF NIL "nsubst") ", " (:FUNREF NIL "nsubst-if") ", and "
     (:FUNREF NIL "nsubst-if-not") " might alter the "
     (:TERM NIL "tree structure") " of " (:PARAM NIL "tree") ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "substitute") ", "
     (:FUNREF NIL "nsubstitute") ", "
     (:ISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:SECREF NIL :CONSTANT-MODIFICATION) ", "
     (:ENDISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL")
     " The " (:KWD NIL "test-not") " parameter is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
     (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " The functions "
     (:FUNREF NIL "subst-if-not") " and " (:FUNREF NIL "nsubst-if-not")
     " are deprecated. " (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
     "One possible definition of " (:FUNREF NIL "subst") ": " :PAR
     (:COMMENT NIL
      "% Indentation fixed per Boyer/Kaufmann/Moore #13 (by X3J13 vote at May 4-5, 1994 meeting)"
      "% -kmp 9-May-94")
     (:CODE NIL " (defun subst (old new tree &rest x &key test test-not key)
   (cond ((satisfies-the-test old tree :test test
                              :test-not test-not :key key)
          new)
         ((atom tree) tree)
         (t (let ((a (apply #'subst old new (car tree) x))
                  (d (apply #'subst old new (cdr tree) x)))
              (if (and (eql a (car tree))
                       (eql d (cdr tree)))
                  tree
                  (cons a d))))))
")
     " "))
   " " :PAR (:COMMENT NIL "%% ========== TREE-EQUAL")
   (:COM (:NAME "tree-equal" :FTYPE "Function")
    (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "tree-equal")
      (:ARGLIST NIL "tree-1 tree-2 " (:KEYWORD NIL " &key") " test test-not")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "tree-1") "—a "
     (:TERM NIL "tree") ". " :PAR (:PARAM NIL "tree-2") "—a "
     (:TERM NIL "tree") ". " :PAR (:PARAM NIL "test") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "test-not") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "generalized-boolean") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.1.0 8")
     (:FUNREF NIL "tree-equal")
     " tests whether two trees are of the same shape and have the same leaves. "
     (:FUNREF NIL "tree-equal") " returns " (:TERM NIL "true") " if "
     (:PARAM NIL "tree-1") " and " (:PARAM NIL "tree-2") " are both "
     (:TERM NIL "atoms") " and " (:TERM NIL "satisfy the test")
     ", or if they are both " (:TERM NIL "conses") " and the "
     (:TERM NIL "car") " of " (:PARAM NIL "tree-1") " is "
     (:FUNREF NIL "tree-equal") " to the " (:TERM NIL "car") " of "
     (:PARAM NIL "tree-2") " and the " (:TERM NIL "cdr") " of "
     (:PARAM NIL "tree-1") " is " (:FUNREF NIL "tree-equal") " to the "
     (:TERM NIL "cdr") " of " (:PARAM NIL "tree-2") ". Otherwise, "
     (:FUNREF NIL "tree-equal") " returns " (:TERM NIL "false") ". " :PAR
     (:FUNREF NIL "tree-equal") " recursively compares " (:TERM NIL "conses")
     " but not any other " (:TERM NIL "objects") " that have components. " :PAR
     "The first argument to the " (:KWD NIL "test") " or "
     (:KWD NIL "test-not") " function is " (:PARAM NIL "tree-1") " or a "
     (:TERM NIL "car") " or " (:TERM NIL "cdr") " of " (:PARAM NIL "tree-1")
     "; the second argument is " (:PARAM NIL "tree-2") " or a "
     (:TERM NIL "car") " or " (:TERM NIL "cdr") " of " (:PARAM NIL "tree-2")
     ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq tree1 '(1 (1 2))
       tree2 '(1 (1 2))) → (1 (1 2))
 (tree-equal tree1 tree2) → "
      (:TERM NIL "true") "
 (eql tree1 tree2) → "
      (:TERM NIL "false") "
 (setq tree1 '('a ('b 'c))
       tree2 '('a ('b 'c))) → ('a ('b 'c)) 
→ ((QUOTE A) ((QUOTE B) (QUOTE C)))
 (tree-equal tree1 tree2 :test 'eq) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "The consequences are undefined if both " (:PARAM NIL "tree-1") " and "
     (:PARAM NIL "tree-2") " are circular. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "equal") ", "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL")
     " The " (:KWD NIL "test-not") " parameter is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR))
   " " :PAR (:COMMENT NIL "-------------------- List --------------------")
   :PAR (:COMMENT NIL "%% ========== COPY-LIST")
   (:COM (:NAME "copy-list" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "copy-list") (:ARGLIST NIL "list")
      (:VALUES NIL "copy"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "list") "—a "
     (:TERM NIL "proper list") " or a " (:TERM NIL "dotted list") ". " :PAR
     (:PARAM NIL "copy") "—a " (:TERM NIL "list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.2.0 23") :PAR
     "Returns a " (:TERM NIL "copy") " of " (:PARAM NIL "list") ". If "
     (:PARAM NIL "list") " is a " (:TERM NIL "dotted list") ", the resulting "
     (:TERM NIL "list") " will also be a " (:TERM NIL "dotted list") ". " :PAR
     "Only the " (:TERM NIL "list structure") " of " (:PARAM NIL "list")
     " is copied; the " (:TERM NIL "elements")
     " of the resulting list are the " (:TERM NIL "same")
     " as the corresponding " (:TERM NIL "elements") " of the given "
     (:PARAM NIL "list") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq lst (list 1 (list 2 3))) → (1 (2 3))
 (setq slst lst) → (1 (2 3))
 (setq clst (copy-list lst)) → (1 (2 3))
 (eq slst lst) → "
      (:TERM NIL "true") "
 (eq clst lst) → "
      (:TERM NIL "false") "
 (equal clst lst) → "
      (:TERM NIL "true") "
 (rplaca lst \"one\") → (\"one\" (2 3))
 slst → (\"one\" (2 3))
 clst → (1 (2 3))
 (setf (caadr lst) \"two\") → \"two\"
 lst → (\"one\" (\"two\" 3))
 slst → (\"one\" (\"two\" 3))
 clst → (1 (\"two\" 3))
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "The consequences are undefined if " (:PARAM NIL "list") " is a "
     (:TERM NIL "circular list") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "copy-alist") ", "
     (:FUNREF NIL "copy-seq") ", " (:FUNREF NIL "copy-tree") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The copy created is "
     (:FUNREF NIL "equal") " to " (:PARAM NIL "list") ", but not "
     (:FUNREF NIL "eq") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LIST" "%% ========== LIST*")
   (:COM (:NAME "list, list*" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "list")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " objects") (:VALUES NIL "list"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "list*")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " " (:PLUS NIL "objects"))
      (:VALUES NIL "result"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "list") "—a "
     (:TERM NIL "list") ". " :PAR (:PARAM NIL "result") "—an "
     (:TERM NIL "object") ". "
     (:COMMENT NIL "A (possibly dotted) list, if at least 2 args are given.")
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.2.0 17") :PAR
     (:FUNREF NIL "list") " returns a " (:TERM NIL "list")
     " containing the supplied " (:PARAM NIL "objects") ". " :PAR
     (:COMMENT NIL "% 15.2.0 18") :PAR (:FUNREF NIL "list*") " is like "
     (:FUNREF NIL "list") " except that the last " (:TERM NIL "argument")
     " to " (:FUNREF NIL "list") " becomes the " (:TERM NIL "car")
     " of the last " (:TERM NIL "cons") " constructed, while the last "
     (:TERM NIL "argument") " to " (:FUNREF NIL "list*") " becomes the "
     (:TERM NIL "cdr") " of the last " (:TERM NIL "cons")
     " constructed. Hence, any given call to " (:FUNREF NIL "list*")
     " always produces one fewer " (:TERM NIL "conses") " than a call to "
     (:FUNREF NIL "list") " with the same number of arguments. " :PAR
     "If the last " (:TERM NIL "argument") " to " (:FUNREF NIL "list*")
     " is a " (:TERM NIL "list") ", the effect is to construct a new "
     (:TERM NIL "list")
     " which is similar, but which has additional elements added to the front corresponding to the preceding "
     (:TERM NIL "arguments") " of " (:FUNREF NIL "list*") ". " :PAR "If "
     (:FUNREF NIL "list*") " receives only one " (:PARAM NIL "object")
     ", that " (:PARAM NIL "object")
     " is returned, regardless of whether or not it is a " (:TERM NIL "list")
     ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (list 1) → (1)
 (list* 1) → 1
 (setq a 1) → 1
 (list a 2) → (1 2)
 '(a 2) → (A 2)
 (list 'a 2) → (A 2)
 (list* a 2) → (1 . 2)
 (list) → NIL ;"
      (:I NIL "i.e.") ",  ()
 (setq a '(1 2)) → (1 2)
 (eq a (list* a)) → "
      (:TERM NIL "true") "
 (list 3 4 'a (car '(b . c)) (+ 6 -2)) → (3 4 A B 4)
 (list* 'a 'b 'c 'd) ≡ (cons 'a (cons 'b (cons 'c 'd))) → (A B C . D)
 (list* 'a 'b 'c '(d e f)) → (A B C D E F)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "cons") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (list* " (:PARAM NIL "x") ") ≡ " (:PARAM NIL "x") "
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LIST-LENGTH")
   (:COM (:NAME "list-length" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "list-length") (:ARGLIST NIL "list")
      (:VALUES NIL "length"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "list") "—a "
     (:TERM NIL "proper list") " or a " (:TERM NIL "circular list") ". " :PAR
     (:PARAM NIL "length") "—a non-negative " (:TERM NIL "integer") ", or "
     (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.2.0 5")
     "Returns the " (:TERM NIL "length") " of " (:PARAM NIL "list") " if "
     (:PARAM NIL "list") " is a " (:TERM NIL "proper list") ". Returns "
     (:MISC NIL "nil") " if " (:PARAM NIL "list") " is a "
     (:TERM NIL "circular list") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (list-length '(a b c d)) → 4
 (list-length '(a (b c) d)) → 3
 (list-length '()) → 0
 (list-length nil) → 0
 (defun circular-list (&rest elements)
   (let ((cycle (copy-list elements))) 
     (nconc cycle cycle)))
 (list-length (circular-list 'a 'b)) → NIL
 (list-length (circular-list 'a)) → NIL
 (list-length (circular-list)) → 0
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "list") " is not a "
     (:TERM NIL "proper list") " or a " (:TERM NIL "circular list") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "length") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "list-length")
     " could be implemented as follows: " :PAR
     (:CODE NIL " (defun list-length (x)  
   (do ((n 0 (+ n 2))           ;Counter.
        (fast x (cddr fast))    ;Fast pointer: leaps by 2.
        (slow x (cdr slow)))    ;Slow pointer: leaps by 1.
       (nil)
     ;; If fast pointer hits the end, return the count.
     (when (endp fast) (return n))
     (when (endp (cdr fast)) (return (+ n 1)))
     ;; If fast pointer eventually equals slow pointer,
     ;;  then we must be stuck in a circular list.
     ;; (A deeper property is the converse: if we are
     ;;  stuck in a circular list, then eventually the
     ;;  fast pointer will equal the slow pointer.
     ;;  That fact justifies this implementation.)
     (when (and (eq fast slow) (> n 0)) (return nil))))
 
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LISTP")
   (:COM (:NAME "listp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "listp") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 10")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "list") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (listp nil) → " (:TERM NIL "true") "
 (listp (cons 1 2)) → "
      (:TERM NIL "true") "
 (listp (make-array 6)) → "
      (:TERM NIL "false") "
 (listp t) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "consp") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL
      "This is implied by type list, but still worth saying. -kmp")
     :PAR "If " (:PARAM NIL "object") " is a " (:TERM NIL "cons") ", "
     (:FUNREF NIL "listp") " does not check whether " (:PARAM NIL "object")
     " is a " (:TERM NIL "proper list") "; it returns " (:TERM NIL "true")
     " for any kind of " (:TERM NIL "list") ". " :PAR
     (:CODE NIL " (listp " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'list) ≡ (typep " (:PARAM NIL "object")
      " '(or cons null))
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MAKE-LIST")
   (:COM (:NAME "make-list" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-list")
      (:ARGLIST NIL "size " (:KEYWORD NIL " &key") " initial-element")
      (:VALUES NIL "list"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "size")
     "—a non-negative " (:TERM NIL "integer") ". " :PAR
     (:PARAM NIL "initial-element") "—an " (:TERM NIL "object")
     ". The default is " (:MISC NIL "nil") ". " :PAR (:PARAM NIL "list") "—a "
     (:TERM NIL "list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.2.0 19")
     "Returns a " (:TERM NIL "list") " of " (:PARAM NIL "length") " given by "
     (:TERM NIL "size") ", each of the " (:TERM NIL "elements") " of which is "
     (:PARAM NIL "initial-element") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (make-list 5) → (NIL NIL NIL NIL NIL)
 (make-list 3 :initial-element 'rah) → (RAH RAH RAH)
 (make-list 2 :initial-element '(1 2 3)) → ((1 2 3) (1 2 3))
 (make-list 0) → NIL ;"
      (:I NIL "i.e.") ",  ()
 (make-list 0 :initial-element 'new-element) → NIL 
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "size")
     " is not a non-negative " (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "cons") ", "
     (:FUNREF NIL "list") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- List Elements --------------------")
   :PAR (:COMMENT NIL "%% ========== PUSH")
   (:COM (:NAME "push" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "push") (:ARGLIST NIL "item place")
      (:VALUES NIL "new-place-value"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "item") "—an "
     (:TERM NIL "object") ". " :PAR
     (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " (:PARAM NIL "place")
     "—a " (:TERM NIL "place") ", the " (:TERM NIL "value")
     " of which may be any " (:TERM NIL "object") ". "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR
     (:PARAM NIL "new-place-value") "—a " (:TERM NIL "list") " (the new "
     (:TERM NIL "value") " of " (:PARAM NIL "place") "). " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "push") " prepends "
     (:PARAM NIL "item") " to the " (:TERM NIL "list") " that is stored in "
     (:PARAM NIL "place") ", stores the resulting " (:TERM NIL "list") " in "
     (:PARAM NIL "place") ", and returns the " (:TERM NIL "list") ". " :PAR
     (:ISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM")
     " For information about the " (:TERM NIL "evaluation") " of "
     (:TERM NIL "subforms") " of " (:PARAM NIL "place") ", see "
     (:SECREF NIL :GEN-REF-SUB-FORM-EVAL) ". "
     (:ENDISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM") " " :PAR)
    (:PART (:NAME "Examples") " " (:COMMENT NIL "% 15.2.0 31")
     (:CODE NIL " (setq llst '(nil)) → (NIL)
 (push 1 (car llst)) → (1)
 llst → ((1))
 (push 1 (car llst)) → (1 1)
 llst → ((1 1))
 (setq x '(a (b c) d)) → (A (B C) D)
 (push 5 (cadr x)) → (5 B C)  
 x → (A (5 B C) D)
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The contents of "
     (:PARAM NIL "place") " are modified. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "pop") ", "
     (:MACREF NIL "pushnew") ", " (:SECREF NIL :GENERALIZED-REFERENCE) " "
     :PAR)
    (:PART (:NAME "Notes") " The effect of "
     (:TT NIL "(push " (:I NIL "item") " " (:I NIL "place") ")")
     " is equivalent to " :PAR
     (:CODE NIL " (setf place (cons " (:I NIL "item") " " (:I NIL "place") "))
")
     " " (:ISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM") " except that the "
     (:TERM NIL "subforms") " of " (:PARAM NIL "place")
     " are evaluated only once, and " (:PARAM NIL "item")
     " is evaluated before " (:PARAM NIL "place") ". "
     (:ENDISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== POP")
   (:COM (:NAME "pop" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "pop") (:ARGLIST NIL "place")
      (:VALUES NIL "element"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " (:PARAM NIL "place")
     "—a " (:TERM NIL "place") ", the " (:TERM NIL "value") " of which is a "
     (:TERM NIL "list") " (possibly, but not necessarily, a "
     (:TERM NIL "dotted list") " or " (:TERM NIL "circular list") "). "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR
     (:PARAM NIL "element") "—an " (:TERM NIL "object") " (the "
     (:TERM NIL "car") " of the contents of " (:PARAM NIL "place") "). " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.2.0 35")
     (:MACREF NIL "pop") " " (:TERM NIL "reads") " the " (:TERM NIL "value")
     " of " (:PARAM NIL "place") ", remembers the " (:TERM NIL "car")
     " of the " (:TERM NIL "list") " which was retrieved, "
     (:TERM NIL "writes") " the " (:TERM NIL "cdr") " of the "
     (:TERM NIL "list") " back into the " (:PARAM NIL "place") ", and finally "
     (:TERM NIL "yields") " the " (:TERM NIL "car")
     " of the originally retrieved " (:TERM NIL "list") ". " :PAR
     (:ISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM")
     " For information about the " (:TERM NIL "evaluation") " of "
     (:TERM NIL "subforms") " of " (:PARAM NIL "place") ", see "
     (:SECREF NIL :GEN-REF-SUB-FORM-EVAL) ". "
     (:ENDISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq stack '(a b c)) → (A B C)
 (pop stack) → A  
 stack → (B C)
 (setq llst '((1 2 3 4))) → ((1 2 3 4))
 (pop (car llst)) → 1
 llst → ((2 3 4))
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The contents of "
     (:PARAM NIL "place") " are modified. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "push") ", "
     (:MACREF NIL "pushnew") ", " (:SECREF NIL :GENERALIZED-REFERENCE) " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR "The effect of "
     (:TT NIL "(pop " (:PARAM NIL "place") ")") " is roughly equivalent to "
     :PAR
     (:CODE NIL " (prog1 (car " (:PARAM NIL "place") ") (setf "
      (:PARAM NIL "place") " (cdr " (:PARAM NIL "place") ")))
")
     " except that the latter would evaluate any " (:TERM NIL "subforms")
     " of " (:PARAM NIL "place") " three times, while " (:MACREF NIL "pop")
     " evaluates them only once. " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== FIRST" "%% ========== SECOND"
    "%% ========== THIRD" "%% ========== FOURTH" "%% ========== FIFTH"
    "%% ========== SIXTH" "%% ========== SEVENTH" "%% ========== EIGHTH"
    "%% ========== NINTH" "%% ========== TENTH")
   (:COM
    (:NAME
     "first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth"
     :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "accessor")
      (:NAMES NIL "first" "second" "third" "fourth" "fifth" "sixth" "seventh"
       "eighth" "ninth" "tenth")
      (:ARGLIST NIL "list") (:VALUES NIL "object")
      (:NEW-VALUE NIL "new-object"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "list") "—a "
     (:TERM NIL "list") ", " (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY")
     " which might be a " (:TERM NIL "dotted list") " or a "
     (:TERM NIL "circular list") ". "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR
     (:PARAM NIL "object") ", " (:PARAM NIL "new-object") "—an "
     (:PARAM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The functions "
     (:COMMENT NIL "% 15.2.0 11") (:FUNREF NIL "first") ", "
     (:FUNREF NIL "second") ", " (:FUNREF NIL "third") ", "
     (:FUNREF NIL "fourth") ", " (:FUNREF NIL "fifth") ", "
     (:FUNREF NIL "sixth") ", " (:FUNREF NIL "seventh") ", "
     (:FUNREF NIL "eighth") ", " (:FUNREF NIL "ninth") ", and "
     (:FUNREF NIL "tenth") " " (:COMMENT NIL "% 15.2.0 12")
     (:PARAM NIL "access")
     " the first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, and tenth "
     (:TERM NIL "elements") " of " (:PARAM NIL "list") ", respectively. "
     (:COMMENT NIL
      "% I changed this to be in terms of car/cdr because I felt this made "
      "% the error checking requirements more apparent. -kmp 27-Aug-93"
      " If there is no such \\term{element} during a \\term{read}, \\nil\\ is returned."
      " The consequences are undefined if there is no such \\term{element} during a \\term{write}.")
     "Specifically, " :PAR
     (:CODE NIL " (first " (:PARAM NIL "list") ")    ≡  (car "
      (:PARAM NIL "list") ")
 (second "
      (:PARAM NIL "list") ")   ≡  (car (cdr " (:PARAM NIL "list") "))
 (third "
      (:PARAM NIL "list") ")    ≡  (car (cddr " (:PARAM NIL "list") "))
 (fourth "
      (:PARAM NIL "list") ")   ≡  (car (cdddr " (:PARAM NIL "list") "))
 (fifth "
      (:PARAM NIL "list") ")    ≡  (car (cddddr " (:PARAM NIL "list") "))
 (sixth "
      (:PARAM NIL "list") ")    ≡  (car (cdr (cddddr " (:PARAM NIL "list") ")))
 (seventh "
      (:PARAM NIL "list") ")  ≡  (car (cddr (cddddr " (:PARAM NIL "list") ")))
 (eighth "
      (:PARAM NIL "list") ")   ≡  (car (cdddr (cddddr " (:PARAM NIL "list") ")))
 (ninth "
      (:PARAM NIL "list") ")    ≡  (car (cddddr (cddddr " (:PARAM NIL "list")
      ")))
 (tenth "
      (:PARAM NIL "list") ")    ≡  (car (cdr (cddddr (cddddr "
      (:PARAM NIL "list") "))))
")
     " " :PAR (:MACREF NIL "setf")
     " can also be used with any of these functions to change an existing component. The same equivalences apply. For example: "
     :PAR
     (:CODE NIL " (setf (fifth " (:PARAM NIL "list") ") "
      (:PARAM NIL "new-object") ") ≡ (setf (car (cddddr " (:PARAM NIL "list")
      ")) " (:PARAM NIL "new-object") ")
")
     " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq lst '(1 2 3 (4 5 6) ((V)) vi 7 8 9 10)) 
→ (1 2 3 (4 5 6) ((V)) VI 7 8 9 10)
 (first lst) → 1
 (tenth lst) → 10
 (fifth lst) → ((V))
 (second (fourth lst)) → 5
 (sixth '(1 2 3)) → NIL
 (setf (fourth lst) \"four\") → \"four\"
 lst → (1 2 3 \"four\" ((V)) VI 7 8 9 10)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "car") ", "
     (:FUNREF NIL "nth") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "first")
     " is functionally equivalent to " (:FUNREF NIL "car") ", "
     (:FUNREF NIL "second") " is functionally equivalent to "
     (:FUNREF NIL "cadr") ", " (:FUNREF NIL "third")
     " is functionally equivalent to " (:FUNREF NIL "caddr") ", and "
     (:FUNREF NIL "fourth") " is functionally equivalent to "
     (:FUNREF NIL "cadddr") ". " :PAR
     "The ordinal numbering used here is one-origin, as opposed to the zero-origin numbering used by "
     (:FUNREF NIL "nth") ": " :PAR
     (:CODE NIL " (fifth x) ≡ (nth 4 x)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== NTH")
   (:COM (:NAME "nth" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "nth") (:ARGLIST NIL "n list")
      (:VALUES NIL "object"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "nth") (:ARGLIST NIL "n list")
      (:NEW-VALUE NIL "new-object"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "n")
     "—a non-negative " (:TERM NIL "integer") ". " :PAR (:PARAM NIL "list")
     "—a " (:TERM NIL "list") ", " (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY")
     " which might be a " (:TERM NIL "dotted list") " or a "
     (:TERM NIL "circular list") ". "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR
     (:PARAM NIL "object") "—an " (:TERM NIL "object") ". " :PAR
     (:PARAM NIL "new-object") "—an " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "nth") " locates the "
     (:PARAM NIL "n") "th element of " (:PARAM NIL "list") ", where the "
     (:TERM NIL "car") " of the " (:PARAM NIL "list")
     " is the “zeroth” element. " (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY")
     " "
     (:COMMENT NIL
      " If the length of \\param{list} is not greater than \\param{n}, "
      " then the result is \\nil.")
     "Specifically, " :PAR
     (:CODE NIL " (nth " (:PARAM NIL "n") " " (:PARAM NIL "list")
      ") ≡ (car (nthcdr " (:PARAM NIL "n") " " (:PARAM NIL "list") "))
")
     " " (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR
     (:COMMENT NIL "% 15.2.0 8") :PAR (:FUNREF NIL "nth")
     " may be used to specify a " (:PARAM NIL "place") " to "
     (:MACREF NIL "setf") ". " (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY")
     " Specifically, "
     (:COMMENT NIL
      " when \\funref{nth} is used in this way, \\param{n} must be less"
      " than the length of the \\param{list}.")
     :PAR
     (:CODE NIL " (setf (nth " (:PARAM NIL "n") " " (:PARAM NIL "list") ") "
      (:PARAM NIL "new-object") ") ≡ (setf (car (nthcdr " (:PARAM NIL "n") " "
      (:PARAM NIL "list") ")) " (:PARAM NIL "new-object") ")
")
     " " (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR (:COMMENT NIL "% 15.2.0 6")
     (:CODE NIL " (nth 0 '(foo bar baz)) → FOO
 (nth 1 '(foo bar baz)) → BAR
 (nth 3 '(foo bar baz)) → NIL
 (setq 0-to-3 (list 0 1 2 3)) → (0 1 2 3)
 (setf (nth 2 0-to-3) \"two\") → \"two\"
 0-to-3 → (0 1 \"two\" 3)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "elt") ", "
     (:FUNREF NIL "first") ", " (:FUNREF NIL "nthcdr") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- List Tails --------------------") :PAR
   (:COMMENT NIL "%% ========== ENDP")
   (:COM (:NAME "endp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "endp") (:ARGLIST NIL "list")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "list") "—a "
     (:TERM NIL "list") ", " (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY")
     " which might be a " (:TERM NIL "dotted list") " or a "
     (:TERM NIL "circular list") ". "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR
     (:PARAM NIL "generalized-boolean") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.2.0 3")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "list") " is the "
     (:TERM NIL "empty list") ". Returns " (:TERM NIL "false") " if "
     (:PARAM NIL "list") " is a " (:TERM NIL "cons") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (endp nil) → " (:TERM NIL "true") "
 (endp '(1 2)) → "
      (:TERM NIL "false") "
 (endp (cddr '(1 2))) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "list") " is not a "
     (:TERM NIL "list") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The purpose of " (:FUNREF NIL "endp")
     " is to test for the end of " (:PARAM NIL "proper list") ". Since "
     (:FUNREF NIL "endp") " does not descend into a " (:TERM NIL "cons")
     ", it is well-defined to pass it a " (:TERM NIL "dotted list")
     ". However, if shorter “lists” are iteratively produced by calling "
     (:FUNREF NIL "cdr") " on such a " (:TERM NIL "dotted list")
     " and those “lists” are tested with " (:FUNREF NIL "endp")
     ", a situation that has undefined consequences will eventually result when the "
     (:TERM NIL "non-nil") " " (:TERM NIL "atom") " (which is not in fact a "
     (:TERM NIL "list") ") finally becomes the argument to "
     (:FUNREF NIL "endp") ". Since this is the usual way in which "
     (:FUNREF NIL "endp")
     " is used, it is conservative programming style and consistent with the intent of "
     (:FUNREF NIL "endp") " to treat " (:FUNREF NIL "endp")
     " as simply a function on " (:TERM NIL "proper lists")
     " which happens not to enforce an argument type of "
     (:TERM NIL "proper list") " except when the argument is "
     (:TERM NIL "atomic") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== NULL")
   (:COM (:NAME "null" :FTYPE "Function")
    (:ISSUE NIL "NOT-AND-NULL-RETURN-VALUE:X3J13-MAR-93") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "null") (:ARGLIST NIL "object")
      (:VALUES NIL "boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "boolean") "—a "
     (:TERM NIL "boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 3") "Returns "
     (:MISC NIL "t") " if " (:PARAM NIL "object") " is the "
     (:TERM NIL "empty list") "; otherwise, returns " (:MISC NIL "nil") ". "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (null '()) → T
 (null nil) → T
 (null t) → NIL
 (null 1) → NIL
")
     " " :PAR (:ENDISSUE NIL "NOT-AND-NULL-RETURN-VALUE:X3J13-MAR-93") " "
     :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "not") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 6.4.0 4")
     (:FUNREF NIL "null") " is intended to be used to test for the "
     (:TERM NIL "empty list") " whereas " (:FUNREF NIL "not")
     " is intended to be used to invert a " (:TERM NIL "boolean") " (or "
     (:TERM NIL "generalized boolean") "). Operationally, "
     (:FUNREF NIL "null") " and " (:FUNREF NIL "not")
     " compute the same result; which to use is a matter of style. " :PAR
     (:CODE NIL " (null " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'null) ≡ (eq " (:PARAM NIL "object") " '"
      (:TT NIL " ()") ")
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== NCONC")
   (:COM (:NAME "nconc" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "nconc")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " lists")
      (:VALUES NIL "concatenated-list"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " (:PARAM NIL "list")
     "—each but the last must be a " (:TERM NIL "list") " (which might be a "
     (:PARAM NIL "dotted list") " but must not be a "
     (:TERM NIL "circular list") "); the last " (:PARAM NIL "list")
     " may be any " (:TERM NIL "object") ". "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR
     (:PARAM NIL "concatenated-list") "—a " (:TERM NIL "list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL " Note: Issue APPEND-DOTTED was repealed.") :PAR
     (:COMMENT NIL "% 15.2.0 28") "Returns a " (:TERM NIL "list")
     " that is the concatenation of " (:PARAM NIL "lists") ". If no "
     (:PARAM NIL "lists") " are supplied, " (:TT NIL "(nconc)") " returns "
     (:MISC NIL "nil") ". "
     (:ISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " "
     (:FUNREF NIL "nconc")
     " is defined using the following recursive relationship: " :PAR
     (:CODE NIL " (nconc) → ()
 (nconc nil . "
      (:PARAM NIL "lists") ") ≡ (nconc . " (:PARAM NIL "lists") ")
 (nconc "
      (:PARAM NIL "list") ") → " (:PARAM NIL "list") "
 (nconc "
      (:PARAM NIL "list-1") " " (:PARAM NIL "list-2")
      ") ≡ (progn (rplacd (last " (:PARAM NIL "list-1") ") "
      (:PARAM NIL "list-2") ") " (:PARAM NIL "list-1") ")
 (nconc "
      (:PARAM NIL "list-1") " " (:PARAM NIL "list-2") " . "
      (:PARAM NIL "lists") ") ≡ (nconc (nconc " (:PARAM NIL "list-1") " "
      (:PARAM NIL "list-2") ") . " (:PARAM NIL "lists") ")
")
     " " (:ENDISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (nconc) → NIL
 (setq x '(a b c)) → (A B C)
 (setq y '(d e f)) → (D E F)
 (nconc x y) → (A B C D E F)
 x → (A B C D E F)
")
     " Note, in the example, that the value of " (:TT NIL "x")
     " is now different, since its last " (:TERM NIL "cons") " has been "
     (:FUNREF NIL "rplacd") "'d to the value of " (:TT NIL "y") ". If "
     (:TT NIL "(nconc x y)")
     " were evaluated again, it would yield a piece of a "
     (:TERM NIL "circular list") ", whose printed representation would be "
     (:TT NIL "(A B C D E F D E F D E F ...)") ", repeating forever; if the "
     (:VARREF NIL "*print-circle*") " switch were " (:TERM NIL "non-nil")
     ", it would be printed as " (:TT NIL "(A B C . #1=(D E F . #1#))") ". "
     :PAR (:ISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " "
     (:CODE NIL " (setq foo (list 'a 'b 'c 'd 'e)
       bar (list 'f 'g 'h 'i 'j)
       baz (list 'k 'l 'm)) → (K L M)
 (setq foo (nconc foo bar baz)) → (A B C D E F G H I J K L M)
 foo → (A B C D E F G H I J K L M)
 bar → (F G H I J K L M)
 baz → (K L M)

 (setq foo (list 'a 'b 'c 'd 'e)
       bar (list 'f 'g 'h 'i 'j)
       baz (list 'k 'l 'm)) → (K L M)
 (setq foo (nconc nil foo bar nil baz)) → (A B C D E F G H I J K L M) 
 foo → (A B C D E F G H I J K L M)
 bar → (F G H I J K L M)
 baz → (K L M)
")
     " " :PAR (:ENDISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " "
     :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:PARAM NIL "lists")
     " are modified rather than copied. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "append") ", "
     (:FUNREF NIL "concatenate") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== APPEND")
   (:COM (:NAME "append" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "append")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " lists") (:VALUES NIL "result"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " (:PARAM NIL "list")
     "—each must be a " (:TERM NIL "proper list")
     " except the last, which may be any " (:TERM NIL "object") ". "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR
     (:PARAM NIL "result") "—an " (:TERM NIL "object") ". This will be a "
     (:TERM NIL "list") " unless the last " (:PARAM NIL "list") " was not a "
     (:TERM NIL "list") " "
     (:COMMENT NIL "Sandra noted a but in the preceding.") "and all preceding "
     (:PARAM NIL "lists") " were " (:TERM NIL "null") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL
      "% Issue APPEND-DOTTED had an effect here, but was later rescinded.")
     :PAR (:COMMENT NIL "% 15.2.0 20") (:FUNREF NIL "append") " returns a new "
     (:PARAM NIL "list") " that is the concatenation of the copies. "
     (:PARAM NIL "lists") " are left unchanged; the "
     (:TERM NIL "list structure") " of each of " (:PARAM NIL "lists")
     " except the last is copied. " (:COMMENT NIL "% 15.2.0 21")
     "The last argument is not copied; it becomes the " (:TERM NIL "cdr")
     " of the final " (:TERM NIL "dotted pair")
     " of the concatenation of the preceding " (:PARAM NIL "lists")
     ", or is returned directly if there are no preceding "
     (:COMMENT NIL
      " \"non-empty\" added with encouragement of Sandra and KAB. -kmp 28-Jan-92")
     (:TERM NIL "non-empty") " " (:PARAM NIL "lists") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (append '(a b c) '(d e f) '() '(g)) → (A B C D E F G)
 (append '(a b c) 'd) → (A B C . D)
 (setq lst '(a b c)) → (A B C)
 (append lst '(d)) → (A B C D)
 lst → (A B C)
 (append) → NIL
 (append 'a) → A
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "nconc") ", "
     (:FUNREF NIL "concatenate") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL
    "% Entries for REVAPPEND and NCONC consolidated. -kmp 29-Aug-93")
   :PAR (:COMMENT NIL "%% ========== REVAPPEND" "%% ========== NRECONC") :PAR
   (:COM (:NAME "revappend, nreconc" :FTYPE "Function")
    (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "revappend")
      (:ARGLIST NIL "list tail") (:VALUES NIL "result-list"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "nreconc") (:ARGLIST NIL "list tail")
      (:VALUES NIL "result-list"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "list") "—a "
     (:TERM NIL "proper list") ". " :PAR (:PARAM NIL "tail") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "result-list") "—an "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "revappend")
     " constructs a " (:TERM NIL "copy") (:SUB NIL "2") " of "
     (:PARAM NIL "list") ", but with the " (:TERM NIL "elements")
     " in reverse order. It then appends (as if by " (:FUNREF NIL "nconc")
     ") the " (:PARAM NIL "tail")
     " to that reversed list and returns the result. " :PAR
     (:FUNREF NIL "nreconc") " reverses the order of " (:TERM NIL "elements")
     " in " (:PARAM NIL "list") " (as if by " (:FUNREF NIL "nreverse")
     "). It then appends (as if by " (:FUNREF NIL "nconc") ") the "
     (:PARAM NIL "tail") " to that reversed list and returns the result. " :PAR
     "The resulting " (:TERM NIL "list") " shares "
     (:TERM NIL "list structure") " with " (:PARAM NIL "tail") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (let ((list-1 (list 1 2 3))
       (list-2 (list 'a 'b 'c)))
   (print (revappend list-1 list-2))
   (print (equal list-1 '(1 2 3)))
   (print (equal list-2 '(a b c))))
⊳ (3 2 1 A B C) 
⊳ T
⊳ T
→ T

 (revappend '(1 2 3) '()) → (3 2 1)
 (revappend '(1 2 3) '(a . b)) → (3 2 1 A . B)
 (revappend '() '(a b c)) → (A B C)
 (revappend '(1 2 3) 'a) → (3 2 1 . A)
 (revappend '() 'a) → A   ;degenerate case

 (let ((list-1 '(1 2 3))
       (list-2 '(a b c)))
   (print (nreconc list-1 list-2))
   (print (equal list-1 '(1 2 3)))
   (print (equal list-2 '(a b c))))
⊳ (3 2 1 A B C) 
⊳ NIL
⊳ T
→ T

")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR (:FUNREF NIL "revappend")
     " does not modify either of its " (:TERM NIL "arguments") ". "
     (:FUNREF NIL "nreconc") " is permitted to modify " (:PARAM NIL "list")
     " but not " (:PARAM NIL "tail") ". " :PAR
     (:ISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89")
     " Although it might be implemented differently, " (:FUNREF NIL "nreconc")
     " is constrained to have side-effect behavior equivalent to: " :PAR
     (:CODE NIL " (nconc (nreverse " (:PARAM NIL "list") ") "
      (:PARAM NIL "tail") ")
")
     " " (:ENDISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "reverse") ", "
     (:FUNREF NIL "nreverse") ", " (:FUNREF NIL "nconc") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 15.2.0 27" "% 15.2.0 30")
     :PAR "The following functional equivalences are true, although good "
     (:TERM NIL "implementations")
     " will typically use a faster algorithm for achieving the same effect: "
     :PAR
     (:CODE NIL " (revappend " (:PARAM NIL "list") " " (:PARAM NIL "tail")
      ") ≡ (nconc (reverse " (:PARAM NIL "list") ") " (:PARAM NIL "tail") ")
 (nreconc "
      (:PARAM NIL "list") " " (:PARAM NIL "tail") ") ≡ (nconc (nreverse "
      (:PARAM NIL "list") ") " (:PARAM NIL "tail") ")
")
     " " :PAR (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR))
   " " :PAR
   (:COMMENT NIL
    "% Entries for REVAPPEND and NCONC consolidated. -kmp 29-Aug-93"
    " %%% ========== NRECONC" " \\begincom{nreconc}\\ftype{Function}" " "
    " \\label Syntax::" " "
    " \\DefunWithValues nreconc {list-1 list-2} {result-list}" " "
    " \\label Arguments and Values:: " " "
    " \\issue{DOTTED-LIST-ARGUMENTS:CLARIFY}" " "
    " \\param{list-1}---a \\term{proper list}." " "
    " \\param{list-2}---an \\term{object}." " "
    " \\endissue{DOTTED-LIST-ARGUMENTS:CLARIFY}" " "
    " \\param{result-list}---an \\term{object}. " " " " \\label Description::"
    " " " \\funref{nreconc} reverses the order of the elements in "
    " \\param{list-1} and appends \\param{list-2} to \\param{list-1} "
    " \\issue{DOTTED-LIST-ARGUMENTS:CLARIFY}" " (as if by \\funref{nconc})."
    " \\endissue{DOTTED-LIST-ARGUMENTS:CLARIFY}"
    " The new \\param{list-1} is returned." " " " \\label Examples::" " "
    " \\code" "  (defparameter *list-1* (list 1 2 3))"
    "  (defparameter *list-2* (list 'a 'b 'c))"
    "  (nreconc *list-1* *list-2*) \\EV (3 2 1 A B C)"
    "  *list-1* \\EV \\term{implementation-dependent}"
    "  *list-2* \\EV (A B C)" " "
    "  (nreconc (list) 'a) \\EV A  ;degenerate situation" " \\endcode" " "
    " \\issue{DOTTED-LIST-ARGUMENTS:CLARIFY}" " % \\code"
    " %  (nreconc (cons 1 2) nil) \\EV (1)" " % \\endcode"
    " \\endissue{DOTTED-LIST-ARGUMENTS:CLARIFY}" " " " \\label Side Effects::"
    " " " \\param{list-1} is modified." " "
    " \\issue{REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89}"
    " \\funref{nreconc} is constrained to have side-effect behavior equivalent to:"
    " " " \\f{(nconc (nreverse \\param{list-1}) \\param{list-2})}."
    " \\endissue{REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89}" " "
    " \\label Affected By:\\None." " "
    " \\label Exceptional Situations:\\None?" " " " \\label See Also::" " "
    " \\funref{revappend}" " " " \\label Notes::" " %% 15.2.0 30"
    " \\f{(nreconc x y)} is exactly the same as "
    " \\f{(nconc (nreverse x) y)} except that it is potentially more efficient."
    " " " \\endcom")
   :PAR
   (:COMMENT NIL
    "% Entries for REVAPPEND and NCONC consolidated. -kmp 29-Aug-93"
    " %%% ========== REVAPPEND" " \\begincom{revappend}\\ftype{Function}" " "
    " \\label Syntax::" " "
    " \\DefunWithValues revappend {list-1 list-2} {result-list}" " "
    " \\label Arguments and Values::" " "
    " \\issue{DOTTED-LIST-ARGUMENTS:CLARIFY}"
    " \\param{list-1}---a \\term{proper list}." " "
    " \\param{list-2}---an \\term{object}. " " "
    " \\param{result-list}---an \\term{object}."
    " \\endissue{DOTTED-LIST-ARGUMENTS:CLARIFY}" " " " \\label Description::"
    " " " \\issue{DOTTED-LIST-ARGUMENTS:CLARIFY}"
    " Constructs a \\term{fresh} \\term{list} that is a \\term{copy} of \\param{list-1}"
    " but with the \\term{elements} in reverse order,"
    " and then appends \\param{list-2} to that \\term{list}"
    " (as if by \\funref{nconc})." " %(as if by \\funref{append})."
    " \\endissue{DOTTED-LIST-ARGUMENTS:CLARIFY}" " "
    " The resulting \\term{list} shares \\term{list structure} with \\param{list-2}."
    " " " \\label Examples::" " " " \\issue{DOTTED-LIST-ARGUMENTS:CLARIFY}"
    " \\code" "  (setq lst1 '(1 2 3)" "         lst2 '(a b c))  \\EV (A B C)"
    "  (revappend lst1 lst2) \\EV (3 2 1 A B C)" "  lst1 \\EV (1 2 3)"
    "  lst2 \\EV (A B C)" "  (revappend '(1 2 3) '(a . b)) \\EV (3 2 1 A . B)"
    "  (revappend nil '(a b c)) \\EV (A B C)"
    "  (revappend '() 'a) \\EV A ;degenerate case" " \\endcode" " " " % \\code"
    " %  (revappend '(1 . 2) '(a b c)) \\EV (1 A B C)" " % \\endcode"
    " \\endissue{DOTTED-LIST-ARGUMENTS:CLARIFY}" " "
    " \\label Side Effects:\\None." " " " \\label Affected By:\\None." " "
    " \\label Exceptional Situations:\\None." " " " \\label See Also::" " "
    " \\funref{nreconc}" " " " \\label Notes::" " %% 15.2.0 27" " "
    " %\"reverse\" => \"nconc\" per Barrett" " \\code"
    "  (revappend x y) \\EQ (nconc (reverse x) y)" " \\endcode" " "
    " \\endcom")
   :PAR (:COMMENT NIL "%% ========== NBUTLAST" "%% ========== BUTLAST")
   (:COM (:NAME "butlast, nbutlast" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "butlast")
      (:ARGLIST NIL "list " (:KEYWORD NIL " &optional") " n")
      (:VALUES NIL "result-list"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "nbutlast")
      (:ARGLIST NIL "list " (:KEYWORD NIL " &optional") " n")
      (:VALUES NIL "result-list"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "list") "—a "
     (:TERM NIL "list") ", " (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY")
     " which might be a " (:TERM NIL "dotted list") " but must not be a "
     (:TERM NIL "circular list") ". "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR
     (:ISSUE NIL "BUTLAST-NEGATIVE:SHOULD-SIGNAL") " " (:PARAM NIL "n")
     "—a non-negative " (:TERM NIL "integer") ". "
     (:ENDISSUE NIL "BUTLAST-NEGATIVE:SHOULD-SIGNAL") " " :PAR
     (:PARAM NIL "result-list") "—a " (:TERM NIL "list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.2.0 36")
     (:FUNREF NIL "butlast") " returns a copy of " (:PARAM NIL "list")
     " from which the last " (:PARAM NIL "n") " "
     (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " (:COMMENT NIL "elements")
     "conses " (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY")
     " have been omitted. If " (:PARAM NIL "n")
     " is not supplied, its value is 1. If there are fewer than "
     (:PARAM NIL "n") " " (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " "
     (:COMMENT NIL "elements") "conses "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " in " (:PARAM NIL "list")
     ", " (:MISC NIL "nil") " is returned and, in the case of "
     (:FUNREF NIL "nbutlast") ", " (:PARAM NIL "list") " is not modified. "
     (:COMMENT NIL
      "Barmar notes that if there are n elements, NIL is returned, too."
      "He suggests says \"fewer than n+1\"."
      "But KMP thinks the definition already covers that, and the reason for the"
      "exception about NIL is to clarify the behavior in the cases not covered.")
     :PAR (:COMMENT NIL "% 15.2.0 37") (:FUNREF NIL "nbutlast") " is like "
     (:FUNREF NIL "butlast") ", but " (:FUNREF NIL "nbutlast") " may modify "
     (:PARAM NIL "list") ". It changes the " (:TERM NIL "cdr") " of the "
     (:TERM NIL "cons") " " (:PARAM NIL "n") "+1 from the end of the "
     (:PARAM NIL "list") " to " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (setq lst '(1 2 3 4 5 6 7 8 9)) → (1 2 3 4 5 6 7 8 9)
 (butlast lst) → (1 2 3 4 5 6 7 8)
 (butlast lst 5) → (1 2 3 4)
 (butlast lst (+ 5 5)) → NIL
 lst → (1 2 3 4 5 6 7 8 9)
 (nbutlast lst 3) → (1 2 3 4 5 6)
 lst → (1 2 3 4 5 6)
 (nbutlast lst 99) → NIL
 lst → (1 2 3 4 5 6)
 (butlast '(a b c d)) → (A B C)
 (butlast '((a b) (c d))) → ((A B))
 (butlast '(a)) → NIL
 (butlast nil) → NIL
 (setq foo (list 'a 'b 'c 'd)) → (A B C D)
 (nbutlast foo) → (A B C)
 foo → (A B C)
 (nbutlast (list 'a)) → NIL
 (nbutlast '()) → NIL
")
     " " :PAR
     (:COMMENT NIL
      " The following example was present but no one could figure out what"
      " made anyone think this would reliably work, so I removed it. -kmp 14-Feb-92"
      " (butlast '(1 2 . 3)) \\EV (1)")
     :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " Should signal an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error") " if "
     (:PARAM NIL "list") " is not a " (:TERM NIL "proper list") " or a "
     (:TERM NIL "dotted list") ". "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " "
     (:ISSUE NIL "BUTLAST-NEGATIVE:SHOULD-SIGNAL")
     " Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "n")
     " is not a non-negative " (:TERM NIL "integer") ". "
     (:ENDISSUE NIL "BUTLAST-NEGATIVE:SHOULD-SIGNAL") " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " "
     (:CODE NIL " (butlast " (:PARAM NIL "list") " " (:PARAM NIL "n")
      ") ≡ (ldiff " (:PARAM NIL "list") " (last " (:PARAM NIL "list") " "
      (:PARAM NIL "n") "))
")
     " " (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LAST")
   (:COM (:NAME "last" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "last")
      (:ARGLIST NIL "list " (:KEYWORD NIL " &optional") " n")
      (:VALUES NIL "tail"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "list") "—a "
     (:TERM NIL "list") ", " (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY")
     " which might be a " (:TERM NIL "dotted list") " but must not be a "
     (:TERM NIL "circular list") ". "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR
     (:ISSUE NIL "LAST-N") " " (:PARAM NIL "n") "—a non-negative "
     (:TERM NIL "integer") ". The default is " (:TT NIL "1") ". "
     (:ENDISSUE NIL "LAST-N") " " :PAR (:PARAM NIL "tail") "—an "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:ISSUE NIL "LAST-N") " "
     (:COMMENT NIL "% 15.2.0 16") (:FUNREF NIL "last") " returns the last "
     (:PARAM NIL "n") " " (:TERM NIL "conses") " (not the last "
     (:PARAM NIL "n") " elements) of " (:PARAM NIL "list") "). If "
     (:PARAM NIL "list") " is " (:TT NIL " ()") ", " (:FUNREF NIL "last")
     " returns " (:TT NIL " ()") ". " :PAR "If " (:PARAM NIL "n")
     " is zero, the atom that terminates " (:PARAM NIL "list")
     " is returned. If " (:PARAM NIL "n")
     " is greater than or equal to the number of " (:TERM NIL "cons")
     " cells in " (:PARAM NIL "list") ", the result is " (:PARAM NIL "list")
     ". " (:ENDISSUE NIL "LAST-N") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR (:ISSUE NIL "LAST-N") " "
     (:CODE NIL " (last nil) → NIL
 (last '(1 2 3)) → (3)
 (last '(1 2 . 3)) → (2 . 3)
 (setq x (list 'a 'b 'c 'd)) → (A B C D)
 (last x) → (D)
 (rplacd (last x) (list 'e 'f)) x → (A B C D E F)
 (last x) → (F)

 (last '(a b c))   → (C)

 (last '(a b c) 0) → ()
 (last '(a b c) 1) → (C)
 (last '(a b c) 2) → (B C)
 (last '(a b c) 3) → (A B C)
 (last '(a b c) 4) → (A B C)

 (last '(a . b) 0) → B
 (last '(a . b) 1) → (A . B)
 (last '(a . b) 2) → (A . B)
")
     " " (:ENDISSUE NIL "LAST-N") " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR (:ISSUE NIL "LAST-N")
     " The consequences are undefined if " (:PARAM NIL "list") " is a "
     (:TERM NIL "circular list") ". " (:ENDISSUE NIL "LAST-N")
     " Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "n")
     " is not a non-negative " (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "butlast") ", "
     (:FUNREF NIL "nth") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ISSUE NIL "LAST-N")
     " The following code could be used to define " (:FUNREF NIL "last") ". "
     :PAR
     (:CODE NIL " (defun last (list &optional (n 1))
   (check-type n (integer 0))
   (do ((l list (cdr l))
        (r list)
        (i 0 (+ i 1)))
       ((atom l) r)
     (if (>= i n) (pop r))))
")
     " " (:ENDISSUE NIL "LAST-N") " "))
   " " :PAR
   (:COMMENT NIL
    "% Tentatively merged entries for LDIFF and TAILP. -kmp 29-Aug-93")
   :PAR (:COMMENT NIL "%% ========== LDIFF" "%% ========== TAILP")
   (:COM (:NAME "ldiff, tailp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "ldiff") (:ARGLIST NIL "list object")
      (:VALUES NIL "result-list"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "tailp") (:ARGLIST NIL "object list")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "list") "—a "
     (:TERM NIL "list") ", " (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY")
     " which might be a " (:TERM NIL "dotted list") ". " :PAR
     (:PARAM NIL "object") "—an " (:TERM NIL "object") ". "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR
     (:PARAM NIL "result-list") "—a " (:TERM NIL "list") ". " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93")
     (:PARAM NIL "generalized-boolean") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:ISSUE NIL "TAILP-NIL:T") " "
     (:COMMENT NIL "% 15.5.0 7"
      "% (CLtL definition superseded by later cleanup issue clarifying behavior.)")
     "If " (:PARAM NIL "object") " is the " (:TERM NIL "same") " as some "
     (:TERM NIL "tail") " of " (:PARAM NIL "list") ", " (:FUNREF NIL "tailp")
     " returns " (:TERM NIL "true") "; otherwise, it returns "
     (:TERM NIL "false") ". " (:ENDISSUE NIL "TAILP-NIL:T") " " :PAR
     (:COMMENT NIL "% 15.2.0 38") "If " (:PARAM NIL "object") " is the "
     (:TERM NIL "same") " as some " (:TERM NIL "tail") " of "
     (:PARAM NIL "list") ", " (:FUNREF NIL "ldiff") " returns a "
     (:TERM NIL "fresh") " " (:TERM NIL "list") " of the "
     (:TERM NIL "elements") " of " (:TERM NIL "list") " that precede "
     (:PARAM NIL "object") " in the " (:TERM NIL "list structure") " of "
     (:PARAM NIL "list") "; otherwise, it returns a " (:TERM NIL "copy")
     (:SUB NIL "2") " of " (:PARAM NIL "list") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR (:ISSUE NIL "TAILP-NIL:T") " "
     (:CODE NIL " (let ((lists '#((a b c) (a b c . d))))
   (dotimes (i (length lists)) ()
     (let ((list (aref lists i)))
       (format t \"~2&list=~S ~21T(tailp object list)~
                  ~44T(ldiff list object)~%\" list)
         (let ((objects (vector list (cddr list) (copy-list (cddr list))
                                '(f g h) '() 'd 'x)))
           (dotimes (j (length objects)) ()
             (let ((object (aref objects j)))
               (format t \"~& object=~S ~21T~S ~44T~S\"
                       object (tailp object list) (ldiff list object))))))))
⊳ 
⊳ list=(A B C)         (tailp object list)    (ldiff list object)
⊳  object=(A B C)      T                      NIL
⊳  object=(C)          T                      (A B)
⊳  object=(C)          NIL                    (A B C)
⊳  object=(F G H)      NIL                    (A B C)
⊳  object=NIL          T                      (A B C)
⊳  object=D            NIL                    (A B C)
⊳  object=X            NIL                    (A B C)
⊳ 
⊳ list=(A B C . D)     (tailp object list)    (ldiff list object)
⊳  object=(A B C . D)  T                      NIL
⊳  object=(C . D)      T                      (A B)
⊳  object=(C . D)      NIL                    (A B C . D)
⊳  object=(F G H)      NIL                    (A B C . D)
⊳  object=NIL          NIL                    (A B C . D)
⊳  object=D            T                      (A B C)
⊳  object=X            NIL                    (A B C . D)
→ NIL
")
     " " (:ENDISSUE NIL "TAILP-NIL:T") " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "Neither " (:FUNREF NIL "ldiff")
     " nor " (:FUNREF NIL "tailp") " modifies either of its "
     (:TERM NIL "arguments") ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY")
     " Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "list") " is not a "
     (:TERM NIL "proper list") " or a " (:TERM NIL "dotted list") ". "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "set-difference") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "If the " (:PARAM NIL "list") " is a "
     (:TERM NIL "circular list") ", " (:FUNREF NIL "tailp") " will reliably "
     (:TERM NIL "yield") " a " (:TERM NIL "value") " only if the given "
     (:PARAM NIL "object") " is in fact a " (:TERM NIL "tail") " of "
     (:PARAM NIL "list")
     ". Otherwise, the consequences are unspecified: a given "
     (:TERM NIL "implementation") " which detects the circularity must return "
     (:TERM NIL "false") ", but since an " (:TERM NIL "implementation")
     " is not obliged to detect such a " (:TERM NIL "situation") ", "
     (:FUNREF NIL "tailp")
     " might just loop indefinitely without returning in that case. " :PAR
     (:ISSUE NIL "TAILP-NIL:T") " " :PAR (:FUNREF NIL "tailp")
     " could be defined as follows: " :PAR
     (:CODE NIL " (defun tailp (object list)
   (do ((list list (cdr list)))
       ((atom list) (eql list object))
      (if (eql object list)
          (return t))))
")
     " " :PAR "and " (:FUNREF NIL "ldiff") " could be defined by: " :PAR
     (:COMMENT NIL "% !!! I just up the following based on the Description."
      "%     Does everyone agree it's right? -kmp 29-Aug-93")
     (:CODE NIL "(defun ldiff (list object)
  (do ((list list (cdr list))
       (r '() (cons (car list) r)))
      ((atom list)
       (if (eql list object) (nreverse r) (nreconc r list)))
    (when (eql object list)
      (return (nreverse r)))))
")
     " " :PAR (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " "
     (:COMMENT NIL " This stuff probably isn't needed. -kmp 7-Jan-91"
      " Since the \\param{list} can be a \\term{dotted list},"
      " the end test must be \\funref{atom}, not \\funref{endp}."
      " For example, if \\f{(tailp \\i{x} l)} returns \\term{true},"
      " it means that there is an \\i{n} such that \\f{(nthcdr \\i{n} \\param{list})} returns \\i{x}."
      " Note that it doesn't follow that if \\term{tailp} returns \\nil,"
      " it is safe to go \\funref{nthcdr}'s into the \\param{list} looking"
      " for \\i{x}, since the \\param{list} might be a \\term{dotted list}"
      " and \\funref{nthcdr} might hit bad data.")
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR
     (:ENDISSUE NIL "TAILP-NIL:T") " " :PAR))
   " " :PAR
   (:COMMENT NIL " %%% ========== LDIFF" " \\begincom{ldiff}\\ftype{Function}"
    " " " \\label Syntax::" " "
    " \\DefunWithValues ldiff {list object} {result-list}" " "
    " \\label Arguments and Values::" " " " \\param{list}---a \\term{list},"
    " \\issue{DOTTED-LIST-ARGUMENTS:CLARIFY}"
    "                    which might be a \\term{dotted list}." " "
    " \\param{object}---an \\term{object}."
    " \\endissue{DOTTED-LIST-ARGUMENTS:CLARIFY}" " "
    " \\param{result-list}---a \\term{list}." " " " \\label Description::" " "
    " %!!! Rewrite in terms of glossary term \"sublist\" if we can get the issue"
    " %    of dottedness resolved. -kmp 27-May-91" " " " %% 15.2.0 38"
    " Returns a \\term{fresh} \\term{list} whose \\term{elements} are "
    " those \\term{elements} of \\param{list} that appear before \\param{object}."
    " If \\param{object} is not a tail of \\param{list} or"
    " if \\param{object} is \\nil,"
    " then a copy of the entire \\param{list} is returned."
    " \\param{list} is not destroyed." " " " % KMP: Can the list be dotted?"
    " %      What is the status of (LDIFF '(A B C . 3) 3)?"
    " % Barrett: The description seems to imply that it cannot be dotted." " "
    " \\label Examples::" " " " \\code"
    "  (setq x '(a b c d e)) \\EV (A B C D E)"
    "  (setq y (cdddr x)) \\EV (D E)" "  (ldiff x y) \\EV (A B C)"
    "  (ldiff x (copy-list y)) \\EV (A B C D E)" " \\endcode" " "
    " \\label Side Effects:\\None." " " " \\label Affected By:\\None." " "
    " \\label Exceptional Situations::" " "
    " \\issue{DOTTED-LIST-ARGUMENTS:CLARIFY}"
    " \\Lazychecktype{list}{a \\term{proper list} or a \\term{dotted list}}"
    " \\endissue{DOTTED-LIST-ARGUMENTS:CLARIFY}" " " " \\label See Also::" " "
    " \\funref{tailp}," " \\funref{set-difference}" " "
    " \\label Notes:\\None." " " " \\endcom" " " " %%% ========== TAILP"
    " \\begincom{tailp}\\ftype{Function}" " " " \\label Syntax::" " "
    " \\DefunWithValues tailp {object list} {generalized-boolean}" " "
    " \\label Arguments and Values:: " " "
    " \\param{object}---an \\term{object}." " "
    " \\param{list}---a \\term{list},"
    " \\issue{DOTTED-LIST-ARGUMENTS:CLARIFY}"
    "                    which might be a \\term{dotted list}."
    " \\endissue{DOTTED-LIST-ARGUMENTS:CLARIFY}" " "
    " \\param{generalized-boolean}---a \\term{generalized boolean}." " "
    " \\label Description::" " " " \\issue{TAILP-NIL:T}" " %% 15.5.0 7"
    " %% (CLtL definition superseded by later cleanup issue clarifying behavior.)"
    " "
    " Returns \\term{true} if and only if \\param{object} is a \\term{tail} of \\param{list};"
    " otherwise returns \\term{false}.  The predicate used for comparison is \\funref{eql}."
    " " " Since the \\param{list} can be a \\term{dotted list},"
    " the end test used by \\funref{tailp} must be \\funref{atom}, not \\funref{endp}."
    " That is, if \\f{(tailp \\i{x} l)} returns \\term{true},"
    " it means that there is an \\i{n} such that \\f{(nthcdr \\i{n} \\param{list})} returns \\i{x}."
    "  " " \\label Examples::" " " " \\code"
    "  (let ((x '(b c))) (tailp x (cons 'a x))) \\EV \\term{true}"
    "  (tailp '(x y) '(a b c)) \\EV \\term{false}"
    "  (tailp '() '(a b c)) \\EV \\term{true}"
    "  (tailp 3 '(a b c)) \\EV \\term{false}"
    "  (tailp 3 '(a b c . 3)) \\EV \\term{true}"
    "  (tailp '(x y) '(a b c . 3)) \\EV \\term{false}" " \\endcode" " "
    " \\endissue{TAILP-NIL:T}" " " " \\label Side Effects:\\None." " "
    " \\label Affected By:\\None." " " " \\label Exceptional Situations::" " "
    " \\issue{DOTTED-LIST-ARGUMENTS:CLARIFY}"
    " \\Lazychecktype{list}{a \\term{proper list} or a \\term{dotted list}}"
    " \\endissue{DOTTED-LIST-ARGUMENTS:CLARIFY}" " " " \\label See Also::" " "
    " \\funref{ldiff}" " " " \\label Notes::" " "
    " If the \\param{list} is a \\term{circular list},"
    " \\funref{tailp} will reliably \\term{yield} a \\term{value} "
    " only if the given \\param{object} is in fact a \\term{subtail}."
    " Otherwise, the consequences are unspecified:"
    " a given \\term{implementation} which detects the circularity must return \\term{false},"
    " but since an \\term{implementation} is not obliged to detect such a \\term{situation},"
    " \\funref{tailp} might just loop indefinitely without returning in that case."
    " " " \\issue{TAILP-NIL:T}" " "
    " \\funref{tailp} could be defined as follows:" " " " \\code"
    "  (defun tailp (sublist list)" "    (do ((list list (cdr list)))"
    "        ((atom list) (eql list sublist))" "       (if (eql sublist list)"
    "           (return t))))" " \\endcode" " "
    " % This probably isn't needed. -kmp 7-Jan-91" " %"
    " % Note that it doesn't follow that if \\term{tailp} returns \\nil,"
    " % it is safe to go \\funref{nthcdr}'s into the \\param{list} looking"
    " % for \\i{x}, since the \\param{list} might be a \\term{dotted list}"
    " % and \\funref{nthcdr} might hit bad data." " "
    " \\endissue{TAILP-NIL:T}" " " " \\endcom")
   :PAR (:COMMENT NIL "%% ========== NTHCDR")
   (:COM (:NAME "nthcdr" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "nthcdr") (:ARGLIST NIL "n list")
      (:VALUES NIL "tail"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " " (:PARAM NIL "n")
     "—a non-negative " (:TERM NIL "integer") ". "
     (:ENDISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " " :PAR
     (:PARAM NIL "list") "—a " (:TERM NIL "list") ", "
     (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " which might be a "
     (:TERM NIL "dotted list") " or a " (:TERM NIL "circular list") ". "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR
     (:PARAM NIL "tail") "—an " (:TERM NIL "object") ". "
     (:COMMENT NIL "\\term{tail} of the \\param{list}.") :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 15.2.0 14"
      "% Described using more descriptive terminology, "
      "% in a way that doesn't get confused about whether n is 0-based or 1-based. -kmp 29-Aug-93"
      "Returns the \\param{n}th successive \\term{cdr} of \\param{list}.")
     "Returns the " (:TERM NIL "tail") " of " (:PARAM NIL "list")
     " that would be obtained by calling " (:FUNREF NIL "cdr") " "
     (:PARAM NIL "n") " times in succession. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:COMMENT NIL
      " I added an example of high-safety error, to demonstrate relation of NTHCDR and CDR."
      " -kmp 26-Aug-93")
     (:CODE NIL " (nthcdr 0 '()) → NIL
 (nthcdr 3 '()) → NIL
 (nthcdr 0 '(a b c)) → (A B C)
 (nthcdr 2 '(a b c)) → (C)
 (nthcdr 4 '(a b c)) → ()
 (nthcdr 1 '(0 . 1)) → 1

 (locally (declare (optimize (safety 3)))
   (nthcdr 3 '(0 . 1)))
 Error: Attempted to take CDR of 1.
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL
      "% I added this stuff because it seemed consistent with the other entries. -kmp 26-Aug-93")
     :PAR "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "n")
     " is not a non-negative " (:TERM NIL "integer") ". " :PAR "For "
     (:PARAM NIL "n") " being an integer greater than " (:TT NIL "1")
     ", the error checking done by "
     (:TT NIL "(nthcdr " (:PARAM NIL "n") " " (:PARAM NIL "list") ")")
     " is the same as for "
     (:TT NIL "(nthcdr (- " (:PARAM NIL "n") " 1) (cdr " (:PARAM NIL "list")
      "))")
     "; see the " (:TERM NIL "function") " " (:FUNREF NIL "cdr") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "cdr") ", "
     (:FUNREF NIL "nth") ", " (:FUNREF NIL "rest") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== REST")
   (:COM (:NAME "rest" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "rest") (:ARGLIST NIL "list")
      (:VALUES NIL "tail"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "rest") (:ARGLIST NIL "list")
      (:NEW-VALUE NIL "new-tail"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "list") "—a "
     (:TERM NIL "list") ", " (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY")
     " which might be a " (:TERM NIL "dotted list") " or a "
     (:TERM NIL "circular list") ". "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR
     (:PARAM NIL "tail") "—an " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.2.0 13")
     (:FUNREF NIL "rest") " performs the same operation as "
     (:FUNREF NIL "cdr") ", but mnemonically complements "
     (:FUNREF NIL "first") ". Specifically, " :PAR
     (:CODE NIL " (rest " (:PARAM NIL "list") ") ≡ (cdr " (:PARAM NIL "list") ")
 (setf (rest "
      (:PARAM NIL "list") ") " (:PARAM NIL "new-tail") ") ≡ (setf (cdr "
      (:PARAM NIL "list") ") " (:PARAM NIL "new-tail") ")
")
     " " :PAR
     (:COMMENT NIL " If \\param{list} is a \\term{cons},"
      " \\funref{rest} returns the portion that follows the first \\term{element}."
      " If \\param{list} is the \\term{empty list},"
      " \\funref{rest} returns the \\term{empty list}." " "
      " \\macref{setf} may be used with \\funref{rest} to change "
      " the \\term{cdr} of a \\term{non-empty} \\term{list} (\\ie a \\term{cons}).")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (rest '(1 2)) → (2)
 (rest '(1 . 2)) → 2
 (rest '(1)) → NIL
 (setq *cons* '(1 . 2)) → (1 . 2)
 (setf (rest *cons*) \"two\") → \"two\"
 *cons* → (1 . \"two\")
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "cdr") ", "
     (:FUNREF NIL "nthcdr") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "rest")
     " is often preferred stylistically over " (:FUNREF NIL "cdr")
     " when the argument is to being subjectively viewed as a "
     (:TERM NIL "list") " rather than as a " (:TERM NIL "cons") ". " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== MEMBER" "%% ========== MEMBER-IF"
    "%% ========== MEMBER-IF-NOT")
   (:COM (:NAME "member, member-if, member-if-not" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "member")
      (:ARGLIST NIL "item list " (:KEYWORD NIL " &key") " key test test-not")
      (:VALUES NIL "tail"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "member-if")
      (:ARGLIST NIL "predicate list " (:KEYWORD NIL " &key") " key")
      (:VALUES NIL "tail"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "member-if-not")
      (:ARGLIST NIL "predicate list " (:KEYWORD NIL " &key") " key")
      (:VALUES NIL "tail"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "item") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "list") "—a "
     (:TERM NIL "proper list") ". " :PAR (:PARAM NIL "predicate") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of one "
     (:TERM NIL "argument") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "test") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "test-not") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "key") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of one argument, or " (:MISC NIL "nil") ". " :PAR (:PARAM NIL "tail")
     "—a " (:TERM NIL "list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.5.0 4")
     (:FUNREF NIL "member") ", " (:FUNREF NIL "member-if") ", and "
     (:FUNREF NIL "member-if-not") " each search " (:PARAM NIL "list") " for "
     (:PARAM NIL "item") " or for a top-level element that "
     (:TERM NIL "satisfies the test") ". The argument to the "
     (:PARAM NIL "predicate") " function is an element of " (:PARAM NIL "list")
     ". " :PAR
     (:COMMENT NIL "% Implied by \"satifies the test\". -kmp 15-Feb-92"
      " If \\kwd{test} or \\kwd{test-not} is not supplied, "
      " \\funref{eql} is used." " The first argument to the \\kwd{test} "
      " or \\kwd{test-not} function is \\param{item}, and the second argument"
      " is an element of \\param{list} as returned by the \\kwd{key} function."
      " It is an error to supply both \\kwd{test} and " " \\kwd{test-not} "
      " in the same function call." " "
      " If \\kwd{key} is supplied, it is used to"
      " extract the part to be tested from the \\param{list} element."
      " The argument to the \\kwd{key} function "
      " is an element of \\param{list}; typically, the  \\kwd{key} function "
      " returns part of the element of" " \\param{list} it was given."
      " If \\kwd{key} is not supplied or \\nil, the \\param{list} "
      " element is used.")
     :PAR "If some element " (:TERM NIL "satisfies the test") ", the tail of "
     (:PARAM NIL "list") " beginning with this element is returned; otherwise "
     (:MISC NIL "nil") " is returned. " :PAR (:PARAM NIL "list")
     " is searched on the top level only. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (member 2 '(1 2 3)) → (2 3)                                 
 (member 2 '((1 . 2) (3 . 4)) :test-not #'= :key #'cdr) → ((3 . 4))
 (member 'e '(a b c d)) → NIL
")
     " " :PAR (:COMMENT NIL "!!! I'm suspicious of this dotted list.")
     (:CODE NIL " (member-if #'listp '(a b nil c d)) → (NIL C D)
 (member-if #'numberp '(a #\\Space 5/3 foo)) → (5/3 FOO)
 (member-if-not #'zerop 
                 '(3 6 9 11 . 12)
                 :key #'(lambda (x) (mod x 3))) → (11 . 12)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "list") " is not a "
     (:TERM NIL "proper list") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "find") ", "
     (:FUNREF NIL "position") ", "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL")
     " The " (:KWD NIL "test-not") " parameter is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
     (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " The " (:TERM NIL "function")
     " " (:FUNREF NIL "member-if-not") " is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR "In the following "
     :PAR
     (:CODE NIL " (member 'a '(g (a y) c a d e a f)) → (A D E A F)
")
     " " :PAR "the value returned by " (:FUNREF NIL "member") " is "
     (:TERM NIL "identical") " to the portion of the " (:TERM NIL "list")
     " beginning with " (:TT NIL "a") ". Thus " (:FUNREF NIL "rplaca")
     " on the result of " (:FUNREF NIL "member")
     " can be used to alter the part of the " (:TERM NIL "list") " where "
     (:TT NIL "a") " was found (assuming a check has been made that "
     (:FUNREF NIL "member") " did not return " (:MISC NIL "nil") "). " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- List Mapping --------------------") :PAR
   (:COMMENT NIL "%% ========== MAPCAR" "%% ========== MAPLIST"
    "%% ========== MAPC" "%% ========== MAPL" "%% ========== MAPCAN"
    "%% ========== MAPCON")
   (:COM
    (:NAME "mapc, mapcar, mapcan, mapl, maplist, mapcon" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "mapc")
      (:ARGLIST NIL "function " (:KEYWORD NIL " &rest") " "
       (:PLUS NIL "lists"))
      (:VALUES NIL "list-1"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "mapcar")
      (:ARGLIST NIL "function " (:KEYWORD NIL " &rest") " "
       (:PLUS NIL "lists"))
      (:VALUES NIL "result-list"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "mapcan")
      (:ARGLIST NIL "function " (:KEYWORD NIL " &rest") " "
       (:PLUS NIL "lists"))
      (:VALUES NIL "concatenated-results"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "mapl")
      (:ARGLIST NIL "function " (:KEYWORD NIL " &rest") " "
       (:PLUS NIL "lists"))
      (:VALUES NIL "list-1"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "maplist")
      (:ARGLIST NIL "function " (:KEYWORD NIL " &rest") " "
       (:PLUS NIL "lists"))
      (:VALUES NIL "result-list"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "mapcon")
      (:ARGLIST NIL "function " (:KEYWORD NIL " &rest") " "
       (:PLUS NIL "lists"))
      (:VALUES NIL "concatenated-results"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "function")
     "—a " (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " that must take as many " (:TERM NIL "arguments") " as there are "
     (:PARAM NIL "lists") ". " :PAR
     (:ISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " (:PARAM NIL "list") "—a "
     (:TERM NIL "proper list") ". " :PAR (:PARAM NIL "list-1") "—the first "
     (:PARAM NIL "list") " (which must be a " (:TERM NIL "proper list") "). "
     (:ENDISSUE NIL "DOTTED-LIST-ARGUMENTS:CLARIFY") " " :PAR
     (:PARAM NIL "result-list") "—a " (:TERM NIL "list") ". " :PAR
     (:PARAM NIL "concatenated-results") "—a " (:TERM NIL "list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "The mapping operation involves applying " (:PARAM NIL "function")
     " to successive sets of arguments in which one argument is obtained from each "
     (:TERM NIL "sequence") ". Except for " (:FUNREF NIL "mapc") " and "
     (:FUNREF NIL "mapl") ", the result contains the results returned by "
     (:PARAM NIL "function") ". In the cases of " (:FUNREF NIL "mapc") " and "
     (:FUNREF NIL "mapl") ", the resulting " (:TERM NIL "sequence") " is "
     (:PARAM NIL "list") ". " :PAR (:COMMENT NIL "% 14.2.0 6")
     (:PARAM NIL "function") " is called first on all the elements with index "
     (:TT NIL "0") ", then on all those with index " (:TT NIL "1")
     ", and so on. " (:PARAM NIL "result-type") " specifies the "
     (:TERM NIL "type") " of the resulting " (:TERM NIL "sequence") ". "
     (:ISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " If " (:PARAM NIL "function")
     " is a " (:TERM NIL "symbol") ", it is " (:FUNREF NIL "coerce") "d to a "
     (:TERM NIL "function") " as if by " (:FUNREF NIL "symbol-function") ". "
     (:ENDISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR
     (:COMMENT NIL "% 7.8.4 4") (:FUNREF NIL "mapcar")
     " operates on successive " (:TERM NIL "elements") " of the "
     (:PARAM NIL "lists") ". " (:PARAM NIL "function")
     " is applied to the first " (:TERM NIL "element") " of each "
     (:PARAM NIL "list") ", then to the second " (:TERM NIL "element")
     " of each " (:PARAM NIL "list")
     ", and so on. The iteration terminates when the shortest "
     (:PARAM NIL "list")
     " runs out, and excess elements in other lists are ignored. The value returned by "
     (:FUNREF NIL "mapcar") " is a " (:TERM NIL "list")
     " of the results of successive calls to " (:PARAM NIL "function") ". "
     :PAR (:COMMENT NIL "% 7.8.4 6             ") (:FUNREF NIL "mapc")
     " is like " (:FUNREF NIL "mapcar") " except that the results of applying "
     (:PARAM NIL "function") " are not accumulated. The " (:PARAM NIL "list")
     " argument is returned. " :PAR (:COMMENT NIL "% 7.8.4 5")
     (:FUNREF NIL "maplist") " is like " (:FUNREF NIL "mapcar") " except that "
     (:PARAM NIL "function") " is applied to successive sublists of the "
     (:PARAM NIL "lists") ". " (:PARAM NIL "function")
     " is first applied to the " (:PARAM NIL "lists")
     " themselves, and then to the " (:TERM NIL "cdr") " of each "
     (:PARAM NIL "list") ", and then to the " (:TERM NIL "cdr") " of the "
     (:TERM NIL "cdr") " of each " (:PARAM NIL "list") ", and so on. " :PAR
     (:FUNREF NIL "mapl") " is like " (:FUNREF NIL "maplist")
     " except that the results of applying " (:PARAM NIL "function")
     " are not accumulated; " (:PARAM NIL "list-1") " is returned. " :PAR
     (:COMMENT NIL "% 7.8.4 8") (:FUNREF NIL "mapcan") " and "
     (:FUNREF NIL "mapcon") " are like " (:FUNREF NIL "mapcar") " and "
     (:FUNREF NIL "maplist")
     " respectively, except that the results of applying "
     (:PARAM NIL "function") " are combined into a " (:TERM NIL "list")
     " by the use of " (:FUNREF NIL "nconc") " rather than "
     (:FUNREF NIL "list") ". That is, " :PAR
     (:CODE NIL " (mapcon f x1 ... xn)
   ≡ (apply #'nconc (maplist f x1 ... xn))
")
     " and similarly for the relationship between " (:FUNREF NIL "mapcan")
     " and " (:FUNREF NIL "mapcar") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (mapcar #'car '((1 a) (2 b) (3 c))) → (1 2 3) 
 (mapcar #'abs '(3 -4 2 -5 -6)) → (3 4 2 5 6)
 (mapcar #'cons '(a b c) '(1 2 3)) → ((A . 1) (B . 2) (C . 3))

 (maplist #'append '(1 2 3 4) '(1 2) '(1 2 3)) 
→ ((1 2 3 4 1 2 1 2 3) (2 3 4 2 2 3)) 
 (maplist #'(lambda (x) (cons 'foo x)) '(a b c d))
→ ((FOO A B C D) (FOO B C D) (FOO C D) (FOO D))
 (maplist #'(lambda (x) (if (member (car x) (cdr x)) 0 1)) '(a b a c d b c))
→ (0 0 1 0 1 1 1)
;An entry is 1 if the corresponding element of the input
;  list was the last instance of that element in the input list.

 (setq dummy nil) → NIL 
 (mapc #'(lambda (&rest x) (setq dummy (append dummy x)))
        '(1 2 3 4)
        '(a b c d e)
        '(x y z)) → (1 2 3 4) 
 dummy → (1 A X 2 B Y 3 C Z)                   

 (setq dummy nil) → NIL 
 (mapl #'(lambda (x) (push x dummy)) '(1 2 3 4)) → (1 2 3 4) 
 dummy → ((4) (3 4) (2 3 4) (1 2 3 4)) 

 (mapcan #'(lambda (x y) (if (null x) nil (list x y)))
          '(nil nil nil d e)
          '(1 2 3 4 5 6)) → (D 4 E 5) 
 (mapcan #'(lambda (x) (and (numberp x) (list x)))
          '(a 1 b c 3 4 d 5))
→ (1 3 4 5)
")
     " In this case the function serves as a filter; this is a standard "
     (:RM NIL " Lisp") " idiom using " (:FUNREF NIL "mapcan") ". " :PAR
     (:CODE NIL " (mapcon #'list '(1 2 3 4)) → ((1 2 3 4) (2 3 4) (3 4) (4)) 
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if any " (:PARAM NIL "list") " is not a "
     (:TERM NIL "proper list") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "dolist") ", "
     (:FUNREF NIL "map") ", "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "-------------------- Alists --------------------")
   :PAR (:COMMENT NIL "%% ========== ACONS")
   (:COM (:NAME "acons" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "acons")
      (:ARGLIST NIL "key datum alist") (:VALUES NIL "new-alist"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "key") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "datum") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "alist") "—an "
     (:TERM NIL "association list") ". " :PAR (:PARAM NIL "new-alist") "—an "
     (:TERM NIL "association list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.6.0 5")
     "Creates a " (:TERM NIL "fresh") " " (:TERM NIL "cons") ", the "
     (:TERM NIL "cdr") " of which is " (:PARAM NIL "alist") " and the "
     (:TERM NIL "car") " of which is another " (:TERM NIL "fresh") " "
     (:TERM NIL "cons") ", the " (:TERM NIL "car") " of which is "
     (:PARAM NIL "key") " and the " (:TERM NIL "cdr") " of which is "
     (:PARAM NIL "datum") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq alist '()) → NIL
 (acons 1 \"one\" alist) → ((1 . \"one\"))
 alist → NIL
 (setq alist (acons 1 \"one\" (acons 2 \"two\" alist))) → ((1 . \"one\") (2 . \"two\"))
 (assoc 1 alist) → (1 . \"one\")
 (setq alist (acons 1 \"uno\" alist)) → ((1 . \"uno\") (1 . \"one\") (2 . \"two\"))
 (assoc 1 alist) → (1 . \"uno\")
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "assoc") ", "
     (:FUNREF NIL "pairlis") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL "(acons " (:PARAM NIL "key") " " (:PARAM NIL "datum") " "
      (:PARAM NIL "alist") ") ≡ (cons (cons " (:PARAM NIL "key") " "
      (:PARAM NIL "datum") ") " (:PARAM NIL "alist") ")
")
     " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== ASSOC" "%% ========== ASSOC-IF"
    "%% ========== ASSOC-IF-NOT")
   (:COM (:NAME "assoc, assoc-if, assoc-if-not" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "assoc")
      (:ARGLIST NIL "item alist " (:KEYWORD NIL " &key") " key test test-not")
      (:VALUES NIL "entry"))
     " " :PAR (:ISSUE NIL "ASSOC-RASSOC-IF-KEY:YES") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "assoc-if")
      (:ARGLIST NIL "predicate alist " (:KEYWORD NIL " &key") " key")
      (:VALUES NIL "entry"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "assoc-if-not")
      (:ARGLIST NIL "predicate alist " (:KEYWORD NIL " &key") " key")
      (:VALUES NIL "entry"))
     " " :PAR (:ENDISSUE NIL "ASSOC-RASSOC-IF-KEY:YES") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "item") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "alist") "—an "
     (:TERM NIL "association list") ". " :PAR (:PARAM NIL "predicate") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of one "
     (:TERM NIL "argument") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "test") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "test-not") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "key") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of one argument, or " (:MISC NIL "nil") ". " :PAR (:PARAM NIL "entry")
     "—a " (:TERM NIL "cons") " that is an " (:TERM NIL "element") " of "
     (:PARAM NIL "alist") ", or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:ISSUE NIL "ASSOC-RASSOC-IF-KEY")
     " "
     (:COMMENT NIL "% Replaced per X3J13. -kmp 05-Oct-93" " %% 15.6.0 8"
      " \\funref{assoc} returns the first \\term{cons} in \\param{alist} whose "
      " \\term{car} \\term{satisfies the test}, or \\nil\\ if no such \\term{cons} is found."
      " "
      " The arguments to \\param{test} and \\param{test-not} and are the key of the"
      " \\param{item} and the key of the \\term{car} of an element of \\param{alist}, "
      " in that order." " "
      " \\funref{assoc-if} and \\funref{assoc-if-not} return the first \\term{cons} "
      " in \\param{alist} whose \\term{car} \\term{satisfies the predicate}, or \\nil\\ if "
      " no such \\term{cons} is found." " "
      " The argument to \\param{predicate} is the key of an element of \\param{alist}.")
     (:FUNREF NIL "assoc") ", " (:FUNREF NIL "assoc-if") ", and "
     (:FUNREF NIL "assoc-if-not") " return the first " (:TERM NIL "cons")
     " in " (:PARAM NIL "alist") " whose " (:TERM NIL "car") " "
     (:TERM NIL "satisfies the test") ", or " (:MISC NIL "nil") " if no such "
     (:TERM NIL "cons") " is found. " (:ENDISSUE NIL "ASSOC-RASSOC-IF-KEY") " "
     :PAR "For " (:FUNREF NIL "assoc") ", " (:FUNREF NIL "assoc-if") ", and "
     (:FUNREF NIL "assoc-if-not") ", if " (:MISC NIL "nil") " appears in "
     (:PARAM NIL "alist") " in place of a pair, it is ignored. " :PAR)
    (:PART (:NAME "Examples") " " (:COMMENT NIL "% 15.6.0 9") :PAR
     (:ISSUE NIL "ASSOC-RASSOC-IF-KEY") " "
     (:CODE NIL
      " (setq values '((x . 100) (y . 200) (z . 50))) → ((X . 100) (Y . 200) (Z . 50))
 (assoc 'y values) → (Y . 200)
 (rplacd (assoc 'y values) 201) → (Y . 201)
 (assoc 'y values) → (Y . 201)
 (setq alist '((1 . \"one\")(2 . \"two\")(3 . \"three\"))) 
→ ((1 . \"one\") (2 . \"two\") (3 . \"three\"))
 (assoc 2 alist) → (2 . \"two\")
 (assoc-if #'evenp alist) → (2 . \"two\")
 (assoc-if-not #'(lambda(x) (< x 3)) alist) → (3 . \"three\")
 (setq alist '((\"one\" . 1)(\"two\" . 2))) → ((\"one\" . 1) (\"two\" . 2))
 (assoc \"one\" alist) → NIL
 (assoc \"one\" alist :test #'equalp) → (\"one\" . 1)
 (assoc \"two\" alist :key #'(lambda(x) (char x 2))) → NIL 
 (assoc #\\o alist :key #'(lambda(x) (char x 2))) → (\"two\" . 2)
 (assoc 'r '((a . b) (c . d) (r . x) (s . y) (r . z))) →  (R . X)
 (assoc 'goo '((foo . bar) (zoo . goo))) → NIL
 (assoc '2 '((1 a b c) (2 b c d) (-7 x y z))) → (2 B C D)
 (setq alist '((\"one\" . 1) (\"2\" . 2) (\"three\" . 3)))
→ ((\"one\" . 1) (\"2\" . 2) (\"three\" . 3))
 (assoc-if-not #'alpha-char-p alist
               :key #'(lambda (x) (char x 0))) → (\"2\" . 2)
")
     " " (:ENDISSUE NIL "ASSOC-RASSOC-IF-KEY") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "alist") " is not an "
     (:TERM NIL "association list") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "rassoc") ", "
     (:FUNREF NIL "find") ", " (:FUNREF NIL "member") ", "
     (:FUNREF NIL "position") ", "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL")
     " The " (:KWD NIL "test-not") " parameter is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
     (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " The " (:TERM NIL "function")
     " " (:FUNREF NIL "assoc-if-not") " is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR "It is possible to "
     (:FUNREF NIL "rplacd") " the result of " (:FUNREF NIL "assoc")
     ", provided that it is not " (:MISC NIL "nil") ", in order to “update” "
     (:PARAM NIL "alist") ". " :PAR (:COMMENT NIL "% 15.6.0 10")
     "The two expressions " :PAR
     (:CODE NIL " (assoc item list :test fn)
")
     " and " :PAR
     (:CODE NIL " (find item list :test fn :key #'car)
")
     " are equivalent in meaning with one exception: if " (:MISC NIL "nil")
     " appears in " (:PARAM NIL "alist") " in place of a pair, and "
     (:PARAM NIL "item") " is " (:MISC NIL "nil") ", " (:FUNREF NIL "find")
     " will compute the " (:TERM NIL "car") " of the " (:MISC NIL "nil") " in "
     (:PARAM NIL "alist") ", find that it is equal to " (:PARAM NIL "item")
     ", and return " (:MISC NIL "nil") ", whereas " (:FUNREF NIL "assoc")
     " will ignore the " (:MISC NIL "nil") " in " (:PARAM NIL "alist")
     " and continue to search for an actual " (:TERM NIL "cons") " whose "
     (:TERM NIL "car") " is " (:MISC NIL "nil") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== COPY-ALIST")
   (:COM (:NAME "copy-alist" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "copy-alist") (:ARGLIST NIL "alist")
      (:VALUES NIL "new-alist"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "alist") "—an "
     (:TERM NIL "association list") ". " :PAR (:PARAM NIL "new-alist") "—an "
     (:TERM NIL "association list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.2.0 24")
     (:FUNREF NIL "copy-alist") " returns a " (:TERM NIL "copy") " of "
     (:PARAM NIL "alist") ". " :PAR "The " (:TERM NIL "list structure") " of "
     (:PARAM NIL "alist") " is copied, and the " (:TERM NIL "elements") " of "
     (:PARAM NIL "alist") " which are " (:TERM NIL "conses")
     " are also copied (as " (:TERM NIL "conses") " only). Any other "
     (:TERM NIL "objects")
     " which are referred to, whether directly or indirectly, by the "
     (:PARAM NIL "alist") " continue to be shared. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL "(defparameter *alist* (acons 1 \"one\" (acons 2 \"two\" '())))
*alist* → ((1 . \"one\") (2 . \"two\"))
(defparameter *list-copy* (copy-list *alist*))
*list-copy* → ((1 . \"one\") (2 . \"two\"))
(defparameter *alist-copy* (copy-alist *alist*))
*alist-copy* → ((1 . \"one\") (2 . \"two\"))
(setf (cdr (assoc 2 *alist-copy*)) \"deux\") → \"deux\"
*alist-copy* → ((1 . \"one\") (2 . \"deux\"))
*alist* → ((1 . \"one\") (2 . \"two\"))
(setf (cdr (assoc 1 *list-copy*)) \"uno\") → \"uno\"
*list-copy* → ((1 . \"uno\") (2 . \"two\"))
*alist* → ((1 . \"uno\") (2 . \"two\"))
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "copy-list") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PAIRLIS")
   (:COM (:NAME "pairlis" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "pairlis")
      (:ARGLIST NIL "keys data " (:KEYWORD NIL " &optional") " alist")
      (:VALUES NIL "new-alist"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "keys") "—a "
     (:TERM NIL "proper list") ". " :PAR (:PARAM NIL "data") "—a "
     (:TERM NIL "proper list") ". " :PAR (:PARAM NIL "alist") "—an "
     (:TERM NIL "association list") ". The default is the "
     (:TERM NIL "empty list") ". " :PAR (:PARAM NIL "new-alist") "—an "
     (:TERM NIL "association list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.6.0 6")
     "Returns an " (:TERM NIL "association list")
     " that associates elements of " (:PARAM NIL "keys")
     " to corresponding elements of " (:PARAM NIL "data")
     ". The consequences are undefined if " (:PARAM NIL "keys") " and "
     (:PARAM NIL "data") " are not of the same " (:TERM NIL "length") ". " :PAR
     "If " (:PARAM NIL "alist") " is supplied, " (:FUNREF NIL "pairlis")
     " returns a modified " (:PARAM NIL "alist")
     " with the new pairs prepended to it. " (:COMMENT NIL "% 15.6.0 7")
     "The new pairs may appear in the resulting "
     (:TERM NIL "association list")
     " in either forward or backward order. The result of " :PAR
     (:CODE NIL " (pairlis '(one two) '(1 2) '((three . 3) (four . 19)))
")
     " might be " :PAR
     (:CODE NIL " ((one . 1) (two . 2) (three . 3) (four . 19))
")
     " or " :PAR
     (:CODE NIL " ((two . 2) (one . 1) (three . 3) (four . 19))
")
     " " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (setq keys '(1 2 3)
        data '(\"one\" \"two\" \"three\")
        alist '((4 . \"four\"))) → ((4 . \"four\"))
 (pairlis keys data) → ((3 . \"three\") (2 . \"two\") (1 . \"one\"))
 (pairlis keys data alist)
→ ((3 . \"three\") (2 . \"two\") (1 . \"one\") (4 . \"four\"))
 alist → ((4 . \"four\"))
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "keys") " and "
     (:PARAM NIL "data") " are not " (:TERM NIL "proper lists") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "acons") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== RASSOC" "%% ========== RASSOC-IF"
    "%% ========== RASSOC-IF-NOT")
   (:COM (:NAME "rassoc, rassoc-if, rassoc-if-not" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "rassoc")
      (:ARGLIST NIL "item alist " (:KEYWORD NIL " &key") " key test test-not")
      (:VALUES NIL "entry"))
     " " :PAR (:ISSUE NIL "ASSOC-RASSOC-IF-KEY:YES") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "rassoc-if")
      (:ARGLIST NIL "predicate alist " (:KEYWORD NIL " &key") " key")
      (:VALUES NIL "entry"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "rassoc-if-not")
      (:ARGLIST NIL "predicate alist " (:KEYWORD NIL " &key") " key")
      (:VALUES NIL "entry"))
     " " :PAR (:ENDISSUE NIL "ASSOC-RASSOC-IF-KEY:YES") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "item") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "alist") "—an "
     (:TERM NIL "association list") ". " :PAR (:PARAM NIL "predicate") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of one "
     (:TERM NIL "argument") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "test") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "test-not") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "key") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of one argument, or " (:MISC NIL "nil") ". " :PAR (:PARAM NIL "entry")
     "—a " (:TERM NIL "cons") " that is an " (:TERM NIL "element") " of the "
     (:PARAM NIL "alist") ", or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.6.0 13")
     (:FUNREF NIL "rassoc") ", " (:FUNREF NIL "rassoc-if") ", and "
     (:FUNREF NIL "rassoc-if-not") " return the first " (:TERM NIL "cons")
     " whose " (:TERM NIL "cdr") " " (:TERM NIL "satisfies the test")
     ". If no such " (:TERM NIL "cons") " is found, " (:MISC NIL "nil")
     " is returned. " :PAR (:ISSUE NIL "ASSOC-RASSOC-IF-KEY") " "
     (:COMMENT NIL "% Removed per X3J13. -kmp 05-Oct-93"
      " The argument to \\param{predicate} is an element of \\param{alist}"
      " as returned by the \\kwd{key} function (if supplied)."
      " The arguments to \\kwd{test} and \\kwd{test-not}"
      " are \\param{item} and an element of \\param{alist}"
      " as returned by the \\kwd{key} function (if supplied), in that"
      " order." " "
      " If \\kwd{key} is supplied, it is applied to the \\term{cdr}"
      " of the \\param{alist} entries and the result is passed to the"
      " \\param{predicate}, \\kwd{test}, or \\kwd{test-not} function."
      " The \\term{cdr} of the \\param{alist} entry contains the"
      " key of the association, and if \\kwd{key} is"
      " not supplied or \\nil, the \\term{cdr} is the key of the association.")
     (:ENDISSUE NIL "ASSOC-RASSOC-IF-KEY") " " :PAR "If " (:MISC NIL "nil")
     " appears in " (:PARAM NIL "alist") " in place of a pair, it is ignored. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq alist '((1 . \"one\") (2 . \"two\") (3 . 3))) 
→ ((1 . \"one\") (2 . \"two\") (3 . 3))
 (rassoc 3 alist) → (3 . 3)
 (rassoc \"two\" alist) → NIL
 (rassoc \"two\" alist :test 'equal) → (2 . \"two\")
 (rassoc 1 alist :key #'(lambda (x) (if (numberp x) (/ x 3)))) → (3 . 3)
 (rassoc 'a '((a . b) (b . c) (c . a) (z . a))) → (C . A)
 (rassoc-if #'stringp alist) → (1 . \"one\")
 (rassoc-if-not #'vectorp alist) → (3 . 3)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "assoc") ", "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL")
     " The " (:KWD NIL "test-not") " parameter is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
     (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " The " (:TERM NIL "function")
     " " (:FUNREF NIL "rassoc-if-not") " is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR "It is possible to "
     (:FUNREF NIL "rplaca") " the result of " (:FUNREF NIL "rassoc")
     ", provided that it is not " (:MISC NIL "nil") ", in order to “update” "
     (:PARAM NIL "alist") ". " :PAR (:COMMENT NIL "% 15.6.0 13") :PAR
     "The expressions " :PAR
     (:CODE NIL " (rassoc item list :test fn)
")
     " and " :PAR
     (:CODE NIL " (find item list :test fn :key #'cdr)
")
     " are equivalent in meaning, except when the " (:TT NIL "item") " is "
     (:MISC NIL "nil") " and " (:MISC NIL "nil")
     " appears in place of a pair in the " (:PARAM NIL "alist") ". See the "
     (:TERM NIL "function") " " (:FUNREF NIL "assoc") ". " :PAR))
   " " :PAR (:COMMENT NIL "-------------------- Plists --------------------")
   :PAR (:COMMENT NIL "%% ========== GET-PROPERTIES")
   (:COM (:NAME "get-properties" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "get-properties")
      (:ARGLIST NIL "plist indicator-list")
      (:VALUES NIL "indicator, value, tail"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PLIST-DUPLICATES:ALLOW") " " (:PARAM NIL "plist") "—a "
     (:TERM NIL "property list") ". " (:ENDISSUE NIL "PLIST-DUPLICATES:ALLOW")
     " " :PAR (:PARAM NIL "indicator-list") "—a " (:TERM NIL "proper list")
     " (of " (:TERM NIL "indicators") "). " :PAR (:PARAM NIL "indicator")
     "—an " (:TERM NIL "object") " that is an " (:TERM NIL "element") " of "
     (:PARAM NIL "indicator-list") ". " :PAR (:PARAM NIL "value") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "tail") "—a "
     (:TERM NIL "list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 10.1.0 19")
     (:FUNREF NIL "get-properties") " is used to look up any of several "
     (:TERM NIL "property list") " entries all at once. " :PAR
     (:COMMENT NIL "% 10.1.0 23        ") "It searches the "
     (:PARAM NIL "plist") " for the first entry whose " (:TERM NIL "indicator")
     " is " (:TERM NIL "identical") " to one of the " (:TERM NIL "objects")
     " in " (:PARAM NIL "indicator-list") ". If such an entry is found, the "
     (:PARAM NIL "indicator") " and " (:PARAM NIL "value") " returned are the "
     (:TERM NIL "property indicator") " and its associated "
     (:TERM NIL "property value") ", and the " (:PARAM NIL "tail")
     " returned is the " (:TERM NIL "tail") " of the " (:PARAM NIL "plist")
     " that begins with the found entry (" (:I NIL "i.e.") ",  whose "
     (:TERM NIL "car") " is the " (:PARAM NIL "indicator")
     "). If no such entry is found, the " (:PARAM NIL "indicator") ", "
     (:PARAM NIL "value") ", and " (:PARAM NIL "tail") " are all "
     (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq x '()) → NIL
 (setq *indicator-list* '(prop1 prop2)) → (PROP1 PROP2)
 (getf x 'prop1) → NIL
 (setf (getf x 'prop1) 'val1) → VAL1
 (eq (getf x 'prop1) 'val1) → "
      (:TERM NIL "true") "
 (get-properties x *indicator-list*) → PROP1, VAL1, (PROP1 VAL1)
 x → (PROP1 VAL1)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "get") ", "
     (:FUNREF NIL "getf") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== GETF")
   (:COM (:NAME "getf" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "getf")
      (:ARGLIST NIL "plist indicator " (:KEYWORD NIL " &optional") " default")
      (:VALUES NIL "value"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "getf")
      (:ARGLIST NIL "place indicator " (:KEYWORD NIL " &optional") " default")
      (:NEW-VALUE NIL "new-value"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "plist") "—a "
     (:TERM NIL "property list") ". " :PAR (:PARAM NIL "place") "—a "
     (:TERM NIL "place") ", the " (:TERM NIL "value") " of which is a "
     (:TERM NIL "property list") ". " :PAR (:PARAM NIL "indicator") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "default") "—an "
     (:TERM NIL "object") ". The default is " (:MISC NIL "nil") ". " :PAR
     (:COMMENT NIL "% 10.1.0 24") (:PARAM NIL "value") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "new-value") "—an "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 10.1.0 19"
      " \\funref{getf} is used to \\term{access} entries in a \\term{property list}."
      " \\funref{getf} searches \\param{plist} for an indicator "
      " \\term{identical} to \\param{indicator} and returns the associated value.")
     (:FUNREF NIL "getf") " finds a " (:TERM NIL "property") " on the "
     (:PARAM NIL "plist") " whose " (:TERM NIL "property indicator") " is "
     (:TERM NIL "identical") " to " (:PARAM NIL "indicator")
     ", and returns its corresponding " (:TERM NIL "property value") ". "
     (:ISSUE NIL "PLIST-DUPLICATES:ALLOW") " If there are multiple "
     (:TERM NIL "properties") (:SUB NIL "1") " with that "
     (:TERM NIL "property indicator") ", " (:FUNREF NIL "getf")
     " uses the first such " (:TERM NIL "property") ". "
     (:ENDISSUE NIL "PLIST-DUPLICATES:ALLOW") " "
     (:COMMENT NIL
      " If \\param{indicator} is not found, then \\param{default} is returned.")
     "If there is no " (:TERM NIL "property") " with that "
     (:TERM NIL "property indicator") ", " (:PARAM NIL "default")
     " is returned. " :PAR
     (:COMMENT NIL " %% 10.1.0 20"
      " For \\macref{setf} of \\funref{getf}, the effect is "
      "    to add a new property-value pair," " or to update an existing pair,"
      " in the \\term{property list} that is the \\term{value} of \\param{place}.")
     (:MACREF NIL "setf") " of " (:FUNREF NIL "getf")
     " may be used to associate a new " (:TERM NIL "object")
     " with an existing indicator in the " (:TERM NIL "property list")
     " held by " (:PARAM NIL "place")
     ", or to create a new assocation if none exists. "
     (:ISSUE NIL "PLIST-DUPLICATES:ALLOW") " If there are multiple "
     (:TERM NIL "properties") (:SUB NIL "1") " with that "
     (:TERM NIL "property indicator") ", " (:MACREF NIL "setf") " of "
     (:FUNREF NIL "getf") " associates the " (:PARAM NIL "new-value")
     " with the first such " (:TERM NIL "property") ". "
     (:ENDISSUE NIL "PLIST-DUPLICATES:ALLOW") " "
     (:ISSUE NIL "SETF-GET-DEFAULT:EVALUATED-BUT-IGNORED") " When a "
     (:FUNREF NIL "getf") " " (:TERM NIL "form") " is used as a "
     (:MACREF NIL "setf") " " (:PARAM NIL "place") ", any "
     (:PARAM NIL "default")
     " which is supplied is evaluated according to normal left-to-right evaluation rules, but its "
     (:TERM NIL "value") " is ignored. "
     (:ENDISSUE NIL "SETF-GET-DEFAULT:EVALUATED-BUT-IGNORED") " " :PAR
     (:COMMENT NIL "% 10.1.0 20")
     (:ISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " "
     (:MACREF NIL "setf") " of " (:FUNREF NIL "getf")
     " is permitted to either " (:TERM NIL "write") " the " (:TERM NIL "value")
     " of " (:PARAM NIL "place") " itself, or modify of any part, "
     (:TERM NIL "car") " or " (:TERM NIL "cdr") ", of the "
     (:TERM NIL "list structure") " held by " (:PARAM NIL "place") ". "
     (:ENDISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:ISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " "
     (:CODE NIL " (setq x '()) → NIL
 (getf x 'prop1) → NIL
 (getf x 'prop1 7) → 7
 (getf x 'prop1) → NIL
 (setf (getf x 'prop1) 'val1) → VAL1
 (eq (getf x 'prop1) 'val1) → "
      (:TERM NIL "true") "
 (getf x 'prop1) → VAL1
 (getf x 'prop1 7) → VAL1
 x → (PROP1 VAL1)

;; Examples of implementation variation permitted.
 (setq foo (list 'a 'b 'c 'd 'e 'f)) → (A B C D E F)
 (setq bar (cddr foo)) → (C D E F)
 (remf foo 'c) → "
      (:TERM NIL "true") "
 foo → (A B E F)
 bar
→ (C D E F)
OR→ (C)
OR→ (NIL)
OR→ (C NIL)
OR→ (C D)
")
     " " (:ENDISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "get") ", "
     (:FUNREF NIL "get-properties") ", " (:MACREF NIL "setf") ", "
     (:SECREF NIL :FN-FORMS-AS-GEN-REFS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "There is no way (using "
     (:FUNREF NIL "getf")
     ") to distinguish an absent property from one whose value is "
     (:PARAM NIL "default") "; but see " (:FUNREF NIL "get-properties") ". "
     :PAR "Note that while supplying a " (:TERM NIL "default") " argument to "
     (:FUNREF NIL "getf") " in a " (:MACREF NIL "setf")
     " situation is sometimes not very interesting, it is still important because some macros, such as "
     (:MACREF NIL "push") " and " (:MACREF NIL "incf") ", require a "
     (:PARAM NIL "place") " argument which data is both " (:TERM NIL "read")
     " from and " (:TERM NIL "written") " to. In such a context, if a "
     (:TERM NIL "default") " argument is to be supplied for the "
     (:TERM NIL "read") " situation, it must be syntactically valid for the "
     (:TERM NIL "write") " situation as well. For example, " :PAR
     (:CODE NIL " (let ((plist '()))
   (incf (getf plist 'count 0))
   plist) → (COUNT 1)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== REMF")
   (:COM (:NAME "remf" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "remf") (:ARGLIST NIL "place indicator")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "place") "—a "
     (:TERM NIL "place") ". " :PAR (:PARAM NIL "indicator") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 10.1.0 22")
     (:MACREF NIL "remf") " removes from the " (:TERM NIL "property list")
     " stored in " (:PARAM NIL "place") " a " (:TERM NIL "property")
     (:SUB NIL "1") " with a " (:TERM NIL "property indicator") " "
     (:COMMENT NIL " EQ => identical -kmp 14-Jul-93") (:TERM NIL "identical")
     " to " (:PARAM NIL "indicator") ". " (:ISSUE NIL "PLIST-DUPLICATES:ALLOW")
     " If there are multiple " (:TERM NIL "properties") (:SUB NIL "1")
     " with the " (:TERM NIL "identical") " key, " (:MACREF NIL "remf")
     " only removes the first such " (:TERM NIL "property") ". "
     (:ENDISSUE NIL "PLIST-DUPLICATES:ALLOW") " " (:MACREF NIL "remf")
     " returns " (:TERM NIL "false") " if no such " (:TERM NIL "property")
     " was found, or " (:TERM NIL "true") " if a property was found. " :PAR
     "The " (:TERM NIL "property indicator") " and the corresponding "
     (:TERM NIL "property value")
     " are removed in an undefined order by destructively splicing the property list. "
     (:ISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " "
     (:MACREF NIL "remf") " is permitted to either " (:MACREF NIL "setf") " "
     (:PARAM NIL "place") " or to " (:MACREF NIL "setf") " any part, "
     (:FUNREF NIL "car") " or " (:FUNREF NIL "cdr") ", of the "
     (:TERM NIL "list structure") " held by that " (:PARAM NIL "place") ". "
     (:ENDISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " " :PAR
     (:ISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM")
     " For information about the " (:TERM NIL "evaluation") " of "
     (:TERM NIL "subforms") " of " (:PARAM NIL "place") ", see "
     (:SECREF NIL :GEN-REF-SUB-FORM-EVAL) ". "
     (:ENDISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq x (cons () ())) → (NIL)
 (setf (getf (car x) 'prop1) 'val1) → VAL1
 (remf (car x) 'prop1) → "
      (:TERM NIL "true") "
 (remf (car x) 'prop1) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The property list stored in "
     (:PARAM NIL "place") " is modified. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "remprop") ", "
     (:FUNREF NIL "getf") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "-------------------- Sets --------------------")
   :PAR
   (:COMMENT NIL "%% ========== INTERSECTION" "%% ========== NINTERSECTION")
   (:COM (:NAME "intersection, nintersection" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "intersection")
      (:ARGLIST NIL "list-1 list-2 " (:KEYWORD NIL " &key")
       " key test test-not")
      (:VALUES NIL "result-list"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "nintersection")
      (:ARGLIST NIL "list-1 list-2 " (:KEYWORD NIL " &key")
       " key test test-not")
      (:VALUES NIL "result-list"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "list-1") "—a "
     (:TERM NIL "proper list") ". " :PAR (:PARAM NIL "list-2") "—a "
     (:TERM NIL "proper list") ". " :PAR (:COMMENT NIL "% 15.5.0 15")
     (:PARAM NIL "test") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "test-not") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "key") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of one argument, or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "result-list") "—a " (:TERM NIL "list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.5.0 14")
     (:FUNREF NIL "intersection") " and " (:FUNREF NIL "nintersection")
     " return a " (:TERM NIL "list")
     " that contains every element that occurs in both " (:PARAM NIL "list-1")
     " and " (:PARAM NIL "list-2") ". " :PAR (:COMMENT NIL "% 15.5.0 16")
     (:FUNREF NIL "nintersection") " is the destructive version of "
     (:FUNREF NIL "intersection")
     ". It performs the same operation, but may destroy " (:PARAM NIL "list-1")
     " using its cells to construct the result. "
     (:ISSUE NIL "NINTERSECTION-DESTRUCTION:REVERT") " "
     (:ISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " "
     (:COMMENT NIL
      "% This has gone back and forth, but my opinion is that the current state of this"
      "% is that the second arg is again protected. -kmp 7-Feb-92" "%"
      "% This opinion finally validated by clarifying vote in letter ballot (X3J13/93-302)."
      "% Option REVERT affirms the status quo from both CLtL1 and draft 12.24,"
      "% overriding the possible effect of REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89."
      " %%Barmar noted that this next sentence was in conflict with the changes"
      " %%made by REMF-DESTRUCTION-UNSPECIFIED, so I've removed it for now.  Mail sent"
      " %%to find out if X3J13 really intended for NINTERSECTION's contract to be changed,"
      " %%or if making this untrue this was a `typo':"
      " %\\param{list-2} is not destroyed." " "
      " \\funref{nintersection} is permitted to modify any part of the \\term{list structure} "
      " of \\param{list-1} or \\param{list-2}.")
     (:PARAM NIL "list-2") " is not destroyed. "
     (:ENDISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " "
     (:ENDISSUE NIL "NINTERSECTION-DESTRUCTION:REVERT") " " :PAR
     "The intersection operation is described as follows. For all possible ordered pairs consisting of one "
     (:TERM NIL "element") " from " (:PARAM NIL "list-1") " and one "
     (:TERM NIL "element") " from " (:PARAM NIL "list-2") ", "
     (:KWD NIL "test") " or " (:KWD NIL "test-not")
     " are used to determine whether they " (:TERM NIL "satisfy the test")
     ". The first argument to the " (:KWD NIL "test") " or "
     (:KWD NIL "test-not") " function is an element of " (:PARAM NIL "list-1")
     "; the second argument is an element of " (:PARAM NIL "list-2") ". If "
     (:KWD NIL "test") " or " (:KWD NIL "test-not") " is not supplied, "
     (:FUNREF NIL "eql") " is used. It is an error if " (:KWD NIL "test")
     " and " (:KWD NIL "test-not") " are supplied in the same function call. "
     :PAR "If " (:KWD NIL "key") " is supplied (and not " (:MISC NIL "nil")
     "), it is used to extract the part to be tested from the "
     (:PARAM NIL "list") " element. The argument to the " (:KWD NIL "key")
     " function is an element of either " (:PARAM NIL "list-1") " or "
     (:PARAM NIL "list-2") "; the " (:KWD NIL "key")
     " function typically returns part of the supplied element. If "
     (:KWD NIL "key") " is not supplied or " (:MISC NIL "nil") ", the "
     (:PARAM NIL "list-1") " and " (:PARAM NIL "list-2") " elements are used. "
     :PAR "For every pair that " (:TERM NIL "satisfies the test")
     ", exactly one of the two elements of the pair will be put in the result. No element from either "
     (:TERM NIL "list") " appears in the result that does not "
     (:TERM NIL "satisfy the test") " for an element from the other "
     (:TERM NIL "list") ". If one of the " (:TERM NIL "lists")
     " contains duplicate elements, there may be duplication in the result. "
     :PAR
     "There is no guarantee that the order of elements in the result will reflect the ordering of the arguments in any particular way. The result "
     (:TERM NIL "list") " may share cells with, or be " (:FUNREF NIL "eq")
     " to, either " (:PARAM NIL "list-1") " or " (:PARAM NIL "list-2")
     " if appropriate. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq list1 (list 1 1 2 3 4 a b c \"A\" \"B\" \"C\" \"d\")
       list2 (list 1 4 5 b c d \"a\" \"B\" \"c\" \"D\")) 
  → (1 4 5 B C D \"a\" \"B\" \"c\" \"D\")
 (intersection list1 list2) → (C B 4 1 1)
 (intersection list1 list2 :test 'equal) → (\"B\" C B 4 1 1)
 (intersection list1 list2 :test #'equalp) → (\"d\" \"C\" \"B\" \"A\" C B 4 1 1) 
 (nintersection list1 list2) → (1 1 4 B C)
 list1 → "
      (:TERM NIL "implementation-dependent") " ;" (:I NIL "e.g.")
      ",  (1 1 4 B C)
 list2 → "
      (:TERM NIL "implementation-dependent") " ;" (:I NIL "e.g.")
      ",  (1 4 5 B C D \"a\" \"B\" \"c\" \"D\")
 (setq list1 (copy-list '((1 . 2) (2 . 3) (3 . 4) (4 . 5))))
→ ((1 . 2) (2 . 3) (3 . 4) (4 . 5)) 
 (setq list2 (copy-list '((1 . 3) (2 . 4) (3 . 6) (4 . 8))))
→ ((1 . 3) (2 . 4) (3 . 6) (4 . 8)) 
 (nintersection list1 list2 :key #'cdr) → ((2 . 3) (3 . 4)) 
 list1 → "
      (:TERM NIL "implementation-dependent") " ;" (:I NIL "e.g.")
      ",  ((1 . 2) (2 . 3) (3 . 4)) 
 list2 → "
      (:TERM NIL "implementation-dependent") " ;" (:I NIL "e.g.")
      ",  ((1 . 3) (2 . 4) (3 . 6) (4 . 8)) 
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR
     (:ISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " "
     (:FUNREF NIL "nintersection") " can modify " (:PARAM NIL "list-1") ", "
     (:ISSUE NIL "NINTERSECTION-DESTRUCTION") " "
     (:COMMENT NIL "or \\param{list-2}.") "but not " (:PARAM NIL "list-2") ". "
     (:ENDISSUE NIL "NINTERSECTION-DESTRUCTION") " "
     (:ENDISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "list-1") " and "
     (:PARAM NIL "list-2") " are not " (:TERM NIL "proper lists") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "union") ", "
     (:ISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:SECREF NIL :CONSTANT-MODIFICATION) ", "
     (:ENDISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL")
     " The " (:KWD NIL "test-not") " parameter is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
     (:ISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " Since the "
     (:FUNREF NIL "nintersection")
     " side effect is not required, it should not be used in for-effect-only positions in portable code. "
     (:ENDISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " "))
   " " :PAR (:COMMENT NIL "%% ========== ADJOIN")
   (:COM (:NAME "adjoin" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "adjoin")
      (:ARGLIST NIL "item list " (:KEYWORD NIL " &key") " key test test-not")
      (:VALUES NIL "new-list"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "item") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "list") "—a "
     (:TERM NIL "proper list") ". " :PAR (:PARAM NIL "test") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "test-not") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "key") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of one argument, or " (:MISC NIL "nil") ". " :PAR
     (:COMMENT NIL "% 15.5.0 8   ") (:PARAM NIL "new-list") "—a "
     (:TERM NIL "list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Tests whether " (:PARAM NIL "item")
     " is the same as an existing element of " (:PARAM NIL "list") ". If the "
     (:PARAM NIL "item") " is not an existing element, " (:FUNREF NIL "adjoin")
     " adds it to " (:PARAM NIL "list") " (as if by " (:FUNREF NIL "cons")
     ") and returns the resulting " (:TERM NIL "list")
     "; otherwise, nothing is added and the original " (:PARAM NIL "list")
     " is returned. " :PAR "The " (:PARAM NIL "test") ", "
     (:PARAM NIL "test-not") ", and " (:PARAM NIL "key")
     " affect how it is determined whether " (:PARAM NIL "item")
     " is the same as an " (:TERM NIL "element") " of " (:PARAM NIL "list")
     ". For details, see " (:SECREF NIL :SATISFYING-THE-TWO-ARG-TEST) "." :PAR
     " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq slist '()) → NIL 
 (adjoin 'a slist) → (A) 
 slist → NIL 
 (setq slist (adjoin '(test-item 1) slist)) → ((TEST-ITEM 1)) 
 (adjoin '(test-item 1) slist) → ((TEST-ITEM 1) (TEST-ITEM 1)) 
 (adjoin '(test-item 1) slist :test 'equal) → ((TEST-ITEM 1)) 
 (adjoin '(new-test-item 1) slist :key #'cadr) → ((TEST-ITEM 1)) 
 (adjoin '(new-test-item 1) slist) → ((NEW-TEST-ITEM 1) (TEST-ITEM 1)) 
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "list") " is not a "
     (:TERM NIL "proper list") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "pushnew") ", "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL")
     " The " (:KWD NIL "test-not") " parameter is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
     (:CODE NIL " (adjoin item list :key fn)
   ≡ (if (member (fn item) list :key fn) list (cons item list))
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PUSHNEW")
   (:COM (:NAME "pushnew" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "pushnew")
      (:ARGLIST NIL "item place " (:KEYWORD NIL " &key") " key test test-not")
      (:VALUES NIL "new-place-value"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "item") "—an "
     (:TERM NIL "object") ". " :PAR
     (:COMMENT NIL
      "!!! Need to separate discussion of place from its value. -kmp 1-Sep-91")
     (:PARAM NIL "place") "—a " (:TERM NIL "place") ", the "
     (:TERM NIL "value") " of which is a " (:TERM NIL "proper list") ". " :PAR
     (:PARAM NIL "test") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "test-not") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "key") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of one argument, or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "new-place-value") "—a " (:TERM NIL "list") " (the new "
     (:TERM NIL "value") " of " (:PARAM NIL "place") "). " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "pushnew")
     " tests whether " (:PARAM NIL "item")
     " is the same as any existing element of the " (:TERM NIL "list")
     " stored in " (:PARAM NIL "place") ". If " (:PARAM NIL "item")
     " is not, it is prepended to the " (:TERM NIL "list") ", and the new "
     (:TERM NIL "list") " is stored in " (:PARAM NIL "place") ". " :PAR
     (:COMMENT NIL "% 15.2.0 34") (:MACREF NIL "pushnew") " returns the new "
     (:TERM NIL "list") " that is stored in " (:PARAM NIL "place") ". " :PAR
     (:COMMENT NIL "% 15.2.0 32") "Whether or not " (:PARAM NIL "item")
     " is already a member of the " (:TERM NIL "list") " that is in "
     (:PARAM NIL "place") " is determined by comparisons using "
     (:KWD NIL "test") " or " (:KWD NIL "test-not")
     ". The first argument to the " (:KWD NIL "test") " or "
     (:KWD NIL "test-not") " function is " (:PARAM NIL "item")
     "; the second argument is an element of the " (:TERM NIL "list") " in "
     (:PARAM NIL "place") " as returned by the " (:KWD NIL "key")
     " function (if supplied). " :PAR "If " (:KWD NIL "key")
     " is supplied, it is used to extract the part to be tested from both "
     (:PARAM NIL "item") " and the " (:TERM NIL "list") " element, as for "
     (:FUNREF NIL "adjoin") ". " :PAR "The argument to the " (:KWD NIL "key")
     " function is an element of the " (:TERM NIL "list") " stored in "
     (:PARAM NIL "place") ". The " (:KWD NIL "key")
     " function typically returns part part of the element of the "
     (:TERM NIL "list") ". If " (:KWD NIL "key") " is not supplied or "
     (:MISC NIL "nil") ", the " (:TERM NIL "list") " element is used. " :PAR
     (:ISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM")
     " For information about the " (:TERM NIL "evaluation") " of "
     (:TERM NIL "subforms") " of " (:PARAM NIL "place") ", see "
     (:SECREF NIL :GEN-REF-SUB-FORM-EVAL) ". "
     (:ENDISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM") " " :PAR
     (:ISSUE NIL "PUSHNEW-STORE-REQUIRED:UNSPECIFIED") " It is "
     (:TERM NIL "implementation-dependent") " whether or not "
     (:MACREF NIL "pushnew") " actually executes the storing form for its "
     (:PARAM NIL "place") " in the situation where the " (:PARAM NIL "item")
     " is already a member of the " (:TERM NIL "list") " held by "
     (:PARAM NIL "place") ". "
     (:ENDISSUE NIL "PUSHNEW-STORE-REQUIRED:UNSPECIFIED") " " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (setq x '(a (b c) d)) → (A (B C) D)
 (pushnew 5 (cadr x)) → (5 B C)   
 x → (A (5 B C) D)
 (pushnew 'b (cadr x)) → (5 B C)  
 x → (A (5 B C) D)
 (setq lst '((1) (1 2) (1 2 3))) → ((1) (1 2) (1 2 3))
 (pushnew '(2) lst) → ((2) (1) (1 2) (1 2 3))
 (pushnew '(1) lst) → ((1) (2) (1) (1 2) (1 2 3))
 (pushnew '(1) lst :test 'equal) → ((1) (2) (1) (1 2) (1 2 3))
 (pushnew '(1) lst :key #'car) → ((1) (2) (1) (1 2) (1 2 3)) 
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The contents of "
     (:PARAM NIL "place") " may be modified. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "push") ", "
     (:FUNREF NIL "adjoin") ", " (:SECREF NIL :GENERALIZED-REFERENCE) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The effect of "
     (:CODE NIL " (pushnew item place :test p)
")
     " is roughly equivalent to "
     (:CODE NIL " (setf place (adjoin item place :test p))
")
     " " (:ISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM") " except that the "
     (:TERM NIL "subforms") " of " (:TT NIL "place")
     " are evaluated only once, and " (:TT NIL "item") " is evaluated before "
     (:TT NIL "place") ". " (:ENDISSUE NIL "PUSH-EVALUATION-ORDER:FIRST-ITEM")
     " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== NSET-DIFFERENCE"
    "%% ========== SET-DIFFERENCE")
   (:COM (:NAME "set-difference, nset-difference" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "set-difference")
      (:ARGLIST NIL "list-1 list-2 " (:KEYWORD NIL " &key")
       " key test test-not")
      (:VALUES NIL "result-list"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "nset-difference")
      (:ARGLIST NIL "list-1 list-2 " (:KEYWORD NIL " &key")
       " key test test-not")
      (:VALUES NIL "result-list"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "list-1") "—a "
     (:TERM NIL "proper list") ". " :PAR (:PARAM NIL "list-2") "—a "
     (:TERM NIL "proper list") ". " :PAR (:PARAM NIL "test") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "test-not") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "key") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of one argument, or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "result-list") "—a " (:TERM NIL "list") ". " :PAR)
    (:PART (:NAME "Description") " " (:COMMENT NIL "% 15.5.0 17")
     (:FUNREF NIL "set-difference") " returns a " (:TERM NIL "list")
     " of elements of " (:PARAM NIL "list-1") " that do not appear in "
     (:PARAM NIL "list-2") ". " :PAR (:COMMENT NIL "% 15.5.0 20")
     (:FUNREF NIL "nset-difference") " is the destructive version of "
     (:FUNREF NIL "set-difference") ". It may destroy " (:PARAM NIL "list-1")
     ". " :PAR (:COMMENT NIL "% 15.5.0 19")
     "For all possible ordered pairs consisting of one element from "
     (:PARAM NIL "list-1") " and one element from " (:PARAM NIL "list-2")
     ", the " (:KWD NIL "test") " or " (:KWD NIL "test-not")
     " function is used to determine whether they "
     (:TERM NIL "satisfy the test") ". The first argument to the "
     (:KWD NIL "test") " or " (:KWD NIL "test-not")
     " function is the part of an element of " (:PARAM NIL "list-1")
     " that is returned by the " (:KWD NIL "key")
     " function (if supplied); the second argument is the part of an element of "
     (:PARAM NIL "list-2") " that is returned by the " (:KWD NIL "key")
     " function (if supplied). " :PAR "If " (:KWD NIL "key")
     " is supplied, its argument is a " (:PARAM NIL "list-1") " or "
     (:PARAM NIL "list-2") " element. The " (:KWD NIL "key")
     " function typically returns part of the supplied element. If "
     (:KWD NIL "key") " is not supplied, the " (:PARAM NIL "list-1") " or "
     (:PARAM NIL "list-2") " element is used. " :PAR "An element of "
     (:PARAM NIL "list-1")
     " appears in the result if and only if it does not match any element of "
     (:PARAM NIL "list-2") ". " :PAR (:COMMENT NIL "% 15.5.0 18")
     "There is no guarantee that the order of elements in the result will reflect the ordering of the arguments in any particular way. The result "
     (:TERM NIL "list") " may share cells with, or be " (:FUNREF NIL "eq")
     " to, either of " (:PARAM NIL "list-1") " or " (:PARAM NIL "list-2")
     ", if appropriate. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq lst1 (list \"A\" \"b\" \"C\" \"d\")
       lst2 (list \"a\" \"B\" \"C\" \"d\")) → (\"a\" \"B\" \"C\" \"d\")
 (set-difference lst1 lst2) → (\"d\" \"C\" \"b\" \"A\")
 (set-difference lst1 lst2 :test 'equal) → (\"b\" \"A\")
 (set-difference lst1 lst2 :test #'equalp) → NIL 
 (nset-difference lst1 lst2 :test #'string=) → (\"A\" \"b\")
 (setq lst1 '((\"a\" . \"b\") (\"c\" . \"d\") (\"e\" . \"f\")))
→ ((\"a\" . \"b\") (\"c\" . \"d\") (\"e\" . \"f\")) 
 (setq lst2 '((\"c\" . \"a\") (\"e\" . \"b\") (\"d\" . \"a\")))
→ ((\"c\" . \"a\") (\"e\" . \"b\") (\"d\" . \"a\")) 
 (nset-difference lst1 lst2 :test #'string= :key #'cdr)
→ ((\"c\" . \"d\") (\"e\" . \"f\")) 
 lst1 → ((\"a\" . \"b\") (\"c\" . \"d\") (\"e\" . \"f\")) 
 lst2 → ((\"c\" . \"a\") (\"e\" . \"b\") (\"d\" . \"a\")) 
")
     " "
     (:CODE NIL ";; Remove all flavor names that contain \"c\" or \"w\".
 (set-difference '(\"strawberry\" \"chocolate\" \"banana\"
                  \"lemon\" \"pistachio\" \"rhubarb\")
          '(#\\c #\\w)
          :test #'(lambda (s c) (find c s)))
→ (\"banana\" \"rhubarb\" \"lemon\")    ;One possible ordering.
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR (:FUNREF NIL "nset-difference")
     " may destroy " (:PARAM NIL "list-1") ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "list-1") " and "
     (:PARAM NIL "list-2") " are not " (:TERM NIL "proper lists") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:ISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:SECREF NIL :CONSTANT-MODIFICATION) ", "
     (:ENDISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL")
     " The " (:KWD NIL "test-not") " parameter is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== NSET-EXCLUSIVE-OR"
    "%% ========== SET-EXCLUSIVE-OR")
   (:COM (:NAME "set-exclusive-or, nset-exclusive-or" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "set-exclusive-or")
      (:ARGLIST NIL "list-1 list-2 " (:KEYWORD NIL " &key")
       " key test test-not")
      (:VALUES NIL "result-list"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "nset-exclusive-or")
      (:ARGLIST NIL "list-1 list-2 " (:KEYWORD NIL " &key")
       " key test test-not")
      (:VALUES NIL "result-list"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "list-1") "—a "
     (:TERM NIL "proper list") ". " :PAR (:PARAM NIL "list-2") "—a "
     (:TERM NIL "proper list") ". " :PAR (:PARAM NIL "test") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "test-not") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "key") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of one argument, or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "result-list") "—a " (:TERM NIL "list") ". " :PAR)
    (:PART (:NAME "Description") " " (:COMMENT NIL "% 15.5.0 22")
     (:FUNREF NIL "set-exclusive-or") " returns a " (:TERM NIL "list")
     " of elements that appear in exactly one of " (:PARAM NIL "list-1")
     " and " (:PARAM NIL "list-2") ". " :PAR (:COMMENT NIL "% 15.5.0 25")
     (:FUNREF NIL "nset-exclusive-or") " is the " (:TERM NIL "destructive")
     " version of " (:FUNREF NIL "set-exclusive-or") ". " :PAR
     (:COMMENT NIL "% 15.5.0 24")
     "For all possible ordered pairs consisting of one element from "
     (:PARAM NIL "list-1") " and one element from " (:PARAM NIL "list-2")
     ", the " (:KWD NIL "test") " or " (:KWD NIL "test-not")
     " function is used to determine whether they "
     (:TERM NIL "satisfy the test") ". " :PAR "If " (:KWD NIL "key")
     " is supplied, it is used to extract the part to be tested from the "
     (:PARAM NIL "list-1") " or " (:PARAM NIL "list-2")
     " element. The first argument to the " (:KWD NIL "test") " or "
     (:KWD NIL "test-not") " function is the part of an element of "
     (:PARAM NIL "list-1") " extracted by the " (:KWD NIL "key")
     " function (if supplied); the second argument is the part of an element of "
     (:PARAM NIL "list-2") " extracted by the " (:KWD NIL "key")
     " function (if supplied). If " (:KWD NIL "key") " is not supplied or "
     (:MISC NIL "nil") ", the " (:PARAM NIL "list-1") " or "
     (:PARAM NIL "list-2") " element is used. " :PAR
     "The result contains precisely those elements of " (:PARAM NIL "list-1")
     " and " (:PARAM NIL "list-2") " that appear in no matching pair. " :PAR
     "The result " (:TERM NIL "list") " of " (:FUNREF NIL "set-exclusive-or")
     " might share storage with one of " (:PARAM NIL "list-1") " or "
     (:PARAM NIL "list-2") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq lst1 (list 1 \"a\" \"b\")
       lst2 (list 1 \"A\" \"b\")) → (1 \"A\" \"b\")
 (set-exclusive-or lst1 lst2) → (\"b\" \"A\" \"b\" \"a\")
 (set-exclusive-or lst1 lst2 :test #'equal) → (\"A\" \"a\")
 (set-exclusive-or lst1 lst2 :test 'equalp) → NIL 
 (nset-exclusive-or lst1 lst2) → (\"a\" \"b\" \"A\" \"b\") 
 (setq lst1 (list ((\"a\" . \"b\") (\"c\" . \"d\") (\"e\" . \"f\"))))
→ ((\"a\" . \"b\") (\"c\" . \"d\") (\"e\" . \"f\"))
 (setq lst2 (list ((\"c\" . \"a\") (\"e\" . \"b\") (\"d\" . \"a\"))))
→ ((\"c\" . \"a\") (\"e\" . \"b\") (\"d\" . \"a\")) 
 (nset-exclusive-or lst1 lst2 :test #'string= :key #'cdr)
→ ((\"c\" . \"d\") (\"e\" . \"f\") (\"c\" . \"a\") (\"d\" . \"a\")) 
 lst1 → ((\"a\" . \"b\") (\"c\" . \"d\") (\"e\" . \"f\"))
 lst2 → ((\"c\" . \"a\") (\"d\" . \"a\")) 
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR
     (:ISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " "
     (:FUNREF NIL "nset-exclusive-or") " is permitted to modify any part, "
     (:TERM NIL "car") " or " (:TERM NIL "cdr") ", of the "
     (:TERM NIL "list structure") " of " (:PARAM NIL "list-1") " or "
     (:PARAM NIL "list-2") ". "
     (:ENDISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "list-1") " and "
     (:PARAM NIL "list-2") " are not " (:TERM NIL "proper lists") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:ISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:SECREF NIL :CONSTANT-MODIFICATION) ", "
     (:ENDISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL")
     " The " (:KWD NIL "test-not") " parameter is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
     (:ISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " Since the "
     (:FUNREF NIL "nset-exclusive-or")
     " side effect is not required, it should not be used in for-effect-only positions in portable code. "
     :PAR (:ENDISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SUBSETP")
   (:COM (:NAME "subsetp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "subsetp")
      (:ARGLIST NIL "list-1 list-2 " (:KEYWORD NIL " &key")
       " key test test-not")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "list-1") "—a "
     (:TERM NIL "proper list") ". " :PAR (:PARAM NIL "list-2") "—a "
     (:TERM NIL "proper list") ". " :PAR (:PARAM NIL "test") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "test-not") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "key") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of one argument, or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "generalized-boolean") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 15.5.0 26")
     (:FUNREF NIL "subsetp") " returns " (:TERM NIL "true")
     " if every element of " (:PARAM NIL "list-1") " matches some element of "
     (:PARAM NIL "list-2") ", and " (:TERM NIL "false") " otherwise. " :PAR
     "Whether a list element is the same as another list element is determined by the functions specified by the keyword arguments. The first argument to the "
     (:KWD NIL "test") " or " (:KWD NIL "test-not") " function is "
     (:COMMENT NIL "!!! Sandra: typically?") "typically part of an element of "
     (:PARAM NIL "list-1") " extracted by the " (:KWD NIL "key")
     " function; the second argument is typically part of an element of "
     (:PARAM NIL "list-2") " extracted by the " (:KWD NIL "key") " function. "
     :PAR "The argument to the " (:KWD NIL "key")
     " function is an element of either " (:PARAM NIL "list-1") " or "
     (:PARAM NIL "list-2")
     "; the return value is part of the element of the supplied list element. If "
     (:KWD NIL "key") " is not supplied or " (:MISC NIL "nil") ", the "
     (:PARAM NIL "list-1") " or " (:PARAM NIL "list-2")
     " element itself is supplied to the " (:KWD NIL "test") " or "
     (:KWD NIL "test-not") " function. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq cosmos '(1 \"a\" (1 2))) → (1 \"a\" (1 2))
 (subsetp '(1) cosmos) → "
      (:TERM NIL "true") "
 (subsetp '((1 2)) cosmos) → "
      (:TERM NIL "false") "
 (subsetp '((1 2)) cosmos :test 'equal) → "
      (:TERM NIL "true") "
 (subsetp '(1 \"A\") cosmos :test #'equalp) → "
      (:TERM NIL "true") "
 (subsetp '((1) (2)) '((1) (2))) → "
      (:TERM NIL "false") "
 (subsetp '((1) (2)) '((1) (2)) :key #'car) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "list-1") " and "
     (:PARAM NIL "list-2") " are not " (:TERM NIL "proper lists") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL")
     " The " (:KWD NIL "test-not") " parameter is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== NUNION" "%% ========== UNION")
   (:COM (:NAME "union, nunion" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "union")
      (:ARGLIST NIL "list-1 list-2 " (:KEYWORD NIL " &key")
       " key test test-not")
      (:VALUES NIL "result-list"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "nunion")
      (:ARGLIST NIL "list-1 list-2 " (:KEYWORD NIL " &key")
       " key test test-not")
      (:VALUES NIL "result-list"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "list-1") "—a "
     (:TERM NIL "proper list") ". " :PAR (:PARAM NIL "list-2") "—a "
     (:TERM NIL "proper list") ". " :PAR (:PARAM NIL "test") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "test-not") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "key") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of one argument, or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "result-list") "—a " (:TERM NIL "list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "union") " and "
     (:FUNREF NIL "nunion") " return a " (:TERM NIL "list")
     " that contains every element that occurs in either "
     (:PARAM NIL "list-1") " or " (:PARAM NIL "list-2") ". " :PAR
     (:COMMENT NIL "% 15.5.0 11")
     "For all possible ordered pairs consisting of one element from "
     (:PARAM NIL "list-1") " and one element from " (:PARAM NIL "list-2") ", "
     (:KWD NIL "test") " or " (:KWD NIL "test-not")
     " is used to determine whether they " (:TERM NIL "satisfy the test")
     ". The first argument to the " (:KWD NIL "test") " or "
     (:KWD NIL "test-not") " function is the part of the element of "
     (:PARAM NIL "list-1") " extracted by the " (:KWD NIL "key")
     " function (if supplied); the second argument is the part of the element of "
     (:PARAM NIL "list-2") " extracted by the " (:KWD NIL "key")
     " function (if supplied). " :PAR "The argument to the " (:KWD NIL "key")
     " function is an element of " (:PARAM NIL "list-1") " or "
     (:PARAM NIL "list-2")
     "; the return value is part of the supplied element. If " (:KWD NIL "key")
     " is not supplied or " (:MISC NIL "nil") ", the element of "
     (:PARAM NIL "list-1") " or " (:PARAM NIL "list-2")
     " itself is supplied to the " (:KWD NIL "test") " or "
     (:KWD NIL "test-not") " function. " :PAR "For every matching pair, "
     (:COMMENT NIL "Removed per barmar -kmp 29-Jul-91" "at least")
     "one of the two elements of the pair will be in the result. Any element from either "
     (:PARAM NIL "list-1") " or " (:PARAM NIL "list-2")
     " that matches no element of the other will appear in the result. " :PAR
     (:COMMENT NIL "% 15.5.0 9") "If there is a duplication between "
     (:PARAM NIL "list-1") " and " (:PARAM NIL "list-2")
     ", only one of the duplicate instances will be in the result. If either "
     (:PARAM NIL "list-1") " or " (:PARAM NIL "list-2")
     " has duplicate entries within it, the redundant entries might or might not appear in the result. "
     :PAR (:COMMENT NIL "% 15.5.0 10")
     "The order of elements in the result do not have to reflect the ordering of "
     (:PARAM NIL "list-1") " or " (:PARAM NIL "list-2")
     " in any way. The result " (:TERM NIL "list") " may be "
     (:FUNREF NIL "eq") " to either " (:PARAM NIL "list-1") " or "
     (:PARAM NIL "list-2") " if appropriate. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (union '(a b c) '(f a d))
→ (A B C F D)
OR→ (B C F A D)
OR→ (D F A B C)
 (union '((x 5) (y 6)) '((z 2) (x 4)) :key #'car)
→ ((X 5) (Y 6) (Z 2))
OR→ ((X 4) (Y 6) (Z 2))

 (setq lst1 (list 1 2 '(1 2) \"a\" \"b\")
       lst2 (list 2 3 '(2 3) \"B\" \"C\"))
→ (2 3 (2 3) \"B\" \"C\")
 (nunion lst1 lst2)
→ (1 (1 2) \"a\" \"b\" 2 3 (2 3) \"B\" \"C\") 
OR→ (1 2 (1 2) \"a\" \"b\" \"C\" \"B\" (2 3) 3)
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR
     (:ISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " "
     (:FUNREF NIL "nunion") " is permitted to modify any part, "
     (:TERM NIL "car") " or " (:TERM NIL "cdr") ", of the "
     (:TERM NIL "list structure") " of " (:PARAM NIL "list-1") " or "
     (:PARAM NIL "list-2") ". "
     (:ENDISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "list-1") " and "
     (:PARAM NIL "list-2") " are not " (:TERM NIL "proper lists") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "intersection") ", "
     (:ISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:SECREF NIL :CONSTANT-MODIFICATION) ", "
     (:ENDISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL")
     " The " (:KWD NIL "test-not") " parameter is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR "Since the "
     (:FUNREF NIL "nunion")
     " side effect is not required, it should not be used in for-effect-only positions in portable code. "
     :PAR))
   " " :PAR)
  " " :PAR)
 (:CHAPTER (:NUM "15" :TITLE ("Arrays") :NUMTAG :CHAP-FIFTEEN :NAMETAG :ARRAYS)
  (:SECTION (:TITLE ("Array Concepts") :TAGS (:ARRAY-CONCEPTS)) " " :PAR
   (:SUBSECTION (:TITLE ("Array Elements") :TAGS (:ARRAY-ELEMENTS)) " " :PAR
    "An " (:TERM NIL "array") " contains a set of " (:TERM NIL "objects")
    " called " (:TERM NIL "elements")
    " that can be referenced individually according to a rectilinear coordinate system. "
    :PAR
    (:SUBSUBSECTION (:TITLE ("Array Indices")) "An " (:TERM NIL "array") " "
     (:TERM NIL "element")
     " is referred to by a (possibly empty) series of indices. The length of the series must equal the "
     (:TERM NIL "rank") " of the " (:TERM NIL "array") ". "
     (:ISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM")
     " Each index must be a non-negative " (:TERM NIL "fixnum") " "
     (:ENDISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " "
     (:COMMENT NIL "strictly") "less than the corresponding "
     (:TERM NIL "array") " " (:TERM NIL "dimension") ". " (:TERM NIL "Array")
     " indexing is zero-origin. " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Array Dimensions")) "An axis of an "
     (:TERM NIL "array") " is called a " (:NEWTERM NIL "dimension") ". " :PAR
     "Each " (:TERM NIL "dimension") " is a non-negative "
     (:ISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " "
     (:TERM NIL "fixnum") "; "
     (:ENDISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM")
     " if any dimension of an " (:TERM NIL "array") " is zero, the "
     (:TERM NIL "array") " has no elements. "
     (:COMMENT NIL
      " Maybe this part isn't in glossary...I just moved it from somewhere else per "
      " suggestion of Barmar.  -kmp 14-Jan-92")
     "It is permissible for a " (:TERM NIL "dimension")
     " to be zero, in which case the " (:TERM NIL "array")
     " has no elements, and any attempt to " (:TERM NIL "access") " an "
     (:TERM NIL "element") " is an error. However, other properties of the "
     (:TERM NIL "array") ", such as the " (:TERM NIL "dimensions")
     " themselves, may be used. " :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Implementation Limits on Individual Array Dimensions")) "An "
      (:TERM NIL "implementation") " may impose a limit on "
      (:TERM NIL "dimensions") " of an " (:TERM NIL "array")
      ", but there is a minimum requirement on that limit. See the "
      (:TERM NIL "variable") " " (:VARREF NIL "array-dimension-limit") ". "
      :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Array Rank")) "An " (:TERM NIL "array")
     " can have any number of " (:TERM NIL "dimensions")
     " (including zero). The number of " (:TERM NIL "dimensions")
     " is called the " (:NEWTERM NIL "rank") ". " :PAR "If the rank of an "
     (:TERM NIL "array") " is zero then the " (:TERM NIL "array")
     " is said to have no " (:TERM NIL "dimensions")
     ", and the product of the dimensions (see "
     (:FUNREF NIL "array-total-size") ") is then 1; a zero-rank "
     (:TERM NIL "array") " therefore has a single element. " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Vectors")) "An " (:TERM NIL "array") " of "
      (:TERM NIL "rank") " one (" (:I NIL "i.e.") ",  a one-dimensional "
      (:TERM NIL "array") ") is called a " (:NEWTERM NIL "vector") ". " :PAR
      (:SUBSUBSUBSUBSECTION (:TITLE ("Fill Pointers")) "A "
       (:NEWTERM NIL "fill pointer") " is a non-negative "
       (:TERM NIL "integer") " no larger than the total number of "
       (:TERM NIL "elements") " in a " (:TERM NIL "vector") ". Not all "
       (:TERM NIL "vectors") " have " (:TERM NIL "fill pointers") ". See the "
       (:TERM NIL "functions") " " (:FUNREF NIL "make-array") " and "
       (:FUNREF NIL "adjust-array") ". " :PAR "An " (:TERM NIL "element")
       " of a " (:TERM NIL "vector") " is said to be " (:NEWTERM NIL "active")
       " if it has an index that is greater than or equal to zero, but less than the "
       (:TERM NIL "fill pointer") " (if any). For an " (:TERM NIL "array")
       " that has no " (:TERM NIL "fill pointer") ", all "
       (:TERM NIL "elements") " are considered " (:TERM NIL "active") ". " :PAR
       (:COMMENT NIL "% 17.5.0 4") "Only " (:TERM NIL "vectors") " may have "
       (:TERM NIL "fill pointers") "; multidimensional " (:TERM NIL "arrays")
       " may not. A multidimensional " (:TERM NIL "array")
       " that is displaced to a " (:TERM NIL "vector") " that has a "
       (:TERM NIL "fill pointer") " can be created. " :PAR)
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Multidimensional Arrays"))
      (:SUBSUBSUBSUBSECTION
       (:TITLE ("Storage Layout for Multidimensional Arrays"))
       "Multidimensional " (:TERM NIL "arrays")
       " store their components in row-major order; that is, internally a multidimensional "
       (:TERM NIL "array") " is stored as a one-dimensional "
       (:TERM NIL "array")
       ", with the multidimensional index sets ordered lexicographically, last index varying fastest. "
       :PAR)
      :PAR
      (:SUBSUBSUBSUBSECTION (:TITLE ("Implementation Limits on Array Rank"))
       "An " (:TERM NIL "implementation") " may impose a limit on the "
       (:TERM NIL "rank") " of an " (:TERM NIL "array")
       ", but there is a minimum requirement on that limit. See the "
       (:TERM NIL "variable") " " (:VARREF NIL "array-rank-limit") ". " :PAR)
      :PAR)
     :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Specialized Arrays")) "An " (:TERM NIL "array")
    " can be a " (:TERM NIL "general") " " (:TERM NIL "array")
    ", meaning each " (:TERM NIL "element") " may be any " (:TERM NIL "object")
    ", or it may be a " (:TERM NIL "specialized") " " (:TERM NIL "array")
    ", meaning that each " (:TERM NIL "element") " must be of a restricted "
    (:TERM NIL "type") ". " :PAR "The phrasing “an " (:TERM NIL "array") " "
    (:TERM NIL "specialized") " to " (:TERM NIL "type") " "
    (:METAVAR NIL "type") "” is sometimes used to emphasize the "
    (:TERM NIL "element type") " of an " (:TERM NIL "array")
    ". This phrasing is tolerated even when the " (:METAVAR NIL "type") " is "
    (:TYPEREF NIL "t") ", even though an " (:TERM NIL "array") " "
    (:TERM NIL "specialized") " to " (:TERM NIL "type") " " (:TERM NIL "t")
    " is a " (:TERM NIL "general") " " (:TERM NIL "array") ", not a "
    (:TERM NIL "specialized") " " (:TERM NIL "array") ". " :PAR
    (:NEXTFIGURE (:CAPS T)) " lists some " (:TERM NIL "defined names")
    " that are applicable to " (:TERM NIL "array") " creation, "
    (:TERM NIL "access") ", and information operations. " :PAR
    (:COMMENT NIL
     "% Added ARRAY-DISPLACEMENT per Tom Shepard.  (X3J13 approved: May 4-5, 1994)"
     "% -kmp 9-May-94")
    (:TABLE (:NAME ("General Purpose Array-Related Defined Names"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " adjust-array"))
      (:CELL NIL (:FUNREF NIL "array-has-fill-pointer-p"))
      (:CELL NIL (:FUNREF NIL "make-array")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " adjustable-array-p"))
      (:CELL NIL (:FUNREF NIL "array-in-bounds-p"))
      (:CELL NIL (:FUNREF NIL "svref")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " aref"))
      (:CELL NIL (:FUNREF NIL "array-rank"))
      (:CELL NIL (:FUNREF NIL "upgraded-array-element-type")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " array-dimension"))
      (:CELL NIL (:FUNREF NIL "array-rank-limit"))
      (:CELL NIL (:FUNREF NIL "upgraded-complex-part-type")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " array-dimension-limit"))
      (:CELL NIL (:FUNREF NIL "array-row-major-index"))
      (:CELL NIL (:FUNREF NIL "vector")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " array-dimensions"))
      (:CELL NIL (:FUNREF NIL "array-total-size"))
      (:CELL NIL (:FUNREF NIL "vector-pop")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " array-displacement"))
      (:CELL NIL (:FUNREF NIL "array-total-size-limit"))
      (:CELL NIL (:FUNREF NIL "vector-push")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " array-element-type"))
      (:CELL NIL (:FUNREF NIL "fill-pointer"))
      (:CELL NIL (:FUNREF NIL "vector-push-extend"))))
    " " :PAR
    (:SUBSUBSECTION (:TITLE ("Array Upgrading") :TAGS (:ARRAY-UPGRADING)) " "
     :PAR (:ISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     :PAR
     (:COMMENT NIL
      " Some of the following was transplanted from the description "
      " of UPGRADED-ARRAY-ELEMENT-TYPE.  Consider also stealing from"
      " SUBTYPEP and TYPEP.")
     :PAR "The " (:NEWTERM NIL "upgraded array element type") " of a "
     (:TERM NIL "type") " " (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "1")))
     " is a " (:TERM NIL "type") " "
     (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "2"))) " that is a "
     (:TERM NIL "supertype") " of "
     (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "1")))
     " and that is used instead of "
     (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "1"))) " whenever "
     (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "1"))) " is used as an "
     (:TERM NIL "array element type")
     " for object creation or type discrimination. " :PAR
     "During creation of an " (:TERM NIL "array") ", the "
     (:TERM NIL "element type") " that was requested is called the "
     (:NEWTERM NIL "expressed array element type") ". The "
     (:TERM NIL "upgraded array element type") " of the "
     (:TERM NIL "expressed array element type") " becomes the "
     (:NEWTERM NIL "actual array element type") " of the " (:TERM NIL "array")
     " that is created. " :PAR
     (:COMMENT NIL "!!! Barmar thinks this should be removed.")
     (:TERM NIL "Type") " " (:TERM NIL "upgrading")
     " implies a movement upwards in the type hierarchy lattice. A "
     (:TERM NIL "type") " is always a " (:TERM NIL "subtype") " of its "
     (:TERM NIL "upgraded array element type") ". Also, if a "
     (:TERM NIL "type") " " (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MI NIL "x")))
     " is a " (:TERM NIL "subtype") " of another " (:TERM NIL "type") " "
     (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MI NIL "y"))) ", then the "
     (:TERM NIL "upgraded array element type") " of "
     (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MI NIL "x"))) " must be a "
     (:TERM NIL "subtype") " of the " (:TERM NIL "upgraded array element type")
     " of " (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MI NIL "y"))) ". Two "
     (:TERM NIL "disjoint") " " (:TERM NIL "types") " can be "
     (:TERM NIL "upgraded") " to the same " (:TERM NIL "type") ". " :PAR "The "
     (:TERM NIL "upgraded array element type") " "
     (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "2"))) " of a "
     (:TERM NIL "type") " " (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "1")))
     " is a function only of "
     (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "1")))
     " itself; that is, it is independent of any other property of the "
     (:TERM NIL "array") " for which "
     (:MATH NIL (:MSUB NIL (:MI NIL "T") (:MN NIL "2")))
     " will be used, such as " (:TERM NIL "rank") ", "
     (:TERM NIL "adjustability") ", " (:TERM NIL "fill pointers")
     ", or displacement. "
     (:COMMENT NIL
      "% This next sentence is interesting, but is just Rationale, so is omitted."
      " The reason \\term{rank} is included is because it would not"
      " be consistently possible to displace \\term{arrays} to those of differing"
      " \\term{rank} otherwise.")
     "The " (:TERM NIL "function") " "
     (:FUNREF NIL "upgraded-array-element-type") " can be used by "
     (:TERM NIL "conforming programs") " to predict how the "
     (:TERM NIL "implementation") " will " (:TERM NIL "upgrade") " a given "
     (:TERM NIL "type") ". " :PAR
     (:ENDISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Required Kinds of Specialized Arrays") :TAGS
      (:REQUIRED-SPECIALIZED-ARRAYS))
     " " :PAR (:COMMENT NIL "% 17.0.0 5") (:TERM NIL "Vectors") " whose "
     (:TERM NIL "elements") " are restricted to " (:TERM NIL "type") " "
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-3-2") " " (:TYPEREF NIL "character")
     " or a " (:TERM NIL "subtype") " of " (:TYPEREF NIL "character") " "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-3-2") " are called "
     (:NEWTERM (:IDX "string") "strings") ". " (:TERM NIL "Strings") " are of "
     (:TERM NIL "type") " " (:TYPEREF NIL "string") ". "
     (:COMMENT NIL "% 18.0.0 7" "% 18.0.0 4") (:NEXTFIGURE (:CAPS T))
     " lists some " (:TERM NIL "defined names") " related to "
     (:TERM NIL "strings") ". " :PAR (:TERM NIL "Strings") " are "
     (:TERM NIL "specialized") " " (:TERM NIL "arrays")
     " and might logically have been included in this chapter. However, for purposes of readability most information about "
     (:TERM NIL "strings") " does not appear in this chapter; see instead "
     (:CHAPREF NIL :STRINGS) ". " :PAR
     (:COMMENT NIL "% 18.0.0 5"
      "% paragraph duplicated in descriptions of string-equal and string="
      "% 18.0.0 6" "% paragraph duplicated in description of stringp")
     :PAR
     (:TABLE (:NAME ("Operators that Manipulate Strings"))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " char"))
       (:CELL NIL (:FUNREF NIL "string-equal"))
       (:CELL NIL (:FUNREF NIL "string-upcase")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " make-string"))
       (:CELL NIL (:FUNREF NIL "string-greaterp"))
       (:CELL NIL "string" (:TT NIL " /=")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " nstring-capitalize"))
       (:CELL NIL (:FUNREF NIL "string-left-trim"))
       (:CELL NIL "string" (:TT NIL " <")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " nstring-downcase"))
       (:CELL NIL (:FUNREF NIL "string-lessp"))
       (:CELL NIL "string" (:TT NIL " <=")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " nstring-upcase"))
       (:CELL NIL (:FUNREF NIL "string-not-equal"))
       (:CELL NIL "string" (:TT NIL " =")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " schar"))
       (:CELL NIL (:FUNREF NIL "string-not-greaterp"))
       (:CELL NIL "string" (:TT NIL " >")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " string"))
       (:CELL NIL (:FUNREF NIL "string-not-lessp"))
       (:CELL NIL "string" (:TT NIL " >=")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " string-capitalize"))
       (:CELL NIL (:FUNREF NIL "string-right-trim")) (:CELL NIL))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " string-downcase"))
       (:CELL NIL (:FUNREF NIL "string-trim")) (:CELL NIL)))
     " " :PAR (:TERM NIL "Vectors") " whose " (:TERM NIL "elements")
     " are restricted to " (:TERM NIL "type") " " (:TYPEREF NIL "bit")
     " are called " (:NEWTERM (:IDX "bit vector") "bit vectors") ". "
     (:TERM NIL "Bit vectors") " are of " (:TERM NIL "type") " "
     (:TYPEREF NIL "bit-vector") ". " (:NEXTFIGURE (:CAPS T)) " lists some "
     (:TERM NIL "defined names") " for operations on " (:TERM NIL "bit arrays")
     ". " :PAR
     (:TABLE (:NAME ("Operators that Manipulate Bit Arrays"))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " bit"))
       (:CELL NIL (:FUNREF NIL "bit-ior"))
       (:CELL NIL (:FUNREF NIL "bit-orc2")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " bit-and"))
       (:CELL NIL (:FUNREF NIL "bit-nand"))
       (:CELL NIL (:FUNREF NIL "bit-xor")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " bit-andc1"))
       (:CELL NIL (:FUNREF NIL "bit-nor")) (:CELL NIL (:FUNREF NIL "sbit")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " bit-andc2"))
       (:CELL NIL (:FUNREF NIL "bit-not")) (:CELL NIL))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " bit-eqv"))
       (:CELL NIL (:FUNREF NIL "bit-orc1")) (:CELL NIL)))
     " " :PAR)
    :PAR))
  :PAR
  (:DICTIONARY NIL :PAR
   (:COMMENT NIL " Arrays" "  Vectors" "   Bit Vectors" "   Strings") :PAR
   (:COMMENT NIL "-------------------- Array types --------------------") :PAR
   (:COMMENT NIL "% 2.5.0 1")
   (:COM (:NAME "array" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "array") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "An " (:TERM NIL "array")
     " contains " (:TERM NIL "objects")
     " arranged according to a Cartesian coordinate system. "
     (:COMMENT NIL "% 2.5.1 4" " {Symbolics rewrote the following}") "An "
     (:TERM NIL "array") " provides mappings from a set of "
     (:ISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " "
     (:TERM NIL "fixnums") " "
     (:ENDISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " "
     (:MATH NIL (:MO NIL "{") (:MSUB NIL (:MI NIL "i") (:MN NIL "0"))
      (:MO NIL ",") (:MSUB NIL (:MI NIL "i") (:MN NIL "1")) (:MO NIL ",")
      (:MO NIL "…") (:MO NIL ",")
      (:MSUB NIL (:MI NIL "i")
       (:MROW NIL (:MI NIL "r") (:MO NIL "-") (:MN NIL "1")))
      (:MO NIL "}"))
     " to corresponding " (:TERM NIL "elements") " of the " (:TERM NIL "array")
     ", where "
     (:MATH NIL (:MN NIL "0") (:MO NIL "≤")
      (:MSUB NIL (:MI NIL "i") (:MI NIL "j")) (:MO NIL "<")
      (:MSUB NIL (:MI NIL "d") (:MI NIL "j")))
     ", " (:MATH NIL (:MI NIL "r")) " is the rank of the array, and "
     (:MATH NIL (:MSUB NIL (:MI NIL "d") (:MI NIL "j"))) " is the size of "
     (:TERM NIL "dimension") " " (:MATH NIL (:MI NIL "j")) " of the array. "
     :PAR "When an " (:TERM NIL "array")
     " is created, the program requesting its creation may declare that all "
     (:TERM NIL "elements") " are of a particular " (:TERM NIL "type")
     ", called the " (:TERM NIL "expressed array element type")
     ". The implementation is permitted to " (:TERM NIL "upgrade")
     " this type in order to produce the "
     (:TERM NIL "actual array element type") ", which is the "
     (:TERM NIL "element type") " for the " (:TERM NIL "array") " is actually "
     (:TERM NIL "specialized") ". See the " (:TERM NIL "function") " "
     (:FUNREF NIL "upgraded-array-element-type") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Specializing. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:DEF (:KIND "type") (:NAMES NIL "array")
      (:ARGLIST NIL
       (:BRAC NIL (:CURLY NIL "element-type | " (:MISC NIL "*")) " "
        (:BRAC NIL "dimension-spec"))))
     " " :PAR
     (:BNF (:NAME "dimension-spec") "rank | " (:MISC NIL "*") " | "
      (:PAREN NIL (:STAR NIL (:CURLY NIL "dimension | " (:MISC NIL "*")))))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "dimension") "—a " (:TERM NIL "valid array dimension") ". "
     :PAR (:PARAM NIL "element-type") "—a " (:TERM NIL "type specifier") ". "
     :PAR (:ISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " "
     (:PARAM NIL "rank") "—a non-negative " (:TERM NIL "fixnum") ". "
     (:ENDISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     (:COMMENT NIL "% 4.5.0 6" "% 4.5.0 7") :PAR "This denotes the set of "
     (:TERM NIL "arrays") " whose " (:TERM NIL "element type") ", "
     (:TERM NIL "rank") ", and " (:TERM NIL "dimensions") " match any given "
     (:PARAM NIL "element-type") ", " (:PARAM NIL "rank") ", and "
     (:PARAM NIL "dimensions") ". Specifically: " :PAR "If "
     (:PARAM NIL "element-type") " is the " (:TERM NIL "symbol") " "
     (:MISC NIL "*") ", " (:TERM NIL "arrays")
     " are not excluded on the basis of their " (:TERM NIL "element type")
     ". Otherwise, only those " (:PARAM NIL "arrays") " are included whose "
     (:TERM NIL "actual array element type") " "
     (:ISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING")
     " is the result of " (:TERM NIL "upgrading") " "
     (:PARAM NIL "element-type") "; see " (:SECREF NIL :ARRAY-UPGRADING) ". "
     (:COMMENT NIL "The following will be left out:" "\\param{element-type}"
      "% The following seems redundant. -kmp 20-Oct-91"
      " {\\tt (array \\param{type-specifier})}"
      " refers only to those \\term{arrays} "
      " that can result from giving \\param{type-specifier} as the"
      " \\kwd{element-type} argument to \\funref{make-array}.  ")
     (:ENDISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     :PAR "If the " (:PARAM NIL "dimension-spec") " is a " (:PARAM NIL "rank")
     ", the set includes only those " (:PARAM NIL "arrays") " having that "
     (:TERM NIL "rank") ". If the " (:PARAM NIL "dimension-spec") " is a "
     (:TERM NIL "list") " of " (:PARAM NIL "dimensions")
     ", the set includes only those " (:PARAM NIL "arrays") " having a "
     (:TERM NIL "rank") " given by the " (:TERM NIL "length") " of the "
     (:PARAM NIL "dimensions") ", and having the indicated "
     (:PARAM NIL "dimensions") "; in this case, " (:MISC NIL "*")
     " matches any value for the corresponding " (:TERM NIL "dimension")
     ". If the " (:PARAM NIL "dimension-spec") " is the " (:TERM NIL "symbol")
     " " (:MISC NIL "*") ", the set is not restricted on the basis of "
     (:TERM NIL "rank") " or " (:TERM NIL "dimension") ". " :PAR
     (:ISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     (:COMMENT NIL "The following will be left out:"
      "For declaration purposes, this \\term{type} encompasses those "
      "\\term{arrays}"
      "that can result by supplying \\param{element-type} as the element type"
      "to \\thefunction{make-array}; this might be different"
      "from what the \\term{type} means for discrimination purposes."
      "For example:" "\\code"
      " (array integer 3)       ;Three-dimensional arrays of integers"
      " (array integer (* * *)) ;Three-dimensional arrays of integers"
      " (array * (4 5 6))       ;4-by-5-by-6 arrays"
      " (array character (3 *)) ;Two-dimensional arrays of characters that have "
      "                         ;three rows"
      " (array short-float \\empty)   ;Zero-rank arrays of short-floats"
      "\\endcode")
     (:ENDISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:VARREF NIL "*print-array*") ", "
     (:FUNREF NIL "aref") ", " (:FUNREF NIL "make-array") ", "
     (:TYPEREF NIL "vector") ", " (:SECREF NIL :SHARPSIGN-A) ", "
     (:SECREF NIL :PRINTING-OTHER-ARRAYS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "Note that the type "
     (:TT NIL " (array t)") " is a proper " (:TERM NIL "subtype")
     " of the type " (:TT NIL " (array *)") ". The reason is that the type "
     (:TT NIL " (array t)") " is the set of " (:TERM NIL "arrays")
     " that can hold any " (:TERM NIL "object") " (the " (:TERM NIL "elements")
     " are of " (:TERM NIL "type") " " (:TYPEREF NIL "t")
     ", which includes all " (:TERM NIL "objects")
     "). On the other hand, the type " (:TT NIL " (array *)")
     " is the set of all " (:TERM NIL "arrays")
     " whatsoever, including for example " (:TERM NIL "arrays")
     " that can hold only " (:TERM NIL "characters") ". "
     (:COMMENT NIL
      "% possible issue here that: ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS says that"
      "%this example only works in implementations that have specialized arrays for"
      "%elements of type character, not required in CL. But char committee may"
      "%require them.")
     "The type " (:TT NIL " (array character)") " is not a "
     (:TERM NIL "subtype") " of the type " (:TT NIL " (array t)")
     "; the two sets are " (:TERM NIL "disjoint") " because the type "
     (:TT NIL " (array character)") " is not the set of all "
     (:TERM NIL "arrays") " that can hold " (:TERM NIL "characters")
     ", but rather the set of " (:TERM NIL "arrays")
     " that are specialized to hold precisely " (:TERM NIL "characters")
     " and no other " (:TERM NIL "objects") ". " :PAR
     (:COMMENT NIL "The following expression cannot be used to determine if"
      "array \\f{foo} can hold a \\term{character}:" "\\code"
      " (typep foo '(array character))" "\\endcode"
      "The following expression can be used to determine if"
      "array \\f{foo} can hold a \\term{character}:" "\\code"
      " (subtypep 'character (array-element-type foo))" "\\endcode")
     :PAR))
   (:COMMENT NIL "% 2.5.0 9")
   (:COM (:NAME "simple-array" :FTYPE "Type")
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "simple-array") ", "
     (:COMMENT NIL "% 2.15.0 20") (:TYPEREF NIL "array") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL
      "Per Symbolics comments, this is reworded to clarify that this only defines"
      "things that might be simple, not what must be:" "An \\term{array}"
      "that is not displaced to another \\term{array}, has no \\term{fill pointer},"
      "and is not to have its size adjusted dynamically after"
      "creation is a \\term{simple array}.")
     "The " (:TERM NIL "type") " of an " (:TERM NIL "array")
     " that is not displaced to another " (:TERM NIL "array") ", has no "
     (:TERM NIL "fill pointer") ", and is "
     (:COMMENT NIL
      " \\reviewer{Barrett: Reexamine in light of ADJUST-ARRAY-NOT-ADJUSTABLE--specifically,"
      "  all arrays are now valid to adjust-array--they just don't all get changed by side-effect.}")
     "not " (:TERM NIL "expressly adjustable") " is a " (:TERM NIL "subtype")
     " of " (:TERM NIL "type") " " (:TYPEREF NIL "simple-array")
     ". The concept of a " (:TERM NIL "simple array")
     " exists to allow the implementation to use a specialized representation and to allow the user to declare that certain values will always be "
     (:TERM NIL "simple arrays") ". " :PAR (:COMMENT NIL "% 2.15.0 21") "The "
     (:TERM NIL "types") " " (:TYPEREF NIL "simple-vector") ", "
     (:TYPEREF NIL "simple-string") ", and " (:TYPEREF NIL "simple-bit-vector")
     " are " (:TERM NIL "disjoint") " " (:TERM NIL "subtypes") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "simple-array")
     ", for they respectively mean " (:TT NIL "(simple-array t (*))")
     ", the union of all " (:TT NIL "(simple-array " (:I NIL "c") " (*))")
     " for any " (:I NIL "c") " being a " (:TERM NIL "subtype") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "character") ", and "
     (:TT NIL "(simple-array bit (*))") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Specializing. "
     :PAR (:COMMENT NIL "% 4.5.0 8"))
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:DEF (:KIND "type") (:NAMES NIL "simple-array")
      (:ARGLIST NIL
       (:BRAC NIL (:CURLY NIL "element-type | " (:MISC NIL "*")) " "
        (:BRAC NIL "dimension-spec"))))
     " " :PAR
     (:BNF (:NAME "dimension-spec") "rank | " (:MISC NIL "*") " | "
      (:PAREN NIL (:STAR NIL (:CURLY NIL "dimension | " (:MISC NIL "*")))))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:PARAM NIL "dimension") "—a " (:TERM NIL "valid array dimension") ". "
     :PAR (:PARAM NIL "element-type") "—a " (:TERM NIL "type specifier") ". "
     :PAR (:ISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " "
     (:PARAM NIL "rank") "—a non-negative " (:TERM NIL "fixnum") ". "
     (:ENDISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR "This "
     (:TERM NIL "compound type specifier")
     " is treated exactly as the corresponding "
     (:TERM NIL "compound type specifier") " for " (:TERM NIL "type") " "
     (:TYPEREF NIL "array")
     " would be treated, except that the set is further constrained to include only "
     (:TERM NIL "simple arrays") ". " :PAR
     (:COMMENT NIL
      " This denotes the set of \\term{simple arrays} whose elements are all of \\term{type}"
      " \\issue{ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING}"
      " {\\penalty-50}\\f{(upgraded-array-element-type \\param{element-type})}"
      " %The following will be left out:" " %\\param{element-type}"
      " \\endissue{ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING}"
      " and whose dimensions are \\param{dimensions}."
      " \\param{Element-type} must be a valid \\term{type specifier} or \\misc{*}."
      " \\issue{ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM}"
      " \\param{Dimensions} must be a non-negative \\term{fixnum},"
      " \\endissue{ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM}"
      " which is the number"
      " of dimensions, or a \\term{list} of \\term{valid array dimensions}"
      " representing the length of each dimension (any dimension"
      " can be \\misc{*} instead), or it can be \\misc{*}.")
     :PAR)
    (:PART (:NAME "Notes") " " :PAR "It is "
     (:TERM NIL "implementation-dependent") " whether "
     (:TERM NIL "displaced arrays") ", " (:TERM NIL "vectors") " with "
     (:TERM NIL "fill pointers") ", or arrays that are "
     (:TERM NIL "actually adjustable") " are " (:TERM NIL "simple arrays") ". "
     :PAR (:ISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     (:TT NIL " (simple-array *)") " refers to all "
     (:TERM NIL "simple arrays") " regardless of element type, "
     (:TT NIL " (simple-array " (:PARAM NIL "type-specifier") ")")
     " refers only to those " (:TERM NIL "simple arrays")
     " that can result from giving " (:PARAM NIL "type-specifier") " as the "
     (:KWD NIL "element-type") " argument to " (:FUNREF NIL "make-array") ". "
     (:ENDISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     :PAR))
   (:COMMENT NIL "% 2.5.1 1")
   (:COM (:NAME "vector" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "vector") ", "
     (:TYPEREF NIL "array") ", " (:TYPEREF NIL "sequence") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "Any one-dimensional "
     (:TERM NIL "array") " is a " (:TERM NIL "vector") ". " :PAR
     (:COMMENT NIL "% 2.15.0 19") "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "vector") " is a " (:TERM NIL "subtype") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "array") "; for all "
     (:TERM NIL "types") " " (:TT NIL "x") ", " (:TT NIL " (vector x)")
     " is the same as " (:TT NIL " (array x (*))") ". " :PAR
     (:COMMENT NIL "% 2.15.0 18") "The " (:TERM NIL "type") " "
     (:TT NIL " (vector t)") ", the " (:TERM NIL "type") " "
     (:TYPEREF NIL "string") ", and the " (:TERM NIL "type") " "
     (:TYPEREF NIL "bit-vector") " are " (:TERM NIL "disjoint") " "
     (:TERM NIL "subtypes") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "vector") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Specializing. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:COMMENT NIL "% 4.5.0 9")
     (:DEF (:KIND "type") (:NAMES NIL "vector")
      (:ARGLIST NIL
       (:BRAC NIL (:CURLY NIL "element-type | " (:MISC NIL "*")) " "
        (:BRAC NIL (:CURLY NIL "size | " (:MISC NIL "*"))))))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:ISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " "
     (:PARAM NIL "size") "—a non-negative " (:TERM NIL "fixnum") ". "
     (:ENDISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " " :PAR
     (:PARAM NIL "element-type") "—a " (:TERM NIL "type specifier") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     "This denotes the set of specialized " (:TERM NIL "vectors") " whose "
     (:TERM NIL "element type") " and " (:PARAM NIL "dimension")
     " match the specified values. Specifically: " :PAR "If "
     (:PARAM NIL "element-type") " is the " (:TERM NIL "symbol") " "
     (:MISC NIL "*") ", " (:TERM NIL "vectors")
     " are not excluded on the basis of their " (:TERM NIL "element type")
     ". Otherwise, only those " (:PARAM NIL "vectors") " are included whose "
     (:TERM NIL "actual array element type") " "
     (:ISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING")
     " is the result of " (:TERM NIL "upgrading") " "
     (:PARAM NIL "element-type") "; see " (:SECREF NIL :ARRAY-UPGRADING) ". "
     (:ENDISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     :PAR "If a " (:PARAM NIL "size")
     " is specified, the set includes only those " (:PARAM NIL "vectors")
     " whose only " (:TERM NIL "dimension") " is " (:PARAM NIL "size")
     ". If the " (:TERM NIL "symbol") " " (:MISC NIL "*")
     " is specified instead of a " (:PARAM NIL "size")
     ", the set is not restricted on the basis of " (:TERM NIL "dimension")
     ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:SECREF NIL :REQUIRED-SPECIALIZED-ARRAYS) ", "
     (:SECREF NIL :SHARPSIGN-LEFT-PAREN) ", "
     (:SECREF NIL :PRINTING-OTHER-VECTORS) ", " (:SECREF NIL :SHARPSIGN-A) " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR "The " (:TERM NIL "type") " "
     (:TT NIL "(vector " (:PARAM NIL "e") " " (:PARAM NIL "s") ")")
     " is equivalent to the " (:TERM NIL "type") " "
     (:TT NIL "(array " (:PARAM NIL "e") " (" (:PARAM NIL "s") "))") ". " :PAR
     "The type " (:TT NIL "(vector bit)") " has the name "
     (:TYPEREF NIL "bit-vector") ". " :PAR "The union of all "
     (:TERM NIL "types") " " (:TT NIL "(vector " (:MATH NIL (:MI NIL "C")) ")")
     ", where " (:MATH NIL (:MI NIL "C")) " is any " (:TERM NIL "subtype")
     " of " (:TYPEREF NIL "character") ", has the name "
     (:TYPEREF NIL "string") ". "
     (:COMMENT NIL
      "Every implementation of \\clisp\\ must provide distinct representations for"
      "these as distinct specialized \\term{types}.")
     :PAR (:ISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     (:TT NIL " (vector *)") " refers to all " (:TERM NIL "vectors")
     " regardless of element type, "
     (:TT NIL " (vector " (:PARAM NIL "type-specifier") ")")
     " refers only to those " (:TERM NIL "vectors")
     " that can result from giving " (:PARAM NIL "type-specifier") " as the "
     (:KWD NIL "element-type") " argument to " (:FUNREF NIL "make-array") ". "
     (:ENDISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     :PAR))
   (:COM (:NAME "simple-vector" :FTYPE "Type")
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "simple-vector") ", "
     (:TYPEREF NIL "vector") ", " (:TYPEREF NIL "simple-array") ", "
     (:TYPEREF NIL "array") ", " (:TYPEREF NIL "sequence") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL " This sentence replaced per Symbolics comments:"
      " A \\term{vector} that is not displaced to another \\term{array}, has no"
      " \\term{fill pointer}, is able to hold elements of any \\term{type},"
      " and is not to have its size adjusted dynamically after creation is a"
      " \\term{simple vector}.")
     "The " (:TERM NIL "type") " of a " (:TERM NIL "vector")
     " that is not displaced to another " (:TERM NIL "array") ", has no "
     (:TERM NIL "fill pointer") ", is not "
     (:COMMENT NIL "to have its size adjusted dynamically after creation, ")
     (:TERM NIL "expressly adjustable") " and is able to hold elements of any "
     (:TERM NIL "type") " is a " (:TERM NIL "subtype") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "simple-vector") ". " :PAR
     (:COMMENT NIL "% 2.15.0 22                       ") "The "
     (:TERM NIL "type") " " (:TYPEREF NIL "simple-vector") " is a "
     (:TERM NIL "subtype") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "vector") ", and is a " (:TERM NIL "subtype") " of "
     (:TERM NIL "type") " " (:TT NIL "(vector t)") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Specializing. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:DEF (:KIND "type") (:NAMES NIL "simple-vector")
      (:ARGLIST NIL (:BRAC NIL "size")))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:ISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " "
     (:PARAM NIL "size") "—a non-negative " (:TERM NIL "fixnum") ", or the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". The default is the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". "
     (:ENDISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     (:COMMENT NIL "% 4.5.0 10                            "
      "\\itemitem{\\tt (simple-vector \\param{size})}")
     :PAR "This is the same as "
     (:TT NIL " (simple-array t (" (:PARAM NIL "size") "))") ". "
     (:COMMENT NIL
      "This is the same as {\\tt (and (vector t \\param{size}) simple-array)}.")
     :PAR
     (:COMMENT NIL " This is the same                "
      " as the type \\f{(vector t \\param{size})}"
      " except that \\typeref{simple-vector} also specifies"
      " that its members are \\term{simple arrays}.")
     :PAR))
   (:COM (:NAME "bit-vector" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "bit-vector") ", "
     (:TYPEREF NIL "vector") ", " (:TYPEREF NIL "array") ", "
     (:TYPEREF NIL "sequence") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "bit vector")
     " is a " (:TERM NIL "vector") " the " (:TERM NIL "element type")
     " of which is " (:TERM NIL "bit") ". " :PAR (:COMMENT NIL "% 2.15.0 17")
     "The " (:TERM NIL "type") " " (:TYPEREF NIL "bit-vector") " is a "
     (:TERM NIL "subtype") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "vector") ", for " (:TYPEREF NIL "bit-vector") " means "
     (:TT NIL "(vector bit)") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Abbreviating. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:COMMENT NIL "% 4.6.0 12")
     (:DEF (:KIND "type") (:NAMES NIL "bit-vector")
      (:ARGLIST NIL (:BRAC NIL "size")))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:ISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " "
     (:PARAM NIL "size") "—a non-negative " (:TERM NIL "fixnum") ", or the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". "
     (:ENDISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     "This denotes the same " (:TERM NIL "type") " as the " (:TERM NIL "type")
     " " (:TT NIL " (array bit (" (:PARAM NIL "size") "))")
     "; that is, the set of " (:TERM NIL "bit vectors") " of size "
     (:PARAM NIL "size") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :SHARPSIGN-STAR) ", "
     (:SECREF NIL :PRINTING-BIT-VECTORS) ", "
     (:SECREF NIL :REQUIRED-SPECIALIZED-ARRAYS) " " :PAR))
   (:COM (:NAME "simple-bit-vector" :FTYPE "Type")
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "simple-bit-vector")
     ", " (:COMMENT NIL "% 2.15.0 25") (:TYPEREF NIL "bit-vector") ", "
     (:TYPEREF NIL "vector") ", " (:TYPEREF NIL "simple-array") ", "
     (:TYPEREF NIL "array") ", " (:TYPEREF NIL "sequence") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL " Reworded per Symbolics comments:"
      "   A \\term{bit vector} that is not displaced to another"
      " \\term{array}, has no \\term{fill pointer}, and is not to have its"
      " size adjusted dynamically after creation is a \\term{simple bit vector}.")
     "The " (:TERM NIL "type") " of a " (:TERM NIL "bit vector")
     " that is not displaced to another " (:TERM NIL "array") ", has no "
     (:TERM NIL "fill pointer") ", and is not "
     (:COMMENT NIL "to have its size adjusted dynamically after creation ")
     (:TERM NIL "expressly adjustable") " is a " (:TERM NIL "subtype") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "simple-bit-vector") ". " :PAR)
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Abbreviating. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:COMMENT NIL "% 4.6.0 13")
     (:DEF (:KIND "type") (:NAMES NIL "simple-bit-vector")
      (:ARGLIST NIL (:BRAC NIL "size")))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:ISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " "
     (:PARAM NIL "size") "—a non-negative " (:TERM NIL "fixnum") ", or the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". The default is the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". "
     (:ENDISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     "This denotes the same type as the " (:TERM NIL "type") " "
     (:TT NIL "(simple-array bit (" (:PARAM NIL "size") "))")
     "; that is, the set of " (:TERM NIL "simple bit vectors") " of size "
     (:PARAM NIL "size") ". " :PAR))
   :PAR (:COMMENT NIL "-------------------- Arrays --------------------") :PAR
   (:COMMENT NIL "%% ========== MAKE-ARRAY")
   (:COM (:NAME "make-array" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-array")
      (:ARGLIST NIL "dimensions " (:KEYWORD NIL " &key")
       " element-type initial-element initial-contents adjustable fill-pointer displaced-to displaced-index-offset")
      (:VALUES NIL "new-array"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:COMMENT NIL "% 17.1.0 3")
     (:PARAM NIL "dimensions") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "list") " of " (:TERM NIL "valid array dimensions") ". " :PAR
     (:COMMENT NIL "% 17.1.0 6") (:PARAM NIL "element-type") "—a "
     (:TERM NIL "type specifier") ". The default is " (:TYPEREF NIL "t") ". "
     :PAR (:PARAM NIL "initial-element") "—an " (:TERM NIL "object") ". " :PAR
     (:PARAM NIL "initial-contents") "—an " (:TERM NIL "object") ". "
     (:COMMENT NIL
      "Per Barmar, remove (or sequence vector) because 0-dimension case doesn't care. -kmp 24-Jul-91")
     :PAR (:PARAM NIL "adjustable") "—a " (:TERM NIL "generalized boolean")
     ". The default is " (:MISC NIL "nil") ". " :PAR
     (:COMMENT NIL "!!! Is there a designator for this?")
     (:PARAM NIL "fill-pointer") "—a " (:TERM NIL "valid fill pointer")
     " for the " (:TERM NIL "array") " to be created, or " (:MISC NIL "t")
     " or " (:MISC NIL "nil") ". The default is " (:MISC NIL "nil") ". " :PAR
     (:COMMENT NIL "% 17.1.0 11") (:PARAM NIL "displaced-to") "—an "
     (:TERM NIL "array") " or " (:MISC NIL "nil") ". The default is "
     (:MISC NIL "nil") ". This option must not be supplied if either "
     (:PARAM NIL "initial-element") " or " (:PARAM NIL "initial-contents")
     " is supplied. " :PAR (:COMMENT NIL "% 17.1.0 12")
     (:PARAM NIL "displaced-index-offset") "—a "
     (:TERM NIL "valid array row-major index") " for "
     (:PARAM NIL "displaced-to") ". The default is " (:TT NIL "0")
     ". This option must not be supplied unless a " (:TERM NIL "non-nil") " "
     (:PARAM NIL "displaced-to") " is supplied. " :PAR (:PARAM NIL "new-array")
     "—an " (:TERM NIL "array") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Creates and returns an "
     (:TERM NIL "array") " constructed of the most " (:TERM NIL "specialized")
     " " (:TERM NIL "type") " that can accommodate elements of "
     (:TERM NIL "type") " given by " (:PARAM NIL "element-type") ". If "
     (:PARAM NIL "dimensions") " is " (:MISC NIL "nil")
     " then a zero-dimensional " (:TERM NIL "array") " is created. " :PAR
     (:PARAM NIL "Dimensions") " represents the dimensionality of the new "
     (:TERM NIL "array") ". " :PAR (:PARAM NIL "element-type")
     " indicates the " (:TERM NIL "type")
     " of the elements intended to be stored in the " (:PARAM NIL "new-array")
     ". The " (:PARAM NIL "new-array") " can actually store any "
     (:TERM NIL "objects") " of the " (:TERM NIL "type") " which results from "
     (:TERM NIL "upgrading") " " (:PARAM NIL "element-type") "; see "
     (:SECREF NIL :ARRAY-UPGRADING) ". " :PAR (:COMMENT NIL "% 17.1.0 7") "If "
     (:PARAM NIL "initial-element")
     " is supplied, it is used to initialize each " (:TERM NIL "element")
     " of " (:PARAM NIL "new-array") ". If " (:PARAM NIL "initial-element")
     " is supplied, it must be of the " (:TERM NIL "type") " given by "
     (:PARAM NIL "element-type") ". " (:PARAM NIL "initial-element")
     " cannot be supplied if either the " (:KWD NIL "initial-contents")
     " option is supplied or " (:PARAM NIL "displaced-to") " is "
     (:TERM NIL "non-nil") ". If " (:PARAM NIL "initial-element")
     " is not supplied, "
     (:ISSUE NIL "UNINITIALIZED-ELEMENTS:CONSEQUENCES-UNDEFINED") " "
     (:COMMENT NIL
      "% This issue finally did pass at the March-93 meeting. -kmp 5-May-93"
      " the initial values of the \\term{array} \\term{elements} are "
      " %%Rewritten to conform to the fact that issue UNINITIALIZED-ELEMENTS failed"
      " %%to clarify this in the other direction because consensus was that this was well-defined"
      " %%already. -kmp 15-Jan-92" " %undefined "
      " \\term{implementation-dependent} ")
     "the consequences of later reading an uninitialized "
     (:TERM NIL "element") " of " (:PARAM NIL "new-array") " are undefined "
     (:ENDISSUE NIL "UNINITIALIZED-ELEMENTS:CONSEQUENCES-UNDEFINED")
     " unless either " (:PARAM NIL "initial-contents") " is supplied or "
     (:PARAM NIL "displaced-to") " is " (:TERM NIL "non-nil") ". " :PAR
     (:COMMENT NIL "% 17.1.0 8") (:PARAM NIL "initial-contents")
     " is used to initialize the contents of " (:TERM NIL "array")
     ". For example: " :PAR
     (:CODE NIL " (make-array '(4 2 3) :initial-contents
             '(((a b c) (1 2 3))
              ((d e f) (3 1 2))
              ((g h i) (2 3 1))
              ((j k l) (0 0 0))))
")
     " " :PAR
     (:COMMENT NIL
      "!!! Is ADJUST-ARRAY-NOT-ADJUSTABLE:IMPLICIT-COPY fully merged?")
     :PAR (:PARAM NIL "initial-contents")
     " is composed of a nested structure of " (:TERM NIL "sequences")
     ". The numbers of levels in the structure must equal the rank of "
     (:TERM NIL "array") ". Each leaf of the nested structure must be of the "
     (:TERM NIL "type") " given by " (:PARAM NIL "element-type") ". If "
     (:TERM NIL "array") " is zero-dimensional, then "
     (:PARAM NIL "initial-contents") " specifies the single "
     (:TERM NIL "element") ". Otherwise, " (:PARAM NIL "initial-contents")
     " must be a " (:TERM NIL "sequence")
     " whose length is equal to the first dimension; each element must be a nested structure for an "
     (:TERM NIL "array")
     " whose dimensions are the remaining dimensions, and so on. "
     (:PARAM NIL "Initial-contents") " cannot be supplied if either "
     (:PARAM NIL "initial-element") " is supplied or "
     (:PARAM NIL "displaced-to") " is " (:TERM NIL "non-nil") ". If "
     (:PARAM NIL "initial-contents") " is not supplied, "
     (:ISSUE NIL "UNINITIALIZED-ELEMENTS:CONSEQUENCES-UNDEFINED") " "
     (:COMMENT NIL
      "% This issue finally did pass at the March-93 meeting. -kmp 5-May-93"
      " the initial values of the \\term{array} \\term{elements} are "
      " %%Rewritten to conform to the fact that issue UNINITIALIZED-ELEMENTS failed"
      " %%to clarify this in the other direction because consensus was that this was well-defined"
      " %%already. -kmp 15-Jan-92" " %undefined"
      " \\term{implementation-dependent}")
     "the consequences of later reading an uninitialized "
     (:TERM NIL "element") " of " (:PARAM NIL "new-array") " are undefined "
     (:ENDISSUE NIL "UNINITIALIZED-ELEMENTS:CONSEQUENCES-UNDEFINED")
     " unless either " (:PARAM NIL "initial-element") " is supplied or "
     (:PARAM NIL "displaced-to") " is " (:TERM NIL "non-nil") ". " :PAR
     (:COMMENT NIL "% KMP's rewrite:" " %% 17.1.0 9"
      " If \\param{adjustable} is \\term{non-nil},"
      " the array is both \\term{expressly adjustable} "
      " 	      and \\term{actually adjustable};"
      " otherwise, the array is not \\term{expressly adjustable} "
      "        and it is \\term{implementation-dependent} whether "
      " 	    the array is \\term{actually adjustable}."
      "% To which Barrett suggested:"
      " If \\param{adjustable} is \\term{non-nil},"
      " the array is \\term{expressly adjustable};"
      " otherwise, it is \\term{implementation-dependent} whether "
      "   the array is \\term{actually adjustable}."
      "% We have compromised on:" "% 17.1.0 9")
     "If " (:PARAM NIL "adjustable") " is " (:TERM NIL "non-nil")
     ", the array is " (:TERM NIL "expressly adjustable") " (and so "
     (:TERM NIL "actually adjustable") "); otherwise, the array is not "
     (:TERM NIL "expressly adjustable") " (and it is "
     (:TERM NIL "implementation-dependent") " whether the array is "
     (:TERM NIL "actually adjustable") "). "
     (:COMMENT NIL " ..."
      " it is possible to alter the \\term{array}'s size dynamically after it is created."
      "\\issue{ADJUST-ARRAY-NOT-ADJUSTABLE:DONKEY}"
      "and \\funref{adjustable-array-p} will be true."
      "If \\param{adjustable} is not supplied or \\nil, "
      "\\term{array} is not required to be"
      "adjustable, but a non-adjustable \\term{array} is not guaranteed."
      "\\endissue{ADJUST-ARRAY-NOT-ADJUSTABLE:DONKEY}")
     :PAR (:COMMENT NIL "% 17.1.0 10") "If " (:PARAM NIL "fill-pointer") " is "
     (:TERM NIL "non-nil") ", the " (:TERM NIL "array")
     " must be one-dimensional; that is, the " (:TERM NIL "array")
     " must be a " (:TERM NIL "vector") ". If " (:PARAM NIL "fill-pointer")
     " is " (:MISC NIL "t") ", the length of the " (:TERM NIL "vector")
     " is used to initialize the " (:TERM NIL "fill pointer") ". If "
     (:PARAM NIL "fill-pointer") " is an " (:TERM NIL "integer")
     ", it becomes the initial " (:TERM NIL "fill pointer") " for the "
     (:TERM NIL "vector") ". " :PAR "If " (:PARAM NIL "displaced-to") " is "
     (:TERM NIL "non-nil") ", " (:FUNREF NIL "make-array") " will create a "
     (:TERM NIL "displaced array") " and " (:PARAM NIL "displaced-to")
     " is the " (:TERM NIL "target") " of that " (:TERM NIL "displaced array")
     ". In that case, the consequences are undefined if the "
     (:TERM NIL "actual array element type") " of " (:PARAM NIL "displaced-to")
     " is not " (:TERM NIL "type equivalent") " to the "
     (:TERM NIL "actual array element type") " of the " (:TERM NIL "array")
     " being created. If " (:PARAM NIL "displaced-to") " is " (:MISC NIL "nil")
     ", the " (:TERM NIL "array") " is not a " (:TERM NIL "displaced array")
     ". " :PAR
     (:COMMENT NIL
      "!!! should \"index offset\" or \"displaced index offset\" be a formal term?")
     "The " (:PARAM NIL "displaced-index-offset")
     " is made to be the index offset of the " (:TERM NIL "array") ". "
     (:COMMENT NIL "% 17.1.0 13") "When an array A is given as the "
     (:KWD NIL "displaced-to") " " (:TERM NIL "argument") " to "
     (:FUNREF NIL "make-array")
     " when creating array B, then array B is said to be displaced to array A. The total number of elements in an "
     (:TERM NIL "array") ", called the total size of the " (:TERM NIL "array")
     ", is calculated as the product of all the dimensions. It is required that the total size of A be no smaller than the sum of the total size of B plus the offset "
     (:TT NIL "n") " supplied by the " (:PARAM NIL "displaced-index-offset")
     ". The effect of displacing is that array B does not have any elements of its own, but instead maps "
     (:TERM NIL "accesses") " to itself into " (:TERM NIL "accesses")
     " to array A. The mapping treats both " (:TERM NIL "arrays")
     " as if they were one-dimensional by taking the elements in row-major order, and then maps an "
     (:TERM NIL "access") " to element " (:TT NIL "k") " of array B to an "
     (:TERM NIL "access") " to element " (:TT NIL "k") "+" (:TT NIL "n")
     " of array A. " :PAR (:COMMENT NIL "% 17.1.0 14") "If "
     (:FUNREF NIL "make-array") " is called with " (:PARAM NIL "adjustable")
     ", " (:PARAM NIL "fill-pointer") ", and " (:PARAM NIL "displaced-to")
     " each " (:MISC NIL "nil") ", then the result is a "
     (:TERM NIL "simple array") ". "
     (:ISSUE NIL "ADJUST-ARRAY-NOT-ADJUSTABLE:IMPLICIT-COPY") " If "
     (:FUNREF NIL "make-array") " is called with one or more of "
     (:PARAM NIL "adjustable") ", " (:PARAM NIL "fill-pointer") ", or "
     (:PARAM NIL "displaced-to") " being " (:TERM NIL "true")
     ", whether the resulting " (:TERM NIL "array") " is a "
     (:TERM NIL "simple array") " is " (:TERM NIL "implementation-dependent")
     ". " (:ENDISSUE NIL "ADJUST-ARRAY-NOT-ADJUSTABLE:IMPLICIT-COPY") " " :PAR
     (:COMMENT NIL "% 17.1.0 13") "When an array A is given as the "
     (:KWD NIL "displaced-to") " " (:TERM NIL "argument") " to "
     (:FUNREF NIL "make-array")
     " when creating array B, then array B is said to be displaced to array A. The total number of elements in an "
     (:TERM NIL "array") ", called the total size of the " (:TERM NIL "array")
     ", is calculated as the product of all the dimensions. The consequences are unspecified if the total size of A is smaller than the sum of the total size of B plus the offset "
     (:TT NIL "n") " supplied by the " (:PARAM NIL "displaced-index-offset")
     ". The effect of displacing is that array B does not have any elements of its own, but instead maps "
     (:TERM NIL "accesses") " to itself into " (:TERM NIL "accesses")
     " to array A. The mapping treats both " (:TERM NIL "arrays")
     " as if they were one-dimensional by taking the elements in row-major order, and then maps an "
     (:TERM NIL "access") " to element " (:TT NIL "k") " of array B to an "
     (:TERM NIL "access") " to " (:TERM NIL "element") " " (:TT NIL "k") "+"
     (:TT NIL "n") " of array A. " :PAR
     (:COMMENT NIL "% Redundant with previous paragraph."
      " When \\kwd{displaced-to} is supplied to \\funref{make-array},"
      " the \\param{displaced-index-offset} is made to be the"
      " index offset of the \\term{array}."
      "% Redundant with Arguments and Values above."
      " If the \\param{displaced-index-offset} is not supplied,"
      " the index offset is zero.")
     :PAR)
    (:PART (:NAME "Examples") " " (:COMMENT NIL "% 17.1.0 15")
     (:CODE NIL "
 (make-array 5) ;; Creates a one-dimensional array of five elements.
 (make-array '(3 4) :element-type '(mod 16)) ;; Creates a 
                ;;two-dimensional array, 3 by 4, with four-bit elements.
 (make-array 5 :element-type 'single-float) ;; Creates an array of single-floats.
")
     " " :PAR
     (:CODE NIL " (make-array nil :initial-element nil) → #0ANIL
 (make-array 4 :initial-element nil) → #(NIL NIL NIL NIL)
 (make-array '(2 4) 
              :element-type '(unsigned-byte 2) 
              :initial-contents '((0 1 2 3) (3 2 1 0)))
→ #2A((0 1 2 3) (3 2 1 0))
 (make-array 6
              :element-type 'character 
              :initial-element #\\a 
              :fill-pointer 3) → \"aaa\"
")
     " " :PAR "The following is an example of making a "
     (:TERM NIL "displaced array") ". " :PAR
     (:CODE NIL " (setq a (make-array '(4 3))) 
→ #<ARRAY 4x3 simple 32546632>
 (dotimes (i 4)
   (dotimes (j 3)
     (setf (aref a i j) (list i 'x j '= (* i j)))))
→ NIL
 (setq b (make-array 8 :displaced-to a
                       :displaced-index-offset 2))
→ #<ARRAY 8 indirect 32550757>
 (dotimes (i 8)
   (print (list i (aref b i))))
⊳ (0 (0 X 2 = 0)) 
⊳ (1 (1 X 0 = 0)) 
⊳ (2 (1 X 1 = 1)) 
⊳ (3 (1 X 2 = 2)) 
⊳ (4 (2 X 0 = 0)) 
⊳ (5 (2 X 1 = 2)) 
⊳ (6 (2 X 2 = 4)) 
⊳ (7 (3 X 0 = 0)) 
→ NIL
")
     " The last example depends on the fact that " (:TERM NIL "arrays")
     " are, in effect, stored in row-major order. " :PAR
     (:CODE NIL " (setq a1 (make-array 50))
→ #<ARRAY 50 simple 32562043>
 (setq b1 (make-array 20 :displaced-to a1 :displaced-index-offset 10))
→ #<ARRAY 20 indirect 32563346>
 (length b1) → 20

 (setq a2 (make-array 50 :fill-pointer 10))
→ #<ARRAY 50 fill-pointer 10 46100216>
 (setq b2 (make-array 20 :displaced-to a2 :displaced-index-offset 10))
→ #<ARRAY 20 indirect 46104010>
 (length a2) → 10
 (length b2) → 20

 (setq a3 (make-array 50 :fill-pointer 10))
→ #<ARRAY 50 fill-pointer 10 46105663>
 (setq b3 (make-array 20 :displaced-to a3 :displaced-index-offset 10
                         :fill-pointer 5))
→ #<ARRAY 20 indirect, fill-pointer 5 46107432>
 (length a3) → 10
 (length b3) → 5
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "adjustable-array-p") ", "
     (:FUNREF NIL "aref") ", " (:FUNREF NIL "arrayp") ", "
     (:FUNREF NIL "array-element-type") ", " (:CONREF NIL "array-rank-limit")
     ", " (:CONREF NIL "array-dimension-limit") ", "
     (:FUNREF NIL "fill-pointer") ", "
     (:FUNREF NIL "upgraded-array-element-type") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:ISSUE NIL "ADJUST-ARRAY-NOT-ADJUSTABLE:IMPLICIT-COPY")
     " There is no specified way to create an " (:TERM NIL "array")
     " for which " (:FUNREF NIL "adjustable-array-p") " definitely returns "
     (:TERM NIL "false") ". There is no specified way to create an "
     (:TERM NIL "array") " that is not a " (:TERM NIL "simple array") ". "
     (:ENDISSUE NIL "ADJUST-ARRAY-NOT-ADJUSTABLE:IMPLICIT-COPY") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ADJUST-ARRAY")
   (:COM (:NAME "adjust-array" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "adjust-array")
      (:ARGLIST NIL "array new-dimensions " (:KEYWORD NIL " &key")
       " element-type initial-element initial-contents fill-pointer displaced-to displaced-index-offset")
      (:VALUES NIL "adjusted-array"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "array") "—an "
     (:TERM NIL "array") ". " :PAR (:PARAM NIL "new-dimensions") "—a "
     (:TERM NIL "valid array dimension") " or a " (:TERM NIL "list") " of "
     (:TERM NIL "valid array dimensions") ". " :PAR (:COMMENT NIL "% 17.6.0 6")
     (:PARAM NIL "element-type") "—a " (:TERM NIL "type specifier") ". "
     (:COMMENT NIL
      "!!! Not sure how to express the default.  Mail sent to Quinquevirate asking for thoughts.")
     :PAR (:COMMENT NIL "% 17.6.0 7") (:PARAM NIL "initial-element") "—an "
     (:TERM NIL "object") ". " (:PARAM NIL "Initial-element")
     " must not be supplied if either " (:PARAM NIL "initial-contents") " or "
     (:PARAM NIL "displaced-to") " is supplied. "
     (:COMMENT NIL "!!! How to express this default??") :PAR
     (:COMMENT NIL "!!! \"array contents designator\" ? -kmp 14-May-91")
     (:PARAM NIL "initial-contents") "—an " (:TERM NIL "object") ". If "
     (:TERM NIL "array") " has rank greater than zero, then "
     (:PARAM NIL "initial-contents") " is composed of nested "
     (:TERM NIL "sequences") ", the depth of which must equal the rank of "
     (:PARAM NIL "array") ". Otherwise, " (:TERM NIL "array")
     " is zero-dimensional and " (:PARAM NIL "initial-contents")
     " supplies the single element. " (:PARAM NIL "initial-contents")
     " must not be supplied if either " (:PARAM NIL "initial-element") " or "
     (:PARAM NIL "displaced-to") " is given. " :PAR (:COMMENT NIL "% 17.6.0 8")
     (:PARAM NIL "fill-pointer") "—a " (:TERM NIL "valid fill pointer")
     " for the " (:TERM NIL "array") " to be created, or " (:MISC NIL "t")
     ", or " (:MISC NIL "nil") ". The default is " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "displaced-to") "—an " (:TERM NIL "array") " or "
     (:MISC NIL "nil") ". " (:PARAM NIL "initial-elements") " and "
     (:PARAM NIL "initial-contents") " must not be supplied if "
     (:PARAM NIL "displaced-to") " is supplied. " (:COMMENT NIL "!!! Default?")
     :PAR (:ISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " "
     (:PARAM NIL "displaced-index-offset") "—an " (:TERM NIL "object") " of "
     (:TERM NIL "type") " " (:TT NIL "(fixnum 0 " (:I NIL "n") ")") " where "
     (:I NIL "n") " is "
     (:TT NIL " (array-total-size " (:PARAM NIL "displaced-to") ")") ". "
     (:PARAM NIL "displaced-index-offset") " may be supplied only if "
     (:PARAM NIL "displaced-to") " is supplied. " (:COMMENT NIL "!!! Default?")
     (:ENDISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " " :PAR
     (:PARAM NIL "adjusted-array") "—an " (:TERM NIL "array") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 17.6.0 3")
     (:FUNREF NIL "adjust-array") " changes the dimensions or elements of "
     (:PARAM NIL "array") ". The result is an " (:TERM NIL "array")
     " of the same " (:TERM NIL "type") " and rank as " (:PARAM NIL "array")
     ", " (:COMMENT NIL "% 17.6.0 4" "% 17.6.0 9")
     "that is either the modified " (:PARAM NIL "array")
     ", or a newly created " (:TERM NIL "array") " to which "
     (:PARAM NIL "array") " can be displaced, and that has the given "
     (:PARAM NIL "new-dimensions") ". " :PAR
     (:COMMENT NIL
      "% Sandra points out that this is implied by the definition of \"valid array dimension\"."
      " The total number of elements that \\param{array} "
      " can contain (as given by the"
      " product of all \\param{new-dimensions}) must be less than "
      " \\conref{array-total-size-limit}.                         ")
     :PAR (:PARAM NIL "New-dimensions") " specify the size of each "
     (:TERM NIL "dimension") " of " (:PARAM NIL "array") ". " :PAR
     (:PARAM NIL "Element-type") " specifies the " (:TERM NIL "type")
     " of the " (:TERM NIL "elements") " of the resulting " (:TERM NIL "array")
     ". If " (:PARAM NIL "element-type") " is supplied, "
     (:COMMENT NIL
      " % the consequences are unspecified if it is not a \\term{type}"
      " % %What does \"compatible\" mean here?? -kmp 29-Apr-91"
      " % %Sandra's curious, too. -kmp 14-Feb-92"
      " % that is compatible with {\\tt (array-element-type \\param{array})}."
      " %% Sandra's suggested rewrite:" " the consequences are unspecified if"
      " \\f{(upgraded-array-element-type \\param{element-type})}"
      " is not the same as {\\tt (array-element-type \\param{array})}."
      "% KMP's rewrite")
     "the consequences are unspecified if the "
     (:TERM NIL "upgraded array element type") " of "
     (:PARAM NIL "element-type") " is not the same as the "
     (:TERM NIL "actual array element type") " of " (:PARAM NIL "array") ". "
     (:COMMENT NIL "% Sandra thinks this is redundant."
      " If the resulting \\term{array} is a displaced \\term{array},"
      " the consequences are unspecified if \\param{element-type}"
      " is not compatible with the \\term{element type} of the \\term{array} "
      " that the resulting \\term{array} shares elements with."
      "% Redundant with Arguments and Values."
      "If \\kwd{element-type} is not supplied, the elements are of type \\t.")
     :PAR "If " (:PARAM NIL "initial-contents")
     " is supplied, it is treated as for " (:FUNREF NIL "make-array")
     ". In this case none of the original contents of " (:PARAM NIL "array")
     " appears in the resulting " (:TERM NIL "array") ". " :PAR
     (:ISSUE NIL "ADJUST-ARRAY-FILL-POINTER") " If "
     (:PARAM NIL "fill-pointer") " is an " (:TERM NIL "integer")
     ", it becomes the " (:TERM NIL "fill pointer") " for the resulting "
     (:TERM NIL "array") ". If " (:PARAM NIL "fill-pointer") " is the symbol "
     (:MISC NIL "t") ", it indicates that the size of the resulting "
     (:TERM NIL "array") " should be used as the " (:TERM NIL "fill pointer")
     ". If " (:PARAM NIL "fill-pointer") " is " (:MISC NIL "nil")
     ", it indicates that the " (:TERM NIL "fill pointer")
     " should be left as it is. " (:ENDISSUE NIL "ADJUST-ARRAY-FILL-POINTER")
     " " :PAR "If " (:PARAM NIL "displaced-to") " "
     (:COMMENT NIL "is supplied and") (:TERM NIL "non-nil") ", a "
     (:TERM NIL "displaced array") " is created. The resulting "
     (:TERM NIL "array") " shares its contents with the " (:TERM NIL "array")
     " given by " (:PARAM NIL "displaced-to") ". The resulting "
     (:TERM NIL "array") " cannot contain more elements than the "
     (:TERM NIL "array") " it is displaced to. If " (:PARAM NIL "displaced-to")
     " is not supplied or " (:MISC NIL "nil") ", the resulting "
     (:TERM NIL "array") " is not a " (:TERM NIL "displaced array")
     ". If array " (:MATH NIL (:MI NIL "A")) " is created displaced to array "
     (:MATH NIL (:MI NIL "B")) " and subsequently array "
     (:MATH NIL (:MI NIL "B")) " is given to " (:FUNREF NIL "adjust-array")
     ", array " (:MATH NIL (:MI NIL "A")) " will still be displaced to array "
     (:MATH NIL (:MI NIL "B")) ". Although " (:PARAM NIL "array")
     " might be a " (:TERM NIL "displaced array") ", the resulting "
     (:TERM NIL "array") " is not a " (:TERM NIL "displaced array") " unless "
     (:PARAM NIL "displaced-to") " is supplied and not " (:MISC NIL "nil") ". "
     (:ISSUE NIL "ADJUST-ARRAY-DISPLACEMENT") " The interaction between "
     (:FUNREF NIL "adjust-array") " and displaced " (:TERM NIL "arrays")
     " is as follows given three " (:TERM NIL "arrays") ", " (:TT NIL " A")
     ", " (:TT NIL " B") ", and " (:TT NIL " C") ": " :PAR
     (:LIST NIL
      (:ITEM NIL (:TT NIL " A") " is not displaced before or after the call "
       :PAR
       (:CODE NIL " (adjust-array A ...)
")
       " " :PAR "The dimensions of " (:TT NIL " A")
       " are altered, and the contents rearranged as appropriate. Additional elements of "
       (:TT NIL " A") " are taken from " (:PARAM NIL "initial-element")
       ". The use of " (:PARAM NIL "initial-contents")
       " causes all old contents to be discarded. " :PAR)
      (:ITEM NIL (:TT NIL " A")
       " is not displaced before, but is displaced to " (:TT NIL " C")
       " after the call " :PAR
       (:CODE NIL " (adjust-array A ... :displaced-to C)
")
       " " :PAR "None of the original contents of " (:TT NIL " A")
       " appears in " (:TT NIL " A") " afterwards; " (:TT NIL " A")
       " now contains the contents of " (:TT NIL " C")
       ", without any rearrangement of " (:TT NIL " C") ". " :PAR)
      (:ITEM NIL (:TT NIL " A") " is displaced to " (:TT NIL " B")
       " before the call, and is displaced to " (:TT NIL " C")
       " after the call " :PAR
       (:CODE NIL " (adjust-array A ... :displaced-to B)
 (adjust-array A ... :displaced-to C)
")
       " " :PAR (:TT NIL " B") " and " (:TT NIL " C")
       " might be the same. The contents of " (:TT NIL " B")
       " do not appear in " (:TT NIL " A")
       " afterward unless such contents also happen to be in " (:TT NIL " C")
       " If " (:PARAM NIL "displaced-index-offset") " is not supplied in the "
       (:FUNREF NIL "adjust-array")
       " call, it defaults to zero; the old offset into " (:TT NIL " B")
       " is not retained. " :PAR (:COMMENT NIL "% 17.6.0 11"))
      (:ITEM NIL (:TT NIL " A") " is displaced to " (:TT NIL " B")
       " before the call, but not displaced afterward. " :PAR
       (:CODE NIL " (adjust-array A ... :displaced-to B)
 (adjust-array A ... :displaced-to nil)
")
       " " (:TT NIL " A") " gets a new “data region,” and contents of "
       (:TT NIL " B")
       " are copied into it as appropriate to maintain the existing old contents; additional elements of "
       (:TT NIL " A") " are taken from " (:PARAM NIL "initial-element")
       " if supplied. However, the use of " (:PARAM NIL "initial-contents")
       " causes all old contents to be discarded. "
       (:COMMENT NIL "If \\param{array} is displaced"
        "to another array \\f{x} when \\funref{adjust-array}"
        "is applied to \\param{array}, then afterwards neither "
        "\\param{array} nor the returned"
        "result is displaced to \\f{x} unless such displacement is explicitly"
        "re-specified in the call to \\funref{adjust-array}.")))
     " " (:ENDISSUE NIL "ADJUST-ARRAY-DISPLACEMENT") " " :PAR "If "
     (:PARAM NIL "displaced-index-offset")
     " is supplied, it specifies the offset of the resulting "
     (:TERM NIL "array") " from the beginning of the " (:TERM NIL "array")
     " that it is displaced to. If " (:PARAM NIL "displaced-index-offset")
     " is not supplied, the offset is 0. The size of the resulting "
     (:TERM NIL "array")
     " plus the offset value cannot exceed the size of the "
     (:TERM NIL "array") " that it is displaced to. " :PAR
     (:COMMENT NIL "% 17.6.0 5") "If only " (:PARAM NIL "new-dimensions")
     " and an " (:PARAM NIL "initial-element")
     " argument are supplied, those elements of " (:PARAM NIL "array")
     " that are still in bounds appear in the resulting " (:TERM NIL "array")
     ". The elements of the resulting " (:TERM NIL "array")
     " that are not in the bounds of " (:TERM NIL "array")
     " are initialized to " (:PARAM NIL "initial-element") "; if "
     (:PARAM NIL "initial-element") " is not provided, "
     (:ISSUE NIL "UNINITIALIZED-ELEMENTS:CONSEQUENCES-UNDEFINED") " "
     (:COMMENT NIL
      "% This issue finally did pass at the March-93 meeting. -kmp 5-May-93"
      " then the initial contents of any resulting \\term{elements}"
      " %%Rewritten to conform to the fact that issue UNINITIALIZED-ELEMENTS failed"
      " %%to clarify this in the other direction because consensus was that this was well-defined"
      " %%already. -kmp 15-Jan-92" " %are undefined."
      " is \\term{implementation-dependent}.")
     "the consequences of later reading any such new " (:TERM NIL "element")
     " of " (:PARAM NIL "new-array")
     " before it has been initialized are undefined. "
     (:ENDISSUE NIL "UNINITIALIZED-ELEMENTS:CONSEQUENCES-UNDEFINED") " " :PAR
     "If " (:PARAM NIL "initial-contents") " or " (:PARAM NIL "displaced-to")
     " is supplied, then none of the original contents of "
     (:PARAM NIL "array") " appears in the new " (:TERM NIL "array") ". " :PAR
     (:COMMENT NIL "% 17.6.0 10") :PAR
     (:ISSUE NIL "ADJUST-ARRAY-NOT-ADJUSTABLE:IMPLICIT-COPY") " "
     (:COMMENT NIL "The following will be deleted:"
      "The consequences are unspecified"
      "if \\funref{adjust-array} is invoked with an \\param{array} argument"
      "that is not adjustable.")
     :PAR (:ENDISSUE NIL "ADJUST-ARRAY-NOT-ADJUSTABLE:IMPLICIT-COPY") " "
     (:COMMENT NIL "If \\param{fill-pointer} is \\nil,"
      "then the consequences are unspecified if"
      "\\param{array} has a \\term{fill pointer}.")
     "The consequences are unspecified if " (:PARAM NIL "array")
     " is adjusted to a size smaller than its " (:TERM NIL "fill pointer")
     " without supplying the " (:PARAM NIL "fill-pointer")
     " argument so that its " (:TERM NIL "fill pointer")
     " is properly adjusted in the process. " :PAR "If " (:TT NIL " A")
     " is displaced to " (:TT NIL " B")
     ", the consequences are unspecified if " (:TT NIL " B")
     " is adjusted in such a way that it no longer has enough elements to satisfy "
     (:TT NIL " A") ". " :PAR
     (:ISSUE NIL "ADJUST-ARRAY-NOT-ADJUSTABLE:IMPLICIT-COPY") " " :PAR "If "
     (:FUNREF NIL "adjust-array") " is applied to an " (:TERM NIL "array")
     " that is " (:TERM NIL "actually adjustable") ", the " (:TERM NIL "array")
     " returned is " (:TERM NIL "identical") " to " (:PARAM NIL "array") ". "
     (:COMMENT NIL
      "% This was only needed when \"\\term{expressly adjustable}\" was used in the previous sentence."
      " It is \\term{implementation-dependent} whether \\funref{adjust-array} "
      " returns an \\term{array} that is \\term{identical} to its first argument for any"
      " other \\term{arrays}.")
     "If the " (:TERM NIL "array") " returned by " (:FUNREF NIL "adjust-array")
     " is " (:TERM NIL "distinct") " from " (:PARAM NIL "array")
     ", then the argument " (:PARAM NIL "array") " is unchanged. "
     (:ENDISSUE NIL "ADJUST-ARRAY-NOT-ADJUSTABLE:IMPLICIT-COPY") " " :PAR
     "Note that if an " (:TERM NIL "array") " " (:MATH NIL (:MI NIL "A"))
     " is displaced to another " (:TERM NIL "array") " "
     (:MATH NIL (:MI NIL "B")) ", and " (:MATH NIL (:MI NIL "B"))
     " is displaced to another " (:TERM NIL "array") " "
     (:MATH NIL (:MI NIL "C")) ", and " (:MATH NIL (:MI NIL "B"))
     " is altered by " (:FUNREF NIL "adjust-array") ", "
     (:MATH NIL (:MI NIL "A")) " must now refer to the adjust contents of "
     (:MATH NIL (:MI NIL "B"))
     ". This means that an implementation cannot collapse the chain to make "
     (:MATH NIL (:MI NIL "A")) " refer to " (:MATH NIL (:MI NIL "C"))
     " directly and forget that the chain of reference passes through "
     (:MATH NIL (:MI NIL "B"))
     ". However, caching techniques are permitted as long as they preserve the semantics specified here. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (adjustable-array-p
  (setq ada (adjust-array
              (make-array '(2 3)
                          :adjustable t
                          :initial-contents '((a b c) (1 2 3)))
              '(4 6)))) → T 
 (array-dimensions ada) → (4 6) 
 (aref ada 1 1) → 2 
 (setq beta (make-array '(2 3) :adjustable t))
→ #2A((NIL NIL NIL) (NIL NIL NIL)) 
 (adjust-array beta '(4 6) :displaced-to ada)
→ #2A((A B C NIL NIL NIL)
       (1 2 3 NIL NIL NIL)
       (NIL NIL NIL NIL NIL NIL) 
       (NIL NIL NIL NIL NIL NIL))
 (array-dimensions beta) → (4 6)
 (aref beta 1 1) → 2 
")
     " " :PAR (:COMMENT NIL "% 17.6.0 11") "Suppose that the 4-by-4 array in "
     (:TT NIL "m") " looks like this: " :PAR
     (:CODE NIL "#2A(( alpha     beta      gamma     delta )
    ( epsilon   zeta      eta       theta )
    ( iota      kappa     lambda    mu    )
    ( nu        xi        omicron   pi    ))
")
     " Then the result of " :PAR
     (:CODE NIL " (adjust-array m '(3 5) :initial-element 'baz)
")
     " is a 3-by-5 array with contents " :PAR
     (:CODE NIL "#2A(( alpha     beta      gamma     delta     baz )
    ( epsilon   zeta      eta       theta     baz )
    ( iota      kappa     lambda    mu        baz ))
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR
     (:COMMENT NIL
      "%I don't think this sort of thing is worthwhile to note. -kmp 7-Jan-91"
      "How \\param{array} was created.")
     :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error") " is signaled if "
     (:PARAM NIL "fill-pointer") " is supplied and " (:TERM NIL "non-nil")
     " but " (:PARAM NIL "array") " has no " (:TERM NIL "fill pointer") ". "
     :PAR
     (:COMMENT NIL "\\issue{ADJUST-ARRAY-NOT-ADJUSTABLE:DONKEY}"
      "An error \\oftype{error} is signaled if an attempt"
      "  is made to adjust an \\param{array} that is not adjustable (that is, an"
      "  \\param{array} for which \\funref{adjustable-array-p} returns \\term{false})."
      " " "\\endissue{ADJUST-ARRAY-NOT-ADJUSTABLE:DONKEY}"))
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "adjustable-array-p") ", "
     (:FUNREF NIL "make-array") ", " (:CONREF NIL "array-dimension-limit") ", "
     (:CONREF NIL "array-total-size-limit") ", " (:TYPEREF NIL "array") " "
     :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL "\\issue{ADJUST-ARRAY-NOT-ADJUSTABLE:DONKEY}"
      "\\funref{adjustable-array-p} is an appropriate"
      "  predicate to determine whether \\funref{adjust-array} will reliably succeed."
      "\\endissue{ADJUST-ARRAY-NOT-ADJUSTABLE:DONKE Y}")
     :PAR
     (:COMMENT NIL "% Sandra thinks this is redundant."
      " \\issue{ADJUST-ARRAY-NOT-ADJUSTABLE:IMPLICIT-COPY}"
      " The value returned by \\funref{adjust-array} might not be \\term{identical} "
      " to the argument \\param{array}."
      " \\endissue{ADJUST-ARRAY-NOT-ADJUSTABLE:IMPLICIT-COPY}")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ADJUSTABLE-ARRAY-P")
   (:COM (:NAME "adjustable-array-p" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "adjustable-array-p")
      (:ARGLIST NIL "array") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "array") "—an "
     (:TERM NIL "array") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:ISSUE NIL "ADJUST-ARRAY-NOT-ADJUSTABLE:IMPLICIT-COPY") " " :PAR
     (:COMMENT NIL "% 17.3.0 13") "Returns true if and only if "
     (:FUNREF NIL "adjust-array") " could return a " (:TERM NIL "value")
     " which is " (:TERM NIL "identical") " to " (:PARAM NIL "array")
     " when given that " (:TERM NIL "array") " as its first "
     (:TERM NIL "argument") ". "
     (:ENDISSUE NIL "ADJUST-ARRAY-NOT-ADJUSTABLE:IMPLICIT-COPY") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (adjustable-array-p 
   (make-array 5
               :element-type 'character 
               :adjustable t 
               :fill-pointer 3)) → "
      (:TERM NIL "true") "
 (adjustable-array-p (make-array 4)) → "
      (:TERM NIL "implementation-dependent") "
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if its argument is not an "
     (:TERM NIL "array") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "adjust-array") ", "
     (:FUNREF NIL "make-array") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " "
     (:COMMENT NIL "\\issue{ADJUST-ARRAY-NOT-ADJUSTABLE:DONKEY}" "  "
      "  An \\term{array} ``is adjustable'' "
      "if {\\tt (adjustable-array-p \\term{array})} is \\term{true}."
      "  The adjustability of an \\term{array} has no necessary"
      "  relation to any value that was given (or not given) by the \\kwd{adjustable} "
      "  \\term{argument}"
      "  in the call to \\funref{make-array} that created the \\term{array}."
      "  There is no portable way to create a non-adjustable"
      "  \\term{array} (that is, an \\term{array} for which \\funref{adjustable-array-p} is"
      "  guaranteed to return \\term{false})."
      "\\endissue{ADJUST-ARRAY-NOT-ADJUSTABLE:DONKEY}")))
   " " :PAR (:COMMENT NIL "%% ========== AREF")
   (:COM (:NAME "aref" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "aref")
      (:ARGLIST NIL "array " (:KEYWORD NIL " &rest") " subscripts")
      (:VALUES NIL "element"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "aref")
      (:ARGLIST NIL "array " (:KEYWORD NIL " &rest") " subscripts")
      (:NEW-VALUE NIL "new-element"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "array") "—an "
     (:TERM NIL "array") ". " :PAR
     (:ISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " "
     (:PARAM NIL "subscripts") "—a " (:TERM NIL "list") " of "
     (:TERM NIL "valid array indices") " for the " (:PARAM NIL "array") ". "
     (:ENDISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " " :PAR
     (:PARAM NIL "element") ", " (:PARAM NIL "new-element") "—an "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 17.2.0 3")
     (:TERM NIL "Accesses") " the " (:PARAM NIL "array") " "
     (:TERM NIL "element") " specified by the " (:PARAM NIL "subscripts")
     ". If no " (:PARAM NIL "subscripts") " are supplied and "
     (:PARAM NIL "array") " is zero rank, " (:FUNREF NIL "aref") " "
     (:TERM NIL "accesses") " the sole element of " (:PARAM NIL "array") ". "
     :PAR (:COMMENT NIL "% 17.2.0 4") (:FUNREF NIL "aref") " ignores "
     (:TERM NIL "fill pointers") ". It is permissible to use "
     (:FUNREF NIL "aref") " to " (:TERM NIL "access") " any "
     (:PARAM NIL "array") " " (:TERM NIL "element") ", whether "
     (:TERM NIL "active") " or not. " :PAR
     (:COMMENT NIL "% This is implied by the use of \"access\" above."
      " %% 17.2.0 5"
      " \\macref{setf} can be used with \\funref{aref} to destructively replace"
      " an \\term{array} element with a new value.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR (:COMMENT NIL "% 2.5.0 6")
     "If the variable " (:TT NIL "foo")
     " names a 3-by-5 array, then the first index could be 0, 1, or 2, and then second index could be 0, 1, 2, 3, or 4. The array elements can be referred to by using the "
     (:TERM NIL "function") " " (:FUNREF NIL "aref") "; for example, "
     (:TT NIL "(aref foo 2 1)") " refers to element (2, 1) of the array. " :PAR
     (:CODE NIL " (aref (setq alpha (make-array 4)) 3) → "
      (:TERM NIL "implementation-dependent") "
 (setf (aref alpha 3) 'sirens) → SIRENS
 (aref alpha 3) → SIRENS
 (aref (setq beta (make-array '(2 4) 
                    :element-type '(unsigned-byte 2)
                    :initial-contents '((0 1 2 3) (3 2 1 0))))
        1 2) → 1
 (setq gamma '(0 2))
 (apply #'aref beta gamma) → 2
 (setf (apply #'aref beta gamma) 3) → 3
 (apply #'aref beta gamma) → 3
 (aref beta 0 2) → 3
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "bit") ", "
     (:FUNREF NIL "char") ", " (:FUNREF NIL "elt") ", "
     (:FUNREF NIL "row-major-aref") ", " (:FUNREF NIL "svref") ", "
     (:ISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:SECREF NIL :CONSTANT-MODIFICATION) " "
     (:ENDISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ARRAY-DIMENSION")
   (:COM (:NAME "array-dimension" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "array-dimension")
      (:ARGLIST NIL "array axis-number") (:VALUES NIL "dimension"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "array") "—an "
     (:TERM NIL "array") ". " :PAR (:PARAM NIL "axis-number") "—an "
     (:TERM NIL "integer") " greater than or equal to zero and less than the "
     (:TERM NIL "rank") " of the " (:PARAM NIL "array") ". " :PAR
     (:COMMENT NIL
      " Barmar observes that nothing requires the implementation to enforce ARRAY-DIMENSION-LIMIT."
      " It's a requirement on the user to be prepared to lose if he exceeds it,"
      " but it is not a requirement on the implementation to make him lose in that case.")
     (:PARAM NIL "dimension") "—a non-negative " (:TERM NIL "integer") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "!!! (array-dimension (make-array nil) ??)") :PAR
     (:COMMENT NIL "% 17.3.0 6") (:FUNREF NIL "array-dimension")
     " returns the " (:PARAM NIL "axis-number") " " (:TERM NIL "dimension")
     (:SUB NIL "1") " of " (:PARAM NIL "array") ". "
     (:COMMENT NIL
      "This next is implied by the definition of dimension, but retained for now for safety. -kmp")
     "(Any " (:TERM NIL "fill pointer") " is ignored.) " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (array-dimension (make-array 4) 0) → 4
 (array-dimension (make-array '(2 3)) 1) → 3
")
     " " :PAR)
    (:PART (:NAME "Affected By") " None. ")
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "array-dimensions") ", "
     (:FUNREF NIL "length") " " :PAR)
    (:PART (:NAME "Notes") " "
     (:CODE NIL " (array-dimension array n) ≡ (nth n (array-dimensions array))
")
     " "))
   " " :PAR (:COMMENT NIL "%% ========== ARRAY-DIMENSIONS")
   (:COM (:NAME "array-dimensions" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "array-dimensions")
      (:ARGLIST NIL "array") (:VALUES NIL "dimensions"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "array") "—an "
     (:TERM NIL "array") ". " :PAR
     (:COMMENT NIL
      " Barmar observes that nothing requires the implementation to enforce ARRAY-DIMENSION-LIMIT."
      " It's a requirement on the user to be prepared to lose if he exceeds it,"
      " but it is not a requirement on the implementation to make him lose in that case.")
     (:PARAM NIL "dimensions") "—a " (:TERM NIL "list") " of "
     (:TERM NIL "integers") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 17.3.0 8")
     "Returns a " (:TERM NIL "list") " of the " (:TERM NIL "dimensions") " of "
     (:PARAM NIL "array") ". (If " (:PARAM NIL "array") " is a "
     (:TERM NIL "vector") " with a " (:TERM NIL "fill pointer") ", that "
     (:TERM NIL "fill pointer") " is ignored.) " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (array-dimensions (make-array 4)) → (4)
 (array-dimensions (make-array '(2 3))) → (2 3)
 (array-dimensions (make-array 4 :fill-pointer 2)) → (4)
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if its argument is not an "
     (:TERM NIL "array") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "array-dimension") " " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ARRAY-ELEMENT-TYPE")
   (:COM (:NAME "array-element-type" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "array-element-type")
      (:ARGLIST NIL "array") (:VALUES NIL "typespec"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "array") "—an "
     (:TERM NIL "array") ". " :PAR (:PARAM NIL "typespec") "—a "
     (:TERM NIL "type specifier") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 17.3.0 3")
     (:ISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING")
     " Returns a " (:TERM NIL "type specifier") " which represents the "
     (:TERM NIL "actual array element type")
     " of the array, which is the set of " (:TERM NIL "objects")
     " that such an " (:PARAM NIL "array") " can hold. "
     (:COMMENT NIL "Barmar points out that this is redundant."
      " after upgrading.")
     "(Because of " (:TERM NIL "array") " " (:TERM NIL "upgrading") ", this "
     (:TERM NIL "type specifier") " can in some cases denote a "
     (:TERM NIL "supertype") " of the "
     (:TERM NIL "expressed array element type") " of the " (:PARAM NIL "array")
     ".) "
     (:COMMENT NIL
      "\\term{type} requested by the user when \\param{array} was created.")
     (:ENDISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (array-element-type (make-array 4)) → T
 (array-element-type (make-array 12 :element-type '(unsigned-byte 8))) 
→ "
      (:TERM NIL "implementation-dependent") "
 (array-element-type (make-array 12 :element-type '(unsigned-byte 5)))
→ "
      (:TERM NIL "implementation-dependent") "
")
     " " :PAR
     (:CODE NIL " (array-element-type (make-array 5 :element-type '(mod 5)))
")
     " could be " (:TT NIL "(mod 5)") ", " (:TT NIL "(mod 8)") ", "
     (:TT NIL "fixnum") ", " (:TT NIL "t") ", or any other type of which "
     (:TT NIL "(mod 5)") " is a " (:TERM NIL "subtype") ". " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The " (:TERM NIL "implementation")
     ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if its argument is not an "
     (:TERM NIL "array") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:TYPEREF NIL "array") ", "
     (:FUNREF NIL "make-array") ", " (:FUNREF NIL "subtypep") ", "
     (:FUNREF NIL "upgraded-array-element-type") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ARRAY-HAS-FILL-POINTER-P")
   (:COM (:NAME "array-has-fill-pointer-p" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "array-has-fill-pointer-p")
      (:ARGLIST NIL "array") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "array") "—an "
     (:TERM NIL "array") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 17.5.0 5")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "array") " has a "
     (:TERM NIL "fill pointer") "; otherwise returns " (:TERM NIL "false") ". "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (array-has-fill-pointer-p (make-array 4)) → "
      (:TERM NIL "implementation-dependent") "
 (array-has-fill-pointer-p (make-array '(2 3))) → "
      (:TERM NIL "false") "
 (array-has-fill-pointer-p
   (make-array 8 
               :fill-pointer 2 
               :initial-element 'filler)) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if its argument is not an "
     (:TERM NIL "array") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-array") ", "
     (:FUNREF NIL "fill-pointer") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "Since " (:TERM NIL "arrays") " of "
     (:TERM NIL "rank") " other than one cannot have a "
     (:TERM NIL "fill pointer") ", " (:FUNREF NIL "array-has-fill-pointer-p")
     " always returns " (:MISC NIL "nil")
     " when its argument is such an array. " :PAR))
   " " :PAR (:COMMENT NIL "--------------------") :PAR
   (:COM (:NAME "array-displacement" :FTYPE "Function")
    (:ISSUE NIL "DISPLACED-ARRAY-PREDICATE:ADD") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "array-displacement")
      (:ARGLIST NIL "array")
      (:VALUES NIL "displaced-to, displaced-index-offset"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "array") "—an "
     (:TERM NIL "array") ". " :PAR (:PARAM NIL "displaced-to") "—an "
     (:PARAM NIL "array") " or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "displaced-index-offset") "—a non-negative "
     (:TERM NIL "fixnum") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "If the " (:PARAM NIL "array")
     " is a " (:TERM NIL "displaced array") ", returns the "
     (:TERM NIL "values") " of the " (:KWD NIL "displaced-to") " and "
     (:KWD NIL "displaced-index-offset") " options for the "
     (:TERM NIL "array") " (see the " (:TERM NIL "functions") " "
     (:FUNREF NIL "make-array") " and " (:FUNREF NIL "adjust-array")
     "). If the " (:PARAM NIL "array") " is not a "
     (:TERM NIL "displaced array") ", " (:MISC NIL "nil") " and " (:TT NIL "0")
     " are returned. " :PAR "If " (:FUNREF NIL "array-displacement")
     " is called on an " (:PARAM NIL "array") " for which a "
     (:TERM NIL "non-nil") " " (:TERM NIL "object") " was provided as the "
     (:KWD NIL "displaced-to") " " (:TERM NIL "argument") " to "
     (:FUNREF NIL "make-array") " or " (:FUNREF NIL "adjust-array")
     ", it must return that " (:TERM NIL "object")
     " as its first value. It is " (:TERM NIL "implementation-dependent")
     " whether " (:FUNREF NIL "array-displacement") " returns a "
     (:TERM NIL "non-nil") " " (:TERM NIL "primary value") " for any other "
     (:PARAM NIL "array") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq a1 (make-array 5)) → #<ARRAY 5 simple 46115576>
 (setq a2 (make-array 4 :displaced-to a1
                        :displaced-index-offset 1))
→ #<ARRAY 4 indirect 46117134>
 (array-displacement a2)
→ #<ARRAY 5 simple 46115576>, 1
 (setq a3 (make-array 2 :displaced-to a2
                        :displaced-index-offset 2))
→ #<ARRAY 2 indirect 46122527>
 (array-displacement a3)
→ #<ARRAY 4 indirect 46117134>, 2
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "array") " is not an "
     (:TERM NIL "array") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-array") " " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Notes" :NONE T) " "
     (:ENDISSUE NIL "DISPLACED-ARRAY-PREDICATE:ADD") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ARRAY-IN-BOUNDS-P")
   (:COM (:NAME "array-in-bounds-p" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "array-in-bounds-p")
      (:ARGLIST NIL "array " (:KEYWORD NIL " &rest") " subscripts")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "array") "—an "
     (:TERM NIL "array") ". " :PAR
     (:COMMENT NIL " Note that they needn't be valid array indices, "
      " since that would make this function a lot less interesting!")
     (:PARAM NIL "subscripts") "—a list of " (:TERM NIL "integers")
     " of length equal to the " (:TERM NIL "rank") " of the "
     (:TERM NIL "array") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 17.3.0 10")
     "Returns " (:TERM NIL "true") " if the " (:PARAM NIL "subscripts")
     " are all in bounds for " (:PARAM NIL "array") "; otherwise returns "
     (:TERM NIL "false") ". (If " (:PARAM NIL "array") " is a "
     (:TERM NIL "vector") " with a " (:TERM NIL "fill pointer") ", that "
     (:TERM NIL "fill pointer") " is ignored.) " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (setq a (make-array '(7 11) :element-type 'string-char))
 (array-in-bounds-p a 0  0) → "
      (:TERM NIL "true") "
 (array-in-bounds-p a 6 10) → "
      (:TERM NIL "true") "
 (array-in-bounds-p a 0 -1) → "
      (:TERM NIL "false") "
 (array-in-bounds-p a 0 11) → "
      (:TERM NIL "false") "
 (array-in-bounds-p a 7  0) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "array-dimensions") " "
     :PAR)
    (:PART (:NAME "Notes") " "
     (:CODE NIL " (array-in-bounds-p array subscripts)   
 ≡ (and (not (some #'minusp (list subscripts)))
         (every #'< (list subscripts) (array-dimensions array)))
")
     " "))
   " " :PAR (:COMMENT NIL "%% ========== ARRAY-RANK")
   (:COM (:NAME "array-rank" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "array-rank") (:ARGLIST NIL "array")
      (:VALUES NIL "rank"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "array") "—an "
     (:TERM NIL "array") ". " :PAR
     (:COMMENT NIL
      " Barmar observes that nothing requires the implementation to enforce ARRAY-RANK-LIMIT."
      " It's a requirement on the user to be prepared to lose if he exceeds it,"
      " but it is not a requirement on the implementation to make him lose in that case.")
     (:PARAM NIL "rank") "—a non-negative " (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 17.3.0 4                                         ")
     "Returns the number of " (:TERM NIL "dimensions") " of "
     (:PARAM NIL "array") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (array-rank (make-array '())) → 0
 (array-rank (make-array 4)) → 1
 (array-rank (make-array '(4))) → 1
 (array-rank (make-array '(2 3))) → 2
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if its argument is not an "
     (:TERM NIL "array") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:CONREF NIL "array-rank-limit") ", "
     (:FUNREF NIL "make-array") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ARRAY-ROW-MAJOR-INDEX")
   (:COM (:NAME "array-row-major-index" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "array-row-major-index")
      (:ARGLIST NIL "array " (:KEYWORD NIL " &rest") " subscripts")
      (:VALUES NIL "index"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "array") "—an "
     (:TERM NIL "array") ". " :PAR (:PARAM NIL "subscripts") "—a "
     (:TERM NIL "list") " of " (:TERM NIL "valid array indices") " for the "
     (:PARAM NIL "array") ". " :PAR (:PARAM NIL "index") "—a "
     (:TERM NIL "valid array row-major index") " for the " (:PARAM NIL "array")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 17.3.0 11")
     "Computes the position according to the row-major ordering of "
     (:PARAM NIL "array") " for the element that is specified by "
     (:PARAM NIL "subscripts")
     ", and returns the offset of the element in the computed position from the beginning of "
     (:PARAM NIL "array") ". " :PAR "For a one-dimensional "
     (:PARAM NIL "array") ", the result of "
     (:FUNREF NIL "array-row-major-index") " equals " (:PARAM NIL "subscript")
     ". " :PAR (:FUNREF NIL "array-row-major-index") " ignores "
     (:TERM NIL "fill pointers") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq a (make-array '(4 7) :element-type '(unsigned-byte 8)))
 (array-row-major-index a 1 2) → 9
 (array-row-major-index 
    (make-array '(2 3 4) 
                :element-type '(unsigned-byte 8)
                :displaced-to a
                :displaced-index-offset 4)
    0 2 1) → 9
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 17.3.0 12")
     "A possible definition of " (:FUNREF NIL "array-row-major-index")
     ", with no error-checking, is " :PAR
     (:CODE NIL " (defun array-row-major-index (a &rest subscripts)
   (apply #'+ (maplist #'(lambda (x y)
                            (* (car x) (apply #'* (cdr y))))
                       subscripts
                       (array-dimensions a))))
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ARRAY-TOTAL-SIZE")
   (:COM (:NAME "array-total-size" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "array-total-size")
      (:ARGLIST NIL "array") (:VALUES NIL "size"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "array") "—an "
     (:TERM NIL "array") ". " :PAR
     (:COMMENT NIL
      " Barmar observes that nothing requires the implementation to enforce ARRAY-TOTAL-SIZE-LIMIT."
      " It's a requirement on the user to be prepared to lose if he exceeds it,"
      " but it is not a requirement on the implementation to make him lose in that case.")
     (:PARAM NIL "size") "—a non-negative " (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 17.3.0 9")
     "Returns the " (:TERM NIL "array total size") " of the "
     (:PARAM NIL "array") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (array-total-size (make-array 4)) → 4
 (array-total-size (make-array 4 :fill-pointer 2)) → 4
 (array-total-size (make-array 0)) → 0
 (array-total-size (make-array '(4 2))) → 8
 (array-total-size (make-array '(4 0))) → 0
 (array-total-size (make-array '())) → 1
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if its argument is not an "
     (:TERM NIL "array") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-array") ", "
     (:FUNREF NIL "array-dimensions") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "If the " (:PARAM NIL "array") " is a "
     (:TERM NIL "vector") " with a " (:TERM NIL "fill pointer") ", the "
     (:TERM NIL "fill pointer") " is ignored when calculating the "
     (:TERM NIL "array total size") ". " :PAR
     "Since the product of no arguments is one, the "
     (:TERM NIL "array total size") " of a zero-dimensional "
     (:TERM NIL "array") " is one. " :PAR
     (:CODE NIL " (array-total-size x)
    ≡ (apply #'* (array-dimensions x))
    ≡ (reduce #'* (array-dimensions x))
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ARRAYP")
   (:COM (:NAME "arrayp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "arrayp") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 24")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "array") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (arrayp (make-array '(2 3 4) :adjustable t)) → "
      (:TERM NIL "true") "
 (arrayp (make-array 6)) → "
      (:TERM NIL "true") "
 (arrayp #*1011) → "
      (:TERM NIL "true") "
 (arrayp \"hi\") → "
      (:TERM NIL "true") "
 (arrayp 'hi) → "
      (:TERM NIL "false") "
 (arrayp 12) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "typep") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (arrayp " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'array)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FILL-POINTER")
   (:COM (:NAME "fill-pointer" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR (:COMMENT NIL "% 17.5.0 7")
     (:DEF (:KIND "function") (:NAMES NIL "fill-pointer")
      (:ARGLIST NIL "vector") (:VALUES NIL "fill-pointer"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "fill-pointer") (:ARGLIST NIL "vector")
      (:NEW-VALUE NIL "new-fill-pointer"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "vector") "—a "
     (:TERM NIL "vector") " with a " (:TERM NIL "fill pointer") ". " :PAR
     (:PARAM NIL "fill-pointer") ", " (:PARAM NIL "new-fill-pointer") "—a "
     (:TERM NIL "valid fill pointer") " for the " (:PARAM NIL "vector") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 17.5.0 6")
     (:TERM NIL "Accesses") " the " (:TERM NIL "fill pointer") " of "
     (:PARAM NIL "vector") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq a (make-array 8 :fill-pointer 4)) → #(NIL NIL NIL NIL)
 (fill-pointer a) → 4
 (dotimes (i (length a)) (setf (aref a i) (* i i))) → NIL
 a → #(0 1 4 9)
 (setf (fill-pointer a) 3) → 3
 (fill-pointer a) → 3
 a → #(0 1 4)
 (setf (fill-pointer a) 8) → 8
 a → #(0 1 4 9 NIL NIL NIL NIL)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "vector") " is not a "
     (:TERM NIL "vector") " with a " (:TERM NIL "fill pointer") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-array") ", "
     (:FUNREF NIL "length") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "There is no " (:TERM NIL "operator")
     " that will remove a " (:TERM NIL "vector") "'s "
     (:TERM NIL "fill pointer") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ROW-MAJOR-AREF")
   (:COM (:NAME "row-major-aref" :FTYPE "Accessor") (:ISSUE NIL "AREF-1D") " "
    :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "row-major-aref")
      (:ARGLIST NIL "array index") (:VALUES NIL "element"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "row-major-aref")
      (:ARGLIST NIL "array index") (:NEW-VALUE NIL "new-element"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "array") "—an "
     (:TERM NIL "array") ". " :PAR
     (:ISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " "
     (:PARAM NIL "index") "—a " (:TERM NIL "valid array row-major index")
     " for the " (:PARAM NIL "array") ". "
     (:ENDISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " " :PAR
     (:PARAM NIL "element") ", " (:PARAM NIL "new-element") "—an "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Considers " (:TERM NIL "array")
     " as a " (:TERM NIL "vector") " by viewing its " (:TERM NIL "elements")
     " in row-major order, and returns the " (:TERM NIL "element") " of that "
     (:TERM NIL "vector") " which is referred to by the given "
     (:PARAM NIL "index") ". " :PAR (:FUNREF NIL "row-major-aref")
     " is valid for use with " (:MACREF NIL "setf") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "aref") ", "
     (:FUNREF NIL "array-row-major-index") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (row-major-aref array index) ≡
   (aref (make-array (array-total-size array)
                     :displaced-to array
                     :element-type (array-element-type array))
         index)

 (aref array i1 i2 ...) ≡
     (row-major-aref array (array-row-major-index array i1 i2))
")
     " " :PAR (:ENDISSUE NIL "AREF-1D") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== UPGRADED-ARRAY-ELEMENT-TYPE")
   (:COM (:NAME "upgraded-array-element-type" :FTYPE "Function")
    (:ISSUE NIL "SUBTYPEP-ENVIRONMENT:ADD-ARG") " "
    (:ISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "upgraded-array-element-type")
      (:ARGLIST NIL "typespec " (:KEYWORD NIL " &optional") " environment")
      (:VALUES NIL "upgraded-typespec"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "typespec")
     "—a " (:TERM NIL "type specifier") ". " :PAR (:PARAM NIL "environment")
     "—an " (:TERM NIL "environment") " " (:TERM NIL "object")
     ". The default is " (:MISC NIL "nil") ", denoting the "
     (:TERM NIL "null lexical environment") " and the current "
     (:TERM NIL "global environment") ". "
     (:COMMENT NIL "!!! Need to say what happens with the environment.") :PAR
     (:PARAM NIL "upgraded-typespec") "—a " (:TERM NIL "type specifier") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns the "
     (:TERM NIL "element type") " of the most " (:TERM NIL "specialized") " "
     (:TERM NIL "array") " representation capable of holding items of the "
     (:TERM NIL "type") " denoted by " (:PARAM NIL "typespec") ". " :PAR
     (:COMMENT NIL
      "Added by KMP in response to a Barmar comment. -kmp 29-Jul-91")
     "The " (:PARAM NIL "typespec") " is a " (:TERM NIL "subtype")
     " of (and possibly " (:TERM NIL "type equivalent") " to) the "
     (:PARAM NIL "upgraded-typespec") ". " :PAR "If " (:PARAM NIL "typespec")
     " is " (:TYPEREF NIL "bit") ", the result is "
     (:TERM NIL "type equivalent") " to " (:TT NIL "bit") ". "
     (:ISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " If "
     (:PARAM NIL "typespec") " is " (:TYPEREF NIL "base-char")
     ", the result is " (:TERM NIL "type equivalent") " to "
     (:TT NIL "base-char") ". "
     (:ENDISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " If "
     (:PARAM NIL "typespec") " is " (:TYPEREF NIL "character")
     ", the result is " (:TERM NIL "type equivalent") " to "
     (:TT NIL "character") ". " :PAR "The purpose of "
     (:FUNREF NIL "upgraded-array-element-type")
     " is to reveal how an implementation does its " (:TERM NIL "upgrading")
     ". " :PAR "The " (:PARAM NIL "environment") " is used to expand any "
     (:TERM NIL "derived type specifiers") " that are mentioned in the "
     (:PARAM NIL "typespec") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "array-element-type") ", "
     (:FUNREF NIL "make-array") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "Except for storage allocation consequences and dealing correctly with the optional "
     (:PARAM NIL "environment") " " (:TERM NIL "argument") ", "
     (:FUNREF NIL "upgraded-array-element-type") " could be defined as: " :PAR
     (:CODE NIL
      " (defun upgraded-array-element-type (type &optional environment)
   (array-element-type (make-array 0 :element-type type)))
")
     " " :PAR
     (:ENDISSUE NIL "ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING") " "
     (:ENDISSUE NIL "SUBTYPEP-ENVIRONMENT:ADD-ARG") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ARRAY-DIMENSION-LIMIT")
   (:COM (:NAME "array-dimension-limit" :FTYPE "Constant Variable")
    (:PART (:NAME "Constant Value") " " :PAR "A positive "
     (:ISSUE NIL "FIXNUM-NON-PORTABLE:TIGHTEN-DEFINITION") " "
     (:TERM NIL "fixnum") ", "
     (:ENDISSUE NIL "FIXNUM-NON-PORTABLE:TIGHTEN-DEFINITION")
     " the exact magnitude of which is " (:TERM NIL "implementation-dependent")
     ", but which is not less than " (:TT NIL "1024") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 17.1.0 18")
     "The upper exclusive bound on each individual " (:TERM NIL "dimension")
     " of an " (:TERM NIL "array") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-array") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ARRAY-RANK-LIMIT")
   (:COM (:NAME "array-rank-limit" :FTYPE "Constant Variable")
    (:PART (:NAME "Constant Value") " " :PAR "A positive "
     (:ISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " "
     (:TERM NIL "fixnum") ", "
     (:ENDISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM")
     " the exact magnitude of which is " (:TERM NIL "implementation-dependent")
     ", but which is not less than " (:TT NIL "8") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 17.1.0 17")
     "The upper exclusive bound on the " (:TERM NIL "rank") " of an "
     (:TERM NIL "array") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-array") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ARRAY-TOTAL-SIZE-LIMIT")
   (:COM (:NAME "array-total-size-limit" :FTYPE "Constant Variable")
    (:PART (:NAME "Constant Value") " " :PAR "A positive "
     (:ISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " "
     (:TERM NIL "fixnum") ", "
     (:ENDISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM")
     " the exact magnitude of which is " (:TERM NIL "implementation-dependent")
     ", but which is not less than " (:TT NIL "1024") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 17.1.0 19")
     "The upper exclusive bound on the " (:TERM NIL "array total size")
     " of an " (:TERM NIL "array") ". " :PAR (:COMMENT NIL "% 17.1.0 20")
     "The actual limit on the " (:TERM NIL "array total size")
     " imposed by the " (:TERM NIL "implementation")
     " might vary according the " (:TERM NIL "element type") " of the "
     (:TERM NIL "array") "; in this case, the value of "
     (:CONREF NIL "array-total-size-limit")
     " will be the smallest of these possible limits. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-array") ", "
     (:FUNREF NIL "array-element-type") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "-------------------- Vectors --------------------")
   :PAR (:COMMENT NIL "%% ========== SIMPLE-VECTOR-P")
   (:COM (:NAME "simple-vector-p" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "simple-vector-p")
      (:ARGLIST NIL "object") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 21")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "simple-vector")
     "; otherwise, returns " (:TERM NIL "false") ".. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (simple-vector-p (make-array 6)) → " (:TERM NIL "true") "
 (simple-vector-p \"aaaaaa\") → "
      (:TERM NIL "false") "
 (simple-vector-p (make-array 6 :fill-pointer t)) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:TYPEREF NIL "simple-vector") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (simple-vector-p " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'simple-vector)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SVREF")
   (:COM (:NAME "svref" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "svref")
      (:ARGLIST NIL "simple-vector index") (:VALUES NIL "element"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "svref")
      (:ARGLIST NIL "simple-vector index") (:NEW-VALUE NIL "new-element"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "simple-vector")
     "—a " (:TERM NIL "simple vector") ". " :PAR (:PARAM NIL "index") "—a "
     (:TERM NIL "valid array index") " for the " (:PARAM NIL "simple-vector")
     ". " :PAR (:PARAM NIL "element") ", " (:PARAM NIL "new-element") "—an "
     (:TERM NIL "object") " (whose " (:TERM NIL "type") " is a "
     (:TERM NIL "subtype") " of the " (:TERM NIL "array element type")
     " of the " (:PARAM NIL "simple-vector") "). " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 17.2.0 7")
     (:TERM NIL "Accesses") " the " (:TERM NIL "element") " of "
     (:PARAM NIL "simple-vector") " specified by " (:PARAM NIL "index") ". "
     :PAR
     (:COMMENT NIL "% Implied by use of \"Access\". -kmp 15-Jan-92"
      " %% 17.2.0 7"
      " \\macref{setf} may be used with \\funref{svref} to destructively replace"
      " a \\term{simple vector} element with a new value.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (simple-vector-p (setq v (vector 1 2 'sirens))) → "
      (:TERM NIL "true") "
 (svref v 0) → 1
 (svref v 2) → SIRENS
 (setf (svref v 1) 'newcomer) → NEWCOMER               
 v → #(1 NEWCOMER SIRENS)
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "aref") ", "
     (:FUNREF NIL "sbit") ", " (:FUNREF NIL "schar") ", "
     (:FUNREF NIL "vector") ", " (:ISSUE NIL "CONSTANT-MODIFICATION:DISALLOW")
     " " (:SECREF NIL :CONSTANT-MODIFICATION) " "
     (:ENDISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 17.2.0 8")
     (:FUNREF NIL "svref") " is identical to " (:FUNREF NIL "aref")
     " except that it requires its first argument to be a "
     (:TERM NIL "simple vector") ". " :PAR
     (:CODE NIL " (svref " (:PARAM NIL "v") " " (:PARAM NIL "i")
      ") ≡ (aref (the simple-vector " (:PARAM NIL "v") ") " (:PARAM NIL "i") ")
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== VECTOR")
   (:COM (:NAME "vector" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "vector")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " objects") (:VALUES NIL "vector"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "vector") "—a "
     (:TERM NIL "vector") " of " (:TERM NIL "type") " "
     (:TT NIL "(vector t " (:TT NIL " *") ")") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 17.1.0 21")
     "Creates a " (:TERM NIL "fresh") " " (:TERM NIL "simple general vector")
     " whose size corresponds to the number of " (:PARAM NIL "objects") ". "
     :PAR "The " (:TERM NIL "vector") " is initialized to contain the "
     (:PARAM NIL "objects") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (arrayp (setq v (vector 1 2 'sirens))) → " (:TERM NIL "true")
      "
 (vectorp v) → "
      (:TERM NIL "true") "
 (simple-vector-p v) → "
      (:TERM NIL "true") "         
 (length v) → 3
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-array") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "vector") " is analogous to "
     (:FUNREF NIL "list") ". " :PAR
     (:CODE NIL " (vector a" (:SUB NIL "1") " a" (:SUB NIL "2") " ... a"
      (:SUB NIL "n") ")
  ≡ (make-array (list "
      (:I NIL "n") ") :element-type t
                          :initial-contents 
                            (list a"
      (:SUB NIL "1") " a" (:SUB NIL "2") " ... a" (:SUB NIL "n") "))
")
     " "))
   " " :PAR (:COMMENT NIL "%% ========== VECTOR-POP")
   (:COM (:NAME "vector-pop" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "vector-pop") (:ARGLIST NIL "vector")
      (:VALUES NIL "element"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "vector") "—a "
     (:TERM NIL "vector") " with a " (:TERM NIL "fill pointer") ". " :PAR
     (:PARAM NIL "element") "—an " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 17.5.0 10")
     "Decreases the " (:TERM NIL "fill pointer") " of " (:PARAM NIL "vector")
     " by one, and retrieves the " (:TERM NIL "element") " of "
     (:PARAM NIL "vector") " that is designated by the new "
     (:TERM NIL "fill pointer") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (vector-push (setq fable (list 'fable))
              (setq fa (make-array 8
                                   :fill-pointer 2
                                   :initial-element 'sisyphus))) → 2 
 (fill-pointer fa) → 3 
 (eq (vector-pop fa) fable) → "
      (:TERM NIL "true") "
 (vector-pop fa) → SISYPHUS 
 (fill-pointer fa) → 1 
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:TERM NIL "fill pointer")
     " is decreased by one. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The value of the "
     (:TERM NIL "fill pointer") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error") " is signaled if "
     (:PARAM NIL "vector") " does not have a " (:TERM NIL "fill pointer") ". "
     :PAR "If the " (:TERM NIL "fill pointer") " is zero, "
     (:FUNREF NIL "vector-pop") " signals an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "vector-push") ", "
     (:FUNREF NIL "vector-push-extend") ", " (:FUNREF NIL "fill-pointer") " "
     :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== VECTOR-PUSH"
    "%% ========== VECTOR-PUSH-EXTEND")
   (:COM (:NAME "vector-push, vector-push-extend" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "vector-push")
      (:ARGLIST NIL "new-element vector") (:VALUES NIL "new-index-p"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "vector-push-extend")
      (:ARGLIST NIL "new-element vector " (:KEYWORD NIL " &optional")
       " extension")
      (:VALUES NIL "new-index"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "new-element")
     "—an " (:TERM NIL "object") ". " :PAR (:PARAM NIL "vector") "—a "
     (:TERM NIL "vector") " with a " (:TERM NIL "fill pointer") ". " :PAR
     (:PARAM NIL "extension") "—a positive " (:TERM NIL "integer")
     ". The default is " (:TERM NIL "implementation-dependent") ". " :PAR
     (:PARAM NIL "new-index-p") "—a " (:TERM NIL "valid array index") " for "
     (:PARAM NIL "vector") ", or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "new-index") "—a " (:TERM NIL "valid array index") " for "
     (:PARAM NIL "vector") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 17.5.0 8")
     (:FUNREF NIL "vector-push") " and " (:FUNREF NIL "vector-push-extend")
     " store " (:PARAM NIL "new-element") " in " (:PARAM NIL "vector") ". "
     (:FUNREF NIL "vector-push") " attempts to store "
     (:PARAM NIL "new-element") " in the element of " (:PARAM NIL "vector")
     " designated by the " (:TERM NIL "fill pointer") ", and to increase the "
     (:TERM NIL "fill pointer") " by one. If the "
     (:TT NIL "(>= (fill-pointer " (:PARAM NIL "vector") ") (array-dimension "
      (:PARAM NIL "vector") " 0))")
     ", neither " (:PARAM NIL "vector") " nor its " (:TERM NIL "fill pointer")
     " are affected. Otherwise, the store and increment take place and "
     (:FUNREF NIL "vector-push") " returns the former value of the "
     (:TERM NIL "fill pointer") " which is one less than the one it leaves in "
     (:PARAM NIL "vector") ". " :PAR (:COMMENT NIL "% 17.5.0 9")
     (:FUNREF NIL "vector-push-extend") " is just like "
     (:FUNREF NIL "vector-push") " except that if the "
     (:TERM NIL "fill pointer") " gets too large, " (:PARAM NIL "vector")
     " is extended using " (:FUNREF NIL "adjust-array")
     " so that it can contain more elements. " (:PARAM NIL "Extension")
     " is the minimum number of elements to be added to " (:PARAM NIL "vector")
     " if it must be extended. " :PAR (:FUNREF NIL "vector-push") " and "
     (:FUNREF NIL "vector-push-extend") " return the index of "
     (:PARAM NIL "new-element") " in " (:PARAM NIL "vector") ". If "
     (:TT NIL "(>= (fill-pointer " (:PARAM NIL "vector") ") (array-dimension "
      (:PARAM NIL "vector") " 0))")
     ", " (:FUNREF NIL "vector-push") " returns " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (vector-push (setq fable (list 'fable))
              (setq fa (make-array 8 
                                   :fill-pointer 2
                                   :initial-element 'first-one))) → 2 
 (fill-pointer fa) → 3 
 (eq (aref fa 2) fable) → "
      (:TERM NIL "true") "
 (vector-push-extend #\\X
                    (setq aa 
                          (make-array 5
                                      :element-type 'character
                                      :adjustable t
                                      :fill-pointer 3))) → 3 
 (fill-pointer aa) → 4 
 (vector-push-extend #\\Y aa 4) → 4 
 (array-total-size aa) → at least 5 
 (vector-push-extend #\\Z aa 4) → 5 
 (array-total-size aa) → 9 ;(or more)
")
     " " :PAR)
    (:PART (:NAME "Affected By") " The value of the "
     (:TERM NIL "fill pointer") ". " :PAR "How " (:PARAM NIL "vector")
     " was created. " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error") " is signaled by "
     (:FUNREF NIL "vector-push-extend") " if it tries to extend "
     (:PARAM NIL "vector") " and " (:PARAM NIL "vector") " is not "
     (:TERM NIL "actually adjustable") ". " :PAR "An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error") " is signaled if "
     (:PARAM NIL "vector") " does not have a " (:TERM NIL "fill pointer") ". "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "adjustable-array-p") ", "
     (:FUNREF NIL "fill-pointer") ", " (:FUNREF NIL "vector-pop") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== VECTORP")
   (:COM (:NAME "vectorp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "vectorp") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 20")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "vector") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (vectorp \"aaaaaa\") → " (:TERM NIL "true") "
 (vectorp (make-array 6 :fill-pointer t)) → "
      (:TERM NIL "true") "
 (vectorp (make-array '(2 3 4))) → "
      (:TERM NIL "false") "
 (vectorp #*11) → "
      (:TERM NIL "true") "
 (vectorp #b11) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " "
     (:CODE NIL " (vectorp " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'vector)
")
     " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Bit Vectors --------------------") :PAR
   (:COMMENT NIL "%% ========== BIT" "%% ========== SBIT")
   (:COM (:NAME "bit, sbit" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "bit" "sbit")
      (:ARGLIST NIL "bit-array " (:KEYWORD NIL " &rest") " subscripts")
      (:VALUES NIL "bit"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "bit" "sbit")
      (:ARGLIST NIL "bit-array " (:KEYWORD NIL " &rest") " subscripts")
      (:NEW-VALUE NIL "new-bit"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "bit-array")
     "—for " (:FUNREF NIL "bit") ", a " (:TERM NIL "bit array") "; for "
     (:FUNREF NIL "sbit") ", a " (:TERM NIL "simple bit array") ". " :PAR
     (:PARAM NIL "subscripts") "—a " (:TERM NIL "list") " of "
     (:TERM NIL "valid array indices") " for the " (:PARAM NIL "bit-array")
     ". " :PAR (:PARAM NIL "bit") "—a " (:TERM NIL "bit") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 17.4.0 3" "% 17.4.0 4") (:FUNREF NIL "bit") " and "
     (:FUNREF NIL "sbit") " " (:TERM NIL "access") " the "
     (:PARAM NIL "bit-array") " " (:TERM NIL "element") " specified by "
     (:PARAM NIL "subscripts") ". " :PAR
     (:COMMENT NIL "!!! Is this necessary to say? How is it said elsewhere?")
     "These " (:TERM NIL "functions") " ignore the " (:TERM NIL "fill pointer")
     " when " (:TERM NIL "accessing") " " (:TERM NIL "elements") ". " :PAR
     (:COMMENT NIL "% This is implied by \"access\" above." " %% 17.4.0 6"
      " \\macref{setf} can be used with \\funref{bit} or \\funref{sbit} to destructively "
      " replace a \\term{bit array} \\term{element} with a new value.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (bit (setq ba (make-array 8 
                            :element-type 'bit 
                            :initial-element 1))
       3) → 1
 (setf (bit ba 3) 0) → 0
 (bit ba 3) → 0
 (sbit ba 5) → 1
 (setf (sbit ba 5) 1) → 1
 (sbit ba 5) → 1
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "aref") ", "
     (:ISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:SECREF NIL :CONSTANT-MODIFICATION) " "
     (:ENDISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 17.4.0 7")
     (:FUNREF NIL "bit") " and " (:FUNREF NIL "sbit") " are like "
     (:FUNREF NIL "aref") " except that they require " (:PARAM NIL "arrays")
     " to be a " (:TERM NIL "bit array") " and a "
     (:TERM NIL "simple bit array") ", respectively. " :PAR
     (:COMMENT NIL "% 17.4.0 5") (:FUNREF NIL "bit") " and "
     (:FUNREF NIL "sbit") ", unlike " (:FUNREF NIL "char") " and "
     (:FUNREF NIL "schar") ", allow the first argument to be an "
     (:TERM NIL "array") " of any " (:TERM NIL "rank") ". " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== BIT-AND" "%% ========== BIT-ANDC1"
    "%% ========== BIT-ANDC2" "%% ========== BIT-EQV" "%% ========== BIT-IOR"
    "%% ========== BIT-NAND" "%% ========== BIT-NOR" "%% ========== BIT-NOT"
    "%% ========== BIT-ORC1" "%% ========== BIT-ORC2" "%% ========== BIT-XOR")
   (:COM
    (:NAME
     "bit-and, bit-andc1, bit-andc2, bit-eqv, bit-ior, bit-nand, bit-nor, bit-not, bit-orc1, bit-orc2, bit-xor"
     :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function")
      (:NAMES NIL "bit-and" "bit-andc1" "bit-andc2" "bit-eqv" "bit-ior"
       "bit-nand" "bit-nor" "bit-orc1" "bit-orc2" "bit-xor")
      (:ARGLIST NIL "bit-array1 bit-array2 " (:KEYWORD NIL " &optional")
       " opt-arg")
      (:VALUES NIL "resulting-bit-array"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "bit-not")
      (:ARGLIST NIL "bit-array " (:KEYWORD NIL " &optional") " opt-arg")
      (:VALUES NIL "resulting-bit-array"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "bit-array")
     ", " (:PARAM NIL "bit-array1") ", " (:PARAM NIL "bit-array2") "—a "
     (:TERM NIL "bit array") ". " :PAR (:PARAM NIL "Opt-arg") "—a "
     (:TERM NIL "bit array") ", or " (:MISC NIL "t") ", or " (:MISC NIL "nil")
     ". The default is " (:MISC NIL "nil") ". " :PAR
     (:COMMENT NIL "!!! This needs work. -kmp 24-May-91")
     (:PARAM NIL "Bit-array") ", " (:PARAM NIL "bit-array1") ", "
     (:PARAM NIL "bit-array2") ", and " (:PARAM NIL "opt-arg") " (if an "
     (:TERM NIL "array") ") must all be of the same " (:TERM NIL "rank")
     " and " (:TERM NIL "dimensions") ". " :PAR
     (:PARAM NIL "resulting-bit-array") "—a " (:TERM NIL "bit array") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 17.4.0 8")
     "These functions perform bit-wise logical operations on "
     (:PARAM NIL "bit-array1") " and " (:PARAM NIL "bit-array2")
     " and return an " (:TERM NIL "array") " of matching " (:TERM NIL "rank")
     " and " (:TERM NIL "dimensions")
     ", such that any given bit of the result is produced by operating on corresponding bits from each of the arguments. "
     :PAR (:COMMENT NIL "% 17.4.0 11") "In the case of "
     (:FUNREF NIL "bit-not") ", an " (:TERM NIL "array") " of "
     (:TERM NIL "rank") " and " (:TERM NIL "dimensions") " matching "
     (:PARAM NIL "bit-array") " is returned that contains a copy of "
     (:PARAM NIL "bit-array") " with all the bits inverted. " :PAR
     (:COMMENT NIL "% 17.4.0 9" "% 17.4.0 12") "If " (:PARAM NIL "opt-arg")
     " is of type " (:TT NIL "(array bit)")
     " the contents of the result are destructively placed into "
     (:PARAM NIL "opt-arg") ". If " (:PARAM NIL "opt-arg") " is the symbol "
     (:MISC NIL "t") ", " (:PARAM NIL "bit-array") " or "
     (:PARAM NIL "bit-array1") " is replaced with the result; if "
     (:PARAM NIL "opt-arg") " is " (:MISC NIL "nil") " or omitted, a new "
     (:TERM NIL "array") " is created to contain the result. " :PAR
     (:COMMENT NIL "% 17.4.0 10") (:NEXTFIGURE (:CAPS T))
     " indicates the logical operation performed by each of the "
     (:TERM NIL "functions") ". " :PAR
     (:FIGURE NIL " "
      (:TABLE (:NAME NIL)
       (:ROW NIL (:CELL NIL (:B NIL " Function"))
        (:CELL NIL (:B NIL " Operation")))
       (:ROW (:RULE T :GAP 4) (:CELL NIL (:FUNREF NIL "bit-and"))
        (:CELL NIL "and"))
       (:ROW NIL (:CELL NIL (:FUNREF NIL "bit-eqv"))
        (:CELL NIL "equivalence (exclusive nor)"))
       (:ROW NIL (:CELL NIL (:FUNREF NIL "bit-not")) (:CELL NIL "complement"))
       (:ROW NIL (:CELL NIL (:FUNREF NIL "bit-ior"))
        (:CELL NIL "inclusive or"))
       (:ROW NIL (:CELL NIL (:FUNREF NIL "bit-xor"))
        (:CELL NIL "exclusive or"))
       (:ROW NIL (:CELL NIL (:FUNREF NIL "bit-nand"))
        (:CELL NIL "complement of " (:PARAM NIL "bit-array1") " and "
         (:PARAM NIL "bit-array2")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL "bit-nor"))
        (:CELL NIL "complement of " (:PARAM NIL "bit-array1") " or "
         (:PARAM NIL "bit-array2")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL "bit-andc1"))
        (:CELL NIL "and complement of " (:PARAM NIL "bit-array1") " with "
         (:PARAM NIL "bit-array2")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL "bit-andc2"))
        (:CELL NIL "and " (:PARAM NIL "bit-array1") " with complement of "
         (:PARAM NIL "bit-array2")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL "bit-orc1"))
        (:CELL NIL "or complement of " (:PARAM NIL "bit-array1") " with "
         (:PARAM NIL "bit-array2")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL "bit-orc2"))
        (:CELL NIL "or " (:PARAM NIL "bit-array1") " with complement of "
         (:PARAM NIL "bit-array2")))
       (:ROW NIL
        (:CELL NIL
         (:CAPTION NIL "Bit-wise Logical Operations on Bit Arrays"))))
      " ")
     " " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (bit-and (setq ba #*11101010) #*01101011) → #*01101010
 (bit-and #*1100 #*1010) → #*1000      
 (bit-andc1 #*1100 #*1010) → #*0010
 (setq rba (bit-andc2 ba #*00110011 t)) → #*11001000
 (eq rba ba) → "
      (:TERM NIL "true") "
 (bit-not (setq ba #*11101010)) → #*00010101
 (setq rba (bit-not ba 
                     (setq tba (make-array 8 
                                           :element-type 'bit))))
→ #*00010101
 (equal rba tba) → "
      (:TERM NIL "true") "
 (bit-xor #*1100 #*1010) → #*0110
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "lognot") ", "
     (:FUNREF NIL "logand") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== BIT-VECTOR-P")
   (:COM (:NAME "bit-vector-p" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "bit-vector-p")
      (:ARGLIST NIL "object") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 19")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "bit-vector") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (bit-vector-p (make-array 6 
                           :element-type 'bit 
                           :fill-pointer t)) → "
      (:TERM NIL "true") "
 (bit-vector-p #*) → "
      (:TERM NIL "true") "
 (bit-vector-p (make-array 6)) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "typep") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (bit-vector-p " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'bit-vector)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SIMPLE-BIT-VECTOR-P")
   (:COM (:NAME "simple-bit-vector-p" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "simple-bit-vector-p")
      (:ARGLIST NIL "object") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 23")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "simple-bit-vector")
     "; otherwise, returns " (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (simple-bit-vector-p (make-array 6)) → " (:TERM NIL "false") "
 (simple-bit-vector-p #*) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "simple-vector-p") " "
     :PAR)
    (:PART (:NAME "Notes") " "
     (:CODE NIL " (simple-bit-vector-p " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'simple-bit-vector)
")
     " " :PAR))
   " " :PAR)
  " " :PAR)
 (:CHAPTER
  (:NUM "16" :TITLE ("Strings") :NUMTAG :CHAP-SIXTEEN :NAMETAG :STRINGS)
  (:SECTION (:TITLE ("String Concepts") :TAGS (:STRING-CONCEPTS)) " " :PAR
   (:SUBSECTION
    (:TITLE ("Implications of Strings Being Arrays") :TAGS
     (:STRINGS-ARE-ARRAYS))
    " " :PAR "Since all " (:TERM NIL "strings") " are " (:TERM NIL "arrays")
    ", all rules which apply generally to " (:TERM NIL "arrays")
    " also apply to " (:TERM NIL "strings") ". See "
    (:SECREF NIL :ARRAY-CONCEPTS) ". " :PAR "For example, "
    (:TERM NIL "strings") " can have " (:TERM NIL "fill pointers") ", and "
    (:TERM NIL "strings") " are also subject to the rules of "
    (:TERM NIL "element type") " " (:TERM NIL "upgrading") " that apply to "
    (:TERM NIL "arrays") ". " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Subtypes of STRING"))
    (:ISSUE NIL "CHARACTER-PROPOSAL:2") " "
    (:COMMENT NIL " All functions defined to operate on \\term{strings} treat"
     " \\term{base strings} uniformly with "
     " other \\term{strings} with the following"
     " caveat: for any function that inserts a \\term{character} "
     " into a \\term{string}, the consequences are undefined"
     " if an \\term{extended character} is inserted "
     " into a \\term{base string}.")
    "All functions that operate on " (:TERM NIL "strings") " will operate on "
    (:TERM NIL "subtypes") " of " (:TERM NIL "string") " as well. " :PAR
    "However, the consequences are undefined if a " (:TERM NIL "character")
    " is inserted into a " (:TERM NIL "string") " for which the "
    (:TERM NIL "element type") " of the " (:TERM NIL "string")
    " does not include that " (:TERM NIL "character") ". " :PAR
    (:ENDISSUE NIL "CHARACTER-PROPOSAL:2") " "))
  :PAR
  (:DICTIONARY NIL :PAR (:COMMENT NIL " Strings") :PAR
   (:COMMENT NIL "-------------------- Strings --------------------") :PAR
   (:COMMENT NIL "% 2.5.2 1" "% 18.0.0 3")
   (:COM (:NAME "string" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "string") ", "
     (:COMMENT NIL "% 2.15.0 16") (:TYPEREF NIL "vector") ", "
     (:TYPEREF NIL "array") ", " (:TYPEREF NIL "sequence") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-3-2") " A " (:TERM NIL "string")
     " is a " (:TERM NIL "specialized") " " (:TERM NIL "vector") " whose "
     (:TERM NIL "elements") " are of " (:TERM NIL "type") " "
     (:TYPEREF NIL "character") " or a " (:TERM NIL "subtype") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "character") ". When used as a "
     (:TERM NIL "type specifier") " for object creation, "
     (:TYPEREF NIL "string") " means " (:TT NIL "(vector character)") ". "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-3-2") " " :PAR
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-3-3") " " :PAR)
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Abbreviating. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:COMMENT NIL "% 4.6.0 10")
     (:DEF (:KIND "type") (:NAMES NIL "string")
      (:ARGLIST NIL (:BRAC NIL "size")))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:ISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " "
     (:PARAM NIL "size") "—a non-negative " (:TERM NIL "fixnum") ", or the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". "
     (:ENDISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     "This denotes the union of all " (:TERM NIL "types") " "
     (:TT NIL "(array " (:I NIL "c") " (" (:PARAM NIL "size") "))") " for all "
     (:TERM NIL "subtypes") " " (:I NIL "c") " of " (:TYPEREF NIL "character")
     "; that is, the set of " (:TERM NIL "strings") " of size "
     (:PARAM NIL "size") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :STRING-CONCEPTS) ", "
     (:SECREF NIL :DOUBLEQUOTE) ", " (:SECREF NIL :PRINTING-STRINGS) " " :PAR))
   (:COM (:NAME "base-string" :FTYPE "Type")
    (:ISSUE NIL "CHARACTER-PROPOSAL:2-3-3") " " :PAR
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "base-string") ", "
     (:TYPEREF NIL "string") ", " (:TYPEREF NIL "vector") ", "
     (:TYPEREF NIL "array") ", " (:TYPEREF NIL "sequence") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "base-string") " is equivalent to "
     (:ISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " "
     (:TT NIL "(vector base-char)") ". "
     (:ENDISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " "
     (:COMMENT NIL
      " A \\term{base string} is the most efficient \\term{string} that can hold"
      " %%this next phrase added in answer to Symbolics' concerns that"
      " %%otherwise a special representation for certain subsets of standard-char"
      " %%might be unintentionally prohibited by the spec."
      " an arbitrary sequence of \\term{standard characters}."
      "% Rewritten for Sandra to use \"representation\" -kmp 13-Jan-92"
      "!!! KAB (re: \"efficient\") I think we never decided what this meant. True?"
      "KMP: True.")
     "The " (:TERM NIL "base string") " representation is the most efficient "
     (:TERM NIL "string")
     " representation that can hold an arbitrary sequence of "
     (:TERM NIL "standard characters") ". " :PAR
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-3-3") " "
     (:COMMENT NIL "!!! Should this be said somewhere??"
      "\\issue{CHARACTER-PROPOSAL:2-3}"
      "An implementation can support \\term{string} subtypes in addition"
      "to the ones defined in this standard." "For example, an"
      "implementation supporting Arabic and Cyrillic characters"
      "might provide as extended characters:" "\\beginlist"
      "\\itemitem{\\typeref{general-string}}"
      "Can contain Arabic, Cyrillic or \\term{base characters}"
      "in any mixture." "\\itemitem{\\typeref{region-specialized-string}}"
      "Can contain installation-selected repertoire "
      "(Arabic/Cyrillic) or \\term{base characters} in any mixture."
      "\\itemitem{\\typeref{base-string}}"
      "Can contain \\term{base characters}." "\\endlist"
      "Though portability of applications using"
      "\\typeref{region-specialized-string} is limited, a performance"
      "advantage might argue for its use." " " "Alternatively,"
      "an implementation" "supporting a large base character repertoire"
      "including, say, Japanese Kanji might define"
      "\\issue{CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT}"
      "\\typeref{base-char}"
      "\\endissue{CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT}"
      "as equivalent to \\term{character}."
      " %We expect that applications sensitive to the performance"
      "%of character handling in some host environments will"
      "%utilize the string subtypes to provide performance"
      "%improvement.  Applications with emphasis on international"
      "%portability will likely utilize only {\\clkwd general-strings}."
      "\\term{Base strings} allow for more compact representation of "
      "\\term{strings}"
      "of \\term{base characters}, which are likely to predominate in any system."
      "Note that in any particular implementation the \\term{base characters}"
      "need not be the" "most compactly representable, since others might have"
      "a smaller repertoire."
      "However, in most implementations \\term{base strings} are"
      "likely to be more space efficient than other types of \\term{strings}."
      "\\endissue{CHARACTER-PROPOSAL:2-3}")
     :PAR)
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Abbreviating. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:ISSUE NIL "JUN90-TRIVIAL-ISSUES:24") " "
     (:DEF (:KIND "type") (:NAMES NIL "base-string")
      (:ARGLIST NIL (:BRAC NIL "size")))
     " " (:ENDISSUE NIL "JUN90-TRIVIAL-ISSUES:24") " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:ISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " "
     (:PARAM NIL "size") "—a non-negative " (:TERM NIL "fixnum") ", or the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". "
     (:ENDISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     "This is equivalent to the type "
     (:TT NIL "(vector base-char " (:PARAM NIL "size") ")")
     "; that is, the set of " (:TERM NIL "base strings") " of size "
     (:PARAM NIL "size") ". " :PAR (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-3-3")
     " "))
   (:COM (:NAME "simple-string" :FTYPE "Type")
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "simple-string") ", "
     (:COMMENT NIL "% 2.15.0 23") (:TYPEREF NIL "string") ", "
     (:TYPEREF NIL "vector") ", " (:TYPEREF NIL "simple-array") ", "
     (:TYPEREF NIL "array") ", " (:TYPEREF NIL "sequence") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-3-4") " "
     (:COMMENT NIL
      "A \\term{string} that is not displaced to another \\term{array},"
      "has no \\term{fill pointer}, and is not to have its size adjusted "
      "dynamically after creation is a \\typeref{simple-string}.")
     "A " (:TERM NIL "simple string") " is a specialized one-dimensional "
     (:TERM NIL "simple array") " whose " (:TERM NIL "elements") " are of "
     (:TERM NIL "type") " " (:TYPEREF NIL "character") " or a "
     (:TERM NIL "subtype") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "character") ". When used as a "
     (:TERM NIL "type specifier") " for object creation, "
     (:TYPEREF NIL "simple-string") " means "
     (:TT NIL "(simple-array character (" (:I NIL "size") "))") ". "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-3-4") " " :PAR)
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Abbreviating. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:DEF (:KIND "type") (:NAMES NIL "simple-string")
      (:ARGLIST NIL (:BRAC NIL "size")))
     " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:ISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " "
     (:PARAM NIL "size") "—a non-negative " (:TERM NIL "fixnum") ", or the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". "
     (:ENDISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     (:COMMENT NIL "% 4.6.0 11                                  "
      "\\itemitem{\\tt (simple-string \\param{size})}")
     :PAR "This denotes the union of all " (:TERM NIL "types") " "
     (:TT NIL " (simple-array " (:I NIL "c") " (" (:PARAM NIL "size") "))")
     " for all " (:TERM NIL "subtypes") " " (:I NIL "c") " of "
     (:TYPEREF NIL "character") "; that is, the set of "
     (:TERM NIL "simple strings") " of size " (:PARAM NIL "size") ". " :PAR))
   (:ISSUE NIL "CHARACTER-PROPOSAL:2-3-5") " "
   (:COM (:NAME "simple-base-string" :FTYPE "Type")
    (:PART (:NAME "Supertypes") " " :PAR (:TYPEREF NIL "simple-base-string")
     ", " (:TYPEREF NIL "base-string") ", " (:TYPEREF NIL "simple-string") ", "
     (:TYPEREF NIL "string") ", " (:TYPEREF NIL "vector") ", "
     (:TYPEREF NIL "simple-array") ", " (:TYPEREF NIL "array") ", "
     (:TYPEREF NIL "sequence") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "simple-base-string") " is equivalent to "
     (:ISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " "
     (:TT NIL "(simple-array base-char (*))") ". "
     (:ENDISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-3-5") " " :PAR)
    (:PART (:NAME "Compound Type Specifier Kind") " " :PAR "Abbreviating. "
     :PAR)
    (:PART (:NAME "Compound Type Specifier Syntax") " " :PAR
     (:ISSUE NIL "JUN90-TRIVIAL-ISSUES:24") " "
     (:DEF (:KIND "type") (:NAMES NIL "simple-base-string")
      (:ARGLIST NIL (:BRAC NIL "size")))
     " " (:ENDISSUE NIL "JUN90-TRIVIAL-ISSUES:24") " " :PAR)
    (:PART (:NAME "Compound Type Specifier Arguments") " " :PAR
     (:ISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " "
     (:PARAM NIL "size") "—a non-negative " (:TERM NIL "fixnum") ", or the "
     (:TERM NIL "symbol") " " (:MISC NIL "*") ". "
     (:ENDISSUE NIL "ARRAY-DIMENSION-IMPLICATIONS:ALL-FIXNUM") " " :PAR)
    (:PART (:NAME "Compound Type Specifier Description") " " :PAR
     "This is equivalent to the type "
     (:TT NIL "(simple-array base-char (" (:PARAM NIL "size") "))")
     "; that is, the set of " (:TERM NIL "simple base strings") " of size "
     (:PARAM NIL "size") ". " :PAR))
   :PAR (:COMMENT NIL "%% ========== SIMPLE-STRING-P")
   (:COM (:NAME "simple-string-p" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "simple-string-p")
      (:ARGLIST NIL "object") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 22")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "simple-string")
     "; otherwise, returns " (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (simple-string-p \"aaaaaa\") → " (:TERM NIL "true") "
 (simple-string-p (make-array 6 
                              :element-type 'character 
                              :fill-pointer t)) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " "
     (:CODE NIL " (simple-string-p " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'simple-string)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== CHAR" "%% ========== SCHAR")
   (:COM (:NAME "char, schar" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "char" "schar")
      (:ARGLIST NIL "string index") (:VALUES NIL "character"))
     " " :PAR
     (:DEF (:KIND "setf") (:NAMES NIL "char" "schar")
      (:ARGLIST NIL "string index") (:NEW-VALUE NIL "new-character"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:COMMENT NIL "% 18.1.0 4")
     (:PARAM NIL "string") "—for " (:FUNREF NIL "char") ", a "
     (:TERM NIL "string") "; for " (:FUNREF NIL "schar") ", a "
     (:TERM NIL "simple string") ". " :PAR (:PARAM NIL "index") "—a "
     (:TERM NIL "valid array index") " for the " (:PARAM NIL "string") ". "
     :PAR (:PARAM NIL "character") ", " (:PARAM NIL "new-character") "—a "
     (:TERM NIL "character") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 18.1.0 3")
     (:FUNREF NIL "char") " and " (:FUNREF NIL "schar") " "
     (:TERM NIL "access") " the " (:TERM NIL "element") " of "
     (:PARAM NIL "string") " specified by " (:PARAM NIL "index") ". "
     (:COMMENT NIL "% This is now said in the concept stuff."
      " \\param{Index} is an offset from the beginning"
      " of \\param{string}; indexing is zero-origin.")
     :PAR (:FUNREF NIL "char") " ignores " (:TERM NIL "fill pointers") " when "
     (:TERM NIL "accessing") " " (:TERM NIL "elements") ". " :PAR
     (:COMMENT NIL "% KAB: Implied by \"access\"."
      " \\macref{setf} can be used with \\funref{char} or \\funref{schar}"
      " to destructively replace an \\term{element} of the \\param{string}.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (setq my-simple-string (make-string 6 :initial-element #\\A)) → \"AAAAAA\"
 (schar my-simple-string 4) → #\\A
 (setf (schar my-simple-string 4) #\\B) → #\\B
 my-simple-string → \"AAAABA\"
 (setq my-filled-string
       (make-array 6 :element-type 'character
                     :fill-pointer 5
                     :initial-contents my-simple-string))
→ \"AAAAB\"
 (char my-filled-string 4) → #\\B
 (char my-filled-string 5) → #\\A
 (setf (char my-filled-string 3) #\\C) → #\\C
 (setf (char my-filled-string 5) #\\D) → #\\D
 (setf (fill-pointer my-filled-string) 6) → 6
 my-filled-string → \"AAACBD\"
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR
     (:COMMENT NIL "!!! Barrett thinks stuff belongs here.") :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "aref") ", "
     (:FUNREF NIL "elt") ", " (:ISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:SECREF NIL :CONSTANT-MODIFICATION) " "
     (:ENDISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (char s j) ≡ (aref (the string s) j)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== STRING")
   (:COM (:NAME "string" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "string") (:ARGLIST NIL "x")
      (:VALUES NIL "string"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " (:PARAM NIL "x") "—a "
     (:TERM NIL "string") ", a " (:TERM NIL "symbol") ", or a "
     (:TERM NIL "character") ". " (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1")
     " " :PAR (:PARAM NIL "string") "—a " (:TERM NIL "string") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns a " (:TERM NIL "string")
     " described by " (:PARAM NIL "x") "; specifically: " :PAR
     (:LIST NIL
      (:ITEM NIL " If " (:PARAM NIL "x") " is a " (:TERM NIL "string")
       ", it is returned. ")
      (:ITEM NIL " If " (:PARAM NIL "x") " is a " (:TERM NIL "symbol") ", its "
       (:TERM NIL "name") " is returned. ")
      (:ITEM NIL " " (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") "If "
       (:PARAM NIL "x") " is a " (:TERM NIL "character") ", "
       (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " then a "
       (:TERM NIL "string") " containing that one " (:TERM NIL "character")
       " is returned. ")
      (:ITEM NIL " " (:ISSUE NIL "STRING-COERCION:MAKE-CONSISTENT")
       (:FUNREF NIL "string") " might perform additional, "
       (:TERM NIL "implementation-defined") " conversions. "
       (:ENDISSUE NIL "STRING-COERCION:MAKE-CONSISTENT") " "))
     " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (string \"already a string\") → \"already a string\"
 (string 'elm) → \"ELM\"
 (string #\\c) → \"c\"
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "STRING-COERCION:MAKE-CONSISTENT")
     " In the case where a conversion is defined neither by this specification nor by the "
     (:TERM NIL "implementation") ", an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " is signaled. "
     (:ENDISSUE NIL "STRING-COERCION:MAKE-CONSISTENT") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "coerce") ", "
     (:TYPEREF NIL "string") " (" (:TERM NIL "type") "). " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL "% 18.3.0 14"
      "% KMP (13-Feb-91): Need to make it so that this is apparent and needn't be inferred"
      "%    from weird rules of thumb."
      "% Barmar: Do they allow a character argument?"
      "% KMP: No! Hmm. Removed for now as misleading."
      " Most of the string functions effectively apply \\funref{string}"
      " to their arguments that are supposed to be \\term{strings}.")
     :PAR (:COMMENT NIL "% 18.3.0 15") (:FUNREF NIL "coerce")
     " can be used to convert a " (:TERM NIL "sequence") " of "
     (:TERM NIL "characters") " to a " (:TERM NIL "string") ". " :PAR
     (:COMMENT NIL "% 18.3.0 15") (:FUNREF NIL "prin1-to-string") ", "
     (:FUNREF NIL "princ-to-string") ", " (:FUNREF NIL "write-to-string")
     ", or " (:FUNREF NIL "format") " (with a first argument of "
     (:MISC NIL "nil") ") can be used to get a " (:TERM NIL "string")
     " representation of a " (:TERM NIL "number") " or any other "
     (:TERM NIL "object") ". " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== NSTRING-CAPITALIZE"
    "%% ========== NSTRING-DOWNCASE" "%% ========== NSTRING-UPCASE"
    "%% ========== STRING-CAPITALIZE" "%% ========== STRING-DOWNCASE"
    "%% ========== STRING-UPCASE")
   (:COM
    (:NAME
     "string-upcase, string-downcase, string-capitalize, nstring-upcase, nstring-downcase, nstring-capitalize"
     :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function")
      (:NAMES NIL "string-upcase" "string-downcase" "string-capitalize")
      (:ARGLIST NIL "string " (:KEYWORD NIL " &key") " start end")
      (:VALUES NIL "cased-string"))
     " " :PAR
     (:DEF (:KIND "function")
      (:NAMES NIL "nstring-upcase" "nstring-downcase" "nstring-capitalize")
      (:ARGLIST NIL "string " (:KEYWORD NIL " &key") " start end")
      (:VALUES NIL "string"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "STRING-COERCION:MAKE-CONSISTENT") " " (:PARAM NIL "string")
     "—a " (:TERM NIL "string designator") ". For "
     (:FUNREF NIL "nstring-upcase") ", " (:FUNREF NIL "nstring-downcase")
     ", and " (:FUNREF NIL "nstring-capitalize") ", the " (:PARAM NIL "string")
     " " (:TERM NIL "designator") " must be a " (:TERM NIL "string") ". "
     (:ENDISSUE NIL "STRING-COERCION:MAKE-CONSISTENT") " " :PAR
     (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " "
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start") ", " (:PARAM NIL "end") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "string")
     ". The defaults for " (:PARAM NIL "start") " and " (:PARAM NIL "end")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " " :PAR
     (:COMMENT NIL "% 18.3.0 13") (:PARAM NIL "cased-string") "—a "
     (:TERM NIL "string") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "string-upcase") ", "
     (:FUNREF NIL "string-downcase") ", " (:FUNREF NIL "string-capitalize")
     ", " (:FUNREF NIL "nstring-upcase") ", " (:FUNREF NIL "nstring-downcase")
     ", " (:FUNREF NIL "nstring-capitalize")
     " change the case of the subsequence of " (:PARAM NIL "string") " "
     (:TERM NIL "bounded") " by " (:PARAM NIL "start") " and "
     (:PARAM NIL "end") " as follows: " :PAR
     (:LIST NIL
      (:ITEM NIL (:B NIL " string-upcase") " " :PAR (:COMMENT NIL "% 18.3.0 6")
       (:FUNREF NIL "string-upcase") " returns a " (:TERM NIL "string")
       " just like " (:PARAM NIL "string")
       " with all lowercase characters replaced by the corresponding uppercase characters. More precisely, each character of the result "
       (:TERM NIL "string") " is produced by applying the "
       (:TERM NIL "function") " " (:FUNREF NIL "char-upcase")
       " to the corresponding character of " (:PARAM NIL "string") ". " :PAR)
      (:ITEM NIL (:B NIL " string-downcase") " " :PAR
       (:COMMENT NIL "% 18.3.0 7") (:FUNREF NIL "string-downcase") " is like "
       (:FUNREF NIL "string-upcase")
       " except that all uppercase characters are replaced by the corresponding lowercase characters (using "
       (:FUNREF NIL "char-downcase") "). " :PAR)
      (:ITEM NIL (:B NIL " string-capitalize") " " :PAR
       (:COMMENT NIL "% 18.3.0 10") (:FUNREF NIL "string-capitalize")
       " produces a copy of " (:PARAM NIL "string")
       " such that, for every word in the copy, the first "
       (:TERM NIL "character") " of the “word,” if it has " (:TERM NIL "case")
       ", is " (:TERM NIL "uppercase") " and any other "
       (:TERM NIL "characters") " with " (:TERM NIL "case") " in the word are "
       (:TERM NIL "lowercase") ". For the purposes of "
       (:FUNREF NIL "string-capitalize") ", a “word” is defined to be a "
       (:COMMENT NIL
        "% Rewritten on advice of Barmar, with confirmation from Quinquevirate."
        "consecutive subsequence consisting of case-modifiable characters or digits,")
       "consecutive subsequence consisting of " (:TERM NIL "alphanumeric") " "
       (:TERM NIL "characters") ", delimited at each end either by a non-"
       (:TERM NIL "alphanumeric") " " (:TERM NIL "character")
       " or by an end of the " (:TERM NIL "string") ". " :PAR
       (:COMMENT NIL "% 18.3.0 12"))
      (:ITEM NIL
       (:B NIL " nstring-upcase, nstring-downcase, nstring-capitalize ") " "
       :PAR
       (:COMMENT NIL
        "Barrett wondered if these really had to modify the string. CLtL p304 says yes. -kmp 13-Feb-92")
       (:FUNREF NIL "nstring-upcase") ", " (:FUNREF NIL "nstring-downcase")
       ", and " (:FUNREF NIL "nstring-capitalize") " are identical to "
       (:FUNREF NIL "string-upcase") ", " (:FUNREF NIL "string-downcase")
       ", and " (:FUNREF NIL "string-capitalize")
       " respectively except that they modify " (:PARAM NIL "string") ". "))
     " " :PAR
     (:COMMENT NIL "% Barrett: Duplication"
      " \\param{start} marks the beginning position of the substring."
      " \\param{end}   marks the position following the last element of the substring.")
     :PAR (:COMMENT NIL "% 18.3.0 9") "For " (:FUNREF NIL "string-upcase") ", "
     (:FUNREF NIL "string-downcase") ", and " (:FUNREF NIL "string-capitalize")
     ", " (:PARAM NIL "string")
     " is not modified. However, if no characters in " (:PARAM NIL "string")
     " require conversion, the result may be either " (:PARAM NIL "string")
     " or a copy of it, at the implementation's discretion. " :PAR
     (:COMMENT NIL "% Implied by use of \"string designator\"."
      " \\issue{STRING-COERCION:MAKE-CONSISTENT}"
      " \\funref{string-upcase}, \\funref{string-downcase}, and \\funref{string-capitalize}"
      " perform coercion identical to the action of \\funref{string}. "
      " \\endissue{STRING-COERCION:MAKE-CONSISTENT}")
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (string-upcase \"abcde\") → \"ABCDE\"
 (string-upcase \"Dr. Livingston, I presume?\")
→ \"DR. LIVINGSTON, I PRESUME?\"
 (string-upcase \"Dr. Livingston, I presume?\" :start 6 :end 10)
→ \"Dr. LiVINGston, I presume?\"
 (string-downcase \"Dr. Livingston, I presume?\")
→ \"dr. livingston, i presume?\"

 (string-capitalize \"elm 13c arthur;fig don't\") → \"Elm 13c Arthur;Fig Don'T\"
 (string-capitalize \" hello \") → \" Hello \"
 (string-capitalize \"occlUDeD cASEmenTs FOreSTAll iNADVertent DEFenestraTION\")
→  \"Occluded Casements Forestall Inadvertent Defenestration\"
 (string-capitalize 'kludgy-hash-search) → \"Kludgy-Hash-Search\"
 (string-capitalize \"DON'T!\") → \"Don'T!\"    ;not \"Don't!\"
 (string-capitalize \"pipe 13a, foo16c\") → \"Pipe 13a, Foo16c\"

 (setq str (copy-seq \"0123ABCD890a\")) → \"0123ABCD890a\"
 (nstring-downcase str :start 5 :end 7) → \"0123AbcD890a\"
 str → \"0123AbcD890a\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR (:FUNREF NIL "nstring-upcase") ", "
     (:FUNREF NIL "nstring-downcase") ", and "
     (:FUNREF NIL "nstring-capitalize") " modify " (:PARAM NIL "string")
     " as appropriate rather than constructing a new " (:TERM NIL "string")
     ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR
     (:COMMENT NIL "% Sandra thinks this is too vague."
      "The \\term{implementation}.")
     :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "char-upcase") ", "
     (:FUNREF NIL "char-downcase") " " :PAR)
    (:PART (:NAME "Notes") " " (:COMMENT NIL "% 18.3.0 8")
     "The result is always of the same length as " (:PARAM NIL "string") ". "
     :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== STRING-TRIM" "%% ========== STRING-LEFT-TRIM"
    "%% ========== STRING-RIGHT-TRIM")
   (:COM
    (:NAME "string-trim, string-left-trim, string-right-trim" :FTYPE
     "Function")
    (:PART (:NAME "Syntax") " "
     (:DEF (:KIND "function")
      (:NAMES NIL "string-trim" "string-left-trim" "string-right-trim")
      (:ARGLIST NIL "character-bag string") (:VALUES NIL "trimmed-string"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "character-bag")
     "—a " (:TERM NIL "sequence") " containing " (:TERM NIL "characters") ". "
     :PAR (:ISSUE NIL "STRING-COERCION:MAKE-CONSISTENT") " "
     (:PARAM NIL "string") "—a " (:TERM NIL "string designator") ". "
     (:ENDISSUE NIL "STRING-COERCION:MAKE-CONSISTENT") " " :PAR
     (:PARAM NIL "trimmed-string") "—a " (:TERM NIL "string") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 18.3.0 5")
     (:FUNREF NIL "string-trim") " returns a substring of "
     (:PARAM NIL "string") ", with all characters in "
     (:PARAM NIL "character-bag") " stripped off the beginning and end. "
     (:FUNREF NIL "string-left-trim")
     " is similar but strips characters off only the beginning; "
     (:FUNREF NIL "string-right-trim") " strips off only the end. " :PAR
     "If no " (:TERM NIL "characters") " need to be trimmed from the "
     (:PARAM NIL "string") ", then either " (:PARAM NIL "string")
     " itself or a copy of it may be returned, at the discretion of the implementation. "
     :PAR (:COMMENT NIL "Added for Barrett.") "All of these "
     (:TERM NIL "functions") " observe the " (:TERM NIL "fill pointer") ". "
     :PAR
     (:COMMENT NIL "% Implied by \"string designator\"."
      " \\issue{STRING-COERCION:MAKE-CONSISTENT}"
      " The functions herein described perform coercion identical to the action of \\funref{string}. "
      " \\endissue{STRING-COERCION:MAKE-CONSISTENT}")
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (string-trim \"abc\" \"abcaakaaakabcaaa\") → \"kaaak\"
 (string-trim '(#\\Space #\\Tab #\\Newline) \" garbanzo beans
        \") → \"garbanzo beans\"
 (string-trim \" (*)\" \" ( *three (silly) words* ) \")
→ \"three (silly) words\"

 (string-left-trim \"abc\" \"labcabcabc\") → \"labcabcabc\"
 (string-left-trim \" (*)\" \" ( *three (silly) words* ) \")
→ \"three (silly) words* ) \"

 (string-right-trim \" (*)\" \" ( *three (silly) words* ) \") 
→ \" ( *three (silly) words\"
")
     " ")
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The " (:TERM NIL "implementation")
     ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== STRING=" "%% ========== STRING/="
    "%% ========== STRING<" "%% ========== STRING>" "%% ========== STRING>="
    "%% ========== STRING<=" "%% ========== STRING-EQUAL"
    "%% ========== STRING-NOT-EQUAL" "%% ========== STRING-GREATERP"
    "%% ========== STRING-LESSP" "%% ========== STRING-NOT-LESSP"
    "%% ========== STRING-NOT-GREATERP")
   (:COM
    (:NAME
     "string=, string/=, string<, string>, string<=, string>=, string-equal, string-not-equal, string-lessp, string-greaterp, string-not-greaterp, string-not-lessp"
     :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:COMMENT NIL
      "!!! Need to cross-check the return values here against CLtL for accuracy."
      "    My guess is that something's been corrupted along the way. -kmp 27-May-91")
     :PAR
     (:DEF (:KIND "function") (:NAMES NIL "string=")
      (:ARGLIST NIL "string1 string2 " (:KEYWORD NIL " &key")
       " start1 end1 start2 end2")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR
     (:DEF (:KIND "function")
      (:NAMES NIL "string/=" "string<" "string>" "string<=" "string>=")
      (:ARGLIST NIL "string1 string2 " (:KEYWORD NIL " &key")
       " start1 end1 start2 end2")
      (:VALUES NIL "mismatch-index"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "string-equal")
      (:ARGLIST NIL "string1 string2 " (:KEYWORD NIL " &key")
       " start1 end1 start2 end2")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR
     (:DEF (:KIND "function")
      (:NAMES NIL "string-not-equal" "string-lessp" "string-greaterp"
       "string-not-greaterp" "string-not-lessp")
      (:ARGLIST NIL "string1 string2 " (:KEYWORD NIL " &key")
       " start1 end1 start2 end2")
      (:VALUES NIL "mismatch-index"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL "% 18.2.0 4" "% 18.2.0 11")
     (:ISSUE NIL "STRING-COERCION:MAKE-CONSISTENT") " " (:PARAM NIL "string1")
     "—a " (:TERM NIL "string designator") ". " :PAR (:PARAM NIL "string2")
     "—a " (:TERM NIL "string designator") ". "
     (:ENDISSUE NIL "STRING-COERCION:MAKE-CONSISTENT") " " :PAR
     (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " "
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start1") ", " (:PARAM NIL "end1") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "string1")
     ". The defaults for " (:PARAM NIL "start") " and " (:PARAM NIL "end")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. " :PAR
     (:PARAM NIL "start2") ", " (:PARAM NIL "end2") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "string2")
     ". The defaults for " (:PARAM NIL "start") " and " (:PARAM NIL "end")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " " :PAR
     (:PARAM NIL "generalized-boolean") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR (:PARAM NIL "mismatch-index") "—a " (:TERM NIL "bounding index")
     " of " (:PARAM NIL "string1") ", or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 18.2.0 9")
     "These functions perform lexicographic comparisons on "
     (:PARAM NIL "string1") " and " (:PARAM NIL "string2") ". "
     (:FUNREF NIL "string=") " and " (:FUNREF NIL "string-equal")
     " are called equality functions; the others are called inequality functions. The comparison operations these "
     (:TERM NIL "functions") " perform are restricted to the subsequence of "
     (:PARAM NIL "string1") " " (:TERM NIL "bounded") " by "
     (:PARAM NIL "start1") " and " (:PARAM NIL "end1")
     " and to the subsequence of " (:PARAM NIL "string2") " "
     (:TERM NIL "bounded") " by " (:PARAM NIL "start2") " and "
     (:PARAM NIL "end2") ". " :PAR "A string " (:I NIL "a")
     " is equal to a string " (:I NIL "b")
     " if it contains the same number of characters, and the corresponding characters are the "
     (:TERM NIL "same") " "
     (:COMMENT NIL
      " \"char<\", \"char-lessp\" => \"char=\", \"char-equal\" in next line thanks to Barmar! -kmp 22-Jan-92")
     "under " (:FUNREF NIL "char=") " or " (:FUNREF NIL "char-equal")
     ", as appropriate. " :PAR (:COMMENT NIL "% 18.2.0 10") "A string "
     (:I NIL "a") " is less than a string " (:I NIL "b")
     " if in the first position in which they differ the character of "
     (:I NIL "a") " is less than the corresponding character of " (:I NIL "b")
     " according to " (:FUNREF NIL "char<") " or " (:FUNREF NIL "char-lessp")
     " as appropriate, or if string " (:I NIL "a")
     " is a proper prefix of string " (:I NIL "b")
     " (of shorter length and matching in all the characters of " (:I NIL "a")
     "). " :PAR
     (:COMMENT NIL
      "Sandra is a little uncomfortable with the use of \"equal\" in the next two paragraphs."
      " -kmp 13-Jan-92")
     "The equality functions return a " (:PARAM NIL "generalized boolean")
     " that is " (:TERM NIL "true") " if the strings are equal, or "
     (:TERM NIL "false") " otherwise. " :PAR
     "The inequality functions return a " (:PARAM NIL "mismatch-index")
     " that is " (:TERM NIL "true") " if the strings are not equal, or "
     (:TERM NIL "false") " otherwise. When the " (:PARAM NIL "mismatch-index")
     " is " (:TERM NIL "true") ", it is an " (:TERM NIL "integer")
     " representing the first character position at which the two substrings differ, as an offset from the beginning of "
     (:PARAM NIL "string1") ". " :PAR
     (:COMMENT NIL
      "% This referred only to string= and string-equal, but was confusing and redundant."
      "%   -kmp 25-Jul-91" " %% 18.2.0 5"
      " The equality functions return \\term{false} if the substrings being compared are"
      " of unequal length; that is, if" " " " \\code"
      "  (not (= (- end1 start1) (- end2 start2)))" " \\endcode"
      " is \\term{true}, then the functions return \\term{false}.")
     :PAR "The comparison has one of the following results: " :PAR
     (:LIST NIL
      (:ITEM NIL (:FUNREF NIL "string=") " " :PAR (:FUNREF NIL "string=")
       " is " (:TERM NIL "true")
       " if the supplied substrings are of the same length and contain the "
       (:TERM NIL "same")
       " characters in corresponding positions; otherwise it is "
       (:TERM NIL "false") ". " :PAR)
      (:ITEM NIL (:FUNREF NIL "string/=") " " :PAR (:FUNREF NIL "string/=")
       " is " (:TERM NIL "true")
       " if the supplied substrings are different; otherwise it is "
       (:TERM NIL "false") ". " :PAR)
      (:ITEM NIL (:FUNREF NIL "string-equal") " " :PAR
       (:COMMENT NIL "% 18.2.0 8") (:FUNREF NIL "string-equal")
       " is just like " (:FUNREF NIL "string=")
       " except that differences in case are ignored; two characters are considered to be the same if "
       (:FUNREF NIL "char-equal") " is " (:TERM NIL "true") " of them. " :PAR)
      (:ITEM NIL (:FUNREF NIL "string<") " " :PAR (:FUNREF NIL "string<")
       " is " (:TERM NIL "true")
       " if substring1 is less than substring2; otherwise it is "
       (:TERM NIL "false") ". " :PAR)
      (:ITEM NIL (:FUNREF NIL "string>") " " :PAR (:FUNREF NIL "string>")
       " is " (:TERM NIL "true")
       " if substring1 is greater than substring2; otherwise it is "
       (:TERM NIL "false") ". " :PAR)
      (:ITEM NIL (:FUNREF NIL "string-lessp") ", "
       (:FUNREF NIL "string-greaterp") " " :PAR (:COMMENT NIL "% 18.2.0 12")
       (:FUNREF NIL "string-lessp") " and " (:FUNREF NIL "string-greaterp")
       " are exactly like " (:FUNREF NIL "string<") " and "
       (:FUNREF NIL "string>")
       ", respectively, except that distinctions between uppercase and lowercase letters are ignored. It is as if "
       (:FUNREF NIL "char-lessp") " were used instead of "
       (:FUNREF NIL "char<") " for comparing characters. " :PAR)
      (:ITEM NIL (:FUNREF NIL "string<=") " " :PAR (:FUNREF NIL "string<=")
       " is " (:TERM NIL "true")
       " if substring1 is less than or equal to substring2; otherwise it is "
       (:TERM NIL "false") ". " :PAR)
      (:ITEM NIL (:FUNREF NIL "string>=") " " :PAR (:FUNREF NIL "string>=")
       " is " (:TERM NIL "true")
       " if substring1 is greater than or equal to substring2; otherwise it is "
       (:TERM NIL "false") ". " :PAR)
      (:ITEM NIL (:FUNREF NIL "string-not-greaterp") ", "
       (:FUNREF NIL "string-not-lessp") " " :PAR
       (:FUNREF NIL "string-not-greaterp") " and "
       (:FUNREF NIL "string-not-lessp") " are exactly like "
       (:FUNREF NIL "string<=") " and " (:FUNREF NIL "string>=")
       ", respectively, except that distinctions between uppercase and lowercase letters are ignored. It is as if "
       (:FUNREF NIL "char-lessp") " were used instead of "
       (:FUNREF NIL "char<") " for comparing characters. " :PAR))
     " " :PAR
     (:COMMENT NIL "% Barrett: Implied by description of bounding."
      "All of these \\term{functions} observe the \\term{fill pointer}.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR (:COMMENT NIL "% 18.2.0 6") :PAR
     (:CODE NIL " (string= \"foo\" \"foo\") → " (:TERM NIL "true") "
 (string= \"foo\" \"Foo\") → "
      (:TERM NIL "false") "
 (string= \"foo\" \"bar\") → "
      (:TERM NIL "false") "
 (string= \"together\" \"frog\" :start1 1 :end1 3 :start2 2) → "
      (:TERM NIL "true") "
 (string-equal \"foo\" \"Foo\") → "
      (:TERM NIL "true") "
 (string= \"abcd\" \"01234abcd9012\" :start2 5 :end2 9) → "
      (:TERM NIL "true") "
 (string< \"aaaa\" \"aaab\") → 3
 (string>= \"aaaaa\" \"aaaa\") → 4
 (string-not-greaterp \"Abcde\" \"abcdE\") → 5
 (string-lessp \"012AAAA789\" \"01aaab6\" :start1 3 :end1 7
                                      :start2 2 :end2 6) → 6
 (string-not-equal \"AAAA\" \"aaaA\") → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "char=") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 18.2.0 3")
     (:FUNREF NIL "equal") " calls " (:FUNREF NIL "string=")
     " if applied to two " (:TERM NIL "strings") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== STRINGP")
   (:COM (:NAME "stringp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "stringp") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 6.2.2 18")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "string") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (stringp \"aaaaaa\") → " (:TERM NIL "true") "
 (stringp #\\a) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "typep") ", "
     (:TYPEREF NIL "string") " (" (:TERM NIL "type") ") " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (stringp " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'string)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MAKE-STRING")
   (:COM (:NAME "make-string" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-string")
      (:ARGLIST NIL "size " (:KEYWORD NIL " &key")
       " initial-element element-type")
      (:VALUES NIL "string"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " " (:PARAM NIL "size")
     "—a " (:TERM NIL "valid array dimension") ". "
     (:ENDISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " " :PAR
     (:ISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " "
     (:PARAM NIL "initial-element") "—a " (:TERM NIL "character") ". "
     (:ENDISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " The default is "
     (:TERM NIL "implementation-dependent") ". " :PAR
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-3-6") " " (:PARAM NIL "element-type")
     "—a " (:TERM NIL "type specifier") ". The default is "
     (:TYPEREF NIL "character") ". " (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-3-6")
     " " :PAR (:PARAM NIL "string") "—a " (:TERM NIL "simple string") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 18.3.0 3")
     (:FUNREF NIL "make-string") " returns a " (:TERM NIL "simple string")
     " of length " (:PARAM NIL "size")
     " whose elements have been initialized to " (:PARAM NIL "initial-element")
     ". " :PAR (:ISSUE NIL "CHARACTER-PROPOSAL:2-3-6") " The "
     (:PARAM NIL "element-type") " names the " (:TERM NIL "type") " of the "
     (:TERM NIL "elements") " of the " (:TERM NIL "string") "; a "
     (:TERM NIL "string") " is constructed of the most "
     (:TERM NIL "specialized") " " (:TERM NIL "type") " that can accommodate "
     (:TERM NIL "elements") " of the given " (:TERM NIL "type") ". "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-3-6") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (make-string 10 :initial-element #\\5) → \"5555555555\"
 (length (make-string 10)) → 10
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The " (:TERM NIL "implementation")
     ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "% 18.3.0 4" "% was left out"))
  " " :PAR)
 (:CHAPTER
  (:NUM "17" :TITLE ("Sequences") :NUMTAG :CHAP-SEVENTEEN :NAMETAG :SEQUENCES)
  (:SECTION (:TITLE ("Sequence Concepts") :TAGS (:SEQUENCE-CONCEPTS)) " " :PAR
   "A " (:NEWTERM NIL "sequence") " is an ordered collection of "
   (:TERM NIL "elements") ", implemented as either a " (:TERM NIL "vector")
   " or a " (:TERM NIL "list") ". " :PAR (:TERM NIL "Sequences")
   " can be created by the " (:TERM NIL "function") " "
   (:FUNREF NIL "make-sequence") ", as well as other " (:TERM NIL "functions")
   " that create " (:TERM NIL "objects") " of " (:TERM NIL "types")
   " that are " (:TERM NIL "subtypes") " of " (:TYPEREF NIL "sequence") " ("
   (:I NIL "e.g.") ",  " (:FUNREF NIL "list") ", " (:FUNREF NIL "make-list")
   ", " (:FUNREF NIL "mapcar") ", and " (:FUNREF NIL "vector") "). " :PAR "A "
   (:NEWTERM NIL "sequence function") " is a " (:TERM NIL "function")
   " defined by this specification or added as an extension by the "
   (:TERM NIL "implementation") " that operates on one or more "
   (:TERM NIL "sequences") ". " (:COMMENT NIL "% 14.0.0 19") "Whenever a "
   (:TERM NIL "sequence function") " must construct and return a new "
   (:TERM NIL "vector") ", it always returns a " (:TERM NIL "simple vector")
   ". Similarly, any " (:TERM NIL "strings") " constructed will be "
   (:TERM NIL "simple strings") ". " :PAR " "
   (:TABLE
    (:NAME ("Standardized Sequence Functions") :TAGS (:SEQUENCE-FUNCTIONS))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " concatenate"))
     (:CELL NIL (:FUNREF NIL "length")) (:CELL NIL (:FUNREF NIL "remove")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " copy-seq"))
     (:CELL NIL (:FUNREF NIL "map"))
     (:CELL NIL (:FUNREF NIL "remove-duplicates")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " count"))
     (:CELL NIL (:FUNREF NIL "map-into"))
     (:CELL NIL (:FUNREF NIL "remove-if")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " count-if"))
     (:CELL NIL (:FUNREF NIL "merge"))
     (:CELL NIL (:FUNREF NIL "remove-if-not")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " count-if-not"))
     (:CELL NIL (:FUNREF NIL "mismatch")) (:CELL NIL (:FUNREF NIL "replace")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " delete"))
     (:CELL NIL (:FUNREF NIL "notany")) (:CELL NIL (:FUNREF NIL "reverse")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " delete-duplicates"))
     (:CELL NIL (:FUNREF NIL "notevery")) (:CELL NIL (:FUNREF NIL "search")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " delete-if"))
     (:CELL NIL (:FUNREF NIL "nreverse")) (:CELL NIL (:FUNREF NIL "some")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " delete-if-not"))
     (:CELL NIL (:FUNREF NIL "nsubstitute")) (:CELL NIL (:FUNREF NIL "sort")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " elt"))
     (:CELL NIL (:FUNREF NIL "nsubstitute-if"))
     (:CELL NIL (:FUNREF NIL "stable-sort")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " every"))
     (:CELL NIL (:FUNREF NIL "nsubstitute-if-not"))
     (:CELL NIL (:FUNREF NIL "subseq")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " fill"))
     (:CELL NIL (:FUNREF NIL "position"))
     (:CELL NIL (:FUNREF NIL "substitute")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " find"))
     (:CELL NIL (:FUNREF NIL "position-if"))
     (:CELL NIL (:FUNREF NIL "substitute-if")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " find-if"))
     (:CELL NIL (:FUNREF NIL "position-if-not"))
     (:CELL NIL (:FUNREF NIL "substitute-if-not")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " find-if-not"))
     (:CELL NIL (:FUNREF NIL "reduce")) (:CELL NIL)))
   " " :PAR
   (:SUBSECTION
    (:TITLE ("General Restrictions on Parameters that must be Sequences"))
    "In general, " (:TERM NIL "lists") " (including "
    (:TERM NIL "association lists") " and " (:TERM NIL "property lists")
    ") that are treated as " (:TERM NIL "sequences") " must be "
    (:TERM NIL "proper lists") ". " :PAR)
   :PAR)
  :PAR
  (:SECTION
   (:TITLE ("Rules about Test Functions") :TAGS (:TEST-FUNCTION-RULES)) " "
   (:COMMENT NIL "% Rules about Test Functions") :PAR
   (:SUBSECTION
    (:TITLE ("Satisfying a Two-Argument Test") :TAGS
     (:SATISFYING-THE-TWO-ARG-TEST))
    " " :PAR "When an " (:TERM NIL "object") " " (:MATH NIL (:MI NIL "O"))
    " is being considered iteratively against each " (:TERM NIL "element") " "
    (:MATH NIL (:MSUB NIL (:MI NIL "E") (:MI NIL "i"))) " of a "
    (:TERM NIL "sequence") " " (:MATH NIL (:MI NIL "S")) " by an "
    (:TERM NIL "operator") " " (:MATH NIL (:MI NIL "F")) " listed in "
    (:NEXTFIGURE NIL)
    ", it is sometimes useful to control the way in which the presence of "
    (:MATH NIL (:MI NIL "O")) " is tested in " (:MATH NIL (:MI NIL "S"))
    " is tested by " (:MATH NIL (:MI NIL "F"))
    ". This control is offered on the basis of a " (:TERM NIL "function")
    " designated with either a " (:KWD NIL "test") " or " (:KWD NIL "test-not")
    " " (:TERM NIL "argument") ". " :PAR
    (:COMMENT NIL "!!! Sandra wonders if this table is complete.")
    (:TABLE (:NAME ("Operators that have Two-Argument Tests to be Satisfied"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " adjoin"))
      (:CELL NIL (:FUNREF NIL "nset-exclusive-or"))
      (:CELL NIL (:FUNREF NIL "search")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " assoc"))
      (:CELL NIL (:FUNREF NIL "nsublis"))
      (:CELL NIL (:FUNREF NIL "set-difference")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " count"))
      (:CELL NIL (:FUNREF NIL "nsubst"))
      (:CELL NIL (:FUNREF NIL "set-exclusive-or")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " delete"))
      (:CELL NIL (:FUNREF NIL "nsubstitute"))
      (:CELL NIL (:FUNREF NIL "sublis")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " find"))
      (:CELL NIL (:FUNREF NIL "nunion")) (:CELL NIL (:FUNREF NIL "subsetp")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " intersection"))
      (:CELL NIL (:FUNREF NIL "position")) (:CELL NIL (:FUNREF NIL "subst")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " member"))
      (:CELL NIL (:FUNREF NIL "pushnew"))
      (:CELL NIL (:FUNREF NIL "substitute")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " mismatch"))
      (:CELL NIL (:FUNREF NIL "rassoc"))
      (:CELL NIL (:FUNREF NIL "tree-equal")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " nintersection"))
      (:CELL NIL (:FUNREF NIL "remove")) (:CELL NIL (:FUNREF NIL "union")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " nset-difference"))
      (:CELL NIL (:FUNREF NIL "remove-duplicates")) (:CELL NIL)))
    " " :PAR "The object " (:MATH NIL (:MI NIL "O"))
    " might not be compared directly to "
    (:MATH NIL (:MSUB NIL (:MI NIL "E") (:MI NIL "i"))) ". If a "
    (:KWD NIL "key") " " (:TERM NIL "argument") " is provided, it is a "
    (:TERM NIL "designator") " for a " (:TERM NIL "function") " of one "
    (:TERM NIL "argument") " to be called with each "
    (:MATH NIL (:MSUB NIL (:MI NIL "E") (:MI NIL "i"))) " as an "
    (:TERM NIL "argument") ", and " (:TERM NIL "yielding") " an "
    (:TERM NIL "object") " "
    (:MATH NIL (:MSUB NIL (:MI NIL "Z") (:MI NIL "i")))
    " to be used for comparison. (If there is no " (:KWD NIL "key") " "
    (:TERM NIL "argument") ", "
    (:MATH NIL (:MSUB NIL (:MI NIL "Z") (:MI NIL "i"))) " is "
    (:MATH NIL (:MSUB NIL (:MI NIL "E") (:MI NIL "i"))) ".) " :PAR
    (:COMMENT NIL " Added per Barmar. -kmp 16-Feb-92") "The "
    (:TERM NIL "function") " designated by the " (:KWD NIL "key") " "
    (:TERM NIL "argument") " is never called on " (:MATH NIL (:MI NIL "O"))
    " itself. However, if the function operates on multiple sequences ("
    (:I NIL "e.g.") ",  as happens in " (:FUNREF NIL "set-difference") "), "
    (:MATH NIL (:MI NIL "O")) " will be the result of calling the "
    (:KWD NIL "key") " function on an " (:TERM NIL "element")
    " of the other sequence. " :PAR "A " (:KWD NIL "test") " "
    (:TERM NIL "argument") ", if supplied to " (:MATH NIL (:MI NIL "F"))
    ", is a " (:TERM NIL "designator") " for a " (:TERM NIL "function")
    " of two " (:TERM NIL "arguments") ", " (:MATH NIL (:MI NIL "O")) " and "
    (:MATH NIL (:MSUB NIL (:MI NIL "Z") (:MI NIL "i"))) ". An "
    (:MATH NIL (:MSUB NIL (:MI NIL "E") (:MI NIL "i")))
    " is said (or, sometimes, an " (:MATH NIL (:MI NIL "O")) " and an "
    (:MATH NIL (:MSUB NIL (:MI NIL "E") (:MI NIL "i"))) " are said) to "
    (:NEWTERM NIL "satisfy the test") " if this " (:KWD NIL "test") " "
    (:TERM NIL "function") " returns a " (:TERM NIL "generalized boolean")
    " representing " (:TERM NIL "true") ". " :PAR "A " (:KWD NIL "test-not")
    " " (:TERM NIL "argument") ", if supplied to " (:MATH NIL (:MI NIL "F"))
    ", is " (:TERM NIL "designator") " for a " (:TERM NIL "function")
    " of two " (:TERM NIL "arguments") ", " (:MATH NIL (:MI NIL "O")) " and "
    (:MATH NIL (:MSUB NIL (:MI NIL "Z") (:MI NIL "i"))) ". An "
    (:MATH NIL (:MSUB NIL (:MI NIL "E") (:MI NIL "i")))
    " is said (or, sometimes, an " (:MATH NIL (:MI NIL "O")) " and an "
    (:MATH NIL (:MSUB NIL (:MI NIL "E") (:MI NIL "i"))) " are said) to "
    (:NEWTERM NIL "satisfy the test") " if this " (:KWD NIL "test-not") " "
    (:TERM NIL "function") " returns a " (:TERM NIL "generalized boolean")
    " representing " (:TERM NIL "false") ". " :PAR "If neither a "
    (:KWD NIL "test") " nor a " (:KWD NIL "test-not") " "
    (:TERM NIL "argument") " is supplied, it is as if a " (:KWD NIL "test")
    " argument of " (:TT NIL "#'eql") " was supplied. " :PAR
    "The consequences are unspecified if both a " (:KWD NIL "test") " and a "
    (:KWD NIL "test-not") " " (:TERM NIL "argument")
    " are supplied in the same " (:TERM NIL "call") " to "
    (:MATH NIL (:MI NIL "F")) ". " :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of Satisfying a Two-Argument Test"))
     (:CODE NIL
      " (remove \"FOO\" '(foo bar \"FOO\" \"BAR\" \"foo\" \"bar\") :test #'equal)
→ (foo bar \"BAR\" \"foo\" \"bar\")
 (remove \"FOO\" '(foo bar \"FOO\" \"BAR\" \"foo\" \"bar\") :test #'equalp)
→ (foo bar \"BAR\" \"bar\")
 (remove \"FOO\" '(foo bar \"FOO\" \"BAR\" \"foo\" \"bar\") :test #'string-equal)
→ (bar \"BAR\" \"bar\")
 (remove \"FOO\" '(foo bar \"FOO\" \"BAR\" \"foo\" \"bar\") :test #'string=)
→ (BAR \"BAR\" \"foo\" \"bar\")

 (remove 1 '(1 1.0 #C(1.0 0.0) 2 2.0 #C(2.0 0.0)) :test-not #'eql)
→ (1)
 (remove 1 '(1 1.0 #C(1.0 0.0) 2 2.0 #C(2.0 0.0)) :test-not #'=)
→ (1 1.0 #C(1.0 0.0))
 (remove 1 '(1 1.0 #C(1.0 0.0) 2 2.0 #C(2.0 0.0)) :test (complement #'=))
→ (1 1.0 #C(1.0 0.0))

 (count 1 '((one 1) (uno 1) (two 2) (dos 2)) :key #'cadr) → 2

 (count 2.0 '(1 2 3) :test #'eql :key #'float) → 1

 (count \"FOO\" (list (make-pathname :name \"FOO\" :type \"X\")  
                    (make-pathname :name \"FOO\" :type \"Y\"))
        :key #'pathname-name
        :test #'equal)
→ 2
")
     " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Satisfying a One-Argument Test") :TAGS
     (:SATISFYING-THE-ONE-ARG-TEST))
    " " :PAR "When using one of the " (:TERM NIL "functions") " in "
    (:NEXTFIGURE NIL) ", the elements " (:MATH NIL (:MI NIL "E")) " of a "
    (:TERM NIL "sequence") " " (:MATH NIL (:MI NIL "S"))
    " are filtered not on the basis of the presence or absence of an object "
    (:MATH NIL (:MI NIL "O")) " under a two " (:TERM NIL "argument") " "
    (:TERM NIL "predicate") ", as with the " (:TERM NIL "functions")
    " described in " (:SECREF NIL :SATISFYING-THE-TWO-ARG-TEST)
    ", but rather on the basis of a one " (:TERM NIL "argument") " "
    (:TERM NIL "predicate") ". " :PAR
    (:COMMENT NIL "!!! KMP wonders if this table is complete.")
    (:TABLE (:NAME ("Operators that have One-Argument Tests to be Satisfied"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " assoc-if"))
      (:CELL NIL (:FUNREF NIL "member-if"))
      (:CELL NIL (:FUNREF NIL "rassoc-if")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " assoc-if-not"))
      (:CELL NIL (:FUNREF NIL "member-if-not"))
      (:CELL NIL (:FUNREF NIL "rassoc-if-not")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " count-if"))
      (:CELL NIL (:FUNREF NIL "nsubst-if"))
      (:CELL NIL (:FUNREF NIL "remove-if")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " count-if-not"))
      (:CELL NIL (:FUNREF NIL "nsubst-if-not"))
      (:CELL NIL (:FUNREF NIL "remove-if-not")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " delete-if"))
      (:CELL NIL (:FUNREF NIL "nsubstitute-if"))
      (:CELL NIL (:FUNREF NIL "subst-if")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " delete-if-not"))
      (:CELL NIL (:FUNREF NIL "nsubstitute-if-not"))
      (:CELL NIL (:FUNREF NIL "subst-if-not")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " find-if"))
      (:CELL NIL (:FUNREF NIL "position-if"))
      (:CELL NIL (:FUNREF NIL "substitute-if")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " find-if-not"))
      (:CELL NIL (:FUNREF NIL "position-if-not"))
      (:CELL NIL (:FUNREF NIL "substitute-if-not"))))
    " " :PAR "The element " (:MATH NIL (:MSUB NIL (:MI NIL "E") (:MI NIL "i")))
    " might not be considered directly. If a " (:KWD NIL "key") " "
    (:TERM NIL "argument") " is provided, it is a " (:TERM NIL "designator")
    " for a " (:TERM NIL "function") " of one " (:TERM NIL "argument")
    " to be called with each "
    (:MATH NIL (:MSUB NIL (:MI NIL "E") (:MI NIL "i"))) " as an "
    (:TERM NIL "argument") ", and " (:TERM NIL "yielding") " an "
    (:TERM NIL "object") " "
    (:MATH NIL (:MSUB NIL (:MI NIL "Z") (:MI NIL "i")))
    " to be used for comparison. (If there is no " (:KWD NIL "key") " "
    (:TERM NIL "argument") ", "
    (:MATH NIL (:MSUB NIL (:MI NIL "Z") (:MI NIL "i"))) " is "
    (:MATH NIL (:MSUB NIL (:MI NIL "E") (:MI NIL "i"))) ".) " :PAR
    (:TERM NIL "Functions")
    " defined in this specification and having a name that ends in “"
    (:TT NIL "-if") "” accept a first " (:TERM NIL "argument") " that is a "
    (:TERM NIL "designator") " for a " (:TERM NIL "function") " of one "
    (:TERM NIL "argument") ", "
    (:MATH NIL (:MSUB NIL (:MI NIL "Z") (:MI NIL "i"))) ". An "
    (:MATH NIL (:MSUB NIL (:MI NIL "E") (:MI NIL "i"))) " is said to "
    (:NEWTERM NIL "satisfy the test") " if this " (:KWD NIL "test") " "
    (:TERM NIL "function") " returns a " (:TERM NIL "generalized boolean")
    " representing " (:TERM NIL "true") ". " :PAR (:TERM NIL "Functions")
    " defined in this specification and having a name that ends in “"
    (:TT NIL "-if-not") "” accept a first " (:TERM NIL "argument")
    " that is a " (:TERM NIL "designator") " for a " (:TERM NIL "function")
    " of one " (:TERM NIL "argument") ", "
    (:MATH NIL (:MSUB NIL (:MI NIL "Z") (:MI NIL "i"))) ". An "
    (:MATH NIL (:MSUB NIL (:MI NIL "E") (:MI NIL "i"))) " is said to "
    (:NEWTERM NIL "satisfy the test") " if this " (:KWD NIL "test") " "
    (:TERM NIL "function") " returns a " (:TERM NIL "generalized boolean")
    " representing " (:TERM NIL "false") ". " :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of Satisfying a One-Argument Test"))
     (:CODE NIL " (count-if #'zerop '(1 #C(0.0 0.0) 0 0.0d0 0.0s0 3)) → 4

 (remove-if-not #'symbolp '(0 1 2 3 4 5 6 7 8 9 A B C D E F))
→ (A B C D E F)
 (remove-if (complement #'symbolp) '(0 1 2 3 4 5 6 7 8 9 A B C D E F))
→ (A B C D E F)

 (count-if #'zerop '(\"foo\" \"\" \"bar\" \"\" \"\" \"baz\" \"quux\") :key #'length)
→ 3
")
     " " :PAR)
    :PAR))
  :PAR
  (:DICTIONARY NIL :PAR
   (:COMMENT NIL " Sequences" "  Sequence Mapping" "  Sequence Counting"
    "  Sequence Ordering" "  Sequence Search" "  Sequence Comparison"
    "  Sequence Substitution" "  Sequence Joining" "  Sequence Deletion")
   :PAR
   (:COMMENT NIL "-------------------- Sequence Type --------------------")
   :PAR (:COMMENT NIL "%% ========== SEQUENCE")
   (:COM (:NAME "sequence" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "sequence") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:TERM NIL "Sequences")
     " are ordered collections of " (:TERM NIL "objects") ", called the "
     (:TERM NIL "elements") " of the " (:TERM NIL "sequence") ". " :PAR
     (:COMMENT NIL
      "% 2.15.0 26                                                 ")
     "The " (:TERM NIL "types") " " (:TYPEREF NIL "vector") " and the "
     (:TERM NIL "type") " " (:TYPEREF NIL "list") " are "
     (:TERM NIL "disjoint") " " (:TERM NIL "subtypes") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "sequence") ", "
     (:COMMENT NIL
      "The following is added to make an implicit vagueness explicit. -kmp 29-Mar-91")
     "but are not necessarily an " (:TERM NIL "exhaustive partition") " of "
     (:TERM NIL "sequence") ". " :PAR "When viewing a " (:TERM NIL "vector")
     " as a " (:TERM NIL "sequence") ", only the " (:TERM NIL "active") " "
     (:TERM NIL "elements") " of that " (:TERM NIL "vector") " are considered "
     (:TERM NIL "elements") " of the " (:TERM NIL "sequence") "; that is, "
     (:TERM NIL "sequence") " operations respect the "
     (:TERM NIL "fill pointer") " when given " (:TERM NIL "sequences")
     " represented as " (:TERM NIL "vectors") ". " :PAR
     (:COMMENT NIL "% 2.4.0 2" "% 2.4.0 7") :PAR))
   :PAR (:COMMENT NIL "-------------------- Sequences --------------------")
   :PAR (:COMMENT NIL "%% ========== COPY-SEQ")
   (:COM (:NAME "copy-seq" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "copy-seq") (:ARGLIST NIL "sequence")
      (:VALUES NIL "copied-sequence"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "sequence")
     "—a " (:TERM NIL "proper sequence") ". " :PAR
     (:PARAM NIL "copied-sequence") "—a " (:TERM NIL "proper sequence") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 14.1.0 8")
     "Creates a copy of " (:PARAM NIL "sequence") ". The "
     (:TERM NIL "elements") " of the new " (:TERM NIL "sequence") " are the "
     (:TERM NIL "same") " as the corresponding " (:TERM NIL "elements")
     " of the given " (:PARAM NIL "sequence") ". " :PAR
     (:COMMENT NIL "% Moon's suggested interpretation follows:") :PAR "If "
     (:PARAM NIL "sequence") " is a " (:TERM NIL "vector") ", the result is a "
     (:TERM NIL "fresh") " " (:TERM NIL "simple array") " of "
     (:TERM NIL "rank") " one that has the same "
     (:TERM NIL "actual array element type") " as " (:PARAM NIL "sequence")
     ". If " (:PARAM NIL "sequence") " is a " (:TERM NIL "list")
     ", the result is a " (:TERM NIL "fresh") " " (:TERM NIL "list") ". " :PAR
     (:COMMENT NIL "% End Moon's suggested interpretation.") :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (setq str \"a string\") → \"a string\"
 (equalp str (copy-seq str)) → "
      (:TERM NIL "true") "
 (eql str (copy-seq str)) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR
     (:COMMENT NIL "% Sandra thinks this is excessive."
      "Creates a new \\term{sequence}.")
     :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "sequence") " is not a "
     (:TERM NIL "proper sequence") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "copy-list") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "From a functional standpoint, "
     (:CODE NIL " (copy-seq x) ≡ (subseq x 0)
")
     " However, the programmer intent is typically very different in these two cases. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ELT")
   (:COM (:NAME "elt" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "elt")
      (:ARGLIST NIL "sequence index") (:VALUES NIL "object"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "elt") (:ARGLIST NIL "sequence index")
      (:NEW-VALUE NIL "new-object"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "sequence")
     "—a " (:TERM NIL "proper sequence") ". " :PAR (:PARAM NIL "index") "—a "
     (:TERM NIL "valid sequence index") " for " (:PARAM NIL "sequence") ". "
     :PAR (:PARAM NIL "object") "—an " (:TERM NIL "object") ". " :PAR
     (:PARAM NIL "new-object") "—an " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 14.1.0 3")
     (:TERM NIL "Accesses") " the " (:TERM NIL "element") " of "
     (:PARAM NIL "sequence") " specified by " (:PARAM NIL "index") ". " :PAR
     (:COMMENT NIL " No longer needed -- implied by \"Access\". -kmp 13-Jan-92"
      " %% 14.1.0 5"
      " \\macref{setf} may be used with \\funref{elt} to destructively replace"
      " a \\term{sequence} element with a new value.")
     :PAR
     (:COMMENT NIL
      "Barmar thinks (and I agree) that this is redundant with the specification"
      "of the argument type above." " %% 14.1.0 4"
      " \\funref{elt} observes the \\term{fill pointer} in those \\term{vectors} "
      " that have \\term{fill pointers}.  ")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq str (copy-seq \"0123456789\")) → \"0123456789\"
 (elt str 6) → #\\6
 (setf (elt str 0) #\\#) → #\\#
 str → \"#123456789\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL "% e.g., consider:"
      "  (LET ((X (NCONC (MAKE-LIST 1000 :INITIAL-ELEMENT 'A) '(B . C))))"
      "    (ELT X 1000))" "  => A")
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "sequence") " is not a "
     (:TERM NIL "proper sequence") ". Should signal an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error") " if "
     (:PARAM NIL "index") " is not a " (:TERM NIL "valid sequence index")
     " for " (:PARAM NIL "sequence") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "aref") ", "
     (:FUNREF NIL "nth") ", " (:ISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:SECREF NIL :CONSTANT-MODIFICATION) " "
     (:ENDISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "aref") " may be used to "
     (:TERM NIL "access") " " (:TERM NIL "vector")
     " elements that are beyond the " (:TERM NIL "vector") "'s "
     (:TERM NIL "fill pointer") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FILL")
   (:COM (:NAME "fill" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "fill")
      (:ARGLIST NIL "sequence item " (:KEYWORD NIL " &key") " start end")
      (:VALUES NIL "sequence"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "sequence")
     "—a " (:TERM NIL "proper sequence") ". " :PAR (:PARAM NIL "item") "—a "
     (:TERM NIL "sequence") ". " :PAR (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " "
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start") ", " (:PARAM NIL "end") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "sequence")
     ". The defaults for " (:PARAM NIL "start") " and " (:PARAM NIL "end")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 14.3.0 3")
     "Replaces the " (:TERM NIL "elements") " of " (:PARAM NIL "sequence") " "
     (:TERM NIL "bounded") " by " (:PARAM NIL "start") " and "
     (:PARAM NIL "end") " with " (:PARAM NIL "item") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (fill (list 0 1 2 3 4 5) '(444)) → ((444) (444) (444) (444) (444) (444))
 (fill (copy-seq \"01234\") #\\e :start 3) → \"012ee\"
 (setq x (vector 'a 'b 'c 'd 'e)) → #(A B C D E)
 (fill x 'z :start 1 :end 3) → #(A Z Z D E)
 x → #(A Z Z D E)
 (fill x 'p) → #(P P P P P)
 x → #(P P P P P)
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR (:PARAM NIL "Sequence")
     " is destructively modified. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "sequence") " is not a "
     (:TERM NIL "proper sequence") ". Should signal an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error") " if "
     (:PARAM NIL "start") " is not a non-negative " (:TERM NIL "integer")
     ". Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "end")
     " is not a non-negative " (:TERM NIL "integer") " or " (:MISC NIL "nil")
     ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "replace") ", "
     (:FUNREF NIL "nsubstitute") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:TT NIL " (fill " (:PARAM NIL "sequence") " " (:PARAM NIL "item")
      ") ≡ (nsubstitute-if " (:PARAM NIL "item") " (constantly t) "
      (:PARAM NIL "sequence") ")")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MAKE-SEQUENCE")
   (:COM (:NAME "make-sequence" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-sequence")
      (:ARGLIST NIL "result-type size " (:KEYWORD NIL " &key")
       " initial-element")
      (:VALUES NIL "sequence"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " "
     (:ISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " "
     (:PARAM NIL "result-type") "—a " (:TYPEREF NIL "sequence") " "
     (:TERM NIL "type specifier") ". "
     (:ENDISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " "
     (:ENDISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " " :PAR
     (:ISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " " (:PARAM NIL "size")
     "—a non-negative " (:TERM NIL "integer") ". "
     (:ENDISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " " :PAR
     (:PARAM NIL "initial-element") "—an " (:TERM NIL "object")
     ". The default is " (:TERM NIL "implementation-dependent") ". " :PAR
     (:PARAM NIL "sequence") "—a " (:TERM NIL "proper sequence") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 14.1.0 12")
     "Returns a " (:TERM NIL "sequence") " of the type "
     (:PARAM NIL "result-type") " and of length " (:PARAM NIL "size")
     ", each of the " (:TERM NIL "elements")
     " of which has been initialized to " (:PARAM NIL "initial-element") ". "
     :PAR (:ISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " If the "
     (:PARAM NIL "result-type") " is a " (:TERM NIL "subtype") " of "
     (:TYPEREF NIL "list") ", the result will be a " (:TERM NIL "list") ". "
     :PAR "If the " (:PARAM NIL "result-type") " is a " (:TERM NIL "subtype")
     " of " (:TYPEREF NIL "vector")
     ", then if the implementation can determine the element type specified for the "
     (:PARAM NIL "result-type")
     ", the element type of the resulting array is the result of "
     (:TERM NIL "upgrading")
     " that element type; or, if the implementation can determine that the element type is unspecified (or "
     (:TT NIL "*") "), the element type of the resulting array is "
     (:TYPEREF NIL "t") "; otherwise, an error is signaled. "
     (:ENDISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (make-sequence 'list 0) → ()
 (make-sequence 'string 26 :initial-element #\\.) 
→ \"..........................\"
 (make-sequence '(vector double-float) 2
                :initial-element 1d0)
→ #(1.0d0 1.0d0)
")
     " " :PAR (:ISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " "
     (:CODE NIL " (make-sequence '(vector * 2) 3) should signal an error
 (make-sequence '(vector * 4) 3) should signal an error
")
     " " (:ENDISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The " (:TERM NIL "implementation")
     ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "The consequences are unspecified if " (:PARAM NIL "initial-element")
     " is not an " (:TERM NIL "object")
     " which can be stored in the resulting " (:TERM NIL "sequence") ". " :PAR
     (:ISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error")
     " must be signaled if the " (:PARAM NIL "result-type") " is neither a "
     (:TERM NIL "recognizable subtype") " of " (:TYPEREF NIL "list") ", nor a "
     (:TERM NIL "recognizable subtype") " of " (:TYPEREF NIL "vector") ". "
     (:ENDISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " " :PAR
     (:ISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error")
     " should be signaled if " (:PARAM NIL "result-type")
     " specifies the number of elements and " (:PARAM NIL "size")
     " is different from that number. "
     (:ENDISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-array") ", "
     (:FUNREF NIL "make-list") " " :PAR)
    (:PART (:NAME "Notes") " " (:ISSUE NIL "CHARACTER-PROPOSAL:2-6-5") " "
     (:CODE NIL " (make-sequence 'string 5) ≡ (make-string 5)               
")
     " " (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-6-5") " "))
   " " :PAR (:COMMENT NIL "%% ========== SUBSEQ")
   (:COM (:NAME "subseq" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "subseq")
      (:ARGLIST NIL "sequence start " (:KEYWORD NIL " &optional") " end")
      (:VALUES NIL "subsequence"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "subseq")
      (:ARGLIST NIL "sequence start " (:KEYWORD NIL " &optional") " end")
      (:NEW-VALUE NIL "new-subsequence"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "sequence")
     "—a " (:TERM NIL "proper sequence") ". " :PAR
     (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " "
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start") ", " (:PARAM NIL "end") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "sequence")
     ". The default for " (:PARAM NIL "end") " is " (:MISC NIL "nil") ". "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " " :PAR
     (:PARAM NIL "subsequence") "—a " (:TERM NIL "proper sequence") ". " :PAR
     (:PARAM NIL "new-subsequence") "—a " (:TERM NIL "proper sequence") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 14.1.0 6")
     (:FUNREF NIL "subseq") " creates a " (:TERM NIL "sequence")
     " that is a copy of the subsequence of " (:PARAM NIL "sequence") " "
     (:PARAM NIL "bounded") " by " (:PARAM NIL "start") " and "
     (:PARAM NIL "end") ". " :PAR (:PARAM NIL "Start")
     " specifies an offset into the original " (:PARAM NIL "sequence")
     " and marks the beginning position of the subsequence. "
     (:PARAM NIL "end")
     " marks the position following the last element of the subsequence. " :PAR
     (:FUNREF NIL "subseq") " always allocates a new " (:TERM NIL "sequence")
     " for a result; it never shares storage with an old "
     (:TERM NIL "sequence") ". The result subsequence is always of the same "
     (:TERM NIL "type") " as " (:PARAM NIL "sequence") ". " :PAR
     (:COMMENT NIL "% Moon's suggested interpretation follows:") :PAR "If "
     (:PARAM NIL "sequence") " is a " (:TERM NIL "vector") ", the result is a "
     (:TERM NIL "fresh") " " (:TERM NIL "simple array") " of "
     (:TERM NIL "rank") " one that has the same "
     (:TERM NIL "actual array element type") " as " (:PARAM NIL "sequence")
     ". If " (:PARAM NIL "sequence") " is a " (:TERM NIL "list")
     ", the result is a " (:TERM NIL "fresh") " " (:TERM NIL "list") ". " :PAR
     (:COMMENT NIL "% End Moon's suggested interpretation.") :PAR
     (:COMMENT NIL "% 14.1.0 7") (:MACREF NIL "setf") " may be used with "
     (:FUNREF NIL "subseq") " to destructively replace " (:TERM NIL "elements")
     " of a subsequence with " (:TERM NIL "elements") " taken from a "
     (:TERM NIL "sequence")
     " of new values. If the subsequence and the new sequence are not of equal length, the shorter length determines the number of elements that are replaced. The remaining "
     (:TERM NIL "elements")
     " at the end of the longer sequence are not modified in the operation. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq str \"012345\") → \"012345\"
 (subseq str 2) → \"2345\"
 (subseq str 3 5) → \"34\"
 (setf (subseq str 4) \"abc\") → \"abc\"
 str → \"0123ab\"
 (setf (subseq str 0 2) \"A\") → \"A\"
 str → \"A123ab\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "sequence") " is not a "
     (:TERM NIL "proper sequence")
     ". Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "new-subsequence")
     " is not a " (:TERM NIL "proper sequence") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "replace") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Sequence Mapping --------------------")
   :PAR (:COMMENT NIL "%% ========== MAP")
   (:COM (:NAME "map" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "map")
      (:ARGLIST NIL "result-type function " (:KEYWORD NIL " &rest") " "
       (:PLUS NIL "sequences"))
      (:VALUES NIL "result"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " "
     (:PARAM NIL "result-type") "—a " (:TYPEREF NIL "sequence") " "
     (:TERM NIL "type specifier") ", or " (:MISC NIL "nil") ". "
     (:ENDISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " " :PAR
     (:ISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " (:PARAM NIL "function")
     "—a " (:TERM NIL "function designator") ". " (:PARAM NIL "function")
     " must take as many arguments as there are " (:PARAM NIL "sequences") ". "
     (:ENDISSUE NIL "FUNCTION-TYPE:X3J13-MARCH-88") " " :PAR
     (:PARAM NIL "sequence") "—a " (:TERM NIL "proper sequence") ". " :PAR
     (:PARAM NIL "result") "—if " (:PARAM NIL "result-type") " is a "
     (:TERM NIL "type specifier") " other than " (:MISC NIL "nil") ", then a "
     (:TERM NIL "sequence") " of the " (:TERM NIL "type")
     " it denotes; otherwise (if the " (:PARAM NIL "result-type") " is "
     (:MISC NIL "nil") "), " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 7.8.4 3") "Applies "
     (:PARAM NIL "function")
     " to successive sets of arguments in which one argument is obtained from each "
     (:TERM NIL "sequence") ". " (:COMMENT NIL "% 14.2.0 6") "The "
     (:PARAM NIL "function") " is called first on all the elements with index "
     (:TT NIL "0") ", then on all those with index " (:TT NIL "1")
     ", and so on. The " (:PARAM NIL "result-type") " specifies the "
     (:TERM NIL "type") " of the resulting " (:TERM NIL "sequence") ". " :PAR
     (:FUNREF NIL "map") " returns " (:MISC NIL "nil") " if "
     (:PARAM NIL "result-type") " is " (:MISC NIL "nil") ". "
     (:COMMENT NIL "% 14.2.0 5") "Otherwise, " (:FUNREF NIL "map")
     " returns a " (:TERM NIL "sequence") " such that element " (:TT NIL "j")
     " is the result of applying " (:PARAM NIL "function") " to element "
     (:TT NIL "j") " of each of the " (:PARAM NIL "sequences") ". The result "
     (:TERM NIL "sequence") " is as long as the shortest of the "
     (:PARAM NIL "sequences")
     ". The consequences are undefined if the result of applying "
     (:PARAM NIL "function") " to the successive elements of the "
     (:PARAM NIL "sequences") " cannot be contained in a "
     (:TERM NIL "sequence") " of the " (:TERM NIL "type") " given by "
     (:PARAM NIL "result-type") ". " :PAR
     (:ISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " If the "
     (:PARAM NIL "result-type") " is a " (:TERM NIL "subtype") " of "
     (:TYPEREF NIL "list") ", the result will be a " (:TERM NIL "list") ". "
     :PAR "If the " (:PARAM NIL "result-type") " is a " (:TERM NIL "subtype")
     " of " (:TYPEREF NIL "vector")
     ", then if the implementation can determine the element type specified for the "
     (:PARAM NIL "result-type")
     ", the element type of the resulting array is the result of "
     (:TERM NIL "upgrading")
     " that element type; or, if the implementation can determine that the element type is unspecified (or "
     (:TT NIL "*") "), the element type of the resulting array is "
     (:TYPEREF NIL "t") "; otherwise, an error is signaled. "
     (:ENDISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (map 'string #'(lambda (x y)
                  (char \"01234567890ABCDEF\" (mod (+ x y) 16)))
       '(1 2 3 4)
       '(10 9 8 7)) → \"AAAA\"
 (setq seq '(\"lower\" \"UPPER\" \"\" \"123\")) → (\"lower\" \"UPPER\" \"\" \"123\")
 (map nil #'nstring-upcase seq) → NIL
 seq → (\"LOWER\" \"UPPER\" \"\" \"123\")
 (map 'list #'- '(1 2 3 4)) → (-1 -2 -3 -4)
 (map 'string
      #'(lambda (x) (if (oddp x) #\\1 #\\0))
      '(1 2 3 4)) → \"1010\"
")
     " " :PAR (:ISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " "
     (:CODE NIL
      " (map '(vector * 4) #'cons \"abc\" \"de\") should signal an error
")
     " " (:ENDISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error")
     " must be signaled if the " (:PARAM NIL "result-type") " is not a "
     (:TERM NIL "recognizable subtype") " of " (:TYPEREF NIL "list") ", not a "
     (:TERM NIL "recognizable subtype") " of " (:TYPEREF NIL "vector")
     ", and not " (:MISC NIL "nil") ". "
     (:ENDISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if any " (:PARAM NIL "sequence")
     " is not a " (:TERM NIL "proper sequence") ". " :PAR
     (:ISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error")
     " should be signaled if " (:PARAM NIL "result-type")
     " specifies the number of elements and the minimum length of the "
     (:PARAM NIL "sequences") " is different from that number. "
     (:ENDISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MAP-INTO")
   (:COM (:NAME "map-into" :FTYPE "Function")
    (:ISSUE NIL "MAP-INTO:ADD-FUNCTION") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "map-into")
      (:ARGLIST NIL "result-sequence function " (:KEYWORD NIL " &rest")
       " sequences")
      (:VALUES NIL "result-sequence"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "result-sequence") "—a " (:TERM NIL "proper sequence") ". "
     :PAR (:PARAM NIL "function") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of as many " (:TERM NIL "arguments")
     " as there are " (:PARAM NIL "sequences") ". " :PAR
     (:PARAM NIL "sequence") "—a " (:TERM NIL "proper sequence") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Destructively modifies "
     (:PARAM NIL "result-sequence") " to contain the results of applying "
     (:PARAM NIL "function") " to each element in the argument "
     (:PARAM NIL "sequences") " in turn. " :PAR (:PARAM NIL "result-sequence")
     " and each element of " (:PARAM NIL "sequences") " can each be either a "
     (:TERM NIL "list") " or a " (:TERM NIL "vector") ". "
     (:COMMENT NIL
      "Note that NIL is considered to be a sequence, of length zero.  ")
     "If " (:PARAM NIL "result-sequence") " and each element of "
     (:PARAM NIL "sequences")
     " are not all the same length, the iteration terminates when the shortest "
     (:TERM NIL "sequence") " (of any of the " (:PARAM NIL "sequences")
     " or the " (:PARAM NIL "result-sequence") ") is exhausted. If "
     (:PARAM NIL "result-sequence") " is a " (:TERM NIL "vector") " with a "
     (:TERM NIL "fill pointer") ", the " (:TERM NIL "fill pointer")
     " is ignored when deciding how many iterations to perform, and afterwards the "
     (:TERM NIL "fill pointer") " is set to the number of times "
     (:PARAM NIL "function") " was applied. If " (:PARAM NIL "result-sequence")
     " is longer than the shortest element of " (:PARAM NIL "sequences")
     ", extra elements at the end of " (:PARAM NIL "result-sequence")
     " are left unchanged. If " (:PARAM NIL "result-sequence") " is "
     (:MISC NIL "nil") ", " (:FUNREF NIL "map-into") " immediately returns "
     (:MISC NIL "nil") ", since " (:MISC NIL "nil") " is a "
     (:TERM NIL "sequence") " of length zero. " :PAR "If "
     (:PARAM NIL "function")
     " has side effects, it can count on being called first on all of the elements with index 0, then on all of those numbered 1, and so on. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq a (list 1 2 3 4) b (list 10 10 10 10)) → (10 10 10 10)
 (map-into a #'+ a b) → (11 12 13 14)
 a → (11 12 13 14)
 b → (10 10 10 10)
 (setq k '(one two three)) → (ONE TWO THREE)
 (map-into a #'cons k a) → ((ONE . 11) (TWO . 12) (THREE . 13) 14)
 (map-into a #'gensym) → (#:G9090 #:G9091 #:G9092 #:G9093)
 a → (#:G9090 #:G9091 #:G9092 #:G9093)
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "result-sequence")
     " is not a " (:TERM NIL "proper sequence")
     ". Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "sequence") " is not a "
     (:TERM NIL "proper sequence") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "map-into") " differs from "
     (:FUNREF NIL "map") " in that it modifies an existing "
     (:TERM NIL "sequence") " rather than creating a new one. In addition, "
     (:FUNREF NIL "map-into") " can be called with only two arguments, while "
     (:FUNREF NIL "map") " requires at least three arguments. " :PAR
     (:COMMENT NIL "% Barmar supplied this.") (:FUNREF NIL "map-into")
     " could be defined by: " :PAR
     (:CODE NIL " (defun map-into (result-sequence function &rest sequences)
   (loop for index below (apply #'min 
                                (length result-sequence)
                                (mapcar #'length sequences))
         do (setf (elt result-sequence index)
                  (apply function
                         (mapcar #'(lambda (seq) (elt seq index))
                                 sequences))))
   result-sequence)
")
     " " :PAR (:ENDISSUE NIL "MAP-INTO:ADD-FUNCTION") " "))
   " " :PAR (:COMMENT NIL "%% ========== REDUCE")
   (:COM (:NAME "reduce" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "reduce")
      (:ARGLIST NIL "function sequence " (:KEYWORD NIL " &key")
       " key from-end start end initial-value")
      (:VALUES NIL "result"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "function")
     "—a " (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " that might be called with either zero or two " (:TERM NIL "arguments")
     ". " :PAR (:PARAM NIL "sequence") "—a " (:TERM NIL "proper sequence") ". "
     :PAR (:ISSUE NIL "REDUCE-ARGUMENT-EXTRACTION") " " (:PARAM NIL "key")
     "—a " (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of one argument, or " (:MISC NIL "nil") ". "
     (:ENDISSUE NIL "REDUCE-ARGUMENT-EXTRACTION") " " :PAR
     (:PARAM NIL "from-end") "—a " (:TERM NIL "generalized boolean")
     ". The default is " (:TERM NIL "false") ". " :PAR
     (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " "
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start") ", " (:PARAM NIL "end") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "sequence")
     ". The defaults for " (:PARAM NIL "start") " and " (:PARAM NIL "end")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " " :PAR
     (:PARAM NIL "initial-value") "—an " (:TERM NIL "object") ". " :PAR
     (:PARAM NIL "result") "—an " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 14.2.0 17" "% 14.2.0 18") (:FUNREF NIL "reduce")
     " uses a binary operation, " (:PARAM NIL "function") ", to combine the "
     (:TERM NIL "elements") " of " (:PARAM NIL "sequence") " "
     (:TERM NIL "bounded") " by " (:PARAM NIL "start") " and "
     (:PARAM NIL "end") ". " :PAR "The " (:PARAM NIL "function")
     " must accept as " (:TERM NIL "arguments") " two " (:TERM NIL "elements")
     " of " (:PARAM NIL "sequence") " or the results from combining those "
     (:TERM NIL "elements") ". The " (:PARAM NIL "function")
     " must also be able to accept no arguments. " :PAR
     (:ISSUE NIL "REDUCE-ARGUMENT-EXTRACTION") " If " (:PARAM NIL "key")
     " is supplied, it is used to extract the values to reduce. The "
     (:PARAM NIL "key") " function is applied exactly once to each element of "
     (:PARAM NIL "sequence")
     " in the order implied by the reduction order but not to the value of "
     (:PARAM NIL "initial-value") ", if supplied. "
     (:ENDISSUE NIL "REDUCE-ARGUMENT-EXTRACTION") " The " (:PARAM NIL "key")
     " function typically returns part of the " (:TERM NIL "element") " of "
     (:PARAM NIL "sequence") ". If " (:PARAM NIL "key")
     " is not supplied or is " (:MISC NIL "nil") ", the "
     (:PARAM NIL "sequence") " " (:TERM NIL "element") " itself is used. " :PAR
     "The reduction is left-associative, unless " (:PARAM NIL "from-end")
     " is " (:TERM NIL "true") " in which case it is right-associative. " :PAR
     "If " (:PARAM NIL "initial-value")
     " is supplied, it is logically placed before the subsequence (or after it if "
     (:PARAM NIL "from-end") " is " (:TERM NIL "true")
     ") and included in the reduction operation. " :PAR
     "In the normal case, the result of " (:FUNREF NIL "reduce")
     " is the combined result of " (:PARAM NIL "function")
     "'s being applied to successive pairs of " (:TERM NIL "elements") " of "
     (:PARAM NIL "sequence") ". " (:COMMENT NIL "% 14.2.0 19")
     "If the subsequence contains exactly one " (:TERM NIL "element")
     " and no " (:PARAM NIL "initial-value") " is given, then that "
     (:TERM NIL "element") " is returned and " (:PARAM NIL "function")
     " is not called. If the subsequence is empty and an "
     (:PARAM NIL "initial-value") " is given, then the "
     (:PARAM NIL "initial-value") " is returned and " (:PARAM NIL "function")
     " is not called. " (:COMMENT NIL "% 14.2.0 20")
     "If the subsequence is empty and no " (:PARAM NIL "initial-value")
     " is given, then the " (:PARAM NIL "function")
     " is called with zero arguments, and " (:FUNREF NIL "reduce")
     " returns whatever " (:PARAM NIL "function")
     " does. This is the only case where the " (:PARAM NIL "function")
     " is called with other than two arguments. " :PAR)
    (:PART (:NAME "Examples") " " (:COMMENT NIL "% 14.2.0 21")
     (:CODE NIL " (reduce #'* '(1 2 3 4 5)) → 120
 (reduce #'append '((1) (2)) :initial-value '(i n i t)) → (I N I T 1 2)
 (reduce #'append '((1) (2)) :from-end t                  
                             :initial-value '(i n i t)) → (1 2 I N I T) 
 (reduce #'- '(1 2 3 4)) ≡ (- (- (- 1 2) 3) 4) → -8
 (reduce #'- '(1 2 3 4) :from-end t)    ;Alternating sum.
≡ (- 1 (- 2 (- 3 4))) → -2
 (reduce #'+ '()) → 0
 (reduce #'+ '(3)) → 3
 (reduce #'+ '(foo)) → FOO
 (reduce #'list '(1 2 3 4)) → (((1 2) 3) 4)
 (reduce #'list '(1 2 3 4) :from-end t) → (1 (2 (3 4)))
 (reduce #'list '(1 2 3 4) :initial-value 'foo) → ((((foo 1) 2) 3) 4)
 (reduce #'list '(1 2 3 4)
        :from-end t :initial-value 'foo) → (1 (2 (3 (4 foo))))
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "sequence") " is not a "
     (:TERM NIL "proper sequence") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Sequence Counting --------------------")
   :PAR
   (:COMMENT NIL "%% ========== COUNT" "%% ========== COUNT-IF"
    "%% ========== COUNT-IF-NOT")
   (:COM (:NAME "count, count-if, count-if-not" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "count")
      (:ARGLIST NIL "item sequence " (:KEYWORD NIL " &key")
       " from-end start end key test test-not")
      (:VALUES NIL "n"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "count-if")
      (:ARGLIST NIL "predicate sequence " (:KEYWORD NIL " &key")
       " from-end start end key")
      (:VALUES NIL "n"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "count-if-not")
      (:ARGLIST NIL "predicate sequence " (:KEYWORD NIL " &key")
       " from-end start end key")
      (:VALUES NIL "n"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "item") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "sequence") "—a "
     (:TERM NIL "proper sequence") ". " :PAR (:PARAM NIL "predicate") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of one "
     (:TERM NIL "argument") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "from-end") "—a "
     (:TERM NIL "generalized boolean") ". The default is " (:TERM NIL "false")
     ". " :PAR (:PARAM NIL "test") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "test-not") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " "
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start") ", " (:PARAM NIL "end") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "sequence")
     ". The defaults for " (:PARAM NIL "start") " and " (:PARAM NIL "end")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " " :PAR (:PARAM NIL "key")
     "—a " (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of one argument, or " (:MISC NIL "nil") ". " :PAR (:PARAM NIL "n")
     "—a non-negative " (:TERM NIL "integer") " less than or equal to the "
     (:TERM NIL "length") " of " (:PARAM NIL "sequence") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 14.3.0 32")
     (:FUNREF NIL "count") ", " (:FUNREF NIL "count-if") ", and "
     (:FUNREF NIL "count-if-not") " count and return the number of "
     (:TERM NIL "elements") " in the " (:PARAM NIL "sequence") " "
     (:TERM NIL "bounded") " by " (:PARAM NIL "start") " and "
     (:PARAM NIL "end") " that " (:TERM NIL "satisfy the test") ". " :PAR
     "The " (:PARAM NIL "from-end")
     " has no direct effect on the result. However, if "
     (:PARAM NIL "from-end") " is " (:TERM NIL "true") ", the "
     (:TERM NIL "elements") " of " (:PARAM NIL "sequence")
     " will be supplied as " (:TERM NIL "arguments") " to the "
     (:PARAM NIL "test") ", " (:PARAM NIL "test-not") ", and "
     (:PARAM NIL "key")
     " in reverse order, which may change the side-effects, if any, of those functions. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (count #\\a \"how many A's are there in here?\") → 2
 (count-if-not #'oddp '((1) (2) (3) (4)) :key #'car) → 2
 (count-if #'upper-case-p \"The Crying of Lot 49\" :start 4) → 2 
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "sequence") " is not a "
     (:TERM NIL "proper sequence") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :TEST-FUNCTION-RULES) ", "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL")
     " The " (:KWD NIL "test-not") " " (:TERM NIL "argument")
     " is deprecated. " (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
     (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " The " (:TERM NIL "function")
     " " (:FUNREF NIL "count-if-not") " is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LENGTH")
   (:COM (:NAME "length" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "length") (:ARGLIST NIL "sequence")
      (:VALUES NIL "n"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "sequence")
     "—a " (:TERM NIL "proper sequence") ". " :PAR (:PARAM NIL "n")
     "—a non-negative " (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 14.1.0 9")
     "Returns the number of " (:TERM NIL "elements") " in "
     (:PARAM NIL "sequence") ". " :PAR "If " (:PARAM NIL "sequence") " is a "
     (:TERM NIL "vector") " with a " (:TERM NIL "fill pointer")
     ", the active length as specified by the " (:TERM NIL "fill pointer")
     " is returned. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (length \"abc\") → 3
 (setq str (make-array '(3) :element-type 'character 
                            :initial-contents \"abc\"
                            :fill-pointer t)) → \"abc\"
 (length str) → 3
 (setf (fill-pointer str) 2) → 2
 (length str) → 2
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "sequence") " is not a "
     (:TERM NIL "proper sequence") ". "
     (:COMMENT NIL "%It's implied by lazychecktype."
      "The results are undefined if \\param{sequence} is a \\term{circular list}.")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "list-length") ", "
     (:TYPEREF NIL "sequence") " " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Sequence Ordering --------------------")
   :PAR (:COMMENT NIL "%% ========== REVERSE" "%% ========== NREVERSE")
   (:COM (:NAME "reverse, nreverse" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "reverse") (:ARGLIST NIL "sequence")
      (:VALUES NIL "reversed-sequence"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "nreverse") (:ARGLIST NIL "sequence")
      (:VALUES NIL "reversed-sequence"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "sequence")
     "—a " (:TERM NIL "proper sequence") ". " :PAR (:COMMENT NIL "% 14.1.0 10")
     (:PARAM NIL "reversed-sequence") "—a " (:TERM NIL "sequence") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "reverse") " and "
     (:FUNREF NIL "nreverse") " return a new " (:TERM NIL "sequence")
     " of the same kind as " (:PARAM NIL "sequence") ", containing the same "
     (:TERM NIL "elements") ", but in reverse order. " :PAR
     (:FUNREF NIL "reverse") " and " (:FUNREF NIL "nreverse")
     " differ in that " (:FUNREF NIL "reverse")
     " always creates and returns a new " (:TERM NIL "sequence") ", whereas "
     (:FUNREF NIL "nreverse") " might modify and return the given "
     (:PARAM NIL "sequence") ". " (:FUNREF NIL "reverse")
     " never modifies the given " (:PARAM NIL "sequence") ". " :PAR
     (:COMMENT NIL "% Moon's suggested interpretation follows:") :PAR "For "
     (:FUNREF NIL "reverse") ", if " (:PARAM NIL "sequence") " is a "
     (:TERM NIL "vector") ", the result is a " (:TERM NIL "fresh") " "
     (:TERM NIL "simple array") " of " (:TERM NIL "rank")
     " one that has the same " (:TERM NIL "actual array element type") " as "
     (:PARAM NIL "sequence") ". If " (:PARAM NIL "sequence") " is a "
     (:TERM NIL "list") ", the result is a " (:TERM NIL "fresh") " "
     (:TERM NIL "list") ". " :PAR "For " (:FUNREF NIL "nreverse") ", if "
     (:PARAM NIL "sequence") " is a " (:TERM NIL "vector") ", the result is a "
     (:TERM NIL "vector") " that has the same "
     (:TERM NIL "actual array element type") " as " (:PARAM NIL "sequence")
     ". If " (:PARAM NIL "sequence") " is a " (:TERM NIL "list")
     ", the result is a " (:TERM NIL "list") ". " :PAR
     (:COMMENT NIL "% End Moon's suggested interpretation.") :PAR
     (:COMMENT NIL "% 14.1.0 11") "For " (:FUNREF NIL "nreverse") ", "
     (:PARAM NIL "sequence")
     " might be destroyed and re-used to produce the result. The result might or might not be "
     (:TERM NIL "identical") " to " (:PARAM NIL "sequence") ". "
     (:ISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89")
     " Specifically, when " (:PARAM NIL "sequence") " is a " (:TERM NIL "list")
     ", " (:FUNREF NIL "nreverse") " is permitted to " (:MACREF NIL "setf")
     " any part, " (:FUNREF NIL "car") " or " (:FUNREF NIL "cdr") ", of any "
     (:TERM NIL "cons") " that is part of the " (:TERM NIL "list structure")
     " of " (:PARAM NIL "sequence") ". When " (:PARAM NIL "sequence") " is a "
     (:TERM NIL "vector") ", " (:FUNREF NIL "nreverse")
     " is permitted to re-order the elements of " (:PARAM NIL "sequence")
     " in order to produce the resulting " (:TERM NIL "vector") ". "
     (:ENDISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (setq str \"abc\") → \"abc\"
 (reverse str) → \"cba\"
 str → \"abc\"
 (setq str (copy-seq str)) → \"abc\"
 (nreverse str) → \"cba\"
 str → "
      (:TERM NIL "implementation-dependent") "
 (setq l (list 1 2 3)) → (1 2 3)
 (nreverse l) → (3 2 1)
 l → "
      (:TERM NIL "implementation-dependent") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR (:FUNREF NIL "nreverse")
     " might either create a new " (:TERM NIL "sequence")
     ", modify the argument " (:PARAM NIL "sequence") ", or both. "
     (:COMMENT NIL
      "\\funref{reverse} returns a \\term{potential copy} of \\param{sequence}.")
     "(" (:FUNREF NIL "reverse") " does not modify " (:PARAM NIL "sequence")
     ".) " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "sequence") " is not a "
     (:TERM NIL "proper sequence") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SORT" "%% ========== STABLE-SORT")
   (:COM (:NAME "sort, stable-sort" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "sort")
      (:ARGLIST NIL "sequence predicate " (:KEYWORD NIL " &key") " key")
      (:VALUES NIL "sorted-sequence"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "stable-sort")
      (:ARGLIST NIL "sequence predicate " (:KEYWORD NIL " &key") " key")
      (:VALUES NIL "sorted-sequence"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "sequence")
     "—a " (:TERM NIL "proper sequence") ". " :PAR (:PARAM NIL "predicate")
     "—a " (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of two arguments that returns a " (:TERM NIL "generalized boolean") ". "
     :PAR (:COMMENT NIL "% 14.4.0 4") (:PARAM NIL "key") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of one argument, or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "sorted-sequence") "—a " (:TERM NIL "sequence") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 14.4.0 2")
     (:FUNREF NIL "sort") " and " (:FUNREF NIL "stable-sort")
     " destructively sort " (:PARAM NIL "sequences")
     " according to the order determined by the " (:PARAM NIL "predicate")
     " function. " :PAR
     (:COMMENT NIL "% Moon's suggested interpretation follows:") :PAR "If "
     (:PARAM NIL "sequence") " is a " (:TERM NIL "vector") ", the result is a "
     (:TERM NIL "vector") " that has the same "
     (:TERM NIL "actual array element type") " as " (:PARAM NIL "sequence")
     ". "
     (:COMMENT NIL
      "% Moved to notes per Schulenburg #1 (by X3J13 vote at May 4-5, 1994 meeting)."
      "% -kmp 9-May-94" " The result might or might not be simple, "
      " and might or might not be \\term{identical} to \\param{sequence}."
      "% Another possible interpretation:"
      "% The result might or might not be \\term{identical} to \\param{sequence}."
      "% If the result is  a \\term{vector} that is not \\term{identical}"
      "% to \\param{sequence}, the result is a \\term{fresh} \\term{simple array}"
      "% of \\term{rank} one.")
     "If " (:PARAM NIL "sequence") " is a " (:TERM NIL "list")
     ", the result is a " (:TERM NIL "list") ". "
     (:COMMENT NIL "% End Moon's suggested interpretation.") :PAR
     (:COMMENT NIL "% 14.4.0 3") (:FUNREF NIL "sort")
     " determines the relationship between two elements by giving keys extracted from the elements to the "
     (:PARAM NIL "predicate") ". The first argument to the "
     (:PARAM NIL "predicate") " function is the part of one element of "
     (:PARAM NIL "sequence") " extracted by the " (:PARAM NIL "key")
     " function (if supplied); the second argument is the part of another element of "
     (:PARAM NIL "sequence") " extracted by the " (:PARAM NIL "key")
     " function (if supplied). " (:PARAM NIL "Predicate") " should return "
     (:TERM NIL "true")
     " if and only if the first argument is strictly less than the second (in some appropriate sense). If the first argument is greater than or equal to the second (in the appropriate sense), then the "
     (:PARAM NIL "predicate") " should return " (:TERM NIL "false") ". " :PAR
     "The argument to the " (:PARAM NIL "key") " function is the "
     (:PARAM NIL "sequence") " element. The return value of the "
     (:PARAM NIL "key") " function becomes an argument to "
     (:PARAM NIL "predicate") ". If " (:PARAM NIL "key") " is not supplied or "
     (:MISC NIL "nil") ", the " (:PARAM NIL "sequence")
     " element itself is used. There is no guarantee on the number of times the "
     (:PARAM NIL "key") " will be called. " :PAR (:COMMENT NIL "% 14.4.0 5")
     "If the " (:PARAM NIL "key") " and " (:PARAM NIL "predicate")
     " always return, then the sorting operation will always terminate, producing a "
     (:TERM NIL "sequence") " containing the same " (:TERM NIL "elements")
     " as " (:PARAM NIL "sequence")
     " (that is, the result is a permutation of " (:PARAM NIL "sequence")
     "). This is guaranteed even if the " (:PARAM NIL "predicate")
     " does not really consistently represent a total order (in which case the "
     (:TERM NIL "elements")
     " will be scrambled in some unpredictable way, but no "
     (:TERM NIL "element") " will be lost). If the " (:PARAM NIL "key")
     " consistently returns meaningful keys, and the " (:PARAM NIL "predicate")
     " does reflect some total ordering criterion on those keys, then the "
     (:TERM NIL "elements") " of the " (:PARAM NIL "sorted-sequence")
     " will be properly sorted according to that ordering. " :PAR
     (:COMMENT NIL "% 14.4.0 6") "The sorting operation performed by "
     (:FUNREF NIL "sort")
     " is not guaranteed stable. Elements considered equal by the "
     (:PARAM NIL "predicate")
     " might or might not stay in their original order. The "
     (:PARAM NIL "predicate") " is assumed to consider two elements "
     (:TT NIL "x") " and " (:TT NIL "y") " to be equal if "
     (:TT NIL "(funcall " (:I NIL "predicate") " " (:I NIL "x") " "
      (:I NIL "y") ")")
     " and "
     (:TT NIL "(funcall " (:I NIL "predicate") " " (:I NIL "y") " "
      (:I NIL "x") ")")
     " are both " (:TERM NIL "false") ". " (:FUNREF NIL "stable-sort")
     " guarantees stability. " :PAR (:COMMENT NIL "% 14.5.0 7")
     "The sorting operation can be destructive in all cases. In the case of a "
     (:TERM NIL "vector")
     " argument, this is accomplished by permuting the elements in place. In the case of a "
     (:TERM NIL "list") ", the " (:TERM NIL "list")
     " is destructively reordered in the same manner as for "
     (:FUNREF NIL "nreverse") ". " :PAR
     (:COMMENT NIL "% 14.4.0 9" "% this paragraph left out") :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq tester (copy-seq \"lkjashd\")) → \"lkjashd\"
 (sort tester #'char-lessp) → \"adhjkls\"
 (setq tester (list '(1 2 3) '(4 5 6) '(7 8 9))) → ((1 2 3) (4 5 6) (7 8 9))
 (sort tester #'> :key #'car)  → ((7 8 9) (4 5 6) (1 2 3)) 
 (setq tester (list 1 2 3 4 5 6 7 8 9 0)) → (1 2 3 4 5 6 7 8 9 0)
 (stable-sort tester #'(lambda (x y) (and (oddp x) (evenp y))))
→ (1 3 5 7 9 2 4 6 8 0)
 (sort (setq committee-data
             (vector (list (list \"JonL\" \"White\") \"Iteration\")
                     (list (list \"Dick\" \"Waters\") \"Iteration\")
                     (list (list \"Dick\" \"Gabriel\") \"Objects\")
                     (list (list \"Kent\" \"Pitman\") \"Conditions\")
                     (list (list \"Gregor\" \"Kiczales\") \"Objects\")
                     (list (list \"David\" \"Moon\") \"Objects\")
                     (list (list \"Kathy\" \"Chapman\") \"Editorial\")
                     (list (list \"Larry\" \"Masinter\") \"Cleanup\")
                     (list (list \"Sandra\" \"Loosemore\") \"Compiler\")))
       #'string-lessp :key #'cadar)
→ #(((\"Kathy\" \"Chapman\") \"Editorial\")
     ((\"Dick\" \"Gabriel\") \"Objects\")
     ((\"Gregor\" \"Kiczales\") \"Objects\")
     ((\"Sandra\" \"Loosemore\") \"Compiler\")
     ((\"Larry\" \"Masinter\") \"Cleanup\")
     ((\"David\" \"Moon\") \"Objects\")
     ((\"Kent\" \"Pitman\") \"Conditions\")
     ((\"Dick\" \"Waters\") \"Iteration\")
     ((\"JonL\" \"White\") \"Iteration\"))
 ;; Note that individual alphabetical order within `committees'
 ;; is preserved.
 (setq committee-data 
       (stable-sort committee-data #'string-lessp :key #'cadr))
→ #(((\"Larry\" \"Masinter\") \"Cleanup\")
     ((\"Sandra\" \"Loosemore\") \"Compiler\")
     ((\"Kent\" \"Pitman\") \"Conditions\")
     ((\"Kathy\" \"Chapman\") \"Editorial\")
     ((\"Dick\" \"Waters\") \"Iteration\")
     ((\"JonL\" \"White\") \"Iteration\")
     ((\"Dick\" \"Gabriel\") \"Objects\")
     ((\"Gregor\" \"Kiczales\") \"Objects\")
     ((\"David\" \"Moon\") \"Objects\"))
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "sequence") " is not a "
     (:TERM NIL "proper sequence") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "merge") ", "
     (:ISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:SECREF NIL :CONSTANT-MODIFICATION) ", "
     (:ENDISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) ", "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :DESTRUCTIVE-OPERATIONS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL
      "% Moved from Description per Schulenburg #1 (by X3J13 vote at May 4-5, 1994 meeting)."
      "% -kmp 9-May-94")
     "If " (:PARAM NIL "sequence") " is a " (:TERM NIL "vector")
     ", the result might or might not be simple, and might or might not be "
     (:TERM NIL "identical") " to " (:PARAM NIL "sequence") ". " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Sequence Search --------------------")
   :PAR
   (:COMMENT NIL "%% ========== FIND" "%% ========== FIND-IF"
    "%% ========== FIND-IF-NOT")
   (:COM (:NAME "find, find-if, find-if-not" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "find")
      (:ARGLIST NIL "item sequence " (:KEYWORD NIL " &key")
       " from-end test test-not start end key")
      (:VALUES NIL "element"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "find-if")
      (:ARGLIST NIL "predicate sequence " (:KEYWORD NIL " &key")
       " from-end start end key")
      (:VALUES NIL "element"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "find-if-not")
      (:ARGLIST NIL "predicate sequence " (:KEYWORD NIL " &key")
       " from-end start end key")
      (:VALUES NIL "element"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "item") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "sequence") "—a "
     (:TERM NIL "proper sequence") ". " :PAR (:PARAM NIL "predicate") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of one "
     (:TERM NIL "argument") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "from-end") "—a "
     (:TERM NIL "generalized boolean") ". The default is " (:TERM NIL "false")
     ". " :PAR (:PARAM NIL "test") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "test-not") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " "
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start") ", " (:PARAM NIL "end") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "sequence")
     ". The defaults for " (:PARAM NIL "start") " and " (:PARAM NIL "end")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " " :PAR (:PARAM NIL "key")
     "—a " (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of one argument, or " (:MISC NIL "nil") ". " :PAR (:PARAM NIL "element")
     "—an " (:TERM NIL "element") " of the " (:PARAM NIL "sequence") ", or "
     (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "find") ", "
     (:FUNREF NIL "find-if") ", and " (:FUNREF NIL "find-if-not")
     " each search for an " (:TERM NIL "element") " of the "
     (:PARAM NIL "sequence") " " (:TERM NIL "bounded") " by "
     (:PARAM NIL "start") " and " (:TERM NIL "end") " that "
     (:TERM NIL "satisfies the predicate") " " (:PARAM NIL "predicate")
     " or that " (:TERM NIL "satisfies the test") " " (:PARAM NIL "test")
     " or " (:PARAM NIL "test-not") ", as appropriate. " :PAR
     (:COMMENT NIL "% 14.3.0 28") "If " (:PARAM NIL "from-end") " is "
     (:TERM NIL "true") ", then the result is the rightmost "
     (:TERM NIL "element") " that " (:TERM NIL "satisfies the test") ". " :PAR
     (:COMMENT NIL "% 14.3.0 26") "If the " (:PARAM NIL "sequence")
     " contains an " (:TERM NIL "element") " that "
     (:TERM NIL "satisfies the test") ", then the leftmost or rightmost "
     (:PARAM NIL "sequence") " element, depending on " (:PARAM NIL "from-end")
     ", is returned; otherwise " (:MISC NIL "nil") " is returned. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (find #\\d \"here are some letters that can be looked at\" :test #'char>)
→ #\\Space 
 (find-if #'oddp '(1 2 3 4 5) :end 3 :from-end t) → 3
 (find-if-not #'complexp                                    
             '#(3.5 2 #C(1.0 0.0) #C(0.0 1.0))
             :start 2) → NIL 
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "sequence") " is not a "
     (:TERM NIL "proper sequence") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "position") ", "
     (:SECREF NIL :TEST-FUNCTION-RULES) ", "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL")
     " The " (:KWD NIL "test-not") " " (:TERM NIL "argument")
     " is deprecated. " (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
     (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " The " (:TERM NIL "function")
     " " (:FUNREF NIL "find-if-not") " is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
     (:COMMENT NIL
      "% This equivalence isn't true when the element isn't found. -kmp 14-Jan-91"
      " \\code" " (find item sequence ...)"
      "  \\EQ (elt sequence (position item sequence ...))" " \\endcode")
     :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== POSITION" "%% ========== POSITION-IF"
    "%% ========== POSITION-IF-NOT")
   (:COM (:NAME "position, position-if, position-if-not" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "position")
      (:ARGLIST NIL "item sequence " (:KEYWORD NIL " &key")
       " from-end test test-not start end key")
      (:VALUES NIL "position"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "position-if")
      (:ARGLIST NIL "predicate sequence " (:KEYWORD NIL " &key")
       " from-end start end key")
      (:VALUES NIL "position"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "position-if-not")
      (:ARGLIST NIL "predicate sequence " (:KEYWORD NIL " &key")
       " from-end start end key")
      (:VALUES NIL "position"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "item") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "sequence") "—a "
     (:TERM NIL "proper sequence") ". " :PAR (:PARAM NIL "predicate") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of one argument that returns a " (:TERM NIL "generalized boolean") ". "
     :PAR (:PARAM NIL "from-end") "—a " (:TERM NIL "generalized boolean")
     ". The default is " (:TERM NIL "false") ". " :PAR (:PARAM NIL "test")
     "—a " (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "test-not") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR
     (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " "
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start") ", " (:PARAM NIL "end") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "sequence")
     ". The defaults for " (:PARAM NIL "start") " and " (:PARAM NIL "end")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " " :PAR (:PARAM NIL "key")
     "—a " (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of one argument, or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "position") "—a " (:TERM NIL "bounding index") " of "
     (:PARAM NIL "sequence") ", or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "position") ", "
     (:FUNREF NIL "position-if") ", and " (:FUNREF NIL "position-if-not")
     " each search " (:PARAM NIL "sequence") " for an " (:TERM NIL "element")
     " that " (:TERM NIL "satisfies the test") ". " :PAR
     (:COMMENT NIL "% 14.3.0 29" "% 14.3.0 31") "The " (:PARAM NIL "position")
     " returned is the index within " (:PARAM NIL "sequence")
     " of the leftmost (if " (:PARAM NIL "from-end") " is " (:TERM NIL "true")
     ") or of the rightmost (if " (:PARAM NIL "from-end") " is "
     (:TERM NIL "false") ") " (:TERM NIL "element") " that "
     (:TERM NIL "satisfies the test") "; otherwise " (:MISC NIL "nil")
     " is returned. " (:COMMENT NIL "% 14.3.0 30")
     "The index returned is relative to the left-hand end of the entire "
     (:PARAM NIL "sequence") ", regardless of the value of "
     (:PARAM NIL "start") ", " (:PARAM NIL "end") ", or "
     (:PARAM NIL "from-end") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (position #\\a \"baobab\" :from-end t) → 4
 (position-if #'oddp '((1) (2) (3) (4)) :start 1 :key #'car) → 2
 (position 595 '()) → NIL
 (position-if-not #'integerp '(1 2 3 4 5.0)) → 4 
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "sequence") " is not a "
     (:TERM NIL "proper sequence") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "find") ", "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL")
     " The " (:KWD NIL "test-not") " " (:TERM NIL "argument")
     " is deprecated. " (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
     (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " The " (:TERM NIL "function")
     " " (:FUNREF NIL "position-if-not") " is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SEARCH")
   (:COM (:NAME "search" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "search")
      (:ARGLIST NIL "sequence-1 sequence-2 " (:KEYWORD NIL " &key")
       " from-end test test-not key start1 start2 end1 end2")
      (:VALUES NIL "position"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "Sequence-1")
     "—a " (:TERM NIL "sequence") ". " :PAR (:PARAM NIL "Sequence-2") "—a "
     (:TERM NIL "sequence") ". " :PAR (:PARAM NIL "from-end") "—a "
     (:TERM NIL "generalized boolean") ". The default is " (:TERM NIL "false")
     ". " :PAR (:PARAM NIL "test") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "test-not") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "key") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of one argument, or " (:MISC NIL "nil") ". " :PAR
     (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " "
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start1") ", " (:PARAM NIL "end1") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "sequence-1")
     ". The defaults for " (:PARAM NIL "start1") " and " (:PARAM NIL "end1")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. " :PAR
     (:PARAM NIL "start2") ", " (:PARAM NIL "end2") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "sequence-2")
     ". The defaults for " (:PARAM NIL "start2") " and " (:PARAM NIL "end2")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " " :PAR
     (:PARAM NIL "position") "—a " (:TERM NIL "bounding index") " of "
     (:PARAM NIL "sequence-2") ", or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 14.3.0 36")
     "Searches " (:PARAM NIL "sequence-2") " for a subsequence that matches "
     (:PARAM NIL "sequence-1") ". " :PAR (:COMMENT NIL "% 14.3.0 38")
     "The implementation may choose to search " (:PARAM NIL "sequence-2")
     " in any order; there is no guarantee on the number of times the test is made. For example, when "
     (:PARAM NIL "from-end") " is " (:TERM NIL "true") ", the "
     (:PARAM NIL "sequence")
     " might actually be searched from left to right instead of from right to left (but in either case would return the rightmost matching subsequence). If the search succeeds, "
     (:FUNREF NIL "search") " returns the offset into "
     (:PARAM NIL "sequence-2")
     " of the first element of the leftmost or rightmost matching subsequence, depending on "
     (:PARAM NIL "from-end") "; otherwise " (:FUNREF NIL "search") " returns "
     (:MISC NIL "nil") ". " :PAR (:COMMENT NIL "% 14.3.0 37") "If "
     (:PARAM NIL "from-end") " is " (:TERM NIL "true")
     ", the index of the leftmost element of the rightmost matching subsequence is returned. "
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (search \"dog\" \"it's a dog's life\") → 7
 (search '(0 1) '(2 4 6 1 3 5) :key #'oddp) → 2
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL")
     " The " (:KWD NIL "test-not") " " (:TERM NIL "argument")
     " is deprecated. " (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR))
   " " :PAR
   (:COMMENT NIL
    "-------------------- Sequence Comparison --------------------")
   :PAR (:COMMENT NIL "%% ========== MISMATCH")
   (:COM (:NAME "mismatch" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "mismatch")
      (:ARGLIST NIL "sequence-1 sequence-2 " (:KEYWORD NIL " &key")
       " from-end test test-not key start1 start2 end1 end2")
      (:VALUES NIL "position"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "Sequence-1")
     "—a " (:TERM NIL "sequence") ". " :PAR (:PARAM NIL "Sequence-2") "—a "
     (:TERM NIL "sequence") ". " :PAR (:PARAM NIL "from-end") "—a "
     (:TERM NIL "generalized boolean") ". The default is " (:TERM NIL "false")
     ". " :PAR (:PARAM NIL "test") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "test-not") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " "
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start1") ", " (:PARAM NIL "end1") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "sequence-1")
     ". The defaults for " (:PARAM NIL "start1") " and " (:PARAM NIL "end1")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. " :PAR
     (:PARAM NIL "start2") ", " (:PARAM NIL "end2") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "sequence-2")
     ". The defaults for " (:PARAM NIL "start2") " and " (:PARAM NIL "end2")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " " :PAR (:PARAM NIL "key")
     "—a " (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of one argument, or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "position") "—a " (:TERM NIL "bounding index") " of "
     (:PARAM NIL "sequence-1") ", or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 14.3.0 34")
     "The specified subsequences of " (:PARAM NIL "sequence-1") " and "
     (:PARAM NIL "sequence-2") " are compared element-wise. " :PAR "The "
     (:PARAM NIL "key") " argument is used for both the "
     (:PARAM NIL "sequence-1") " and the " (:PARAM NIL "sequence-2") ". " :PAR
     "If " (:PARAM NIL "sequence-1") " and " (:PARAM NIL "sequence-2")
     " are of equal length and match in every element, the result is "
     (:TERM NIL "false") ". Otherwise, the result is a non-negative "
     (:TERM NIL "integer") ", the index within " (:PARAM NIL "sequence-1")
     " of the leftmost or rightmost position, depending on "
     (:PARAM NIL "from-end")
     ", at which the two subsequences fail to match. If one subsequence is shorter than and a matching prefix of the other, the result is the index relative to "
     (:PARAM NIL "sequence-1") " beyond the last position tested. " :PAR
     (:COMMENT NIL "% 14.3.0 35") "If " (:PARAM NIL "from-end") " is "
     (:TERM NIL "true")
     ", then one plus the index of the rightmost position in which the "
     (:PARAM NIL "sequences")
     " differ is returned. In effect, the subsequences are aligned at their right-hand ends; then, the last elements are compared, the penultimate elements, and so on. The index returned is an index relative to "
     (:PARAM NIL "sequence-1") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (mismatch \"abcd\" \"ABCDE\" :test #'char-equal) → 4
 (mismatch '(3 2 1 1 2 3) '(1 2 3) :from-end t) → 3
 (mismatch '(1 2 3) '(2 3 4) :test-not #'eq :key #'oddp) → NIL
 (mismatch '(1 2 3 4 5 6) '(3 4 5 6 7) :start1 2 :end2 4) → NIL 
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL")
     " The " (:KWD NIL "test-not") " " (:TERM NIL "argument")
     " is deprecated. " (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR))
   " " :PAR
   (:COMMENT NIL
    "-------------------- Sequence Substitution --------------------")
   :PAR (:COMMENT NIL "%% ========== REPLACE")
   (:COM (:NAME "replace" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "replace")
      (:ARGLIST NIL "sequence-1 sequence-2 " (:KEYWORD NIL " &key")
       " start1 end1 start2 end2")
      (:VALUES NIL "sequence-1"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "sequence-1")
     "—a " (:TERM NIL "sequence") ". " :PAR (:PARAM NIL "sequence-2") "—a "
     (:TERM NIL "sequence") ". " :PAR (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " "
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start1") ", " (:PARAM NIL "end1") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "sequence-1")
     ". The defaults for " (:PARAM NIL "start1") " and " (:PARAM NIL "end1")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. " :PAR
     (:PARAM NIL "start2") ", " (:PARAM NIL "end2") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "sequence-2")
     ". The defaults for " (:PARAM NIL "start2") " and " (:PARAM NIL "end2")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "Destructively modifies "
     (:PARAM NIL "sequence-1") " by replacing the " (:TERM NIL "elements")
     " of " (:PARAM NIL "subsequence-1") " " (:TERM NIL "bounded") " by "
     (:PARAM NIL "start1") " and " (:PARAM NIL "end1") " with the "
     (:TERM NIL "elements") " of " (:PARAM NIL "subsequence-2") " "
     (:TERM NIL "bounded") " by " (:PARAM NIL "start2") " and "
     (:PARAM NIL "end2") ". " :PAR (:COMMENT NIL "% 14.3.0 4")
     (:PARAM NIL "Sequence-1")
     " is destructively modified by copying successive " (:TERM NIL "elements")
     " into it from " (:PARAM NIL "sequence-2") ". " (:TERM NIL "Elements")
     " of the subsequence of " (:PARAM NIL "sequence-2") " "
     (:TERM NIL "bounded") " by " (:PARAM NIL "start2") " and "
     (:PARAM NIL "end2") " are copied into the subsequence of "
     (:PARAM NIL "sequence-1") " " (:TERM NIL "bounded") " by "
     (:PARAM NIL "start1") " and " (:PARAM NIL "end1")
     ". If these subsequences are not of the same length, then the shorter length determines how many "
     (:TERM NIL "elements") " are copied; the extra " (:TERM NIL "elements")
     " near the end of the longer subsequence are not involved in the operation. The number of elements copied can be expressed as: "
     :PAR
     (:CODE NIL " (min (- " (:I NIL "end1") " " (:I NIL "start1") ") (- "
      (:I NIL "end2") " " (:I NIL "start2") "))
")
     " " :PAR (:COMMENT NIL "% 14.3.0 5") "If " (:PARAM NIL "sequence-1")
     " and " (:PARAM NIL "sequence-2") " are the " (:TERM NIL "same") " "
     (:TERM NIL "object")
     " and the region being modified overlaps the region being copied from, then it is as if the entire source region were copied to another place and only then copied back into the target region. However, if "
     (:PARAM NIL "sequence-1") " and " (:PARAM NIL "sequence-2")
     " are not the same, but the region being modified overlaps the region being copied from (perhaps because of shared list structure or displaced "
     (:TERM NIL "arrays") "), then after the " (:FUNREF NIL "replace")
     " operation the subsequence of " (:PARAM NIL "sequence-1")
     " being modified will have unpredictable contents. It is an error if the elements of "
     (:PARAM NIL "sequence-2") " are not of a " (:TERM NIL "type")
     " that can be stored into " (:PARAM NIL "sequence-1") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL
      " (replace \"abcdefghij\" \"0123456789\" :start1 4 :end1 7 :start2 4) 
→ \"abcd456hij\"
 (setq lst \"012345678\") → \"012345678\"
 (replace lst lst :start1 2 :start2 0) → \"010123456\"
 lst → \"010123456\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:PARAM NIL "sequence-1")
     " is modified. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "fill") " " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== SUBSTITUTE" "%% ========== SUBSTITUTE-IF"
    "%% ========== SUBSTITUTE-IF-NOT" "%% ========== NSUBSTITUTE"
    "%% ========== NSUBSTITUTE-IF" "%% ========== NSUBSTITUTE-IF-NOT")
   (:COM
    (:NAME
     "substitute, substitute-if, substitute-if-not, nsubstitute, nsubstitute-if, nsubstitute-if-not"
     :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "substitute")
      (:ARGLIST NIL "newitem olditem sequence " (:KEYWORD NIL " &key")
       " from-end test test-not start end count key")
      (:VALUES NIL "result-sequence"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "substitute-if")
      (:ARGLIST NIL "newitem predicate sequence " (:KEYWORD NIL " &key")
       " from-end start end count key")
      (:VALUES NIL "result-sequence"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "substitute-if-not")
      (:ARGLIST NIL "newitem predicate sequence " (:KEYWORD NIL " &key")
       " from-end start end count key")
      (:VALUES NIL "result-sequence"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "nsubstitute")
      (:ARGLIST NIL "newitem olditem sequence " (:KEYWORD NIL " &key")
       " from-end test test-not start end count key")
      (:VALUES NIL "sequence"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "nsubstitute-if")
      (:ARGLIST NIL "newitem predicate sequence " (:KEYWORD NIL " &key")
       " from-end start end count key")
      (:VALUES NIL "sequence"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "nsubstitute-if-not")
      (:ARGLIST NIL "newitem predicate sequence " (:KEYWORD NIL " &key")
       " from-end start end count key")
      (:VALUES NIL "sequence"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "newitem")
     "—an " (:TERM NIL "object") ". " :PAR (:PARAM NIL "olditem") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "sequence") "—a "
     (:TERM NIL "proper sequence") ". " :PAR (:PARAM NIL "predicate") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of one "
     (:TERM NIL "argument") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "from-end") "—a "
     (:TERM NIL "generalized boolean") ". The default is " (:TERM NIL "false")
     ". " :PAR (:PARAM NIL "test") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "test-not") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " "
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start") ", " (:PARAM NIL "end") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "sequence")
     ". The defaults for " (:PARAM NIL "start") " and " (:PARAM NIL "end")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " " :PAR
     (:ISSUE NIL "RANGE-OF-COUNT-KEYWORD:NIL-OR-INTEGER") " "
     (:PARAM NIL "count") "—an " (:TERM NIL "integer") " or " (:MISC NIL "nil")
     ". " (:ENDISSUE NIL "RANGE-OF-COUNT-KEYWORD:NIL-OR-INTEGER")
     " The default is " (:MISC NIL "nil") ". " :PAR (:PARAM NIL "key") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of one argument, or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "result-sequence") "—a " (:TERM NIL "sequence") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "substitute") ", "
     (:FUNREF NIL "substitute-if") ", and " (:FUNREF NIL "substitute-if-not")
     " return a " (:COMMENT NIL "% Sandra is queasy about this." " modified")
     "copy of " (:PARAM NIL "sequence") " in which each " (:TERM NIL "element")
     " that " (:TERM NIL "satisfies the test") " has been replaced with "
     (:PARAM NIL "newitem") ". " :PAR (:FUNREF NIL "nsubstitute") ", "
     (:FUNREF NIL "nsubstitute-if") ", and " (:FUNREF NIL "nsubstitute-if-not")
     " are like " (:FUNREF NIL "substitute") ", " (:FUNREF NIL "substitute-if")
     ", and " (:FUNREF NIL "substitute-if-not")
     " respectively, but they may modify " (:PARAM NIL "sequence") ". " :PAR
     (:COMMENT NIL "% Moon's suggested interpretation follows:") :PAR "If "
     (:PARAM NIL "sequence") " is a " (:TERM NIL "vector") ", the result is a "
     (:TERM NIL "vector") " that has the same "
     (:TERM NIL "actual array element type") " as " (:PARAM NIL "sequence")
     ". "
     (:COMMENT NIL
      "% Moved to notes per Schulenburg #1 (by X3J13 vote at May 4-5, 1994 meeting)."
      "% -kmp 9-May-94" " The result might or might not be simple, "
      " and might or might not be \\term{identical} to \\param{sequence}."
      "% Another possible interpretation:"
      "% The result might or might not be \\term{identical} to \\param{sequence}."
      "% If the result is  a \\term{vector} that is not \\term{identical}"
      "% to \\param{sequence}, the result is a \\term{fresh} \\term{simple array}"
      "% of \\term{rank} one.")
     "If " (:PARAM NIL "sequence") " is a " (:TERM NIL "list")
     ", the result is a " (:TERM NIL "list") ". "
     (:COMMENT NIL "% End Moon's suggested interpretation.") :PAR
     (:COMMENT NIL "% 14.3.0 20") (:PARAM NIL "Count")
     ", if supplied, limits the number of elements altered; if more than "
     (:PARAM NIL "count") " " (:TERM NIL "elements") " "
     (:TERM NIL "satisfy the test") ", then of these " (:TERM NIL "elements")
     " only the leftmost or rightmost, depending on " (:PARAM NIL "from-end")
     ", are replaced, as many as specified by " (:PARAM NIL "count") ". "
     (:ISSUE NIL "RANGE-OF-COUNT-KEYWORD:NIL-OR-INTEGER") " If "
     (:PARAM NIL "count")
     " is supplied and negative, the behavior is as if zero had been supplied instead. "
     (:ENDISSUE NIL "RANGE-OF-COUNT-KEYWORD:NIL-OR-INTEGER") " If "
     (:PARAM NIL "count") " is " (:MISC NIL "nil")
     ", all matching items are affected. " :PAR (:COMMENT NIL "% 14.3.0 21")
     "Supplying a " (:PARAM NIL "from-end") " of " (:TERM NIL "true")
     " matters only when the " (:PARAM NIL "count") " is provided (and "
     (:TERM NIL "non-nil") "); in that case, only the rightmost "
     (:PARAM NIL "count") " " (:TERM NIL "elements") " "
     (:TERM NIL "satisfying the test")
     " are removed (instead of the leftmost). " :PAR (:PARAM NIL "predicate")
     ", " (:PARAM NIL "test") ", and " (:PARAM NIL "test-not")
     " might be called more than once for each " (:TERM NIL "sequence") " "
     (:TERM NIL "element") ", and their side effects can happen in any order. "
     :PAR (:COMMENT NIL "% 14.3.0 18" "% 14.3.0 23")
     "The result of all these functions is a " (:TERM NIL "sequence")
     " of the same " (:TERM NIL "type") " as " (:PARAM NIL "sequence")
     " that has the same elements except that those in the subsequence "
     (:TERM NIL "bounded") " by " (:PARAM NIL "start") " and "
     (:PARAM NIL "end") " and " (:TERM NIL "satisfying the test")
     " have been replaced by " (:PARAM NIL "newitem") ". " :PAR
     (:FUNREF NIL "substitute") ", " (:FUNREF NIL "substitute-if") ", and "
     (:FUNREF NIL "substitute-if-not") " return a " (:PARAM NIL "sequence")
     " which can share with " (:PARAM NIL "sequence") " or may be "
     (:TERM NIL "identical") " to the input " (:PARAM NIL "sequence")
     " if no elements need to be changed. " :PAR
     (:ISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " "
     (:FUNREF NIL "nsubstitute") " and " (:FUNREF NIL "nsubstitute-if")
     " are required to " (:MACREF NIL "setf") " any " (:FUNREF NIL "car")
     " (if " (:PARAM NIL "sequence") " is a " (:TERM NIL "list") ") or "
     (:FUNREF NIL "aref") " (if " (:PARAM NIL "sequence") " is a "
     (:TERM NIL "vector") ") of " (:PARAM NIL "sequence")
     " that is required to be replaced with " (:PARAM NIL "newitem") ". If "
     (:PARAM NIL "sequence") " is a " (:TERM NIL "list") ", none of the "
     (:TERM NIL "cdrs") " of the top-level " (:TERM NIL "list")
     " can be modified. "
     (:ENDISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (substitute #\\. #\\SPACE \"0 2 4 6\") → \"0.2.4.6\"
 (substitute 9 4 '(1 2 4 1 3 4 5)) → (1 2 9 1 3 9 5)
 (substitute 9 4 '(1 2 4 1 3 4 5) :count 1) → (1 2 9 1 3 4 5)
 (substitute 9 4 '(1 2 4 1 3 4 5) :count 1 :from-end t)
→ (1 2 4 1 3 9 5)
 (substitute 9 3 '(1 2 4 1 3 4 5) :test #'>) → (9 9 4 9 3 4 5)

 (substitute-if 0 #'evenp '((1) (2) (3) (4)) :start 2 :key #'car)
→ ((1) (2) (3) 0)
 (substitute-if 9 #'oddp '(1 2 4 1 3 4 5)) → (9 2 4 9 9 4 9)
 (substitute-if 9 #'evenp '(1 2 4 1 3 4 5) :count 1 :from-end t)
→ (1 2 4 1 3 9 5)

 (setq some-things (list 'a 'car 'b 'cdr 'c)) → (A CAR B CDR C)
 (nsubstitute-if \"function was here\" #'fboundp some-things
                 :count 1 :from-end t) → (A CAR B \"function was here\" C)
 some-things → (A CAR B \"function was here\" C)
 (setq alpha-tester (copy-seq \"ab \")) → \"ab \"
 (nsubstitute-if-not #\\z #'alpha-char-p alpha-tester) → \"abz\"
 alpha-tester → \"abz\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR (:FUNREF NIL "nsubstitute") ", "
     (:FUNREF NIL "nsubstitute-if") ", and " (:FUNREF NIL "nsubstitute-if-not")
     " modify " (:PARAM NIL "sequence") ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "sequence") " is not a "
     (:TERM NIL "proper sequence") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "subst") ", "
     (:FUNREF NIL "nsubst") ", " (:ISSUE NIL "CONSTANT-MODIFICATION:DISALLOW")
     " " (:SECREF NIL :CONSTANT-MODIFICATION) ", "
     (:ENDISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL
      "% Moved from Description per Schulenburg #1 (by X3J13 vote at May 4-5, 1994 meeting)."
      "% -kmp 9-May-94")
     "If " (:PARAM NIL "sequence") " is a " (:TERM NIL "vector")
     ", the result might or might not be simple, and might or might not be "
     (:TERM NIL "identical") " to " (:PARAM NIL "sequence") ". " :PAR
     (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " The " (:KWD NIL "test-not") " "
     (:TERM NIL "argument") " is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
     (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " The functions "
     (:FUNREF NIL "substitute-if-not") " and "
     (:FUNREF NIL "nsubstitute-if-not") " are deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
     (:FUNREF NIL "nsubstitute") " and " (:FUNREF NIL "nsubstitute-if")
     " can be used in for-effect-only positions in code. " :PAR
     "Because the side-effecting variants (" (:I NIL "e.g.") ",  "
     (:FUNREF NIL "nsubstitute")
     ") potentially change the path that is being traversed, their effects in the presence of shared or circular structure may vary in surprising ways when compared to their non-side-effecting alternatives. To see this, consider the following side-effect behavior, which might be exhibited by some implementations: "
     :PAR
     (:CODE NIL " (defun test-it (fn)
   (let ((x (cons 'b nil)))
     (rplacd x x)
     (funcall fn 'a 'b x :count 1)))
 (test-it #'substitute) → (A . #1=(B . #1#))
 (test-it #'nsubstitute) → (A . #1#)
")
     " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Sequence Joining --------------------")
   :PAR (:COMMENT NIL "%% ========== CONCATENATE")
   (:COM (:NAME "concatenate" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "concatenate")
      (:ARGLIST NIL "result-type " (:KEYWORD NIL " &rest") " sequences")
      (:VALUES NIL "result-sequence"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " "
     (:PARAM NIL "result-type") "—a " (:TYPEREF NIL "sequence") " "
     (:TERM NIL "type specifier") ". "
     (:ENDISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " " :PAR
     (:PARAM NIL "sequences") "—a " (:TERM NIL "sequence") ". " :PAR
     (:PARAM NIL "result-sequence") "—a " (:TERM NIL "proper sequence") " of "
     (:TERM NIL "type") " " (:PARAM NIL "result-type") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 14.2.0 3")
     (:FUNREF NIL "concatenate") " returns a " (:TERM NIL "sequence")
     " that contains all the individual elements of all the "
     (:PARAM NIL "sequences") " in the order that they are supplied. The "
     (:TERM NIL "sequence") " is of type " (:PARAM NIL "result-type")
     ", which must be a " (:TERM NIL "subtype") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "sequence") ". " :PAR "All of the " (:PARAM NIL "sequences")
     " are copied from; the result does not share any structure with any of the "
     (:PARAM NIL "sequences") ". " (:COMMENT NIL "% 14.2.0 4")
     "Therefore, if only one " (:PARAM NIL "sequence")
     " is provided and it is of type " (:PARAM NIL "result-type") ", "
     (:FUNREF NIL "concatenate") " is required to copy "
     (:PARAM NIL "sequence") " rather than simply returning it. " :PAR
     "It is an error if any element of the " (:PARAM NIL "sequences")
     " cannot be an element of the " (:TERM NIL "sequence") " result. "
     (:REVIEWER NIL "Barmar: Should signal?") (:COMMENT NIL "!!!") :PAR
     (:ISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " If the "
     (:PARAM NIL "result-type") " is a " (:TERM NIL "subtype") " of "
     (:TYPEREF NIL "list") ", the result will be a " (:TERM NIL "list") ". "
     :PAR "If the " (:PARAM NIL "result-type") " is a " (:TERM NIL "subtype")
     " of " (:TYPEREF NIL "vector")
     ", then if the implementation can determine the element type specified for the "
     (:PARAM NIL "result-type")
     ", the element type of the resulting array is the result of "
     (:TERM NIL "upgrading")
     " that element type; or, if the implementation can determine that the element type is unspecified (or "
     (:TT NIL "*") "), the element type of the resulting array is "
     (:TYPEREF NIL "t") "; otherwise, an error is signaled. "
     (:ENDISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      "(concatenate 'string \"all\" \" \" \"together\" \" \" \"now\") → \"all together now\"
(concatenate 'list \"ABC\" '(d e f) #(1 2 3) #*1011)
→ (#\\A #\\B #\\C D E F 1 2 3 1 0 1 1)
(concatenate 'list) → NIL
")
     " " :PAR (:ISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " "
     (:CODE NIL
      "  (concatenate '(vector * 2) \"a\" \"bc\") should signal an error
")
     " " (:ENDISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR")
     " An error is signaled if the " (:PARAM NIL "result-type")
     " is neither a " (:TERM NIL "recognizable subtype") " of "
     (:TYPEREF NIL "list") ", nor a " (:TERM NIL "recognizable subtype") " of "
     (:TYPEREF NIL "vector") ". "
     (:ENDISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " " :PAR
     (:ISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error")
     " should be signaled if " (:PARAM NIL "result-type")
     " specifies the number of elements and the sum of "
     (:PARAM NIL "sequences") " is different from that number. "
     (:ENDISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "append") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MERGE")
   (:COM (:NAME "merge" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "merge")
      (:ARGLIST NIL "result-type sequence-1 sequence-2 predicate "
       (:KEYWORD NIL " &key") " key")
      (:VALUES NIL "result-sequence"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " "
     (:PARAM NIL "result-type") "—a " (:TYPEREF NIL "sequence") " "
     (:TERM NIL "type specifier") ". "
     (:ENDISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " " :PAR
     (:PARAM NIL "sequence-1") "—a " (:TERM NIL "sequence") ". " :PAR
     (:PARAM NIL "sequence-2") "—a " (:TERM NIL "sequence") ". " :PAR
     (:PARAM NIL "predicate") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two arguments that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:COMMENT NIL "% 14.4.0 12")
     (:PARAM NIL "key") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of one argument, or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "result-sequence") "—a " (:TERM NIL "proper sequence") " of "
     (:TERM NIL "type") " " (:PARAM NIL "result-type") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 14.4.0 10")
     "Destructively merges " (:PARAM NIL "sequence-1") " with "
     (:PARAM NIL "sequence-2") " according to an order determined by the "
     (:PARAM NIL "predicate") ". " (:FUNREF NIL "merge")
     " determines the relationship between two elements by giving keys extracted from the sequence elements to the "
     (:PARAM NIL "predicate") ". " :PAR "The first argument to the "
     (:PARAM NIL "predicate") " function is an element of "
     (:PARAM NIL "sequence-1") " as returned by the " (:PARAM NIL "key")
     " (if supplied); the second argument is an element of "
     (:PARAM NIL "sequence-2") " as returned by the " (:PARAM NIL "key")
     " (if supplied). " (:PARAM NIL "Predicate") " should return "
     (:TERM NIL "true")
     " if and only if its first argument is strictly less than the second (in some appropriate sense). If the first argument is greater than or equal to the second (in the appropriate sense), then "
     (:PARAM NIL "predicate") " should return " (:TERM NIL "false") ". "
     (:FUNREF NIL "merge") " considers two elements " (:TT NIL "x") " and "
     (:TT NIL "y") " to be equal if " (:TT NIL "(funcall predicate x y)")
     " and " (:TT NIL "(funcall predicate y x)") " both " (:TERM NIL "yield")
     " " (:TERM NIL "false") ". " :PAR
     (:COMMENT NIL "% 14.4.0 11" "% 14.4.0 12") "The argument to the "
     (:PARAM NIL "key") " is the " (:PARAM NIL "sequence")
     " element. Typically, the return value of the " (:PARAM NIL "key")
     " becomes the argument to " (:PARAM NIL "predicate") ". If "
     (:PARAM NIL "key") " is not supplied or " (:MISC NIL "nil")
     ", the sequence element itself is used. The " (:PARAM NIL "key")
     " may be executed more than once for each " (:TERM NIL "sequence") " "
     (:TERM NIL "element") ", and its side effects may occur in any order. "
     :PAR (:COMMENT NIL "% 14.4.0 13") "If " (:PARAM NIL "key") " and "
     (:PARAM NIL "predicate")
     " return, then the merging operation will terminate. The result of merging two "
     (:TERM NIL "sequences") " " (:TT NIL "x") " and " (:TT NIL "y")
     " is a new " (:TERM NIL "sequence") " of type " (:PARAM NIL "result-type")
     " " (:TT NIL "z") ", such that the length of " (:TT NIL "z")
     " is the sum of the lengths of " (:TT NIL "x") " and " (:TT NIL "y")
     ", and " (:TT NIL "z") " contains all the elements of " (:TT NIL "x")
     " and " (:TT NIL "y") ". If " (:TT NIL "x1") " and " (:TT NIL "x2")
     " are two elements of " (:TT NIL "x") ", and " (:TT NIL "x1") " precedes "
     (:TT NIL "x2") " in " (:TT NIL "x") ", then " (:TT NIL "x1") " precedes "
     (:TT NIL "x2") " in " (:TT NIL "z") ", and similarly for elements of "
     (:TT NIL "y") ". In short, " (:TT NIL "z") " is an interleaving of "
     (:TT NIL "x") " and " (:TT NIL "y") ". " :PAR (:COMMENT NIL "% 14.4.0 14")
     "If " (:TT NIL "x") " and " (:TT NIL "y")
     " were correctly sorted according to the " (:PARAM NIL "predicate")
     ", then " (:TT NIL "z") " will also be correctly sorted. If "
     (:TT NIL "x") " or " (:TT NIL "y") " is not so sorted, then "
     (:TT NIL "z")
     " will not be sorted, but will nevertheless be an interleaving of "
     (:TT NIL "x") " and " (:TT NIL "y") ". " :PAR (:COMMENT NIL "% 14.4.0 14")
     "The merging operation is guaranteed stable; if two or more elements are considered equal by the "
     (:PARAM NIL "predicate") ", then the elements from "
     (:PARAM NIL "sequence-1") " will precede those from "
     (:PARAM NIL "sequence-2") " in the result. " :PAR
     (:PARAM NIL "sequence-1") " and/or " (:PARAM NIL "sequence-2")
     " may be destroyed. " :PAR
     (:ISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " If the "
     (:PARAM NIL "result-type") " is a " (:TERM NIL "subtype") " of "
     (:TYPEREF NIL "list") ", the result will be a " (:TERM NIL "list") ". "
     :PAR "If the " (:PARAM NIL "result-type") " is a " (:TERM NIL "subtype")
     " of " (:TYPEREF NIL "vector")
     ", then if the implementation can determine the element type specified for the "
     (:PARAM NIL "result-type")
     ", the element type of the resulting array is the result of "
     (:TERM NIL "upgrading")
     " that element type; or, if the implementation can determine that the element type is unspecified (or "
     (:TT NIL "*") "), the element type of the resulting array is "
     (:TYPEREF NIL "t") "; otherwise, an error is signaled. "
     (:ENDISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (setq test1 (list 1 3 4 6 7))
 (setq test2 (list 2 5 8))
 (merge 'list test1 test2 #'<) → (1 2 3 4 5 6 7 8)
 (setq test1 (copy-seq \"BOY\"))
 (setq test2 (copy-seq :nosy\"))
 (merge 'string test1 test2 #'char-lessp) → \"BnOosYy\"
 (setq test1 (vector ((red . 1) (blue . 4))))
 (setq test2 (vector ((yellow . 2) (green . 7))))
 (merge 'vector test1 test2 #'< :key #'cdr) 
→ #((RED . 1) (YELLOW . 2) (BLUE . 4) (GREEN . 7)) 
")
     " " (:ISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " "
     (:CODE NIL
      " (merge '(vector * 4) '(1 5) '(2 4 6) #'<) should signal an error
")
     " " (:ENDISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR")
     " An error must be signaled if the " (:PARAM NIL "result-type")
     " is neither a " (:TERM NIL "recognizable subtype") " of "
     (:TYPEREF NIL "list") ", nor a " (:TERM NIL "recognizable subtype") " of "
     (:TYPEREF NIL "vector") ". "
     (:ENDISSUE NIL "CONCATENATE-SEQUENCE:SIGNAL-ERROR") " " :PAR
     (:ISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error")
     " should be signaled if " (:PARAM NIL "result-type")
     " specifies the number of elements and the sum of the lengths of "
     (:PARAM NIL "sequence-1") " and " (:PARAM NIL "sequence-2")
     " is different from that number. "
     (:ENDISSUE NIL "SEQUENCE-TYPE-LENGTH:MUST-MATCH") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "sort") ", "
     (:FUNREF NIL "stable-sort") ", "
     (:ISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:SECREF NIL :CONSTANT-MODIFICATION) ", "
     (:ENDISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Sequence Deletion --------------------")
   :PAR
   (:COMMENT NIL "%% ========== REMOVE" "%% ========== REMOVE-IF"
    "%% ========== REMOVE-IF-NOT" "%% ========== DELETE"
    "%% ========== DELETE-IF" "%% ========== DELETE-IF-NOT")
   (:COM
    (:NAME "remove, remove-if, remove-if-not, delete, delete-if, delete-if-not"
     :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "remove")
      (:ARGLIST NIL "item sequence " (:KEYWORD NIL " &key")
       " from-end test test-not start end count key")
      (:VALUES NIL "result-sequence"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "remove-if")
      (:ARGLIST NIL "test sequence " (:KEYWORD NIL " &key")
       " from-end start end count key")
      (:VALUES NIL "result-sequence"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "remove-if-not")
      (:ARGLIST NIL "test sequence " (:KEYWORD NIL " &key")
       " from-end start end count key")
      (:VALUES NIL "result-sequence"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "delete")
      (:ARGLIST NIL "item sequence " (:KEYWORD NIL " &key")
       " from-end test test-not start end count key")
      (:VALUES NIL "result-sequence"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "delete-if")
      (:ARGLIST NIL "test sequence " (:KEYWORD NIL " &key")
       " from-end start end count key")
      (:VALUES NIL "result-sequence"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "delete-if-not")
      (:ARGLIST NIL "test sequence " (:KEYWORD NIL " &key")
       " from-end start end count key")
      (:VALUES NIL "result-sequence"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "item") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "sequence") "—a "
     (:TERM NIL "proper sequence") ". " :PAR (:PARAM NIL "test") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of one "
     (:TERM NIL "argument") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "from-end") "—a "
     (:TERM NIL "generalized boolean") ". The default is " (:TERM NIL "false")
     ". " :PAR (:PARAM NIL "test") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "test-not") "—a " (:TERM NIL "designator") " for a "
     (:TERM NIL "function") " of two " (:TERM NIL "arguments")
     " that returns a " (:TERM NIL "generalized boolean") ". " :PAR
     (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " "
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start") ", " (:PARAM NIL "end") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "sequence")
     ". The defaults for " (:PARAM NIL "start") " and " (:PARAM NIL "end")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " " :PAR
     (:ISSUE NIL "RANGE-OF-COUNT-KEYWORD:NIL-OR-INTEGER") " "
     (:PARAM NIL "count") "—an " (:TERM NIL "integer") " or " (:MISC NIL "nil")
     ". " (:ENDISSUE NIL "RANGE-OF-COUNT-KEYWORD:NIL-OR-INTEGER")
     " The default is " (:MISC NIL "nil") ". " :PAR (:PARAM NIL "key") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of one argument, or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "result-sequence") "—a " (:TERM NIL "sequence") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "remove") ", "
     (:FUNREF NIL "remove-if") ", and " (:FUNREF NIL "remove-if-not")
     " return a " (:PARAM NIL "sequence") " from which the elements that "
     (:TERM NIL "satisfy the test") " have been removed. " :PAR
     (:FUNREF NIL "delete") ", " (:FUNREF NIL "delete-if") ", and "
     (:FUNREF NIL "delete-if-not") " are like " (:FUNREF NIL "remove") ", "
     (:FUNREF NIL "remove-if") ", and " (:FUNREF NIL "remove-if-not")
     " respectively, but they may modify " (:PARAM NIL "sequence") ". " :PAR
     (:COMMENT NIL "% Moon's suggested interpretation follows:") :PAR "If "
     (:PARAM NIL "sequence") " is a " (:TERM NIL "vector") ", the result is a "
     (:TERM NIL "vector") " that has the same "
     (:TERM NIL "actual array element type") " as " (:PARAM NIL "sequence")
     ". "
     (:COMMENT NIL
      "% Moved to notes per Schulenburg #1 (by X3J13 vote at May 4-5, 1994 meeting)."
      "% -kmp 9-May-94" " The result might or might not be simple, "
      " and might or might not be \\term{identical} to \\param{sequence}."
      "% Another possible interpretation:"
      "% The result might or might not be \\term{identical} to \\param{sequence}."
      "% If the result is  a \\term{vector} that is not \\term{identical}"
      "% to \\param{sequence}, the result is a \\term{fresh} \\term{simple array}"
      "% of \\term{rank} one.")
     "If " (:PARAM NIL "sequence") " is a " (:TERM NIL "list")
     ", the result is a " (:TERM NIL "list") ". "
     (:COMMENT NIL "% End Moon's suggested interpretation.") :PAR
     (:COMMENT NIL "% 14.3.0 8" "% 14.3.0 11") "Supplying a "
     (:PARAM NIL "from-end") " of " (:TERM NIL "true")
     " matters only when the " (:PARAM NIL "count")
     " is provided; in that case only the rightmost " (:PARAM NIL "count")
     " elements " (:TERM NIL "satisfying the test") " are deleted. " :PAR
     (:COMMENT NIL "% 14.3.0 7" "% 14.3.0 10") (:PARAM NIL "Count")
     ", if supplied, limits the number of elements removed or deleted; if more than "
     (:PARAM NIL "count") " elements " (:TERM NIL "satisfy the test")
     ", then of these elements only the leftmost or rightmost, depending on "
     (:PARAM NIL "from-end")
     ", are deleted or removed, as many as specified by " (:PARAM NIL "count")
     ". " (:ISSUE NIL "RANGE-OF-COUNT-KEYWORD:NIL-OR-INTEGER") " If "
     (:PARAM NIL "count")
     " is supplied and negative, the behavior is as if zero had been supplied instead. "
     (:ENDISSUE NIL "RANGE-OF-COUNT-KEYWORD:NIL-OR-INTEGER") " If "
     (:PARAM NIL "count") " is " (:MISC NIL "nil")
     ", all matching items are affected. " :PAR
     "For all these functions, elements not removed or deleted occur in the same order in the result as they did in "
     (:PARAM NIL "sequence") ". " :PAR (:COMMENT NIL "% 14.3.0 6")
     (:FUNREF NIL "remove") ", " (:FUNREF NIL "remove-if") ", "
     (:FUNREF NIL "remove-if-not") " return a " (:TERM NIL "sequence")
     " of the same " (:TERM NIL "type") " as " (:PARAM NIL "sequence")
     " that has the same elements except that those in the subsequence "
     (:TERM NIL "bounded") " by " (:PARAM NIL "start") " and "
     (:PARAM NIL "end") " and " (:TERM NIL "satisfying the test")
     " have been removed. This is a non-destructive operation. If any elements need to be removed, the result will be a copy. The result of "
     (:FUNREF NIL "remove") " may share with " (:PARAM NIL "sequence")
     "; the result may be " (:TERM NIL "identical") " to the input "
     (:PARAM NIL "sequence") " if no elements need to be removed. " :PAR
     (:COMMENT NIL "% 14.3.0 9") (:FUNREF NIL "delete") ", "
     (:FUNREF NIL "delete-if") ", and " (:FUNREF NIL "delete-if-not")
     " return a " (:TERM NIL "sequence") " of the same " (:TERM NIL "type")
     " as " (:PARAM NIL "sequence")
     " that has the same elements except that those in the subsequence "
     (:TERM NIL "bounded") " by " (:PARAM NIL "start") " and "
     (:PARAM NIL "end") " and " (:TERM NIL "satisfying the test")
     " have been deleted. " (:PARAM NIL "Sequence")
     " may be destroyed and used to construct the result; however, the result might or might not be "
     (:TERM NIL "identical") " to " (:PARAM NIL "sequence") ". " :PAR
     (:ISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " "
     (:FUNREF NIL "delete") ", when " (:PARAM NIL "sequence") " is a "
     (:TERM NIL "list") ", is permitted to " (:MACREF NIL "setf") " any part, "
     (:FUNREF NIL "car") " or " (:FUNREF NIL "cdr")
     ", of the top-level list structure in that " (:PARAM NIL "sequence")
     ". When " (:PARAM NIL "sequence") " is a " (:TERM NIL "vector") ", "
     (:FUNREF NIL "delete") " is permitted to change the dimensions of the "
     (:TERM NIL "vector")
     " and to slide its elements into new positions without permuting them to produce the resulting "
     (:TERM NIL "vector") ". " :PAR (:FUNREF NIL "delete-if")
     " is constrained to behave exactly as follows: " :PAR
     (:CODE NIL " (delete nil " (:I NIL "sequence") "
             :test #'(lambda (ignore "
      (:I NIL "item") ") (funcall " (:I NIL "test") " " (:I NIL "item") "))
             ...)
")
     " " :PAR (:ENDISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " "
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (remove 4 '(1 3 4 5 9)) → (1 3 5 9)
 (remove 4 '(1 2 4 1 3 4 5)) → (1 2 1 3 5)
 (remove 4 '(1 2 4 1 3 4 5) :count 1) → (1 2 1 3 4 5)
 (remove 4 '(1 2 4 1 3 4 5) :count 1 :from-end t) → (1 2 4 1 3 5)
 (remove 3 '(1 2 4 1 3 4 5) :test #'>) → (4 3 4 5)
 (setq lst '(list of four elements)) → (LIST OF FOUR ELEMENTS)
 (setq lst2 (copy-seq lst)) → (LIST OF FOUR ELEMENTS)
 (setq lst3 (delete 'four lst)) → (LIST OF ELEMENTS)
 (equal lst lst2) → "
      (:TERM NIL "false") "
 (remove-if #'oddp '(1 2 4 1 3 4 5)) → (2 4 4)
 (remove-if #'evenp '(1 2 4 1 3 4 5) :count 1 :from-end t) 
→ (1 2 4 1 3 5)
 (remove-if-not #'evenp '(1 2 3 4 5 6 7 8 9) :count 2 :from-end t)
→ (1 2 3 4 5 6 8)
 (setq tester (list 1 2 4 1 3 4 5)) → (1 2 4 1 3 4 5)
 (delete 4 tester) → (1 2 1 3 5)
 (setq tester (list 1 2 4 1 3 4 5)) → (1 2 4 1 3 4 5)
 (delete 4 tester :count 1) → (1 2 1 3 4 5)
 (setq tester (list 1 2 4 1 3 4 5)) → (1 2 4 1 3 4 5)
 (delete 4 tester :count 1 :from-end t) → (1 2 4 1 3 5)
 (setq tester (list 1 2 4 1 3 4 5)) → (1 2 4 1 3 4 5)
 (delete 3 tester :test #'>) → (4 3 4 5)
 (setq tester (list 1 2 4 1 3 4 5)) → (1 2 4 1 3 4 5)
 (delete-if #'oddp tester) → (2 4 4)
 (setq tester (list 1 2 4 1 3 4 5)) → (1 2 4 1 3 4 5)
 (delete-if #'evenp tester :count 1 :from-end t) → (1 2 4 1 3 5)    
 (setq tester (list 1 2 3 4 5 6)) → (1 2 3 4 5 6) 
 (delete-if #'evenp tester) → (1 3 5) 
 tester → "
      (:TERM NIL "implementation-dependent") "
")
     " " :PAR
     (:COMMENT NIL
      "!!! This example (with the \"or\") looks like bad notation AND questionable value")
     (:ISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " "
     (:CODE NIL " (setq foo (list 'a 'b 'c)) → (A B C)
 (setq bar (cdr foo)) → (B C)
 (setq foo (delete 'b foo)) → (A C)
 bar → ((C)) or ...
 (eq (cdr foo) (car bar)) → T or ...
")
     " " (:ENDISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "For " (:FUNREF NIL "delete") ", "
     (:FUNREF NIL "delete-if") ", and " (:FUNREF NIL "delete-if-not") ", "
     (:PARAM NIL "sequence")
     " may be destroyed and used to construct the result. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "sequence") " is not a "
     (:TERM NIL "proper sequence") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:ISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:SECREF NIL :CONSTANT-MODIFICATION) ", "
     (:ENDISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL
      "% Moved from Description per Schulenburg #1 (by X3J13 vote at May 4-5, 1994 meeting)."
      "% -kmp 9-May-94")
     "If " (:PARAM NIL "sequence") " is a " (:TERM NIL "vector")
     ", the result might or might not be simple, and might or might not be "
     (:TERM NIL "identical") " to " (:PARAM NIL "sequence") ". " :PAR
     (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " The " (:KWD NIL "test-not") " "
     (:TERM NIL "argument") " is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
     (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " The functions "
     (:FUNREF NIL "delete-if-not") " and " (:FUNREF NIL "remove-if-not")
     " are deprecated. " (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== REMOVE-DUPLICATES"
    "%% ========== DELETE-DUPLICATES")
   (:COM (:NAME "remove-duplicates, delete-duplicates" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "remove-duplicates")
      (:ARGLIST NIL "sequence " (:KEYWORD NIL " &key")
       " from-end test test-not start end key")
      (:VALUES NIL "result-sequence"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "delete-duplicates")
      (:ARGLIST NIL "sequence " (:KEYWORD NIL " &key")
       " from-end test test-not start end key")
      (:VALUES NIL "result-sequence"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "sequence")
     "—a " (:TERM NIL "proper sequence") ". " :PAR (:PARAM NIL "from-end")
     "—a " (:TERM NIL "generalized boolean") ". The default is "
     (:TERM NIL "false") ". " :PAR (:PARAM NIL "test") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "test-not") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") " that returns a "
     (:TERM NIL "generalized boolean") ". " :PAR
     (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " "
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start") ", " (:PARAM NIL "end") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "sequence")
     ". The defaults for " (:PARAM NIL "start") " and " (:PARAM NIL "end")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " " :PAR (:PARAM NIL "key")
     "—a " (:TERM NIL "designator") " for a " (:TERM NIL "function")
     " of one argument, or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "result-sequence") "—a " (:TERM NIL "sequence") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "remove-duplicates")
     " returns a modified copy of " (:PARAM NIL "sequence")
     " from which any element that matches another element occurring in "
     (:PARAM NIL "sequence") " has been removed. " :PAR
     (:COMMENT NIL "% Moon's suggested interpretation follows:") :PAR "If "
     (:PARAM NIL "sequence") " is a " (:TERM NIL "vector") ", the result is a "
     (:TERM NIL "vector") " that has the same "
     (:TERM NIL "actual array element type") " as " (:PARAM NIL "sequence")
     ". "
     (:COMMENT NIL
      "% Moved to notes per Schulenburg #1 (by X3J13 vote at May 4-5, 1994 meeting)."
      "% -kmp 9-May-94" " The result might or might not be simple,"
      " and might or might not be \\term{identical} to \\param{sequence}."
      "% Another possible interpretation:"
      "% The result might or might not be \\term{identical} to \\param{sequence}."
      "% If the result is  a \\term{vector} that is not \\term{identical}"
      "% to \\param{sequence}, the result is a \\term{fresh} \\term{simple array}"
      "% of \\term{rank} one.")
     "If " (:PARAM NIL "sequence") " is a " (:TERM NIL "list")
     ", the result is a " (:TERM NIL "list") ". "
     (:COMMENT NIL "% End Moon's suggested interpretation.") :PAR
     (:FUNREF NIL "delete-duplicates") " is like "
     (:FUNREF NIL "remove-duplicates") ", but "
     (:FUNREF NIL "delete-duplicates") " may modify " (:PARAM NIL "sequence")
     ". " :PAR (:COMMENT NIL "% 14.3.0 13") "The elements of "
     (:PARAM NIL "sequence") " are compared " (:TERM NIL "pairwise")
     ", and if any two match, then the one occurring earlier in "
     (:PARAM NIL "sequence") " is discarded, unless " (:PARAM NIL "from-end")
     " is " (:TERM NIL "true") ", in which case the one later in "
     (:PARAM NIL "sequence") " is discarded. " :PAR
     (:FUNREF NIL "remove-duplicates") " and "
     (:FUNREF NIL "delete-duplicates") " return a " (:TERM NIL "sequence")
     " of the same " (:TERM NIL "type") " as " (:PARAM NIL "sequence")
     " with enough elements removed so that no two of the remaining elements match. The order of the elements remaining in the result is the same as the order in which they appear in "
     (:PARAM NIL "sequence") ". " :PAR (:FUNREF NIL "remove-duplicates")
     " returns a " (:TERM NIL "sequence") " " (:COMMENT NIL "% 14.3.0 14")
     "that may share with " (:PARAM NIL "sequence") " or may be "
     (:TERM NIL "identical") " to " (:PARAM NIL "sequence")
     " if no elements need to be removed. " :PAR
     (:ISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " "
     (:FUNREF NIL "delete-duplicates") ", when " (:PARAM NIL "sequence")
     " is a " (:TERM NIL "list") ", is permitted to " (:MACREF NIL "setf")
     " any part, " (:FUNREF NIL "car") " or " (:FUNREF NIL "cdr")
     ", of the top-level list structure in that " (:PARAM NIL "sequence")
     ". When " (:PARAM NIL "sequence") " is a " (:TERM NIL "vector") ", "
     (:FUNREF NIL "delete-duplicates")
     " is permitted to change the dimensions of the " (:TERM NIL "vector")
     " and to slide its elements into new positions without permuting them to produce the resulting "
     (:TERM NIL "vector") ". "
     (:ENDISSUE NIL "REMF-DESTRUCTION-UNSPECIFIED:X3J13-MAR-89") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR (:COMMENT NIL "% 14.3.0 16")
     (:CODE NIL
      " (remove-duplicates \"aBcDAbCd\" :test #'char-equal :from-end t) → \"aBcD\"
 (remove-duplicates '(a b c b d d e)) → (A C B D E)
 (remove-duplicates '(a b c b d d e) :from-end t) → (A B C D E)
 (remove-duplicates '((foo #\\a) (bar #\\%) (baz #\\A))
     :test #'char-equal :key #'cadr) → ((BAR #\\%) (BAZ #\\A))
 (remove-duplicates '((foo #\\a) (bar #\\%) (baz #\\A)) 
     :test #'char-equal :key #'cadr :from-end t) → ((FOO #\\a) (BAR #\\%))
 (setq tester (list 0 1 2 3 4 5 6))
 (delete-duplicates tester :key #'oddp :start 1 :end 6) → (0 4 5 6)
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR (:COMMENT NIL "% 14.3.0 15")
     (:FUNREF NIL "delete-duplicates") " might destructively modify "
     (:PARAM NIL "sequence") ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "sequence") " is not a "
     (:TERM NIL "proper sequence") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:ISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:SECREF NIL :CONSTANT-MODIFICATION) ", "
     (:ENDISSUE NIL "CONSTANT-MODIFICATION:DISALLOW") " "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL
      "% Moved from Description per Schulenburg #1 (by X3J13 vote at May 4-5, 1994 meeting)."
      "% -kmp 9-May-94")
     "If " (:PARAM NIL "sequence") " is a " (:TERM NIL "vector")
     ", the result might or might not be simple, and might or might not be "
     (:TERM NIL "identical") " to " (:PARAM NIL "sequence") ". " :PAR
     (:ISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " The " (:KWD NIL "test-not") " "
     (:TERM NIL "argument") " is deprecated. "
     (:ENDISSUE NIL "TEST-NOT-IF-NOT:FLUSH-ALL") " " :PAR
     (:COMMENT NIL "% 14.3.0 17") "These functions are useful for converting "
     (:PARAM NIL "sequence")
     " into a canonical form suitable for representing a set. " :PAR))
   " " :PAR)
  " " :PAR)
 (:CHAPTER
  (:NUM "18" :TITLE ("Hash Tables") :NUMTAG :CHAP-EIGHTEEN :NAMETAG
   :HASH-TABLES)
  (:SECTION (:TITLE ("Hash Table Concepts") :TAGS (:HASH-TABLE-CONCEPTS)) " "
   :PAR
   (:SUBSECTION (:TITLE ("Hash-Table Operations")) (:NEXTFIGURE (:CAPS T))
    " lists some " (:TERM NIL "defined names") " that are applicable to "
    (:TERM NIL "hash tables") ". The following rules apply to "
    (:TERM NIL "hash tables") ". " :PAR
    (:COMMENT NIL "% 16.0.0 2" "% 16.0.0 4")
    (:LIST NIL
     (:ITEM NIL "– A " (:TERM NIL "hash table")
      " can only associate one value with a given key. If an attempt is made to add a second value for a given key, the second value will replace the first. Thus, adding a value to a "
      (:TERM NIL "hash table") " is a destructive operation; the "
      (:TERM NIL "hash table") " is modified. " :PAR
      (:COMMENT NIL "% 16.0.0 5"))
     (:ITEM NIL "– There are four kinds of " (:TERM NIL "hash tables")
      ": those whose keys are compared with " (:FUNREF NIL "eq")
      ", those whose keys are compared with " (:FUNREF NIL "eql")
      ", those whose keys are compared with " (:FUNREF NIL "equal") ", and "
      (:ISSUE NIL "HASH-TABLE-TESTS:ADD-EQUALP")
      " those whose keys are compared with " (:FUNREF NIL "equalp") ". "
      (:ENDISSUE NIL "HASH-TABLE-TESTS:ADD-EQUALP") " " :PAR
      (:COMMENT NIL "% 16.0.0 6"))
     (:ITEM NIL "– " (:TERM NIL "Hash tables") " are created by "
      (:FUNREF NIL "make-hash-table") ". " (:FUNREF NIL "gethash")
      " is used to look up a key and find the associated value. New entries are added to "
      (:TERM NIL "hash tables") " using " (:MACREF NIL "setf") " with "
      (:FUNREF NIL "gethash") ". " (:FUNREF NIL "remhash")
      " is used to remove an entry. For example: " :PAR
      (:CODE NIL " (setq a (make-hash-table)) → #<HASH-TABLE EQL 0/120 32536573>
 (setf (gethash 'color a) 'brown) → BROWN
 (setf (gethash 'name a) 'fred) → FRED
 (gethash 'color a) → BROWN, "
       (:TERM NIL "true") "
 (gethash 'name a) → FRED, "
       (:TERM NIL "true") "
 (gethash 'pointy a) → NIL, "
       (:TERM NIL "false") "
")
      " " :PAR (:COMMENT NIL "% 16.0.0 7             ")
      "In this example, the symbols " (:TT NIL "color") " and "
      (:TT NIL "name") " are being used as keys, and the symbols "
      (:TT NIL "brown") " and " (:TT NIL "fred")
      " are being used as the associated values. The " (:TERM NIL "hash table")
      " has two items in it, one of which associates from " (:TT NIL "color")
      " to " (:TT NIL "brown") ", and the other of which associates from "
      (:TT NIL "name") " to " (:TT NIL "fred") ". " :PAR
      (:COMMENT NIL "% 16.0.0 8"))
     (:ITEM NIL "– A key or a value may be any " (:TERM NIL "object") ". " :PAR
      (:ISSUE NIL "HASH-TABLE-SIZE:INTENDED-ENTRIES") " "
      (:COMMENT NIL " The following will be deleted." " " " %% 16.0.0 9"
       " \\itemitem{--}"
       " A \\term{hash table}'s size is the maximum number of entries"
       " it can hold without collisions. Usually the actual capacity of"
       " the table is somewhat less, since the hashing is not perfectly"
       " collision-free.  If so many entries are"
       " added that the capacity is exceeded, the \\term{hash table} "
       " will automatically"
       " grow, and the entries will be rehashed (new hash values will be"
       " recomputed, and everything will be rearranged so that the fast hash"
       " lookup still works).  This is transparent to the caller; it all happens"
       " automatically.")
      (:ENDISSUE NIL "HASH-TABLE-SIZE:INTENDED-ENTRIES") " " :PAR
      (:COMMENT NIL "% 16.0.0 10"))
     (:ITEM NIL "– "
      (:COMMENT NIL
       " The cases of \\f{nil} as a value and no entry in the \\term{hash table} "
       " can be distinguished by the second value returned by \\funref{gethash}."
       "% Reworded per Barmar:")
      "The existence of an entry in the " (:TERM NIL "hash table")
      " can be determined from the " (:TERM NIL "secondary value")
      " returned by " (:FUNREF NIL "gethash") ". "))
    " " :PAR
    (:TABLE (:NAME ("Hash-table defined names"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " clrhash"))
      (:CELL NIL (:FUNREF NIL "hash-table-p"))
      (:CELL NIL (:FUNREF NIL "remhash")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " gethash"))
      (:CELL NIL (:FUNREF NIL "make-hash-table"))
      (:CELL NIL (:FUNREF NIL "sxhash")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " hash-table-count"))
      (:CELL NIL (:FUNREF NIL "maphash")) (:CELL NIL)))
    " " :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Modifying Hash Table Keys") :TAGS (:MODIFYING-HASH-KEYS)) " "
    :PAR (:ISSUE NIL "HASH-TABLE-KEY-MODIFICATION:SPECIFY") " " :PAR
    "The function supplied as the " (:KWD NIL "test") " argument to "
    (:FUNREF NIL "make-hash-table")
    " specifies the `equivalence test' for the " (:TERM NIL "hash table")
    " it creates. " :PAR "An " (:TERM NIL "object")
    " is `visibly modified' with regard to an equivalence test if there exists some set of "
    (:TERM NIL "objects") " (or potential " (:TERM NIL "objects")
    ") which are equivalent to the " (:TERM NIL "object")
    " before the modification but are no longer equivalent afterwards. " :PAR
    (:COMMENT NIL
     " If an \\term{object} is used as a key in a \\term{hash table} and is then visibly "
     " modified with regard to the equivalence test of the \\term{hash table}, then"
     " using the \\term{object} as a key in further operations on the \\term{hash table}"
     " has unspecified consequences.  Moreover, this applies for other \\term{objects}"
     " which either are or were equivalent to the key object.  Further, undoing the "
     " modification does not remove this effect.")
    :PAR "If an " (:TERM NIL "object") " "
    (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1")))
    " is used as a key in a " (:TERM NIL "hash table") " "
    (:MATH NIL (:MI NIL "H"))
    " and is then visibly modified with regard to the equivalence test of "
    (:MATH NIL (:MI NIL "H")) ", then the consequences are unspecified if "
    (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1"))) ", or any "
    (:TERM NIL "object") " "
    (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "2"))) " equivalent to "
    (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1")))
    " under the equivalence test (either before or after the modification), is used as a key in further operations on "
    (:MATH NIL (:MI NIL "H")) ". The consequences of using "
    (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1")))
    " as a key are unspecified even if "
    (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1")))
    " is visibly modified and then later modified again in such a way as to undo the visible modification. "
    :PAR
    "Following are specifications of the modifications which are visible to the equivalence tests which must be supported by "
    (:TERM NIL "hash tables")
    ". The modifications are described in terms of modification of components, and are defined recursively. Visible modifications of components of the "
    (:TERM NIL "object") " are visible modifications of the "
    (:TERM NIL "object") ". " :PAR
    (:SUBSUBSECTION
     (:TITLE ("Visible Modification of Objects with respect to EQ and EQL")
      :TAGS (:VIS-MOD-EQ :VIS-MOD-EQL))
     "  " :PAR "No " (:TERM NIL "standardized") " " (:TERM NIL "function")
     " is provided that is capable of visibly modifying an "
     (:TERM NIL "object") " with regard to " (:FUNREF NIL "eq") " or "
     (:FUNREF NIL "eql") ". " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Visible Modification of Objects with respect to EQUAL") :TAGS
      (:VIS-MOD-EQUAL))
     " " :PAR "As a consequence of the behavior for " (:FUNREF NIL "equal")
     ", the rules for visible modification of " (:TERM NIL "objects")
     " not explicitly mentioned in this section are inherited from those in "
     (:SECREF NIL :VIS-MOD-EQL) ". " :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Visible Modification of Conses with respect to EQUAL"))
      "Any visible change to the " (:TERM NIL "car") " or the "
      (:TERM NIL "cdr") " of a " (:TERM NIL "cons")
      " is considered a visible modification with regard to "
      (:FUNREF NIL "equal") ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE
       ("Visible Modification of Bit Vectors and Strings with respect to EQUAL"))
      "For a " (:TERM NIL "vector") " of " (:TERM NIL "type") " "
      (:TYPEREF NIL "bit-vector") " or of " (:TERM NIL "type") " "
      (:TYPEREF NIL "string") ", any visible change to an "
      (:TERM NIL "active") " " (:TERM NIL "element") " of the "
      (:TERM NIL "vector") ", or to the " (:TERM NIL "length") " of the "
      (:TERM NIL "vector") " (if it is " (:TERM NIL "actually adjustable")
      " or has a " (:TERM NIL "fill pointer")
      ") is considered a visible modification with regard to "
      (:FUNREF NIL "equal") ". " :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Visible Modification of Objects with respect to EQUALP"))
     "As a consequence of the behavior for " (:FUNREF NIL "equalp")
     ", the rules for visible modification of " (:TERM NIL "objects")
     " not explicitly mentioned in this section are inherited from those in "
     (:SECREF NIL :VIS-MOD-EQUAL) ". " :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Visible Modification of Structures with respect to EQUALP"))
      "Any visible change to a " (:TERM NIL "slot") " of a "
      (:TERM NIL "structure")
      " is considered a visible modification with regard to "
      (:FUNREF NIL "equalp") ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Visible Modification of Arrays with respect to EQUALP"))
      "In an " (:TERM NIL "array") ", any visible change to an "
      (:TERM NIL "active") " " (:TERM NIL "element") ", to the "
      (:TERM NIL "fill pointer") " (if the " (:TERM NIL "array")
      " can and does have one), or to the " (:TERM NIL "dimensions")
      " (if the " (:TERM NIL "array") " is " (:TERM NIL "actually adjustable")
      ") is considered a visible modification with regard to "
      (:FUNREF NIL "equalp") ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Visible Modification of Hash Tables with respect to EQUALP"))
      "In a " (:TERM NIL "hash table")
      ", any visible change to the count of entries in the "
      (:TERM NIL "hash table")
      ", to the keys, or to the values associated with the keys is considered a visible modification with regard to "
      (:FUNREF NIL "equalp") ". " :PAR
      "Note that the visibility of modifications to the keys depends on the equivalence test of the "
      (:TERM NIL "hash table") ", not on the specification of "
      (:FUNREF NIL "equalp") ". " :PAR)
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Visible Modifications by Language Extensions"))
     (:TERM NIL "Implementations")
     " that extend the language by providing additional mutator functions (or additional behavior for existing mutator functions) must document how the use of these extensions interacts with equivalence tests and "
     (:TERM NIL "hash table") " searches. " :PAR (:TERM NIL "Implementations")
     " that extend the language by defining additional acceptable equivalence tests for "
     (:TERM NIL "hash tables") " (allowing additional values for the "
     (:KWD NIL "test") " argument to " (:FUNREF NIL "make-hash-table")
     ") must document the visible components of these tests. " :PAR)
    :PAR
    (:COMMENT NIL " !!! Maybe consider making these things visible..."
     " Test Cases/Examples:" " " "  (setf ht (make-hash-table :test #'eq))"
     "  (setf a (cons 1 2))" "  (setf (gethash a ht) 'win)"
     "  (setf (cdr a) 3)" "  (gethash a ht 'lose) => win t" " "
     "  The same example with :test #'equal in the first line would be an error."
     " "
     "  The following example is not an error, because EQUAL does not examine the"
     "  components of general vectors:" " "
     "  (setf ht (make-hash-table :test #'equal))" "  (setf a (vector 1 2))"
     "  (setf (gethash a ht) 'win)" "  (setf (aref a 1) 3)"
     "  (gethash a ht 'lose) => win t" " "
     "  The following example is not an error, because EQUALP is limited by the"
     "  fill-pointer when examining the elements of a vector:" " "
     "  (setf ht (make-hash-table :test #'equalp))"
     "  (setf a (make-array 3 :fill-pointer 2 :initial-contents '(1 2 3)))"
     "  (setf (gethash a ht) 'win)" "  (setf (aref a 2) 4)"
     "  (gethash a ht 'lose) => win t" " "
     "  The following example is an error, because EQUALP may examine the dimensions"
     "  of arrays:" " " "  (setf ht (make-hash-table :test #'equalp))"
     "  (setf a (make-array '(2 3) :adjustable t))"
     "  (setf (gethash a ht) 'win)" "  (setf a (adjust-array a '(3 2)))"
     "  (gethash a ht 'lose) => `unspecified'" " "
     "  The following example is not an error, because EQUALP is case insensitive:"
     " " "  (setf ht (make-hash-table :test #'equalp))" "  (setf a \"ABC\")"
     "  (setf (gethash a ht) 'win)" "  (setf (char a 0) #\\a)"
     "  (gethash a ht 'lose) => win t" " "
     "  The same example with :test #'equal in the first line would be an error."
     " ")
    :PAR (:ENDISSUE NIL "HASH-TABLE-KEY-MODIFICATION:SPECIFY") " " :PAR))
  :PAR
  (:DICTIONARY NIL
   (:COMMENT NIL " !!!" " Barrett:" "  What about errors for these?" " !!!"
    " JonL:"
    "  I'll bet we don't define \"grow\" (as a verb -- trivial point would be to"
    "  put this in passive voice rather than active; better, simply say \"before"
    "  the table size has to be enlarged.\")"
    "  Given that fuzziness (about \"grow\") it is still unclear what the interaction"
    "  between SIZE and THRESHOLD is.  Since THRESHOLD later is described as being "
    "  merely a \"hint\", then maybe all one needs to say is that the the programmer "
    "  is permitted to express his intent that no enlargements will be forced until "
    "  after about SIZE different entries have been made, and at that the time of "
    "  enlargement, the actual storage size of the table may be larger than SIZE by "
    "  an amount indicated by the THRESHOLD parameter -- that is the SIZE parameter"
    "  will be at the \"threshold\" value rather than the \"actual size\" value.")
   :PAR
   (:COMMENT NIL "-------------------- Hash-Table Type --------------------")
   :PAR
   (:COM (:NAME "hash-table" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "hash-table") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 16.0.0 3 (has been mostly gutted)") :PAR
     (:TERM NIL "Hash tables") " provide a way of mapping any "
     (:TERM NIL "object") " (a " (:TERM NIL "key") ") to an associated "
     (:TERM NIL "object") " (a " (:TERM NIL "value") "). " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :HASH-TABLE-CONCEPTS) ", "
     (:SECREF NIL :PRINTING-OTHER-OBJECTS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL " This is to satisfy JonL.")
     "The intent is that this mapping be implemented by a hashing mechanism, such as that described in Section 6.4 “Hashing” of "
     (:BIB (:ISBN "9780201038033") "The Art of Computer Programming, Volume 3")
     " (pp506-549). In spite of this intent, no "
     (:TERM NIL "conforming implementation")
     " is required to use any particular technique to implement the mapping. "
     :PAR))
   :PAR (:COMMENT NIL "%% ========== MAKE-HASH-TABLE")
   (:COM (:NAME "make-hash-table" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-hash-table")
      (:ARGLIST NIL (:KEYWORD NIL " &key")
       " test size rehash-size rehash-threshold")
      (:VALUES NIL "hash-table"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "test") "—a "
     (:TERM NIL "designator") " for one of the " (:TERM NIL "functions") " "
     (:FUNREF NIL "eq") ", " (:FUNREF NIL "eql") ", " (:FUNREF NIL "equal")
     ", or " (:ISSUE NIL "HASH-TABLE-TESTS:ADD-EQUALP") " "
     (:FUNREF NIL "equalp") ". " (:ENDISSUE NIL "HASH-TABLE-TESTS:ADD-EQUALP")
     " The default is " (:FUNREF NIL "eql") ". " :PAR
     (:COMMENT NIL "% 16.0.0 13")
     (:ISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " " (:PARAM NIL "size")
     "—a non-negative " (:TERM NIL "integer") ". "
     (:ENDISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " The default is "
     (:TERM NIL "implementation-dependent") ". " :PAR
     (:COMMENT NIL "% 16.0.0 14") (:PARAM NIL "rehash-size") "—a "
     (:TERM NIL "real") " of " (:TERM NIL "type") " "
     (:TT NIL "(or (integer 1 *) (float (1.0) *))") ". The default is "
     (:TERM NIL "implementation-dependent") ". " :PAR
     (:COMMENT NIL "% 16.0.0 15")
     (:ISSUE NIL "HASH-TABLE-SIZE:INTENDED-ENTRIES") " "
     (:PARAM NIL "rehash-threshold") "—a " (:TERM NIL "real") " of "
     (:TERM NIL "type") " " (:TT NIL "(real 0 1)") ". The default is "
     (:TERM NIL "implementation-dependent") ". "
     (:COMMENT NIL
      " KMP thinks HASH-TABLE-SIZE:INTENDED-ENTRIES implies this can no longer be an integer."
      " Moon concurs.")
     (:ENDISSUE NIL "HASH-TABLE-SIZE:INTENDED-ENTRIES") " " :PAR
     (:PARAM NIL "hash-table") "—a " (:TERM NIL "hash table") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 16.0.0 12")
     "Creates and returns a new " (:TERM NIL "hash table") ". " :PAR
     (:PARAM NIL "test") " determines how " (:TERM NIL "keys")
     " are compared. "
     (:COMMENT NIL
      "This seemed to need elaboration, so I added the rest of this paragraph. -kmp 27-Feb-91")
     "An " (:TERM NIL "object") " is said to be present in the "
     (:PARAM NIL "hash-table") " if that " (:TERM NIL "object") " is the "
     (:TERM NIL "same") " under the " (:TERM NIL "test") " as the "
     (:TERM NIL "key") " for some entry in the " (:PARAM NIL "hash-table") ". "
     :PAR (:PARAM NIL "size") " is a hint to the " (:TERM NIL "implementation")
     " about how much initial space to allocate in the "
     (:PARAM NIL "hash-table") ". "
     (:ISSUE NIL "HASH-TABLE-SIZE:INTENDED-ENTRIES") " "
     (:COMMENT NIL "It specifies" "% For JonL, I substituted the next line:")
     "This information, taken together with the "
     (:PARAM NIL "rehash-threshold")
     ", controls the approximate number of entries which it should be possible to insert before the table has to grow. "
     (:ENDISSUE NIL "HASH-TABLE-SIZE:INTENDED-ENTRIES")
     " The actual size might be rounded up from " (:PARAM NIL "size")
     " to the next `good' size; for example, some "
     (:TERM NIL "implementations") " might round to the next prime number. "
     :PAR (:PARAM NIL "rehash-size")
     " specifies a minimum amount to increase the size of the "
     (:PARAM NIL "hash-table")
     " when it becomes full enough to require rehashing; see "
     (:PARAM NIL "rehash-threshold") " below. "
     (:ISSUE NIL "HASH-TABLE-REHASH-SIZE-INTEGER") " If "
     (:PARAM NIL "rehash-size") " is an " (:TERM NIL "integer")
     ", the expected growth rate for the table is additive and the "
     (:TERM NIL "integer") " is the number of entries to add; if it is a "
     (:TERM NIL "float")
     ", the expected growth rate for the table is multiplicative and the "
     (:TERM NIL "float") " is the ratio of the new size to the old size. "
     (:ENDISSUE NIL "HASH-TABLE-REHASH-SIZE-INTEGER") " As with "
     (:PARAM NIL "size")
     ", the actual size of the increase might be rounded up. " :PAR
     (:PARAM NIL "rehash-threshold") " specifies how full the "
     (:PARAM NIL "hash-table") " can get before it must grow. "
     (:ISSUE NIL "HASH-TABLE-SIZE:INTENDED-ENTRIES")
     " It specifies the maximum desired hash-table occupancy level. "
     (:COMMENT NIL "If \\param{rehash-threshold} is an \\term{integer} "
      "it will be scaled whenever the table is grown.")
     :PAR (:ISSUE NIL "HASH-TABLE-REHASH-SIZE-INTEGER") " The "
     (:TERM NIL "values") " of " (:PARAM NIL "rehash-size") " and "
     (:PARAM NIL "rehash-threshold") " do not constrain the "
     (:TERM NIL "implementation")
     " to use any particular method for computing when and by how much the size of "
     (:PARAM NIL "hash-table") " should be enlarged. Such decisions are "
     (:TERM NIL "implementation-dependent") ", and these " (:TERM NIL "values")
     " only hints from the " (:TERM NIL "programmer") " to the "
     (:TERM NIL "implementation") ", and the " (:TERM NIL "implementation")
     " is permitted to ignore them. "
     (:ENDISSUE NIL "HASH-TABLE-REHASH-SIZE-INTEGER") " "
     (:ENDISSUE NIL "HASH-TABLE-SIZE:INTENDED-ENTRIES") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR (:COMMENT NIL "% 16.0.0 16")
     (:CODE NIL
      " (setq table (make-hash-table)) → #<HASH-TABLE EQL 0/120 46142754>
 (setf (gethash \"one\" table) 1) → 1
 (gethash \"one\" table) → NIL, "
      (:TERM NIL "false") "
 (setq table (make-hash-table :test 'equal)) → #<HASH-TABLE EQUAL 0/139 46145547>
 (setf (gethash \"one\" table) 1) → 1
 (gethash \"one\" table) → 1, T
 (make-hash-table :rehash-size 1.5 :rehash-threshold 0.7) 
→ #<HASH-TABLE EQL 0/120 46156620>
")
     " " :PAR (:ISSUE NIL "HASH-TABLE-SIZE:INTENDED-ENTRIES") " "
     (:COMMENT NIL
      " I removed this example because it uses an integer :rehash-threshold. -kmp 21-May-91"
      "  (make-hash-table :size 100 :rehash-size 50 :rehash-threshold 75)"
      " \\EV #<HASH-TABLE EQL 0/100 46152651>")
     (:ENDISSUE NIL "HASH-TABLE-SIZE:INTENDED-ENTRIES") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "gethash") ", "
     (:TYPEREF NIL "hash-table") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL
      "% JonL says this is \"redundant, and perhaps confusing\". -kmp 3-Feb-92"
      " There are \\term{hash tables} that hash on \\term{object} identity"
      " (using \\funref{eq} or \\funref{eql})"
      " and there are \\term{hash tables} that hash on \\term{object} structure "
      " (using \\funref{equal} and \\funref{equalp}).")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== HASH-TABLE-P")
   (:COM (:NAME "hash-table-p" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "hash-table-p")
      (:ARGLIST NIL "object") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 16.0.0 17")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "hash-table") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (setq table (make-hash-table)) → #<HASH-TABLE EQL 0/120 32511220>
 (hash-table-p table) → "
      (:TERM NIL "true") "
 (hash-table-p 37) → "
      (:TERM NIL "false") "
 (hash-table-p '((a . 1) (b . 2))) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (hash-table-p " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'hash-table)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== HASH-TABLE-COUNT")
   (:COM (:NAME "hash-table-count" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "hash-table-count")
      (:ARGLIST NIL "hash-table") (:VALUES NIL "count"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "hash-table")
     "—a " (:TERM NIL "hash table") ". " :PAR (:PARAM NIL "count")
     "—a non-negative " (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 16.0.0 25")
     "Returns the number of entries in the " (:PARAM NIL "hash-table") ". If "
     (:PARAM NIL "hash-table") " has just been created or newly cleared (see "
     (:FUNREF NIL "clrhash") ") the entry count is " (:TT NIL "0") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (setq table (make-hash-table)) → #<HASH-TABLE EQL 0/120 32115135>
 (hash-table-count table) → 0
 (setf (gethash 57 table) \"fifty-seven\") → \"fifty-seven\"
 (hash-table-count table) → 1
 (dotimes (i 100) (setf (gethash i table) i)) → NIL
 (hash-table-count table) → 100
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:FUNREF NIL "clrhash") ", "
     (:FUNREF NIL "remhash") ", " (:MACREF NIL "setf") " of "
     (:MISC NIL "gethash") " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "hash-table-size") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "The following relationships are functionally correct, although in practice using "
     (:FUNREF NIL "hash-table-count") " is probably much faster: " :PAR
     (:CODE NIL " (hash-table-count " (:PARAM NIL "table") ") ≡
 (loop for value being the hash-values of "
      (:PARAM NIL "table") " count t) ≡
 (let ((total 0))
   (maphash #'(lambda (key value)
                (declare (ignore key value))
                (incf total))
            "
      (:PARAM NIL "table") ")
   total)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== HASH-TABLE-REHASH-SIZE")
   (:COM (:NAME "hash-table-rehash-size" :FTYPE "Function")
    (:ISSUE NIL "HASH-TABLE-ACCESS:X3J13-MAR-89") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "hash-table-rehash-size")
      (:ARGLIST NIL "hash-table") (:VALUES NIL "rehash-size"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "hash-table")
     "—a " (:TERM NIL "hash table") ". " :PAR (:PARAM NIL "rehash-size") "—a "
     (:TERM NIL "real") " of " (:TERM NIL "type") " "
     (:TT NIL "(or (integer 1 *) (float (1.0) *))") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns the current rehash size of "
     (:PARAM NIL "hash-table") ", suitable for use in a call to "
     (:FUNREF NIL "make-hash-table") " in order to produce a "
     (:TERM NIL "hash table")
     " with state corresponding to the current state of the "
     (:PARAM NIL "hash-table") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq table (make-hash-table :size 100 :rehash-size 1.4))
→ #<HASH-TABLE EQL 0/100 2556371>
 (hash-table-rehash-size table) → 1.4
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "hash-table") " is not a "
     (:TERM NIL "hash table") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-hash-table") ", "
     (:FUNREF NIL "hash-table-rehash-threshold") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:ISSUE NIL "HASH-TABLE-REHASH-SIZE-INTEGER")
     " If the hash table was created with an " (:TERM NIL "integer")
     " rehash size, the result is an " (:TERM NIL "integer")
     ", indicating that the rate of growth of the " (:PARAM NIL "hash-table")
     " when rehashed is intended to be additive; otherwise, the result is a "
     (:TERM NIL "float") ", indicating that the rate of growth of the "
     (:PARAM NIL "hash-table")
     " when rehashed is intended to be multiplicative. However, this value is only advice to the "
     (:TERM NIL "implementation") "; the actual amount by which the "
     (:PARAM NIL "hash-table") " will grow upon rehash is "
     (:TERM NIL "implementation-dependent") ". "
     (:ENDISSUE NIL "HASH-TABLE-REHASH-SIZE-INTEGER") " " :PAR
     (:ENDISSUE NIL "HASH-TABLE-ACCESS:X3J13-MAR-89") " "))
   " " :PAR (:COMMENT NIL "%% ========== HASH-TABLE-REHASH-THRESHOLD")
   (:COM (:NAME "hash-table-rehash-threshold" :FTYPE "Function")
    (:ISSUE NIL "HASH-TABLE-ACCESS:X3J13-MAR-89") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "hash-table-rehash-threshold")
      (:ARGLIST NIL "hash-table") (:VALUES NIL "rehash-threshold"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "hash-table")
     "—a " (:TERM NIL "hash table") ". " :PAR
     (:ISSUE NIL "HASH-TABLE-SIZE:INTENDED-ENTRIES") " "
     (:PARAM NIL "rehash-threshold") "—a " (:TERM NIL "real") " of "
     (:TERM NIL "type") " " (:TT NIL "(real 0 1)") ". "
     (:COMMENT NIL
      " KMP thinks HASH-TABLE-SIZE:INTENDED-ENTRIES implies this can no longer be an integer."
      " Moon concurs.")
     (:ENDISSUE NIL "HASH-TABLE-SIZE:INTENDED-ENTRIES") " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "Returns the current rehash threshold of " (:PARAM NIL "hash-table")
     ", which is suitable for use in a call to "
     (:FUNREF NIL "make-hash-table") " in order to produce a "
     (:TERM NIL "hash table")
     " with state corresponding to the current state of the "
     (:PARAM NIL "hash-table") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq table (make-hash-table :size 100 :rehash-threshold 0.5))
→ #<HASH-TABLE EQL 0/100 2562446>
 (hash-table-rehash-threshold table) → 0.5
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "hash-table") " is not a "
     (:TERM NIL "hash table") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-hash-table") ", "
     (:FUNREF NIL "hash-table-rehash-size") " " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "HASH-TABLE-ACCESS:X3J13-MAR-89") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== HASH-TABLE-SIZE")
   (:COM (:NAME "hash-table-size" :FTYPE "Function")
    (:ISSUE NIL "HASH-TABLE-ACCESS:X3J13-MAR-89") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "hash-table-size")
      (:ARGLIST NIL "hash-table") (:VALUES NIL "size"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "hash-table")
     "—a " (:TERM NIL "hash table") ". " :PAR (:PARAM NIL "size")
     "—a non-negative " (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns the current size of "
     (:PARAM NIL "hash-table") ", which is suitable for use in a call to "
     (:FUNREF NIL "make-hash-table") " in order to produce a "
     (:TERM NIL "hash table")
     " with state corresponding to the current state of the "
     (:PARAM NIL "hash-table") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "hash-table") " is not a "
     (:TERM NIL "hash table") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "hash-table-count") ", "
     (:FUNREF NIL "make-hash-table") " " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "HASH-TABLE-ACCESS:X3J13-MAR-89") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== HASH-TABLE-TEST")
   (:COM (:NAME "hash-table-test" :FTYPE "Function")
    (:ISSUE NIL "HASH-TABLE-ACCESS:X3J13-MAR-89") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "hash-table-test")
      (:ARGLIST NIL "hash-table") (:VALUES NIL "test"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "hash-table")
     "—a " (:TERM NIL "hash table") ". " :PAR (:PARAM NIL "test") "—a "
     (:TERM NIL "function designator") ". For the four "
     (:TERM NIL "standardized") " " (:TERM NIL "hash table") " test "
     (:TERM NIL "functions") " (see " (:FUNREF NIL "make-hash-table") "), the "
     (:PARAM NIL "test") " value returned is always a " (:TERM NIL "symbol")
     ". If an " (:TERM NIL "implementation")
     " permits additional tests, it is " (:TERM NIL "implementation-dependent")
     " whether such tests are returned as " (:TERM NIL "function") " "
     (:TERM NIL "objects") " or " (:TERM NIL "function names") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "Returns the test used for comparing " (:TERM NIL "keys") " in "
     (:PARAM NIL "hash-table") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "hash-table") " is not a "
     (:TERM NIL "hash table") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-hash-table") " " :PAR
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "HASH-TABLE-ACCESS:X3J13-MAR-89") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== GETHASH")
   (:COM (:NAME "gethash" :FTYPE "Accessor")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "gethash")
      (:ARGLIST NIL "key hash-table " (:KEYWORD NIL " &optional") " default")
      (:VALUES NIL "value, present-p"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "gethash")
      (:ARGLIST NIL "key hash-table " (:KEYWORD NIL " &optional") " default")
      (:NEW-VALUE NIL "new-value"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "key") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "hash-table") "—a "
     (:TERM NIL "hash table") ". " :PAR (:PARAM NIL "default") "—an "
     (:TERM NIL "object") ". The default is " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "value") "—an " (:TERM NIL "object") ". " :PAR
     (:PARAM NIL "present-p") "—a " (:TERM NIL "generalized boolean") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 16.0.0 18")
     (:PARAM NIL "Value") " is the " (:TERM NIL "object") " in "
     (:PARAM NIL "hash-table") " whose " (:TERM NIL "key") " is the "
     (:TERM NIL "same") " as " (:PARAM NIL "key") " under the "
     (:PARAM NIL "hash-table")
     "'s equivalence test. If there is no such entry, " (:PARAM NIL "value")
     " is the " (:PARAM NIL "default") ". " :PAR (:COMMENT NIL "% 16.0.0 19")
     (:PARAM NIL "Present-p") " is " (:TERM NIL "true")
     " if an entry is found; otherwise, it is " (:TERM NIL "false") ". " :PAR
     (:COMMENT NIL "% 16.0.0 20") (:MACREF NIL "setf") " may be used with "
     (:FUNREF NIL "gethash") " to modify the " (:TERM NIL "value")
     " associated with a given " (:TERM NIL "key") ", or to add a new entry. "
     (:ISSUE NIL "SETF-GET-DEFAULT:EVALUATED-BUT-IGNORED") " When a "
     (:FUNREF NIL "gethash") " " (:TERM NIL "form") " is used as a "
     (:MACREF NIL "setf") " " (:PARAM NIL "place") ", any "
     (:PARAM NIL "default")
     " which is supplied is evaluated according to normal left-to-right evaluation rules, but its "
     (:TERM NIL "value") " is ignored. "
     (:COMMENT NIL " \\param{Default} may be supplied to \\funref{gethash} "
      " in this context; it is ignored by the"
      " \\macref{setf} expander function for \\funref{gethash}, but"
      " may be useful in such macros "
      " as \\macref{incf} that are related to \\macref{setf}:")
     (:ENDISSUE NIL "SETF-GET-DEFAULT:EVALUATED-BUT-IGNORED") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (setq table (make-hash-table)) → #<HASH-TABLE EQL 0/120 32206334>
 (gethash 1 table) → NIL, "
      (:TERM NIL "false") "
 (gethash 1 table 2) → 2, "
      (:TERM NIL "false") "
 (setf (gethash 1 table) \"one\") → \"one\"
 (setf (gethash 2 table \"two\") \"two\") → \"two\"
 (gethash 1 table) → \"one\", "
      (:TERM NIL "true") "
 (gethash 2 table) → \"two\", "
      (:TERM NIL "true") "
 (gethash nil table) → NIL, "
      (:TERM NIL "false") "
 (setf (gethash nil table) nil) → NIL 
 (gethash nil table) → NIL, "
      (:TERM NIL "true") "
 (defvar *counters* (make-hash-table)) → *COUNTERS*
 (gethash 'foo *counters*) → NIL, "
      (:TERM NIL "false") "
 (gethash 'foo *counters* 0) → 0, "
      (:TERM NIL "false") "
 (defmacro how-many (obj) `(values (gethash ,obj *counters* 0))) → HOW-MANY
 (defun count-it (obj) (incf (how-many obj))) → COUNT-IT
 (dolist (x '(bar foo foo bar bar baz)) (count-it x))
 (how-many 'foo) → 2
 (how-many 'bar) → 3
 (how-many 'quux) → 0
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "remhash") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The " (:TERM NIL "secondary value") ", "
     (:PARAM NIL "present-p")
     ", can be used to distinguish the absence of an entry from the presence of an entry that has a value of "
     (:PARAM NIL "default") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== REMHASH")
   (:COM (:NAME "remhash" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "remhash")
      (:ARGLIST NIL "key hash-table") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "key") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "hash-table") "—a "
     (:TERM NIL "hash table") ". " :PAR (:PARAM NIL "generalized-boolean")
     "—a " (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 16.0.0 21")
     "Removes the entry for " (:PARAM NIL "key") " in "
     (:PARAM NIL "hash-table") ", if any. Returns " (:TERM NIL "true")
     " if there was such an entry, or " (:TERM NIL "false") " otherwise. "
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL
      " (setq table (make-hash-table)) → #<HASH-TABLE EQL 0/120 32115666>
 (setf (gethash 100 table) \"C\") → \"C\"
 (gethash 100 table) → \"C\", "
      (:TERM NIL "true") "
 (remhash 100 table) → "
      (:TERM NIL "true") "
 (gethash 100 table) → NIL, "
      (:TERM NIL "false") "
 (remhash 100 table) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:PARAM NIL "hash-table")
     " is modified. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MAPHASH")
   (:COM (:NAME "maphash" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR (:COMMENT NIL "% 16.0.0 23")
     (:DEF (:KIND "function") (:NAMES NIL "maphash")
      (:ARGLIST NIL "function hash-table") (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "function")
     "—a " (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") ", the " (:TERM NIL "key") " and the "
     (:TERM NIL "value") ". " :PAR (:PARAM NIL "hash-table") "—a "
     (:TERM NIL "hash table") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 16.0.0 22")
     "Iterates over all entries in the " (:PARAM NIL "hash-table")
     ". For each entry, the " (:PARAM NIL "function") " is called with two "
     (:TERM NIL "arguments") "–the " (:TERM NIL "key") " and the "
     (:TERM NIL "value") " of that entry. " :PAR
     "The consequences are unspecified if any attempt is made to add or remove an entry from the "
     (:PARAM NIL "hash-table") " while a " (:FUNREF NIL "maphash")
     " is in progress, with two exceptions: the " (:PARAM NIL "function")
     " can use can use " (:MACREF NIL "setf") " of " (:FUNREF NIL "gethash")
     " to change the " (:TERM NIL "value")
     " part of the entry currently being processed, or it can use "
     (:FUNREF NIL "remhash") " to remove that entry. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (setq table (make-hash-table)) → #<HASH-TABLE EQL 0/120 32304110>
 (dotimes (i 10) (setf (gethash i table) i)) → NIL
 (let ((sum-of-squares 0))
    (maphash #'(lambda (key val) 
                 (let ((square (* val val)))
                   (incf sum-of-squares square)
                   (setf (gethash key table) square)))
             table)
    sum-of-squares) → 285
 (hash-table-count table) → 10
 (maphash #'(lambda (key val)
               (when (oddp val) (remhash key table)))
           table) → NIL
 (hash-table-count table) → 5
 (maphash #'(lambda (k v) (print (list k v))) table)
(0 0) 
(8 64) 
(2 4) 
(6 36) 
(4 16) 
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR
     "None, other than any which might be done by the " (:PARAM NIL "function")
     ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "loop") ", "
     (:MACREF NIL "with-hash-table-iterator") ", "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== WITH-HASH-TABLE-ITERATOR")
   (:COM (:NAME "with-hash-table-iterator" :FTYPE "Macro")
    (:ISSUE NIL "DECLS-AND-DOC") " " :PAR
    (:ISSUE NIL "HASH-TABLE-PACKAGE-GENERATORS:ADD-WITH-WRAPPER") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "with-hash-table-iterator")
      (:ARGLIST NIL (:PAREN NIL "name hash-table") " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "name")
     "—a name suitable for the first argument to " (:SPECREF NIL "macrolet")
     ". " :PAR (:PARAM NIL "hash-table") "—a " (:TERM NIL "form")
     ", evaluated once, that should produce a " (:TERM NIL "hash table") ". "
     :PAR (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR (:PARAM NIL "forms")
     "—an " (:TERM NIL "implicit progn") ". " :PAR (:PARAM NIL "results")
     "—the " (:TERM NIL "values") " returned by " (:PARAM NIL "forms") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "!!! KMP: Are declarations permitted?"
      " JonL: Let's say No because this provides no name bindings, except for the MACROLET."
      "       Can always use LOCALLY anyway."
      " KMP&Barrett: We added them anyway.")
     :PAR "Within the lexical scope of the body, " (:PARAM NIL "name")
     " is defined via " (:SPECREF NIL "macrolet")
     " such that successive invocations of "
     (:TT NIL "(" (:PARAM NIL "name") ")")
     " return the items, one by one, from the " (:TERM NIL "hash table")
     " that is obtained by evaluating " (:PARAM NIL "hash-table")
     " only once. " :PAR "An invocation " (:TT NIL "(" (:PARAM NIL "name") ")")
     " returns three values as follows: " :PAR
     (:LIST NIL
      (:ITEM NIL "1. A " (:TERM NIL "generalized boolean") " that is "
       (:TERM NIL "true") " if an entry is returned. ")
      (:ITEM NIL "2. The key from the " (:PARAM NIL "hash-table") " entry. ")
      (:ITEM NIL "3. The value from the " (:PARAM NIL "hash-table")
       " entry. "))
     " After all entries have been returned by successive invocations of "
     (:TT NIL "(" (:PARAM NIL "name") ")")
     ", then only one value is returned, namely " (:MISC NIL "nil") ". " :PAR
     (:COMMENT NIL
      "!!! Barrett: Doesn't this just mean the macro has dynamic extent?")
     "It is unspecified what happens if any of the implicit interior state of an iteration is returned outside the dynamic extent of the "
     (:MACREF NIL "with-hash-table-iterator") " " (:TERM NIL "form")
     " such as by returning some " (:TERM NIL "closure")
     " over the invocation " (:TERM NIL "form") ". " :PAR
     "Any number of invocations of " (:MACREF NIL "with-hash-table-iterator")
     " can be nested, and the body of the innermost one can invoke all of the locally "
     (:TERM NIL "established") " " (:TERM NIL "macros")
     ", provided all of those " (:TERM NIL "macros") " have "
     (:TERM NIL "distinct") " names. " :PAR)
    (:PART (:NAME "Examples") " " :PAR "The following function should return "
     (:MISC NIL "t") " on any " (:TERM NIL "hash table")
     ", and signal an error if the usage of "
     (:MACREF NIL "with-hash-table-iterator")
     " does not agree with the corresponding usage of " (:FUNREF NIL "maphash")
     ". " :PAR
     (:CODE NIL " (defun test-hash-table-iterator (hash-table)
   (let ((all-entries '())
         (generated-entries '())
         (unique (list nil)))
     (maphash #'(lambda (key value) (push (list key value) all-entries))
              hash-table)
     (with-hash-table-iterator (generator-fn hash-table)
       (loop     
         (multiple-value-bind (more? key value) (generator-fn)
           (unless more? (return))
           (unless (eql value (gethash key hash-table unique))
             (error \"Key ~S not found for value ~S\" key value))
           (push (list key value) generated-entries))))
     (unless (= (length all-entries)
                (length generated-entries)
                (length (union all-entries generated-entries
                               :key #'car :test (hash-table-test hash-table))))
       (error \"Generated entries and Maphash entries don't correspond\"))
     t))
")
     " "
     (:COMMENT NIL
      " \"#'equal\" => \"(hash-table-test hash-table)\" in the above per JonL."
      " There are maybe other problems as well. Mail sent to Quinquevirate."
      " -kmp 2-Feb-92")
     :PAR "The following could be an acceptable definition of "
     (:FUNREF NIL "maphash") ", implemented by "
     (:MACREF NIL "with-hash-table-iterator") ". " :PAR
     (:CODE NIL " (defun maphash (function hash-table)
   (with-hash-table-iterator (next-entry hash-table)
     (loop (multiple-value-bind (more key value) (next-entry)
             (unless more (return nil))
             (funcall function key value)))))
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "The consequences are undefined if the local function named "
     (:PARAM NIL "name") " " (:TERM NIL "established") " by "
     (:MACREF NIL "with-hash-table-iterator")
     " is called after it has returned " (:TERM NIL "false") " as its "
     (:TERM NIL "primary value") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "HASH-TABLE-PACKAGE-GENERATORS:ADD-WITH-WRAPPER") " "
     (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== CLRHASH")
   (:COM (:NAME "clrhash" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "clrhash")
      (:ARGLIST NIL "hash-table") (:VALUES NIL "hash-table"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "hash-table")
     "—a " (:TERM NIL "hash table") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 16.0.0 24")
     "Removes all entries from " (:PARAM NIL "hash-table")
     ", and then returns that empty " (:TERM NIL "hash table") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (setq table (make-hash-table)) → #<HASH-TABLE EQL 0/120 32004073>
 (dotimes (i 100) (setf (gethash i table) (format nil \"~R\" i))) → NIL
 (hash-table-count table) → 100
 (gethash 57 table) → \"fifty-seven\", "
      (:TERM NIL "true") "
 (clrhash table) → #<HASH-TABLE EQL 0/120 32004073>
 (hash-table-count table) → 0
 (gethash 57 table) → NIL, "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:PARAM NIL "hash-table")
     " is modified. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SXHASH")
   (:COM (:NAME "sxhash" :FTYPE "Function")
    (:ISSUE NIL "SXHASH-DEFINITION:SIMILAR-FOR-SXHASH") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "sxhash") (:ARGLIST NIL "object")
      (:VALUES NIL "hash-code"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "hash-code") "—a non-negative "
     (:TERM NIL "fixnum") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 16.0.0 27")
     (:FUNREF NIL "sxhash") " returns a hash code for " (:PARAM NIL "object")
     ". " :PAR "The manner in which the hash code is computed is "
     (:TERM NIL "implementation-dependent")
     ", but subject to certain constraints: " :PAR
     (:LIST NIL
      (:ITEM NIL "1. "
       (:TT NIL "(equal " (:PARAM NIL "x") " " (:PARAM NIL "y") ")")
       " implies "
       (:TT NIL "(= (sxhash " (:PARAM NIL "x") ") (sxhash " (:PARAM NIL "y")
        "))")
       ". " :PAR)
      (:ITEM NIL "2. For any two " (:TERM NIL "objects") ", " (:PARAM NIL "x")
       " and " (:PARAM NIL "y") ", both of which are "
       (:TERM NIL "bit vectors") ", " (:TERM NIL "characters") ", "
       (:TERM NIL "conses") ", " (:TERM NIL "numbers") ", "
       (:TERM NIL "pathnames") ", " (:TERM NIL "strings") ", or "
       (:TERM NIL "symbols") ", and which are " (:TERM NIL "similar") ", "
       (:TT NIL "(sxhash " (:PARAM NIL "x") ")") " and "
       (:TT NIL "(sxhash " (:PARAM NIL "y") ")") " " (:TERM NIL "yield")
       " the same mathematical value even if " (:PARAM NIL "x") " and "
       (:PARAM NIL "y") " exist in different " (:TERM NIL "Lisp images")
       " of the same " (:TERM NIL "implementation") ". See "
       (:SECREF NIL :LITERALS-IN-COMPILED-FILES) ". " :PAR)
      (:ITEM NIL "3. The " (:PARAM NIL "hash-code") " for an "
       (:TERM NIL "object") " is always the " (:TERM NIL "same")
       " within a single " (:TERM NIL "session") " provided that the "
       (:TERM NIL "object")
       " is not visibly modified with regard to the equivalence test "
       (:FUNREF NIL "equal") ". See " (:SECREF NIL :MODIFYING-HASH-KEYS) ". "
       :PAR)
      (:ITEM NIL "4. The " (:PARAM NIL "hash-code")
       " is intended for hashing. This places no verifiable constraint on a "
       (:TERM NIL "conforming implementation") ", but the intent is that an "
       (:TERM NIL "implementation")
       " should make a good-faith effort to produce " (:PARAM NIL "hash-codes")
       " that are well distributed within the range of non-negative "
       (:TERM NIL "fixnums") ". " :PAR)
      (:ITEM NIL "5. Computation of the " (:PARAM NIL "hash-code")
       " must terminate, even if the " (:PARAM NIL "object")
       " contains circularities. "))
     " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (= (sxhash (list 'list \"ab\")) (sxhash (list 'list \"ab\"))) → "
      (:TERM NIL "true") "
 (= (sxhash \"a\") (sxhash (make-string 1 :initial-element #\\a))) → "
      (:TERM NIL "true") "
 (let ((r (make-random-state)))
   (= (sxhash r) (sxhash (make-random-state r))))
→ "
      (:TERM NIL "implementation-dependent") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The " (:TERM NIL "implementation")
     ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "Many common hashing needs are satisfied by "
     (:FUNREF NIL "make-hash-table") " and the related functions on "
     (:TERM NIL "hash tables") ". " (:FUNREF NIL "sxhash")
     " is intended for use where the pre-defined abstractions are insufficient. Its main intent is to allow the user a convenient means of implementing more complicated hashing paradigms than are provided through "
     (:TERM NIL "hash tables") ". " :PAR "The hash codes returned by "
     (:FUNREF NIL "sxhash")
     " are not necessarily related to any hashing strategy used by any other "
     (:TERM NIL "function") " in " (:RM NIL " Common Lisp") ". " :PAR "For "
     (:TERM NIL "objects") " of " (:TERM NIL "types") " that "
     (:FUNREF NIL "equal") " compares with " (:FUNREF NIL "eq")
     ", item 3 requires that the " (:PARAM NIL "hash-code")
     " be based on some immutable quality of the identity of the object. Another legitimate implementation technique would be to have "
     (:FUNREF NIL "sxhash") " assign (and cache) a random hash code for these "
     (:TERM NIL "objects") ", since there is no requirement that "
     (:TERM NIL "similar") " but non-" (:FUNREF NIL "eq")
     " objects have the same hash code. " :PAR "Although "
     (:TERM NIL "similarity") " is defined for " (:TERM NIL "symbols")
     " in terms of both the " (:TERM NIL "symbol") "'s " (:TERM NIL "name")
     " and the " (:TERM NIL "packages") " in which the " (:TERM NIL "symbol")
     " is " (:TERM NIL "accessible") ", item 3 disallows using "
     (:TERM NIL "package")
     " information to compute the hash code, since changes to the package status of a symbol are not visible to "
     (:PARAM NIL "equal") ". " :PAR
     (:ENDISSUE NIL "SXHASH-DEFINITION:SIMILAR-FOR-SXHASH") " " :PAR))
   " ")
  " " :PAR)
 (:CHAPTER
  (:NUM "19" :TITLE ("Filenames") :NUMTAG :CHAP-NINETEEN :NAMETAG :FILENAMES)
  (:SECTION (:TITLE ("Overview of Filenames") :TAGS (:NAMING-FILES)) " " :PAR
   "There are many kinds of " (:TERM NIL "file systems")
   ", varying widely both in their superficial syntactic details, and in their underlying power and structure. The facilities provided by "
   (:RM NIL " Common Lisp") " for referring to and manipulating "
   (:TERM NIL "files") " has been chosen to be compatible with many kinds of "
   (:TERM NIL "file systems")
   ", while at the same time minimizing the program-visible differences between kinds of "
   (:TERM NIL "file systems") ". " :PAR (:COMMENT NIL "% 23.1.0 1") "Since "
   (:TERM NIL "file systems") " vary in their conventions for naming "
   (:TERM NIL "files") ", there are two distinct ways to represent "
   (:TERM NIL "filenames") ": as " (:TERM NIL "namestrings") " and as "
   (:TERM NIL "pathnames") ". " :PAR
   (:SUBSECTION (:TITLE ("Namestrings as Filenames"))
    (:ISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " A "
    (:NEWTERM NIL "namestring") " is a " (:TERM NIL "string")
    " that represents a " (:TERM NIL "filename") ". " :PAR
    "In general, the syntax of " (:TERM NIL "namestrings")
    " involves the use of " (:TERM NIL "implementation-defined")
    " conventions, usually those customary for the " (:TERM NIL "file system")
    " in which the named " (:TERM NIL "file")
    " resides. The only exception is the syntax of a "
    (:TERM NIL "logical pathname") " " (:TERM NIL "namestring")
    ", which is defined in this specification; see "
    (:SECREF NIL :LOG-PATH-NAMESTRINGS) ". "
    (:ENDISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
    :PAR "A " (:TERM NIL "conforming program")
    " must never unconditionally use a " (:TERM NIL "literal") " "
    (:TERM NIL "namestring") " other than a " (:TERM NIL "logical pathname")
    " " (:TERM NIL "namestring") " because " (:RM NIL " Common Lisp")
    " does not define any " (:TERM NIL "namestring")
    " syntax other than that for " (:TERM NIL "logical pathnames")
    " that would be guaranteed to be portable. However, a "
    (:TERM NIL "conforming program")
    " can, if it is careful, successfully manipulate user-supplied data which contains or refers to non-portable "
    (:TERM NIL "namestrings") ". " :PAR (:COMMENT NIL "%% 23.1.1 11") "A "
    (:TERM NIL "namestring") " can be " (:TERM NIL "coerced") " to a "
    (:TERM NIL "pathname") " by the " (:TERM NIL "functions") " "
    (:FUNREF NIL "pathname") " or " (:FUNREF NIL "parse-namestring") ". "
    (:COMMENT NIL
     "% Not true for logical pathnames.  Anyway, better said (if at all) in the function entries."
     " The effect of these \\term{functions} is necessarily"
     " \\term{implementation-dependent} because the format of \\term{namestrings}"
     " is \\term{implementation-dependent}.")
    :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Pathnames as Filenames") :TAGS (:PATHNAMES-AS-FILENAMES)) " "
    :PAR
    (:COMMENT NIL " From Chapter 21.1 ..."
     " \\term{Pathnames} provide a means for expressing many operations that"
     " manipulate files or file names in a manner that does not depend on the specific"
     " format of file names on a particular file system.")
    :PAR (:NEWTERM (:IDX "pathname") "Pathnames") " are structured "
    (:TERM NIL "objects") " that can represent, in an "
    (:TERM NIL "implementation-independent") " way, the "
    (:TERM NIL "filenames") " that are used natively by an underlying "
    (:TERM NIL "file system") ". " :PAR "In addition, " (:TERM NIL "pathnames")
    " can also represent certain partially composed " (:TERM NIL "filenames")
    " for which an underlying " (:TERM NIL "file system")
    " might not have a specific " (:TERM NIL "namestring") " representation. "
    :PAR
    (:COMMENT NIL "% 23.1.1 10" " A \\term{pathname} "
     " is not necessarily the name of a specific file."
     " Rather, it is a specification (possibly only a partial specification) of"
     " how to access a file.  ")
    :PAR "A " (:TERM NIL "pathname")
    " need not correspond to any file that actually exists, and more than one "
    (:TERM NIL "pathname") " can refer to the same file. For example, the "
    (:TERM NIL "pathname") " with a version of " (:KWD NIL "newest")
    " might refer to the same file as a " (:TERM NIL "pathname")
    " with the same components except a certain number as the version. Indeed, a "
    (:TERM NIL "pathname") " with version " (:KWD NIL "newest")
    " might refer to different files as time passes, because the meaning of such a "
    (:TERM NIL "pathname") " depends on the state of the file system. " :PAR
    "Some " (:TERM NIL "file systems")
    " naturally use a structural model for their " (:TERM NIL "filenames")
    ", while others do not. Within the " (:RM NIL " Common Lisp") " "
    (:TERM NIL "pathname") " model, all " (:TERM NIL "filenames")
    " are seen as having a particular structure, even if that structure is not reflected in the underlying "
    (:TERM NIL "file system")
    ". The nature of the mapping between structure imposed by "
    (:TERM NIL "pathnames")
    " and the structure, if any, that is used by the underlying "
    (:TERM NIL "file system") " is " (:TERM NIL "implementation-defined") ". "
    :PAR
    (:COMMENT NIL "% 23.1.0 2"
     "In order to allow code to operate in a network environment"
     "that may have more than one kind of file system, the pathname facility"
     "allows a file name to specify which file system (called the"
     "host) is to be used." "Left out.")
    :PAR (:COMMENT NIL "% 23.1.1 3") "Every " (:TERM NIL "pathname")
    " has six components: a host, a device, a directory, a name, a type, and a version. By naming "
    (:TERM NIL "files") " with " (:TERM NIL "pathnames") ", "
    (:RM NIL " Common Lisp")
    " programs can work in essentially the same way even in "
    (:TERM NIL "file systems")
    " that seem superficially quite different. For a detailed description of these components, see "
    (:SECREF NIL :PATHNAME-COMPONENTS) ". " :PAR
    (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
    (:ISSUE NIL "PATHNAME-SYNTAX-ERROR-TIME:EXPLICITLY-VAGUE")
    (:COMMENT NIL " %% Per X3J13. -kmp 5-Oct-93"
     " The mapping of the \\term{pathname} components into the concepts peculiar to "
     " each \\term{file system} is \\term{implementation-defined}."
     " There exist conceivable \\term{pathnames} for which there is no valid mapping "
     " in a particular \\term{implementation}. The time at which this error detection"
     " occurs is \\term{implementation-dependent}.")
    "The mapping of the " (:TERM NIL "pathname")
    " components into the concepts peculiar to each " (:TERM NIL "file system")
    " is " (:TERM NIL "implementation-defined") ". There exist conceivable "
    (:TERM NIL "pathnames")
    " for which there is no mapping to a syntactically valid "
    (:TERM NIL "filename") " in a particular " (:TERM NIL "implementation")
    ". An " (:TERM NIL "implementation")
    " may use various strategies in an attempt to find a mapping; for example, an "
    (:TERM NIL "implementation") " may quietly truncate "
    (:TERM NIL "filenames")
    " that exceed length limitations imposed by the underlying "
    (:TERM NIL "file system") ", or ignore certain " (:TERM NIL "pathname")
    " components for which the " (:TERM NIL "file system")
    " provides no support. If such a mapping cannot be found, an error of "
    (:TERM NIL "type") " " (:TYPEREF NIL "file-error") " is signaled. " :PAR
    "The time at which this mapping and associated error signaling occurs is "
    (:TERM NIL "implementation-dependent")
    ". Specifically, it may occur at the time the " (:TERM NIL "pathname")
    " is constructed, when coercing a " (:TERM NIL "pathname") " to a "
    (:TERM NIL "namestring") ", or when an attempt is made to "
    (:TERM NIL "open") " or otherwise access the " (:TERM NIL "file")
    " designated by the " (:TERM NIL "pathname") ". "
    (:ENDISSUE NIL "PATHNAME-SYNTAX-ERROR-TIME:EXPLICITLY-VAGUE") " "
    (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR
    (:NEXTFIGURE (:CAPS T)) " lists some " (:TERM NIL "defined names")
    " that are applicable to " (:TERM NIL "pathnames") ". " :PAR
    (:TABLE (:NAME ("Pathname Operations"))
     (:ROW NIL (:CELL NIL (:VARREF NIL "*default-pathname-defaults*"))
      (:CELL NIL (:FUNREF NIL "namestring"))
      (:CELL NIL (:FUNREF NIL "pathname-name")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " directory-namestring"))
      (:CELL NIL (:FUNREF NIL "open"))
      (:CELL NIL (:FUNREF NIL "pathname-type")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " enough-namestring"))
      (:CELL NIL (:FUNREF NIL "parse-namestring"))
      (:CELL NIL (:FUNREF NIL "pathname-version")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " file-namestring"))
      (:CELL NIL (:FUNREF NIL "pathname"))
      (:CELL NIL (:FUNREF NIL "pathnamep")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " file-string-length"))
      (:CELL NIL (:FUNREF NIL "pathname-device"))
      (:CELL NIL (:FUNREF NIL "translate-pathname")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " host-namestring"))
      (:CELL NIL (:FUNREF NIL "pathname-directory"))
      (:CELL NIL (:FUNREF NIL "truename")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " make-pathname"))
      (:CELL NIL (:FUNREF NIL "pathname-host"))
      (:CELL NIL (:FUNREF NIL "user-homedir-pathname")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " merge-pathnames"))
      (:CELL NIL (:FUNREF NIL "pathname-match-p"))
      (:CELL NIL (:FUNREF NIL "wild-pathname-p"))))
    " ")
   :PAR
   (:SUBSECTION (:TITLE ("Parsing Namestrings Into Pathnames"))
    "Parsing is the operation used to convert a " (:TERM NIL "namestring")
    " into a " (:TERM NIL "pathname") ". "
    (:ISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES")
    " Except in the case of parsing " (:TERM NIL "logical pathname") " "
    (:TERM NIL "namestrings") ", "
    (:ENDISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES")
    " this operation is " (:TERM NIL "implementation-dependent")
    ", because the format of " (:TERM NIL "namestrings") " is "
    (:TERM NIL "implementation-dependent") ". " :PAR
    (:COMMENT NIL "% 23.1.1 20") "A " (:TERM NIL "conforming implementation")
    " is free to accommodate other " (:TERM NIL "file system")
    " features in its " (:TERM NIL "pathname")
    " representation and provides a parser that can process such specifications in "
    (:TERM NIL "namestrings") ". " (:TERM NIL "Conforming programs")
    " must not depend on any such features, since those features will not be portable. "
    :PAR))
  :PAR
  (:SECTION (:TITLE ("Pathnames") :TAGS (:PATHNAME-CONCEPTS)) " " :PAR
   (:SUBSECTION (:TITLE ("Pathname Components") :TAGS (:PATHNAME-COMPONENTS))
    " " :PAR
    (:COMMENT NIL " \\long\\def\\possiblecomponentvalues#1{\\goodbreak"
     " Possible values for this component:\\par" " \\beginlist\\par#1\\par"
     " \\itemitem{\\nil, \\kwd{wild}, or \\kwd{unspecific}}\\par"
     " See details and restrictions in \\secref\\SpecialComponentValues.\\par"
     " \\endlist\\par}" " \\possiblecomponentvalues{\\itemitem{...}\\par...}")
    :PAR "A " (:TERM NIL "pathname")
    " has six components: a host, a device, a directory, a name, a type, and a version. "
    :PAR (:COMMENT NIL "% 23.1.1 4" "% 23.1.1 5" "% 23.1.1 17") :PAR
    (:SUBSUBSECTION (:TITLE ("The Pathname Host Component"))
     "The name of the file system on which the file resides, or the name of a "
     (:TERM NIL "logical host") ". " :PAR
     (:COMMENT NIL "\\possiblecomponentvalues{\\itemitem{...}\\par...}") :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("The Pathname Device Component"))
     "Corresponds to the “device” or “file structure” concept in many host file systems: the name of a logical or physical device containing files. "
     :PAR (:COMMENT NIL "\\possiblecomponentvalues{\\itemitem{...}\\par...}")
     :PAR)
    :PAR (:COMMENT NIL "% 23.1.1 6")
    (:SUBSUBSECTION (:TITLE ("The Pathname Directory Component"))
     "Corresponds to the “directory” concept in many host file systems: the name of a group of related files. "
     :PAR (:COMMENT NIL "\\possiblecomponentvalues{\\itemitem{...}\\par...}")
     :PAR)
    :PAR (:COMMENT NIL "% 23.1.1 7")
    (:SUBSUBSECTION (:TITLE ("The Pathname Name Component"))
     "The “name” part of a group of " (:TERM NIL "files")
     " that can be thought of as conceptually related. " :PAR
     (:COMMENT NIL "\\possiblecomponentvalues{\\itemitem{...}\\par...}") :PAR)
    :PAR (:COMMENT NIL "% 23.1.1 8" "% 23.1.1 15")
    (:SUBSUBSECTION (:TITLE ("The Pathname Type Component"))
     "Corresponds to the “filetype” or “extension” concept in many host file systems. This says what kind of file this is. This component is always a "
     (:TERM NIL "string") ", " (:MISC NIL "nil") ", " (:KWD NIL "wild") ", or "
     (:KWD NIL "unspecific") ". " :PAR
     (:COMMENT NIL "\\possiblecomponentvalues{\\itemitem{...}\\par...}") :PAR)
    :PAR (:COMMENT NIL "% 23.1.1 9" "% 23.1.1 16  ")
    (:SUBSUBSECTION (:TITLE ("The Pathname Version Component"))
     "Corresponds to the “version number” concept in many host file systems. "
     :PAR "The version is either a positive " (:TERM NIL "integer") " or a "
     (:TERM NIL "symbol") " from the following list: " (:MISC NIL "nil") ", "
     (:KWD NIL "wild") ", " (:KWD NIL "unspecific") ", or " (:KWD NIL "newest")
     " (refers to the largest version number that already exists in the file system when reading a file, or to a version number greater than any already existing in the file system when writing a new file). Implementations can define other special version "
     (:TERM NIL "symbols") ". " :PAR
     (:COMMENT NIL "\\possiblecomponentvalues{\\itemitem{...}\\par...}") :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Interpreting Pathname Component Values"))
    (:SUBSUBSECTION (:TITLE ("Strings in Component Values"))
     (:ISSUE NIL "PATHNAME-COMPONENT-VALUE:SPECIFY") " " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Special Characters in Pathname Components"))
      (:TERM NIL "Strings") " in " (:TERM NIL "pathname")
      " component values never contain special " (:TERM NIL "characters")
      " that represent separation between " (:TERM NIL "pathname")
      " fields, such as " (:TERM NIL "slash") " in " (:RM NIL " Unix") " "
      (:TERM NIL "filenames") ". Whether separator " (:TERM NIL "characters")
      " are permitted as part of a " (:TERM NIL "string") " in a "
      (:TERM NIL "pathname") " component is "
      (:TERM NIL "implementation-defined") "; however, if the "
      (:TERM NIL "implementation")
      " does permit it, it must arrange to properly “quote” the character for the "
      (:TERM NIL "file system") " when constructing a "
      (:TERM NIL "namestring") ". For example, " :PAR
      (:CODE NIL " ;; In a TOPS-20 implementation, which uses ^V to quote 
 (NAMESTRING (MAKE-PATHNAME :HOST \"OZ\" :NAME \"<TEST>\"))
→ #P\"OZ:PS:^V<TEST^V>\"
NOT→ #P\"OZ:PS:<TEST>\"
")
      " " :PAR
      (:COMMENT NIL
       "Such punctuation \\term{characters} appear only in \\term{namestrings}."
       "Characters used as punctuation can appear in \\term{pathname} component values"
       "with a non-punctuation meaning if the file system allows it "
       "(\\eg a \\Unix\\ file name that begins with a dot).")
      :PAR)
     :PAR (:ENDISSUE NIL "PATHNAME-COMPONENT-VALUE:SPECIFY") " " :PAR
     (:ISSUE NIL "PATHNAME-COMPONENT-CASE:KEYWORD-ARGUMENT") " "
     (:SUBSUBSUBSECTION
      (:TITLE ("Case in Pathname Components") :TAGS (:PATHNAME-COMPONENT-CASE))
      " " :PAR (:TERM NIL "Namestrings") " always use local file system "
      (:TERM NIL "case") " conventions, but " (:RM NIL " Common Lisp") " "
      (:TERM NIL "functions") " that manipulate " (:TERM NIL "pathname")
      " components allow the caller to select either of two conventions for representing "
      (:TERM NIL "case") " in component values by supplying a value for the "
      (:KWD NIL "case") " keyword argument. "
      (:COMMENT NIL
       "Added per Loosemore #32, first public review -kmp 26-Jun-93")
      (:NEXTFIGURE (:CAPS T)) " lists the functions relating to "
      (:TERM NIL "pathnames") " that permit a " (:KWD NIL "case") " argument: "
      :PAR " "
      (:TABLE
       (:NAME ("Pathname functions using a :CASE argument") :TAGS
        (:PATHNAME-CASE-FUNS))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " make-pathname"))
        (:CELL NIL (:FUNREF NIL "pathname-directory"))
        (:CELL NIL (:FUNREF NIL "pathname-name")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " pathname-device"))
        (:CELL NIL (:FUNREF NIL "pathname-host"))
        (:CELL NIL (:FUNREF NIL "pathname-type"))))
      " " :PAR
      (:SUBSUBSUBSUBSECTION (:TITLE ("Local Case in Pathname Components"))
       "For the functions in " (:FIGREF NIL :PATHNAME-CASE-FUNS)
       ", a value of " (:KWD NIL "local") (:IDXKWD NIL "local") " for the "
       (:KWD NIL "case")
       " argument (the default for these functions) indicates that the functions should receive and yield "
       (:TERM NIL "strings")
       " in component values as if they were already represented according to the host "
       (:TERM NIL "file system") "'s convention for " (:TERM NIL "case") ". "
       :PAR "If the " (:TERM NIL "file system") " supports both "
       (:TERM NIL "cases") ", " (:TERM NIL "strings") " given or received as "
       (:TERM NIL "pathname")
       " component values under this protocol are to be used exactly as written. If the file system only supports one "
       (:TERM NIL "case") ", the " (:TERM NIL "strings")
       " will be translated to that " (:TERM NIL "case") ". " :PAR)
      :PAR
      (:SUBSUBSUBSUBSECTION (:TITLE ("Common Case in Pathname Components"))
       "For the functions in " (:FIGREF NIL :PATHNAME-CASE-FUNS)
       ", a value of " (:KWD NIL "common") (:IDXKWD NIL "common") " for the "
       (:KWD NIL "case") " argument that these " (:TERM NIL "functions")
       " should receive and yield " (:TERM NIL "strings")
       " in component values according to the following conventions: " :PAR
       (:LIST NIL
        (:ITEM NIL " All " (:TERM NIL "uppercase")
         " means to use a file system's customary " (:TERM NIL "case") ". ")
        (:ITEM NIL " All " (:TERM NIL "lowercase")
         " means to use the opposite of the customary " (:TERM NIL "case")
         ". ")
        (:ITEM NIL " Mixed " (:TERM NIL "case") " represents itself. "))
       " Note that these conventions have been chosen in such a way that translation from "
       (:KWD NIL "local") " to " (:KWD NIL "common") " and back to "
       (:KWD NIL "local") " is information-preserving. " :PAR)
      :PAR)
     (:ENDISSUE NIL "PATHNAME-COMPONENT-CASE:KEYWORD-ARGUMENT") " " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Special Pathname Component Values") :TAGS
      (:SPECIAL-COMPONENT-VALUES))
     " " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("NIL as a Component Value")) "As a "
      (:TERM NIL "pathname") " component value, " (:MISC NIL "nil")
      " represents that the component is “unfilled”; see "
      (:SECREF NIL :MERGING-PATHNAMES) ". " :PAR "The value of any "
      (:TERM NIL "pathname") " component can be " (:MISC NIL "nil") ". " :PAR
      (:COMMENT NIL
       "% This came from bullet 1 of ``Restrictions on Constructing Pathnames''")
      "When constructing a " (:TERM NIL "pathname") ", " (:MISC NIL "nil")
      " in the host component might mean a default host rather than an actual "
      (:MISC NIL "nil") " in some " (:TERM NIL "implementations") ". " :PAR)
     :PAR (:ISSUE NIL "PATHNAME-COMPONENT-VALUE:SPECIFY") " "
     (:SUBSUBSUBSECTION
      (:TITLE (":WILD as a Component Value") :TAGS (:WILD-COMPONENTS)) " " :PAR
      "If " (:KWD NIL "wild") (:IDXKWD NIL "wild") " is the value of a "
      (:TERM NIL "pathname")
      " component, that component is considered to be a wildcard, which matches anything. "
      :PAR "A " (:TERM NIL "conforming program")
      " must be prepared to encounter a value of " (:KWD NIL "wild")
      " as the value of any " (:TERM NIL "pathname") " component, or as an "
      (:TERM NIL "element") " of a " (:TERM NIL "list")
      " that is the value of the directory component. " :PAR
      (:ISSUE NIL "PATHNAME-SUBDIRECTORY-LIST:NEW-REPRESENTATION")
      " When constructing a " (:TERM NIL "pathname") ", a "
      (:TERM NIL "conforming program") " may use " (:KWD NIL "wild")
      " as the value of any or all of the directory, name, type, or version component, but must not use "
      (:KWD NIL "wild") " as the value of the host, "
      (:COMMENT NIL "% \"version\" commented out per Barmar--"
       "% PATHNAME-COMPONENT-VALUE:SPECIFY says that wild versions are permitted."
       "device, or version")
      "or device component. " :PAR "If " (:KWD NIL "wild")
      " is used as the value of the directory component in the construction of a "
      (:TERM NIL "pathname")
      ", the effect is equivalent to specifying the list "
      (:TT NIL "(:absolute :wild-inferiors)") ", or the same as "
      (:TT NIL "(:absolute :wild)") " in a " (:TERM NIL "file system")
      " that does not support " (:KWD NIL "wild-inferiors") "."
      (:IDXKWD NIL "wild-inferiors") " "
      (:ENDISSUE NIL "PATHNAME-SUBDIRECTORY-LIST:NEW-REPRESENTATION") " " :PAR)
     (:ENDISSUE NIL "PATHNAME-COMPONENT-VALUE:SPECIFY") " " :PAR
     (:ISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN") " "
     (:SUBSUBSUBSECTION
      (:TITLE (":UNSPECIFIC as a Component Value") :TAGS
       (:UNSPECIFIC-COMPONENT))
      " " :PAR "If " (:KWD NIL "unspecific") (:IDXKWD NIL "unspecific")
      " is the value of a " (:TERM NIL "pathname")
      " component, the component is considered to be “absent” "
      (:COMMENT NIL
       " Part of bullet 2 of ``Restrictions on Examining Pathname Components''")
      "or to “have no meaning” in the " (:TERM NIL "filename")
      " being represented by the " (:TERM NIL "pathname") ". " :PAR
      "Whether a value of " (:KWD NIL "unspecific")
      " is permitted for any component on any given " (:TERM NIL "file system")
      " accessible to the " (:TERM NIL "implementation") " is "
      (:TERM NIL "implementation-defined") ". A "
      (:TERM NIL "conforming program") " must never unconditionally use a "
      (:KWD NIL "unspecific") " as the value of a " (:TERM NIL "pathname")
      " component because such a value is not guaranteed to be permissible in all implementations. However, a "
      (:TERM NIL "conforming program")
      " can, if it is careful, successfully manipulate user-supplied data which contains or refers to non-portable "
      (:TERM NIL "pathname") " components. And certainly a "
      (:TERM NIL "conforming program")
      " should be prepared for the possibility that any components of a "
      (:TERM NIL "pathname") " could be " (:KWD NIL "unspecific") ". " :PAR
      (:ISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN") " "
      (:COMMENT NIL
       " Part of bullet 2 of ``Restrictions on Examining Pathname Components''")
      "When " (:TERM NIL "reading") (:SUB NIL "1") " the value of any "
      (:TERM NIL "pathname") " component, " (:TERM NIL "conforming programs")
      " should be prepared for the value to be " (:KWD NIL "unspecific") ". "
      (:ENDISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN") " " :PAR
      (:ISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN") " When "
      (:TERM NIL "writing") (:SUB NIL "1") " the value of any "
      (:TERM NIL "pathname") " component, the consequences are undefined if "
      (:KWD NIL "unspecific") " is given for a " (:TERM NIL "pathname")
      " in a " (:TERM NIL "file system") " for which it does not make sense. "
      (:ENDISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN") " " :PAR
      (:SUBSUBSUBSUBSECTION
       (:TITLE ("Relation between component values NIL and :UNSPECIFIC"))
       (:ISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN") " If a "
       (:TERM NIL "pathname") " is converted to a " (:TERM NIL "namestring")
       ", the " (:TERM NIL "symbols") " " (:MISC NIL "nil") " and "
       (:KWD NIL "unspecific")
       " cause the field to be treated as if it were empty. That is, both "
       (:MISC NIL "nil") " and " (:KWD NIL "unspecific")
       " cause the component not to appear in the " (:TERM NIL "namestring")
       ". " :PAR "However, when merging a " (:TERM NIL "pathname")
       " with a set of defaults, only a " (:MISC NIL "nil")
       " value for a component will be replaced with the default for that component, while a value of "
       (:KWD NIL "unspecific")
       " will be left alone as if the field were “filled”; see the "
       (:TERM NIL "function") " " (:FUNREF NIL "merge-pathnames") " and "
       (:SECREF NIL :MERGING-PATHNAMES) ". "
       (:ENDISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN") " " :PAR)
      :PAR)
     (:ENDISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN") " " :PAR)
    :PAR :PAR
    (:SUBSUBSECTION
     (:TITLE ("Restrictions on Wildcard Pathnames") :TAGS
      (:WILDCARD-RESTRICTIONS))
     " " :PAR "Wildcard " (:TERM NIL "pathnames") " can be used with "
     (:FUNREF NIL "directory") " but not with " (:FUNREF NIL "open") ", "
     (:COMMENT NIL "!!! Laddaga: LOAD?") "and return true from "
     (:FUNREF NIL "wild-pathname-p")
     ". When examining wildcard components of a wildcard "
     (:TERM NIL "pathname")
     ", conforming programs must be prepared to encounter any of the following additional values in any component or any element of a "
     (:TERM NIL "list") " that is the directory component: " :PAR
     (:LIST NIL
      (:ITEM NIL " The " (:TERM NIL "symbol") " " (:KWD NIL "wild")
       ", which matches anything. " :PAR)
      (:ITEM NIL " A " (:TERM NIL "string") " containing "
       (:TERM NIL "implementation-dependent") " special wildcard "
       (:TERM NIL "characters") ". " :PAR)
      (:ITEM NIL " Any " (:TERM NIL "object") ", representing an "
       (:TERM NIL "implementation-dependent") " wildcard pattern. " :PAR))
     " " :PAR)
    :PAR (:ISSUE NIL "PATHNAME-COMPONENT-VALUE:SPECIFY") " " :PAR
    (:SUBSUBSECTION (:TITLE ("Restrictions on Examining Pathname Components"))
     "The space of possible " (:TERM NIL "objects") " that a "
     (:TERM NIL "conforming program") " must be prepared to "
     (:TERM NIL "read") (:SUB NIL "1") " as the value of a "
     (:TERM NIL "pathname")
     " component is substantially larger than the space of possible "
     (:TERM NIL "objects") " that a " (:TERM NIL "conforming program")
     " is permitted to " (:TERM NIL "write") (:SUB NIL "1")
     " into such a component. " :PAR
     "While the values discussed in the subsections of this section, in "
     (:SECREF NIL :SPECIAL-COMPONENT-VALUES) ", and in "
     (:SECREF NIL :WILDCARD-RESTRICTIONS)
     " apply to values that might be seen when reading the component values, substantially more restrictive rules apply to constructing pathnames; see "
     (:SECREF NIL :CONSTRUCTING-PATHNAMES) ". " :PAR "When examining "
     (:TERM NIL "pathname") " components, " (:TERM NIL "conforming programs")
     " should be aware of the following restrictions. " :PAR
     (:COMMENT NIL " \\beginlist" " "
      " %% Consolidated with ``NIL as a Component Value'' above."
      " % \\itemitem{\\bull} Any component can be \\nil, ..." "   "
      " %% Consolidated with ``:UNSPECIFIC as a Component Value'' above."
      " % \\issue{PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN}"
      " % \\itemitem{\\bull} Any component can be \\kwd{unspecific}, ..."
      " % \\endissue{PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN}" "   "
      " %% Moved to various sections below."
      " %\\itemitem{\\bull} The device, directory, name, and type can be \\term{strings}."
      "   " " %% Moved to new section farther down." " % \\itemitem{\\bull}"
      " % It is \\term{implementation-dependent} what \\term{object}"
      " % is used to represent the host. " "   "
      " %% Moved to new section below." " % \\itemitem{\\bull}"
      " % The directory can be a \\term{list} of \\term{strings} and \\term{symbols}. "
      " % [...]" "   " " %% Moved to new section below."
      " % \\itemitem{\\bull} The version can be any \\term{symbol} or any \\term{integer}.  "
      " " " \\endlist ")
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Restrictions on Examining a Pathname Host Component")) "It is "
      (:TERM NIL "implementation-dependent") " what " (:TERM NIL "object")
      " is used to represent the host. " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Restrictions on Examining a Pathname Device Component"))
      "The device might be a " (:TERM NIL "string") ", "
      (:COMMENT NIL " These came from other sections earlier -kmp 30-Aug-93")
      (:KWD NIL "wild") ", " (:KWD NIL "unspecific") ", or " (:MISC NIL "nil")
      ". " :PAR "Note that " (:KWD NIL "wild")
      " might result from an attempt to " (:TERM NIL "read") (:SUB NIL "1")
      " the " (:TERM NIL "pathname")
      " component, even though portable programs are restricted from "
      (:TERM NIL "writing") (:SUB NIL "1") " such a component value; see "
      (:SECREF NIL :WILDCARD-RESTRICTIONS) " and "
      (:SECREF NIL :CONSTRUCTING-PATHNAMES) ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Restrictions on Examining a Pathname Directory Component"))
      "The directory might be a " (:TERM NIL "string") ", "
      (:COMMENT NIL "%!!! Laddaga:"
       "%  But cannot cannot contain directory separators.  Or, put another way, if"
       "%  a directory component is a string, it can only name a simple level of "
       "%  directory structure?  This doesn't seem right, but otherwise rule 1 is violated."
       "%  Perhaps directory here is an error?"
       "% These came from other sections earlier -kmp 30-Aug-93")
      (:KWD NIL "wild") ", " (:KWD NIL "unspecific") ", or " (:MISC NIL "nil")
      ". " :PAR "The directory can be a " (:TERM NIL "list") " of "
      (:TERM NIL "strings") " and " (:TERM NIL "symbols") ". "
      (:ISSUE NIL "PATHNAME-SUBDIRECTORY-LIST:NEW-REPRESENTATION") " The "
      (:TERM NIL "car") " of the " (:TERM NIL "list") " is one of the symbols "
      (:KWD NIL "absolute") (:IDXKWD NIL "absolute") " or "
      (:KWD NIL "relative") (:IDXKWD NIL "relative") ", meaning: " :PAR
      (:LIST NIL
       (:ITEM NIL (:KWD NIL "absolute") " " :PAR "A " (:TERM NIL "list")
        " whose " (:TERM NIL "car") " is the symbol " (:KWD NIL "absolute")
        " represents a directory path starting from the root directory. The list "
        (:TT NIL "(:absolute)") " represents the root directory. The list "
        (:TT NIL "(:absolute \"foo\" \"bar\" \"baz\")")
        " represents the directory called " (:TT NIL "\"/foo/bar/baz\"")
        " in Unix (except possibly for " (:TERM NIL "case") "). " :PAR)
       (:ITEM NIL (:KWD NIL "relative") " " :PAR "A " (:TERM NIL "list")
        " whose " (:TERM NIL "car") " is the symbol " (:KWD NIL "relative")
        " represents a directory path starting from a default directory. The list "
        (:TT NIL "(:relative)") " has the same meaning as " (:MISC NIL "nil")
        " and hence is not used. The list "
        (:TT NIL " (:relative \"foo\" \"bar\")")
        " represents the directory named " (:TT NIL " \"bar\"")
        " in the directory named " (:TT NIL " \"foo\"")
        " in the default directory. " :PAR))
      " " :PAR "Each remaining element of the " (:TERM NIL "list") " is a "
      (:TERM NIL "string") " or a " (:TERM NIL "symbol") ". " :PAR "Each "
      (:TERM NIL "string") " names a single level of directory structure. The "
      (:TERM NIL "strings")
      " should contain only the directory names themselves—no punctuation characters. "
      :PAR "In place of a " (:TERM NIL "string") ", at any point in the "
      (:TERM NIL "list") ", " (:TERM NIL "symbols")
      " can occur to indicate special file notations. " (:NEXTFIGURE (:CAPS T))
      " lists the " (:TERM NIL "symbols")
      " that have standard meanings. Implementations are permitted to add additional "
      (:TERM NIL "objects") " of any " (:TERM NIL "type")
      " that is disjoint from " (:TYPEREF NIL "string")
      " if necessary to represent features of their file systems that cannot be represented with the standard "
      (:TERM NIL "strings") " and " (:TERM NIL "symbols") ". " :PAR
      "Supplying any non-" (:TERM NIL "string") ", including any of the "
      (:TERM NIL "symbols")
      " listed below, to a file system for which it does not make sense signals an error of "
      (:TERM NIL "type") " " (:TYPEREF NIL "file-error")
      ". For example, Unix does not support " (:KWD NIL "wild-inferiors")
      " in most implementations. " :PAR (:IDXKWD NIL "wild")
      (:IDXKWD NIL "wild-inferiors") (:IDXKWD NIL "up") (:IDXKWD NIL "back")
      (:TABLE (:NAME ("Special Markers In Directory Component"))
       (:ROW NIL (:CELL NIL "Symbol") (:CELL NIL "Meaning"))
       (:ROW NIL (:CELL NIL (:KWD NIL "wild"))
        (:CELL NIL " Wildcard match of one level of directory structure "))
       (:ROW NIL (:CELL NIL (:KWD NIL "wild-inferiors"))
        (:CELL NIL " Wildcard match of any number of directory levels "))
       (:ROW NIL (:CELL NIL (:KWD NIL "up"))
        (:CELL NIL " Go upward in directory structure (semantic) "))
       (:ROW NIL (:CELL NIL (:KWD NIL "back"))
        (:CELL NIL " Go upward in directory structure (syntactic) ")))
      " " :PAR "The following notes apply to the previous figure: " :PAR
      (:LIST NIL
       (:ITEM NIL "Invalid Combinations " :PAR "Using " (:KWD NIL "absolute")
        " or " (:KWD NIL "wild-inferiors") " immediately followed by "
        (:KWD NIL "up") " or " (:KWD NIL "back") " signals an error of "
        (:TERM NIL "type") " " (:TYPEREF NIL "file-error") ". " :PAR)
       (:ITEM NIL "Syntactic vs Semantic " :PAR
        "“Syntactic” means that the action of " (:KWD NIL "back")
        " depends only on the " (:TERM NIL "pathname")
        " and not on the contents of the file system. " :PAR
        "“Semantic” means that the action of " (:KWD NIL "up")
        " depends on the contents of the file system; to resolve a "
        (:TERM NIL "pathname") " containing " (:KWD NIL "up") " to a "
        (:TERM NIL "pathname") " whose directory component contains only "
        (:KWD NIL "absolute") " and " (:TERM NIL "strings")
        " requires probing the file system. " :PAR (:KWD NIL "up")
        " differs from " (:KWD NIL "back")
        " only in file systems that support multiple names for directories, perhaps via symbolic links. For example, suppose that there is a directory "
        (:TT NIL "(:absolute \"X\" \"Y\" \"Z\")") " linked to "
        (:TT NIL "(:absolute \"A\" \"B\" \"C\")")
        " and there also exist directories "
        (:TT NIL "(:absolute \"A\" \"B\" \"Q\")") " and "
        (:TT NIL "(:absolute \"X\" \"Y\" \"Q\")") ". Then "
        (:TT NIL "(:absolute \"X\" \"Y\" \"Z\" :up \"Q\")") " designates "
        (:TT NIL "(:absolute \"A\" \"B\" \"Q\")") " while "
        (:TT NIL "(:absolute \"X\" \"Y\" \"Z\" :back \"Q\")") " designates "
        (:TT NIL "(:absolute \"X\" \"Y\" \"Q\")") " "))
      " " :PAR (:ENDISSUE NIL "PATHNAME-SUBDIRECTORY-LIST:NEW-REPRESENTATION")
      " " :PAR
      (:SUBSUBSUBSUBSECTION
       (:TITLE ("Directory Components in Non-Hierarchical File Systems"))
       "In non-hierarchical " (:TERM NIL "file systems") ", the only valid "
       (:TERM NIL "list") " values for the directory component of a "
       (:TERM NIL "pathname") " are "
       (:TT NIL "(:absolute " (:TERM NIL "string") ")") " and "
       (:TT NIL "(:absolute :wild)") ". " (:KWD NIL "relative")
       " directories and the keywords " (:KWD NIL "wild-inferiors") ", "
       (:KWD NIL "up") ", and " (:KWD NIL "back")
       " are not used in non-hierarchical " (:TERM NIL "file systems") ". "
       :PAR)
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Restrictions on Examining a Pathname Name Component"))
      "The name might be a " (:TERM NIL "string") ", "
      (:COMMENT NIL "% These came from other sections earlier -kmp 30-Aug-93")
      (:KWD NIL "wild") ", " (:KWD NIL "unspecific") ", or " (:MISC NIL "nil")
      ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Restrictions on Examining a Pathname Type Component"))
      "The type might be a " (:TERM NIL "string") ", "
      (:COMMENT NIL "% These came from other sections earlier -kmp 30-Aug-93")
      (:KWD NIL "wild") ", " (:KWD NIL "unspecific") ", or " (:MISC NIL "nil")
      ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Restrictions on Examining a Pathname Version Component"))
      "The version can be any " (:TERM NIL "symbol") " or any "
      (:TERM NIL "integer") ". " :PAR "The symbol " (:KWD NIL "newest")
      " refers to the largest version number that already exists in the "
      (:TERM NIL "file system")
      " when reading, overwriting, appending, superseding, or directory listing an existing "
      (:TERM NIL "file") ". The symbol " (:KWD NIL "newest")
      " refers to the smallest version number greater than any existing version number when creating a new file. "
      :PAR "The symbols " (:MISC NIL "nil") ", " (:KWD NIL "unspecific")
      ", and " (:KWD NIL "wild")
      " have special meanings and restrictions; see "
      (:SECREF NIL :SPECIAL-COMPONENT-VALUES) " and "
      (:SECREF NIL :CONSTRUCTING-PATHNAMES) ". " :PAR "Other "
      (:TERM NIL "symbols") " and " (:TERM NIL "integers") " have "
      (:TERM NIL "implementation-defined") " meaning. " :PAR)
     (:SUBSUBSUBSECTION (:TITLE ("Notes about the Pathname Version Component"))
      "It is suggested, but not required, that implementations do the following: "
      :PAR
      (:LIST NIL
       (:ITEM NIL " Use positive " (:TERM NIL "integers")
        " starting at 1 as version numbers. " :PAR)
       (:ITEM NIL " Recognize the symbol " (:KWD NIL "oldest")
        " to designate the smallest existing version number. " :PAR)
       (:ITEM NIL " Use " (:TERM NIL "keywords")
        " for other special versions. " :PAR))
      " " :PAR)
     :PAR)
    (:SUBSUBSECTION
     (:TITLE ("Restrictions on Constructing Pathnames") :TAGS
      (:CONSTRUCTING-PATHNAMES))
     " " :PAR "When constructing a " (:TERM NIL "pathname")
     " from components, conforming programs must follow these rules: " :PAR
     (:LIST NIL
      (:ITEM NIL " Any component can be " (:MISC NIL "nil") ". "
       (:MISC NIL "nil")
       " in the host might mean a default host rather than an actual "
       (:MISC NIL "nil") " in some implementations. " :PAR)
      (:ITEM NIL " "
       (:COMMENT NIL "!!! Laddaga questions the \"directory\" part here.")
       "The host, device, directory, name, and type can be "
       (:TERM NIL "strings") ". There are "
       (:TERM NIL "implementation-dependent")
       " limits on the number and type of " (:TERM NIL "characters")
       " in these " (:TERM NIL "strings") ". " :PAR)
      (:ITEM NIL " The directory can be a " (:TERM NIL "list") " of "
       (:TERM NIL "strings") " and " (:TERM NIL "symbols") ". There are "
       (:TERM NIL "implementation-dependent") " limits on the "
       (:TERM NIL "list") "'s length and contents. " :PAR)
      (:ITEM NIL " The version can be " (:KWD NIL "newest") ". " :PAR)
      (:ITEM NIL
       " Any component can be taken from the corresponding component of another "
       (:TERM NIL "pathname") ". When the two " (:TERM NIL "pathnames")
       " are for different file systems (in implementations that support multiple file systems), an appropriate translation occurs. If no meaningful translation is possible, an error is signaled. The definitions of “appropriate” and “meaningful” are "
       (:TERM NIL "implementation-dependent") ". " :PAR)
      (:ITEM NIL
       " An implementation might support other values for some components, but a portable program cannot use those values. A conforming program can use "
       (:TERM NIL "implementation-dependent")
       " values but this can make it non-portable; for example, it might work only with "
       (:RM NIL " Unix") " file systems. "))
     " " :PAR (:COMMENT NIL "%% 23.1.1 14 omitted." "%% 23.1.1 18 omitted.")
     :PAR)
    :PAR (:ENDISSUE NIL "PATHNAME-COMPONENT-VALUE:SPECIFY") " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Merging Pathnames") :TAGS (:MERGING-PATHNAMES)) " "
    :PAR "Merging takes a " (:TERM NIL "pathname")
    " with unfilled components and supplies values for those components from a source of defaults. "
    :PAR "If a component's value is " (:MISC NIL "nil")
    ", that component is considered to be unfilled. If a component's value is any "
    (:TERM NIL "non-nil") " " (:TERM NIL "object") ", including "
    (:KWD NIL "unspecific") ", that component is considered to be filled. "
    :PAR
    (:COMMENT NIL "% Replaced per X3J13"
     " %% Moved from ``Restrictions on Examining Pathname Components''"
     " %% Laddaga had complained that this was in the wrong place before."
     " %% This place may not be 100% better, but it's at least an improvement. -kmp 30-Aug-93"
     " A relative directory in the \\term{pathname} argument to a function such as"
     " \\funref{open} is merged with \\varref{*default-pathname-defaults*} "
     " before accessing the file system.")
    "Except as explicitly specified otherwise, for functions that manipulate or inquire about "
    (:TERM NIL "files") " in the " (:TERM NIL "file system")
    ", the pathname argument to such a function is merged with "
    (:VARREF NIL "*default-pathname-defaults*") " before accessing the "
    (:TERM NIL "file system") " (as if by " (:FUNREF NIL "merge-pathnames")
    "). " :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of Merging Pathnames"))
     "Although the following examples are possible to execute only in "
     (:TERM NIL "implementations") " which permit " (:KWD NIL "unspecific")
     " in the indicated position andwhich permit four-letter type components, they serve to illustrate the basic concept of "
     (:TERM NIL "pathname") " merging. " :PAR " "
     (:CODE NIL " (pathname-type 
   (merge-pathnames (make-pathname :type \"LISP\")
                    (make-pathname :type \"TEXT\")))
→ \"LISP\"

 (pathname-type 
   (merge-pathnames (make-pathname :type nil)
                    (make-pathname :type \"LISP\")))
→ \"LISP\"

 (pathname-type 
   (merge-pathnames (make-pathname :type :unspecific)
                    (make-pathname :type \"LISP\")))
→ :UNSPECIFIC
")
     " " :PAR)
    :PAR)
   :PAR)
  :PAR
  (:SECTION (:TITLE ("Logical Pathnames") :TAGS (:LOGICAL-PATHNAMES)) " " :PAR
   (:SUBSECTION
    (:TITLE ("Syntax of Logical Pathname Namestrings") :TAGS
     (:LOG-PATH-NAMESTRINGS))
    " " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " The syntax of a "
    (:TERM NIL "logical pathname") " " (:TERM NIL "namestring")
    " is as follows. " (:COMMENT NIL "Added for clarity. -kmp 26-Jun-93")
    "(Note that unlike many notational descriptions in this document, this is a syntactic description of character sequences, not a structural description of "
    (:TERM NIL "objects") ".) " :PAR
    (:BNF (:NAME "logical-pathname")
     (:BRAC NIL (:DOWN NIL "host") " " (:PARAM NIL "host-marker")) " "
     (:BR NIL) " "
     (:BRAC NIL (:DOWN NIL (:PARAM NIL "relative-directory-marker"))) " "
     (:STAR NIL
      (:CURLY NIL (:DOWN NIL "directory") " " (:PARAM NIL "directory-marker")))
     " " (:BR NIL) " " (:BRAC NIL (:DOWN NIL "name")) " "
     (:BRAC NIL (:PARAM NIL "type-marker") " " (:DOWN NIL "type") " "
      (:BRAC NIL (:PARAM NIL "version-marker") " " (:DOWN NIL "version"))))
    " " :PAR (:BNF (:NAME "host") (:DOWN NIL "word")) " "
    (:BNF (:NAME "directory") (:DOWN NIL "word") " | "
     (:DOWN NIL "wildcard-word") " | " (:DOWN NIL "wild-inferiors-word"))
    " "
    (:BNF (:NAME "name") (:DOWN NIL "word") " | " (:DOWN NIL "wildcard-word"))
    " "
    (:BNF (:NAME "type") (:DOWN NIL "word") " | " (:DOWN NIL "wildcard-word"))
    " "
    (:BNF (:NAME "version") (:DOWN NIL "pos-int") " | "
     (:PARAM NIL "newest-word") " | " (:PARAM NIL "wildcard-version"))
    " " :PAR (:PARAM NIL "host-marker") "—a " (:TERM NIL "colon") ". " :PAR
    (:PARAM NIL "relative-directory-marker") "—a " (:TERM NIL "semicolon") ". "
    :PAR (:PARAM NIL "directory-marker") "—a " (:TERM NIL "semicolon") ". "
    :PAR (:PARAM NIL "type-marker") "—a " (:TERM NIL "dot") ". " :PAR
    (:PARAM NIL "version-marker") "—a " (:TERM NIL "dot") ". " :PAR
    (:PARAM NIL "wild-inferiors-word") "—The two character sequence “"
    (:TT NIL "**") "” (two " (:TERM NIL "asterisks") "). " :PAR
    (:PARAM NIL "newest-word") "—The six character sequence “"
    (:TT NIL "newest") "” or the six character sequence “" (:TT NIL "NEWEST")
    "”. " :PAR (:PARAM NIL "wildcard-version") "—an " (:TERM NIL "asterisk")
    ". " :PAR (:PARAM NIL "wildcard-word") "—one or more "
    (:TERM NIL "asterisks")
    ", uppercase letters, digits, and hyphens, including at least one "
    (:TERM NIL "asterisk") ", with no two " (:TERM NIL "asterisks")
    " adjacent. " :PAR (:PARAM NIL "word")
    "—one or more uppercase letters, digits, and hyphens. " :PAR
    (:PARAM NIL "pos-int") "—a positive " (:TERM NIL "integer") ". " :PAR
    (:SUBSUBSECTION
     (:TITLE
      ("Additional Information about Parsing Logical Pathname Namestrings"))
     (:SUBSUBSUBSECTION
      (:TITLE ("The Host part of a Logical Pathname Namestring")) "The "
      (:PARAM NIL "host") " must have been defined as a "
      (:TERM NIL "logical pathname") " host; this can be done by using "
      (:MACREF NIL "setf") " of " (:FUNREF NIL "logical-pathname-translations")
      ". " :PAR "The " (:TERM NIL "logical pathname") " host name "
      (:TT NIL "\"SYS\"")
      " is reserved for the implementation. The existence and meaning of "
      (:TT NIL "SYS:") " " (:TERM NIL "logical pathnames") " is "
      (:TERM NIL "implementation-defined") ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("The Device part of a Logical Pathname Namestring"))
      "There is no syntax for a " (:TERM NIL "logical pathname")
      " device since the device component of a " (:TERM NIL "logical pathname")
      " is always " (:KWD NIL "unspecific") "; see "
      (:SECREF NIL :LOGICAL-PATH-COMP-UNSPECIFIC) ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("The Directory part of a Logical Pathname Namestring")) "If a "
      (:PARAM NIL "relative-directory-marker") " precedes the "
      (:PARAM NIL "directories") ", the directory component parsed is as "
      (:TERM NIL "relative")
      "; otherwise, the directory component is parsed as "
      (:TERM NIL "absolute") ". " :PAR "If a "
      (:PARAM NIL "wild-inferiors-marker") " is specified, it parses into "
      (:KWD NIL "wild-inferiors") ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("The Type part of a Logical Pathname Namestring")) "The "
      (:PARAM NIL "type") " of a " (:TERM NIL "logical pathname") " for a "
      (:TERM NIL "source file") " is " (:TT NIL "\"LISP\"")
      ". This should be translated into whatever type is appropriate in a physical pathname. "
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("The Version part of a Logical Pathname Namestring")) "Some "
      (:TERM NIL "file systems") " do not have " (:PARAM NIL "versions") ". "
      (:TERM NIL "Logical pathname") " translation to such a "
      (:TERM NIL "file system") " ignores the " (:PARAM NIL "version")
      ". This implies that a program cannot rely on being able to store more than one version of a file named by a "
      (:TERM NIL "logical pathname") ". " :PAR "If a "
      (:PARAM NIL "wildcard-version") " is specified, it parses into "
      (:KWD NIL "wild") ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Wildcard Words in a Logical Pathname Namestring")) "Each "
      (:TERM NIL "asterisk") " in a " (:PARAM NIL "wildcard-word")
      " matches a sequence of zero or more characters. The "
      (:PARAM NIL "wildcard-word") " “" (:TT NIL "*") "” parses into "
      (:KWD NIL "wild") "; other " (:TERM NIL "wildcard-words") " parse into "
      (:TERM NIL "strings") ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Lowercase Letters in a Logical Pathname Namestring"))
      "When parsing " (:PARAM NIL "words") " and "
      (:PARAM NIL "wildcard-words")
      ", lowercase letters are translated to uppercase. " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Other Syntax in a Logical Pathname Namestring"))
      "The consequences of using characters other than those specified here in a "
      (:TERM NIL "logical pathname") " " (:TERM NIL "namestring")
      " are unspecified. " :PAR
      (:COMMENT NIL
       "% !!! What does this mean??  This section is supposed to be about syntax, "
       "%     not component values.  Sigh.  -kmp 26-Jun-93")
      "The consequences of using any value not specified here as a "
      (:TERM NIL "logical pathname") " component are unspecified. " :PAR)
     :PAR
     (:COMMENT NIL "This wasn't a valid reference."
      "See ``Input/Output'' for parsing and file manipulation details.")
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Logical Pathname Components"))
    (:SUBSUBSECTION
     (:TITLE ("Unspecific Components of a Logical Pathname") :TAGS
      (:LOGICAL-PATH-COMP-UNSPECIFIC))
     " " :PAR "The device component of a " (:TERM NIL "logical pathname")
     " is always " (:KWD NIL "unspecific") "; no other component of a "
     (:TERM NIL "logical pathname") " can be " (:KWD NIL "unspecific") ". "
     :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Null Strings as Components of a Logical Pathname"))
     "The null string, " (:TT NIL "\"\"")
     ", is not a valid value for any component of a "
     (:TERM NIL "logical pathname") ". "
     (:COMMENT NIL "% I removed the following because:"
      "%   - it's redundant with the syntax info above"
      "%   - I doubt it's really the reason"
      "%   - it's not sufficient to cause this: e.g., you might assume that"
      "%       (probe-file \"X:FOO;*.LISP\") could return a logical pathname containing"
      "%     a null string name even though you didn't type it in, since * is not a zero-char"
      "%     string but only matches one.  The resulting logical pathname might have no "
      "%     printed representation.  But the previous sentence makes a stronger claim:  it"
      "%     says that there is no such file, whether printable or not.  So the following"
      "%     cannot be the reason." "%  -kmp 26-Jun-93"
      " since it is neither a \\param{word} nor a \\param{wildcard-word}.")
     :PAR)
    :PAR))
  :PAR
  (:DICTIONARY NIL :PAR
   (:COMMENT NIL " Pathnames" "  Logical Pathnames" "  Parsing"
    "   Namestrings" "   Pathname Matching" "   Pathname Merging")
   :PAR
   (:COMMENT NIL "-------------------- Pathname Types --------------------")
   :PAR
   (:COM (:NAME "pathname" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "pathname") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "pathname")
     " is a structured " (:TERM NIL "object") " which represents a "
     (:TERM NIL "filename") ". " :PAR "There are two kinds of "
     (:TERM NIL "pathnames") "—" (:TERM NIL "physical pathnames") " and "
     (:TERM NIL "logical pathnames") ". " :PAR))
   (:COM (:NAME "logical-pathname" :FTYPE "System Class")
    (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " " :PAR
    (:PART (:NAME "Class Precedence List") " " :PAR
     (:TYPEREF NIL "logical-pathname") ", " (:TYPEREF NIL "pathname") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "pathname")
     " that uses a " (:TERM NIL "namestring") " syntax that is "
     (:TERM NIL "implementation-independent")
     ", and that has component values that are "
     (:TERM NIL "implementation-independent") ". "
     (:TERM NIL "Logical pathnames") " do not refer directly to "
     (:TERM NIL "filenames") " " :PAR
     (:COMMENT NIL "!!! Barmar: Needs more description.  e.g.,"
      "      an implementation-independent pathname that is automatically translated"
      "      to a pathname when it is used." " Relate to physical pathname.")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :FILE-SYSTEM-CONCEPTS) ", "
     (:SECREF NIL :SHARPSIGN-P) ", " (:SECREF NIL :PRINTING-PATHNAMES) " " :PAR
     (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     :PAR))
   :PAR (:COMMENT NIL "-------------------- Pathnames --------------------")
   :PAR (:COMMENT NIL "%% ========== PATHNAME")
   (:COM (:NAME "pathname" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "pathname") (:ARGLIST NIL "pathspec")
      (:VALUES NIL "pathname"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PATHNAME-STREAM") " " (:PARAM NIL "pathspec") "—a "
     (:TERM NIL "pathname designator") ". " (:ENDISSUE NIL "PATHNAME-STREAM")
     " " :PAR (:PARAM NIL "pathname") "—a " (:TERM NIL "pathname") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns the " (:TERM NIL "pathname")
     " denoted by " (:PARAM NIL "pathspec") ". " :PAR
     (:COMMENT NIL "% 23.1.2 5"
      " \\funref{pathname} converts \\param{pathspec} to a \\term{pathname} "
      " and returns the new \\term{pathname}."
      " If \\param{pathspec} is a \\term{stream} "
      " it represents the name used to open the file. This may be, but is"
      " not required to be, the actual name of the file. ")
     (:ISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " If the "
     (:PARAM NIL "pathspec") " " (:TERM NIL "designator") " is a "
     (:TERM NIL "stream") ", the " (:TERM NIL "stream")
     " can be either open or closed; in both cases, the "
     (:FUNREF NIL "pathname") " returned corresponds to the "
     (:TERM NIL "filename") " used to open the " (:TERM NIL "file") ". "
     (:FUNREF NIL "pathname") " returns the same " (:TERM NIL "pathname")
     " for a " (:TERM NIL "file stream")
     " after it is closed as it did when it was open. "
     (:ENDISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " " :PAR
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:COMMENT NIL " created by \\funref{open}"
      " or \\macref{with-open-file} of a \\term{logical pathname},"
      "\\funref{pathname} returns a \\term{logical pathname}.")
     "If the " (:PARAM NIL "pathspec") " " (:TERM NIL "designator") " is a "
     (:TERM NIL "file stream") " created by opening a "
     (:TERM NIL "logical pathname") ", a " (:TERM NIL "logical pathname")
     " is returned. " (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:COMMENT NIL " \\issue{PATHNAME-STREAM}"
      " It is an error if \\param{pathspec} is a \\term{stream} that is "
      " created with \\funref{make-two-way-stream}, "
      " \\funref{make-echo-stream}," " \\funref{make-broadcast-stream}, "
      " \\funref{make-concatenated-stream}, \\funref{make-string-input-stream},"
      " \\funref{make-string-output-stream}." " \\endissue{PATHNAME-STREAM}")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " ;; There is a great degree of variability permitted here.  The next
 ;; several examples are intended to illustrate just a few of the many
 ;; possibilities.  Whether the name is canonicalized to a particular
 ;; case (either upper or lower) depends on both the file system and the
 ;; implementation since two different implementations using the same
 ;; file system might differ on many issues.  How information is stored
 ;; internally (and possibly presented in #S notation) might vary,
 ;; possibly requiring `accessors' such as PATHNAME-NAME to perform case
 ;; conversion upon access.  The format of a namestring is dependent both
 ;; on the file system and the implementation since, for example, one
 ;; implementation might include the host name in a namestring, and
 ;; another might not.  #S notation would generally only be used in a
 ;; situation where no appropriate namestring could be constructed for use
 ;; with #P.
 (setq p1 (pathname \"test\"))
→ #P\"CHOCOLATE:TEST\" ; with case canonicalization (e.g., VMS)
OR→ #P\"VANILLA:test\"   ; without case canonicalization (e.g., Unix)
OR→ #P\"test\"
OR→ #S(PATHNAME :HOST \"STRAWBERRY\" :NAME \"TEST\")
OR→ #S(PATHNAME :HOST \"BELGIAN-CHOCOLATE\" :NAME \"test\")
 (setq p2 (pathname \"test\"))
→ #P\"CHOCOLATE:TEST\"
OR→ #P\"VANILLA:test\"
OR→ #P\"test\"
OR→ #S(PATHNAME :HOST \"STRAWBERRY\" :NAME \"TEST\")
OR→ #S(PATHNAME :HOST \"BELGIAN-CHOCOLATE\" :NAME \"test\")
 (pathnamep p1) → "
      (:TERM NIL "true") "
 (eq p1 (pathname p1)) → "
      (:TERM NIL "true") "
 (eq p1 p2)
→ "
      (:TERM NIL "true") "
OR→ "
      (:TERM NIL "false") "
 (with-open-file (stream \"test\" :direction :output)
   (pathname stream))
→ #P\"ORANGE-CHOCOLATE:>Gus>test.lisp.newest\"
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:TYPEREF NIL "pathname") ", " (:TYPEREF NIL "logical-pathname") ", "
     (:SECREF NIL :FILE-SYSTEM-CONCEPTS) ", "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL "% 23.1.2 4                 " "% was left out") :PAR))
   :PAR (:COMMENT NIL "%% ========== MAKE-PATHNAME")
   (:COM (:NAME "make-pathname" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-pathname")
      (:ARGLIST NIL (:KEYWORD NIL " &key")
       " host device directory name type version defaults case")
      (:VALUES NIL "pathname"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN") " "
     (:PARAM NIL "host") "—a " (:TERM NIL "valid physical pathname host") ". "
     (:COMMENT NIL "%Per X3J13. -kmp 05-Oct-93.")
     "Complicated defaulting behavior; see below. " :PAR (:PARAM NIL "device")
     "—a " (:TERM NIL "valid pathname device") ". "
     (:COMMENT NIL "%Per X3J13. -kmp 05-Oct-93.")
     "Complicated defaulting behavior; see below. " :PAR
     (:PARAM NIL "directory") "—a " (:TERM NIL "valid pathname directory") ". "
     (:COMMENT NIL "%Per X3J13. -kmp 05-Oct-93.")
     "Complicated defaulting behavior; see below. " :PAR (:PARAM NIL "name")
     "—a " (:TERM NIL "valid pathname name") ". "
     (:COMMENT NIL "%Per X3J13. -kmp 05-Oct-93.")
     "Complicated defaulting behavior; see below. " :PAR (:PARAM NIL "type")
     "—a " (:TERM NIL "valid pathname type") ". "
     (:COMMENT NIL "%Per X3J13. -kmp 05-Oct-93.")
     "Complicated defaulting behavior; see below. " :PAR (:PARAM NIL "version")
     "—a " (:TERM NIL "valid pathname version") ". "
     (:COMMENT NIL "%Per X3J13. -kmp 05-Oct-93")
     "Complicated defaulting behavior; see below. "
     (:ENDISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN") " " :PAR
     (:PARAM NIL "defaults") "—a " (:TERM NIL "pathname designator")
     ". The default is a " (:TERM NIL "pathname")
     " whose host component is the same as the host component of the "
     (:TERM NIL "value") " of " (:VARREF NIL "*default-pathname-defaults*")
     ", and whose other components are all " (:MISC NIL "nil") ". " :PAR
     (:ISSUE NIL "PATHNAME-COMPONENT-CASE:KEYWORD-ARGUMENT") " "
     (:PARAM NIL "case") "—one of " (:KWD NIL "common") " or "
     (:KWD NIL "local") ". The default is " (:KWD NIL "local") ". "
     (:ENDISSUE NIL "PATHNAME-COMPONENT-CASE:KEYWORD-ARGUMENT") " " :PAR
     (:PARAM NIL "pathname") "—a " (:TERM NIL "pathname") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 23.1.2 27")
     "Constructs and returns a " (:TERM NIL "pathname")
     " from the supplied keyword arguments. " :PAR
     "After the components supplied explicitly by " (:PARAM NIL "host") ", "
     (:PARAM NIL "device") ", " (:PARAM NIL "directory") ", "
     (:PARAM NIL "name") ", " (:PARAM NIL "type") ", and "
     (:PARAM NIL "version") " are filled in, the merging rules used by "
     (:FUNREF NIL "merge-pathnames") " are used to fill in any "
     (:COMMENT NIL "%Per X3J13. -kmp 05-Oct-93." "missing")
     "unsupplied components from the defaults supplied by "
     (:PARAM NIL "defaults") ". " :PAR (:COMMENT NIL "% 23.1.2 28")
     "Whenever a " (:TERM NIL "pathname")
     " is constructed the components may be canonicalized if appropriate. "
     (:COMMENT NIL "For example, if a file system is insensitive to case, then"
      "characters with case may be forced to be all uppercase or all lowercase"
      "by the implementation.")
     "For the explanation of the arguments that can be supplied for each component, see "
     (:SECREF NIL :PATHNAME-COMPONENTS) ". " :PAR
     (:ISSUE NIL "PATHNAME-COMPONENT-CASE:KEYWORD-ARGUMENT") " If "
     (:PARAM NIL "case") " is supplied, it is treated as described in "
     (:SECREF NIL :PATHNAME-COMPONENT-CASE) ". "
     (:ENDISSUE NIL "PATHNAME-COMPONENT-CASE:KEYWORD-ARGUMENT") " " :PAR
     (:ISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " The resulting "
     (:PARAM NIL "pathname") " is a " (:TERM NIL "logical pathname")
     " if and only its host component " (:COMMENT NIL "denotes ") "is a "
     (:TERM NIL "logical host") " or a " (:TERM NIL "string")
     " that names a defined " (:TERM NIL "logical host") ". "
     (:COMMENT NIL " If \\param{host} is supplied,"
      " the host is logical if it came from \\funref{pathname-host} of a \\term{logical pathname}. "
      " Whether \\param{host} denotes a \\term{logical host} if it is a \\term{string} "
      " that is equal to the \\term{name} of a \\term{logical host} is \\term{implementation-defined}.")
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ENDISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
     :PAR (:ISSUE NIL "PATHNAME-SUBDIRECTORY-LIST:NEW-REPRESENTATION") " "
     (:COMMENT NIL
      "!!! Laddaga: Clearly this should also be presented in the concept section.")
     "If the " (:PARAM NIL "directory") " is a " (:TERM NIL "string")
     ", it should be the name of a top level directory, and should not contain any punctuation characters; that is, specifying a "
     (:TERM NIL "string") ", " (:I NIL "str")
     ", is equivalent to specifying the list "
     (:TT NIL "(:absolute " (:I NIL "str") ")") ". Specifying the symbol "
     (:KWD NIL "wild") " is equivalent to specifying the list "
     (:TT NIL "(:absolute :wild-inferiors)") ", or "
     (:TT NIL "(:absolute :wild)") " in a file system that does not support "
     (:KWD NIL "wild-inferiors") ". "
     (:ENDISSUE NIL "PATHNAME-SUBDIRECTORY-LIST:NEW-REPRESENTATION") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " ;; Implementation A -- an implementation with access to a single
 ;;  Unix file system.  This implementation happens to never display
 ;;  the `host' information in a namestring, since there is only one host. 
 (make-pathname :directory '(:absolute \"public\" \"games\")
                :name \"chess\" :type \"db\")
→ #P\"/public/games/chess.db\" 

 ;; Implementation B -- an implementation with access to one or more
 ;;  VMS file systems.  This implementation displays `host' information
 ;;  in the namestring only when the host is not the local host.
 ;;  It uses a double colon to separate a host name from the host's local
 ;;  file name.
 (make-pathname :directory '(:absolute \"PUBLIC\" \"GAMES\")
                :name \"CHESS\" :type \"DB\")
→ #P\"SYS$DISK:[PUBLIC.GAMES]CHESS.DB\" 
 (make-pathname :host \"BOBBY\"
                :directory '(:absolute \"PUBLIC\" \"GAMES\")
                :name \"CHESS\" :type \"DB\")
→ #P\"BOBBY::SYS$DISK:[PUBLIC.GAMES]CHESS.DB\" 

 ;; Implementation C -- an implementation with simultaneous access to
 ;;  multiple file systems from the same Lisp image.  In this 
 ;;  implementation, there is a convention that any text preceding the
 ;;  first colon in a pathname namestring is a host name.
 (dolist (case '(:common :local))
   (dolist (host '(\"MY-LISPM\" \"MY-VAX\" \"MY-UNIX\"))
     (print (make-pathname :host host :case case
                           :directory '(:absolute \"PUBLIC\" \"GAMES\")
                           :name \"CHESS\" :type \"DB\"))))
⊳ #P\"MY-LISPM:>public>games>chess.db\"
⊳ #P\"MY-VAX:SYS$DISK:[PUBLIC.GAMES]CHESS.DB\"
⊳ #P\"MY-UNIX:/public/games/chess.db\"
⊳ #P\"MY-LISPM:>public>games>chess.db\" 
⊳ #P\"MY-VAX:SYS$DISK:[PUBLIC.GAMES]CHESS.DB\" 
⊳ #P\"MY-UNIX:/PUBLIC/GAMES/CHESS.DB\" 
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The " (:TERM NIL "file system") ". "
     :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:FUNREF NIL "merge-pathnames") ", " (:TYPEREF NIL "pathname") ", "
     (:TYPEREF NIL "logical-pathname") ", " (:SECREF NIL :FILE-SYSTEM-CONCEPTS)
     ", " (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "Portable programs should not supply "
     (:KWD NIL "unspecific") " for any component. See "
     (:SECREF NIL :UNSPECIFIC-COMPONENT) ". " :PAR))
   :PAR (:COMMENT NIL "%% ========== PATHNAMEP")
   (:COM (:NAME "pathnamep" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "pathnamep") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 23.1.2 29")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "pathname") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq q \"test\")  → \"test\"
 (pathnamep q) → "
      (:TERM NIL "false") "
 (setq q (pathname \"test\"))
→ #S(PATHNAME :HOST NIL :DEVICE NIL :DIRECTORY NIL :NAME \"test\" :TYPE NIL
       :VERSION NIL)
 (pathnamep q) → "
      (:TERM NIL "true") " 
 (setq q (logical-pathname \"SYS:SITE;FOO.SYSTEM\"))
→ #P\"SYS:SITE;FOO.SYSTEM\"
 (pathnamep q) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (pathnamep " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'pathname)
")
     " " :PAR))
   :PAR
   (:COMMENT NIL "%% ========== PATHNAME-HOST" "%% ========== PATHNAME-DEVICE"
    "%% ========== PATHNAME-DIRECTORY" "%% ========== PATHNAME-NAME"
    "%% ========== PATHNAME-TYPE" "%% ========== PATHNAME-VERSION")
   (:COM
    (:NAME
     "pathname-host, pathname-device, pathname-directory, pathname-name, pathname-type, pathname-version"
     :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "PATHNAME-COMPONENT-CASE:KEYWORD-ARGUMENT") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "pathname-host")
      (:ARGLIST NIL "pathname " (:KEYWORD NIL " &key") " case")
      (:VALUES NIL "host"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "pathname-device")
      (:ARGLIST NIL "pathname " (:KEYWORD NIL " &key") " case")
      (:VALUES NIL "device"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "pathname-directory")
      (:ARGLIST NIL "pathname " (:KEYWORD NIL " &key") " case")
      (:VALUES NIL "directory"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "pathname-name")
      (:ARGLIST NIL "pathname " (:KEYWORD NIL " &key") " case")
      (:VALUES NIL "name"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "pathname-type")
      (:ARGLIST NIL "pathname " (:KEYWORD NIL " &key") " case")
      (:VALUES NIL "type"))
     " " :PAR (:ENDISSUE NIL "PATHNAME-COMPONENT-CASE:KEYWORD-ARGUMENT") " "
     :PAR
     (:DEF (:KIND "function") (:NAMES NIL "pathname-version")
      (:ARGLIST NIL "pathname") (:VALUES NIL "version"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PATHNAME-STREAM") " " (:PARAM NIL "pathname") "—a "
     (:TERM NIL "pathname designator") ". " (:ENDISSUE NIL "PATHNAME-STREAM")
     " " :PAR (:ISSUE NIL "PATHNAME-COMPONENT-CASE:KEYWORD-ARGUMENT") " "
     (:PARAM NIL "case") "—one of " (:KWD NIL "local") " or "
     (:KWD NIL "common") ". The default is " (:KWD NIL "local") ". "
     (:ENDISSUE NIL "PATHNAME-COMPONENT-CASE:KEYWORD-ARGUMENT") " " :PAR
     (:ISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN") " "
     (:PARAM NIL "host") "—a " (:TERM NIL "valid pathname host") ". " :PAR
     (:PARAM NIL "device") "—a " (:TERM NIL "valid pathname device") ". " :PAR
     (:ISSUE NIL "PATHNAME-SUBDIRECTORY-LIST:NEW-REPRESENTATION") " "
     (:PARAM NIL "directory") "—a " (:TERM NIL "valid pathname directory") ". "
     (:ENDISSUE NIL "PATHNAME-SUBDIRECTORY-LIST:NEW-REPRESENTATION") " " :PAR
     (:PARAM NIL "name") "—a " (:TERM NIL "valid pathname name") ". " :PAR
     (:PARAM NIL "type") "—a " (:TERM NIL "valid pathname type") ". " :PAR
     (:PARAM NIL "version") "—a " (:TERM NIL "valid pathname version") ". "
     :PAR (:ENDISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 23.1.2 30")
     "These functions return the components of " (:PARAM NIL "pathname") ". "
     :PAR "If the " (:PARAM NIL "pathname") " " (:TERM NIL "designator")
     " is a " (:TERM NIL "pathname")
     ", it represents the name used to open the file. This may be, but is not required to be, the actual name of the file. "
     :PAR (:ISSUE NIL "PATHNAME-COMPONENT-CASE:KEYWORD-ARGUMENT") " If "
     (:PARAM NIL "case") " is supplied, it is treated as described in "
     (:SECREF NIL :PATHNAME-COMPONENT-CASE) ". "
     (:ENDISSUE NIL "PATHNAME-COMPONENT-CASE:KEYWORD-ARGUMENT") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:ISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " "
     (:ISSUE NIL "PATHNAME-SUBDIRECTORY-LIST:NEW-REPRESENTATION") " "
     (:CODE NIL " (setq q (make-pathname :host \"KATHY\"
                        :directory \"CHAPMAN\" 
                        :name \"LOGIN\" :type \"COM\"))
→ #P\"KATHY::[CHAPMAN]LOGIN.COM\"
 (pathname-host q) → \"KATHY\"
 (pathname-name q) → \"LOGIN\"
 (pathname-type q) → \"COM\"

 ;; Because namestrings are used, the results shown in the remaining
 ;; examples are not necessarily the only possible results.  Mappings
 ;; from namestring representation to pathname representation are 
 ;; dependent both on the file system involved and on the implementation
 ;; (since there may be several implementations which can manipulate the
 ;; the same file system, and those implementations are not constrained
 ;; to agree on all details). Consult the documentation for each
 ;; implementation for specific information on how namestrings are treated
 ;; that implementation.

 ;; VMS
 (pathname-directory (parse-namestring \"[FOO.*.BAR]BAZ.LSP\"))
→ (:ABSOLUTE \"FOO\" \"BAR\")
 (pathname-directory (parse-namestring \"[FOO.*.BAR]BAZ.LSP\") :case :common)
→ (:ABSOLUTE \"FOO\" \"BAR\")

 ;; Unix
 (pathname-directory \"foo.l\") → NIL
 (pathname-device \"foo.l\") → :UNSPECIFIC
 (pathname-name \"foo.l\") → \"foo\"
 (pathname-name \"foo.l\" :case :local) → \"foo\"
 (pathname-name \"foo.l\" :case :common) → \"FOO\"
 (pathname-type \"foo.l\") → \"l\"
 (pathname-type \"foo.l\" :case :local) → \"l\"
 (pathname-type \"foo.l\" :case :common) → \"L\"
 (pathname-type \"foo\") → :UNSPECIFIC
 (pathname-type \"foo\" :case :common) → :UNSPECIFIC
 (pathname-type \"foo.\") → \"\"
 (pathname-type \"foo.\" :case :common) → \"\"
 (pathname-directory (parse-namestring \"/foo/bar/baz.lisp\") :case :local)
→ (:ABSOLUTE \"foo\" \"bar\")
 (pathname-directory (parse-namestring \"/foo/bar/baz.lisp\") :case :local)
→ (:ABSOLUTE \"FOO\" \"BAR\")
 (pathname-directory (parse-namestring \"../baz.lisp\"))
→ (:RELATIVE :UP)
 (PATHNAME-DIRECTORY (PARSE-NAMESTRING \"/foo/BAR/../Mum/baz\"))
→ (:ABSOLUTE \"foo\" \"BAR\" :UP \"Mum\")
 (PATHNAME-DIRECTORY (PARSE-NAMESTRING \"/foo/BAR/../Mum/baz\") :case :common)
→ (:ABSOLUTE \"FOO\" \"bar\" :UP \"Mum\")
 (PATHNAME-DIRECTORY (PARSE-NAMESTRING \"/foo/*/bar/baz.l\"))
→ (:ABSOLUTE \"foo\" :WILD \"bar\")
 (PATHNAME-DIRECTORY (PARSE-NAMESTRING \"/foo/*/bar/baz.l\") :case :common)
→ (:ABSOLUTE \"FOO\" :WILD \"BAR\")

 ;; Symbolics LMFS
 (pathname-directory (parse-namestring \">foo>**>bar>baz.lisp\"))
→ (:ABSOLUTE \"foo\" :WILD-INFERIORS \"bar\")
 (pathname-directory (parse-namestring \">foo>*>bar>baz.lisp\"))
→ (:ABSOLUTE \"foo\" :WILD \"bar\")
 (pathname-directory (parse-namestring \">foo>*>bar>baz.lisp\") :case :common)
→ (:ABSOLUTE \"FOO\" :WILD \"BAR\")
 (pathname-device (parse-namestring \">foo>baz.lisp\")) → :UNSPECIFIC
")
     " " (:ENDISSUE NIL "PATHNAME-SUBDIRECTORY-LIST:NEW-REPRESENTATION") " "
     (:ENDISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The " (:TERM NIL "implementation")
     " and the host " (:TERM NIL "file system") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if its first argument is not a "
     (:TERM NIL "pathname") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:TYPEREF NIL "pathname") ", " (:TYPEREF NIL "logical-pathname") ", "
     (:SECREF NIL :FILE-SYSTEM-CONCEPTS) ", "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   :PAR
   (:COMMENT NIL "-------------------- Logical Pathnames --------------------")
   :PAR (:COMMENT NIL "%% ========== LOAD-LOGICAL-PATHNAME-TRANSLATIONS")
   (:COM (:NAME "load-logical-pathname-translations" :FTYPE "Function")
    (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "load-logical-pathname-translations")
      (:ARGLIST NIL "host") (:VALUES NIL "just-loaded"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "host") "—a "
     (:TERM NIL "string") ". " :PAR (:TERM NIL "just-loaded") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "Searches for and loads the definition of a " (:TERM NIL "logical host")
     " named " (:PARAM NIL "host")
     ", if it is not already defined. The specific nature of the search is "
     (:TERM NIL "implementation-defined") ". " :PAR "If the "
     (:PARAM NIL "host")
     " is already defined, no attempt to find or load a definition is attempted, and "
     (:TERM NIL "false") " is returned. If the " (:PARAM NIL "host")
     " is not already defined, but a definition is successfully found and loaded, "
     (:TERM NIL "true") " is returned. Otherwise, an error is signaled. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (translate-logical-pathname \"hacks:weather;barometer.lisp.newest\")
⊳ Error: The logical host HACKS is not defined.
 (load-logical-pathname-translations \"HACKS\")
⊳ ;; Loading SYS:SITE;HACKS.TRANSLATIONS
⊳ ;; Loading done.
→ "
      (:TERM NIL "true") "
 (translate-logical-pathname \"hacks:weather;barometer.lisp.newest\")
→ #P\"HELIUM:[SHARED.HACKS.WEATHER]BAROMETER.LSP;0\"
 (load-logical-pathname-translations \"HACKS\")
→ "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "If no definition is found, an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") " is signaled. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:TYPEREF NIL "logical-pathname") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:TERM NIL "Logical pathname")
     " definitions will be created not just by " (:TERM NIL "implementors")
     " but also by " (:TERM NIL "programmers")
     ". As such, it is important that the search strategy be documented. For example, an "
     (:TERM NIL "implementation") " might define that the definition of a "
     (:PARAM NIL "host") " is to be found in a file called “"
     (:PARAM NIL "host")
     ".translations” in some specifically named directory. " :PAR
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== LOGICAL-PATHNAME-TRANSLATIONS")
   (:COM (:NAME "logical-pathname-translations" :FTYPE "Accessor")
    (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "logical-pathname-translations")
      (:ARGLIST NIL "host") (:VALUES NIL "translations"))
     " "
     (:DEF (:KIND "setf") (:NAMES NIL "logical-pathname-translations")
      (:ARGLIST NIL "host") (:NEW-VALUE NIL "new-translations"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "host") "–a "
     (:TERM NIL "logical host designator") ". " :PAR
     (:PARAM NIL "translations") ", " (:PARAM NIL "new-translations") "—a "
     (:TERM NIL "list") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns the host's "
     (:TERM NIL "list") " of translations. Each translation is a "
     (:TERM NIL "list") " of at least two elements: " (:I NIL "from-wildcard")
     " and " (:I NIL "to-wildcard") ". Any additional elements are "
     (:TERM NIL "implementation-defined") ". " (:I NIL "From-wildcard")
     " is a " (:TERM NIL "logical pathname") " whose host is "
     (:PARAM NIL "host") ". " (:I NIL "To-wildcard") " is a "
     (:TERM NIL "pathname") ". "
     (:REVIEWER NIL "Laddaga: Can this be a logical pathname?") " " :PAR
     (:TT NIL "(setf (logical-pathname-translations " (:PARAM NIL "host") ") "
      (:I NIL "translations") ")")
     " sets a " (:TERM NIL "logical pathname") " host's " (:TERM NIL "list")
     " of " (:I NIL "translations") ". If " (:PARAM NIL "host") " is a "
     (:TERM NIL "string") " that has not been previously used as a "
     (:TERM NIL "logical pathname") " host, a new "
     (:TERM NIL "logical pathname")
     " host is defined; otherwise an existing host's translations are replaced. "
     (:TERM NIL "logical pathname") " host names are compared with "
     (:FUNREF NIL "string-equal") ". " :PAR
     "When setting the translations list, each " (:I NIL "from-wildcard")
     " can be a " (:TERM NIL "logical pathname") " whose host is "
     (:PARAM NIL "host") " or a " (:TERM NIL "logical pathname")
     " namestring parseable by "
     (:TT NIL "(parse-namestring " (:TERM NIL "string") " " (:I NIL "host")
      ")")
     ", where " (:I NIL "host") " represents the appropriate "
     (:TERM NIL "object") " as defined by " (:FUNREF NIL "parse-namestring")
     ". Each " (:I NIL "to-wildcard") " can be anything coercible to a "
     (:TERM NIL "pathname") " by "
     (:TT NIL "(pathname " (:I NIL "to-wildcard") ")") ". If "
     (:I NIL "to-wildcard") " coerces to a " (:TERM NIL "logical pathname")
     ", " (:FUNREF NIL "translate-logical-pathname")
     " will perform repeated translation steps when it uses it. " :PAR
     (:PARAM NIL "host") " is either the host component of a "
     (:TERM NIL "logical pathname") " or a " (:TERM NIL "string")
     " that has been defined as a " (:TERM NIL "logical pathname")
     " host name by " (:MACREF NIL "setf") " of "
     (:FUNREF NIL "logical-pathname-translations") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:REVIEWER NIL "Laddaga: Shouldn't there be some " (:TT NIL "*.*")
      "'s in the list of translations for " (:TT NIL "PROG") " below?")
     " " :PAR
     (:CODE NIL
      " ;;;A very simple example of setting up a logical pathname host.  No
 ;;;translations are necessary to get around file system restrictions, so
 ;;;all that is necessary is to specify the root of the physical directory
 ;;;tree that contains the logical file system.
 ;;;The namestring syntax on the right-hand side is implementation-dependent.
 (setf (logical-pathname-translations \"foo\")
       '((\"**;*.*.*\"              \"MY-LISPM:>library>foo>**>\")))
 
 ;;;Sample use of that logical pathname.  The return value
 ;;;is implementation-dependent.          
 (translate-logical-pathname \"foo:bar;baz;mum.quux.3\")
→ #P\"MY-LISPM:>library>foo>bar>baz>mum.quux.3\"
 
 ;;;A more complex example, dividing the files among two file servers
 ;;;and several different directories.  This Unix doesn't support
 ;;;:WILD-INFERIORS in the directory, so each directory level must
 ;;;be translated individually.  No file name or type translations
 ;;;are required except for .MAIL to .MBX.
 ;;;The namestring syntax on the right-hand side is implementation-dependent.
 (setf (logical-pathname-translations \"prog\")
       '((\"RELEASED;*.*.*\"        \"MY-UNIX:/sys/bin/my-prog/\")
         (\"RELEASED;*;*.*.*\"      \"MY-UNIX:/sys/bin/my-prog/*/\")
         (\"EXPERIMENTAL;*.*.*\"    \"MY-UNIX:/usr/Joe/development/prog/\")
         (\"EXPERIMENTAL;DOCUMENTATION;*.*.*\"
                                  \"MY-VAX:SYS$DISK:[JOE.DOC]\")
         (\"EXPERIMENTAL;*;*.*.*\"  \"MY-UNIX:/usr/Joe/development/prog/*/\")
         (\"MAIL;**;*.MAIL\"        \"MY-VAX:SYS$DISK:[JOE.MAIL.PROG...]*.MBX\")))

 ;;;Sample use of that logical pathname.  The return value
 ;;;is implementation-dependent.          
 (translate-logical-pathname \"prog:mail;save;ideas.mail.3\")
→ #P\"MY-VAX:SYS$DISK:[JOE.MAIL.PROG.SAVE]IDEAS.MBX.3\"

 ;;;Example translations for a program that uses three files main.lisp,
 ;;;auxiliary.lisp, and documentation.lisp.  These translations might be
 ;;;supplied by a software supplier as examples.

 ;;;For Unix with long file names
 (setf (logical-pathname-translations \"prog\")
       '((\"CODE;*.*.*\"             \"/lib/prog/\")))

 ;;;Sample use of that logical pathname.  The return value
 ;;;is implementation-dependent.          
 (translate-logical-pathname \"prog:code;documentation.lisp\")
→ #P\"/lib/prog/documentation.lisp\"

 ;;;For Unix with 14-character file names, using .lisp as the type
 (setf (logical-pathname-translations \"prog\")
       '((\"CODE;DOCUMENTATION.*.*\" \"/lib/prog/docum.*\")
         (\"CODE;*.*.*\"             \"/lib/prog/\")))

 ;;;Sample use of that logical pathname.  The return value
 ;;;is implementation-dependent.          
 (translate-logical-pathname \"prog:code;documentation.lisp\")
→ #P\"/lib/prog/docum.lisp\"

 ;;;For Unix with 14-character file names, using .l as the type
 ;;;The second translation shortens the compiled file type to .b
 (setf (logical-pathname-translations \"prog\")
       `((\"**;*.LISP.*\"            ,(logical-pathname \"PROG:**;*.L.*\"))
         (,(compile-file-pathname (logical-pathname \"PROG:**;*.LISP.*\"))
                                   ,(logical-pathname \"PROG:**;*.B.*\"))
         (\"CODE;DOCUMENTATION.*.*\" \"/lib/prog/documentatio.*\")
         (\"CODE;*.*.*\"             \"/lib/prog/\")))

 ;;;Sample use of that logical pathname.  The return value
 ;;;is implementation-dependent.          
 (translate-logical-pathname \"prog:code;documentation.lisp\")
→ #P\"/lib/prog/documentatio.l\"

 ;;;For a Cray with 6 character names and no directories, types, or versions.
 (setf (logical-pathname-translations \"prog\")
       (let ((l '((\"MAIN\" \"PGMN\")
                  (\"AUXILIARY\" \"PGAUX\")
                  (\"DOCUMENTATION\" \"PGDOC\")))
             (logpath (logical-pathname \"prog:code;\"))
             (phypath (pathname \"XXX\")))
         (append
           ;; Translations for source files
           (mapcar #'(lambda (x)
                       (let ((log (first x))
                             (phy (second x)))
                         (list (make-pathname :name log
                                              :type \"LISP\"
                                              :version :wild
                                              :defaults logpath)
                               (make-pathname :name phy
                                              :defaults phypath))))
                   l)
           ;; Translations for compiled files
           (mapcar #'(lambda (x)
                       (let* ((log (first x))
                              (phy (second x))
                              (com (compile-file-pathname
                                     (make-pathname :name log
                                                    :type \"LISP\"
                                                    :version :wild
                                                    :defaults logpath))))
                         (setq phy (concatenate 'string phy \"B\"))
                         (list com
                               (make-pathname :name phy
                                              :defaults phypath))))
                   l))))

 ;;;Sample use of that logical pathname.  The return value
 ;;;is implementation-dependent.          
 (translate-logical-pathname \"prog:code;documentation.lisp\")
→ #P\"PGDOC\"
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If " (:PARAM NIL "host")
     " is incorrectly supplied, an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " is signaled. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:TYPEREF NIL "logical-pathname") ", "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "Implementations can define additional "
     (:TERM NIL "functions") " that operate on " (:TERM NIL "logical pathname")
     " hosts, for example to specify additional translation rules or options. "
     :PAR (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== LOGICAL-PATHNAME")
   (:COM (:NAME "logical-pathname" :FTYPE "Function")
    (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "logical-pathname")
      (:ARGLIST NIL "pathspec") (:VALUES NIL "logical-pathname"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "pathspec")
     "—a " (:TERM NIL "logical pathname") ", a " (:TERM NIL "logical pathname")
     " " (:TERM NIL "namestring") ", or a " (:TERM NIL "stream") ". " :PAR
     (:PARAM NIL "logical-pathname") "—a " (:TERM NIL "logical pathname") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "logical-pathname")
     " converts " (:PARAM NIL "pathspec") " to a "
     (:TERM NIL "logical pathname") " and returns the new "
     (:TERM NIL "logical pathname") ". If " (:PARAM NIL "pathspec") " is a "
     (:TERM NIL "logical pathname") " " (:TERM NIL "namestring")
     ", it should contain a host component and its following "
     (:TERM NIL "colon") ". If " (:PARAM NIL "pathspec") " is a "
     (:TERM NIL "stream") ", it should be one for which "
     (:FUNREF NIL "pathname") " returns a " (:TERM NIL "logical pathname") ". "
     :PAR (:ISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " If "
     (:PARAM NIL "pathspec") " is a " (:TERM NIL "stream") ", the "
     (:TERM NIL "stream") " can be either open or closed. "
     (:FUNREF NIL "logical-pathname") " returns the same "
     (:TERM NIL "logical pathname")
     " after a file is closed as it did when the file was open. "
     (:ENDISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " "
     (:ISSUE NIL "PATHNAME-STREAM") " It is an error if "
     (:PARAM NIL "pathspec") " is a " (:TERM NIL "stream")
     " that is created with " (:FUNREF NIL "make-two-way-stream") ", "
     (:FUNREF NIL "make-echo-stream") ", "
     (:FUNREF NIL "make-broadcast-stream") ", "
     (:FUNREF NIL "make-concatenated-stream") ", "
     (:FUNREF NIL "make-string-input-stream") ", or "
     (:FUNREF NIL "make-string-output-stream") ". "
     (:ENDISSUE NIL "PATHNAME-STREAM") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "Signals an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error") " if "
     (:PARAM NIL "pathspec") " isn't supplied correctly. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:TYPEREF NIL "logical-pathname") ", "
     (:FUNREF NIL "translate-logical-pathname") ", "
     (:SECREF NIL :LOGICAL-PATHNAMES) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR))
   :PAR
   (:COMMENT NIL "-------------------- Pathname Parsing --------------------")
   :PAR (:COMMENT NIL "%% ========== DEFAULT-PATHNAME-DEFAULTS")
   (:COM (:NAME "*default-pathname-defaults*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "pathname") " "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR
     (:COMMENT NIL "I added this first little phrase. -kmp 12-Jan-91") "An "
     (:TERM NIL "implementation-dependent") " " (:TERM NIL "pathname")
     ", typically in the working directory that was current when "
     (:RM NIL " Common Lisp") " was started up. " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 23.1.2 26") "a "
     (:TERM NIL "pathname") ", used as the default whenever a "
     (:TERM NIL "function") " needs a default " (:TERM NIL "pathname")
     " and one is not supplied. " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL
      " ;; This example illustrates a possible usage for a hypothetical Lisp running on a
 ;; DEC TOPS-20 file system.  Since pathname conventions vary between Lisp 
 ;; implementations and host file system types, it is not possible to provide a
 ;; general-purpose, conforming example.
 *default-pathname-defaults* → #P\"PS:<FRED>\"
 (merge-pathnames (make-pathname :name \"CALENDAR\"))
→ #P\"PS:<FRED>CALENDAR\"
 (let ((*default-pathname-defaults* (pathname \"<MARY>\")))
   (merge-pathnames (make-pathname :name \"CALENDAR\")))
→ #P\"<MARY>CALENDAR\"
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The " (:TERM NIL "implementation")
     ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   :PAR
   (:COMMENT NIL
    "-------------------- Pathname Namestrings --------------------")
   :PAR
   (:COMMENT NIL "%% ========== NAMESTRING" "%% ========== FILE-NAMESTRING"
    "%% ========== DIRECTORY-NAMESTRING" "%% ========== HOST-NAMESTRING"
    "%% ========== ENOUGH-NAMESTRING")
   :PAR
   (:COM
    (:NAME
     "namestring, file-namestring, directory-namestring, host-namestring, enough-namestring"
     :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "namestring")
      (:ARGLIST NIL "pathname") (:VALUES NIL "namestring"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "file-namestring")
      (:ARGLIST NIL "pathname") (:VALUES NIL "namestring"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "directory-namestring")
      (:ARGLIST NIL "pathname") (:VALUES NIL "namestring"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "host-namestring")
      (:ARGLIST NIL "pathname") (:VALUES NIL "namestring"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "enough-namestring")
      (:ARGLIST NIL "pathname " (:KEYWORD NIL " &optional") " defaults")
      (:VALUES NIL "namestring"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PATHNAME-STREAM") " " (:PARAM NIL "pathname") "—a "
     (:TERM NIL "pathname designator") ". " (:ENDISSUE NIL "PATHNAME-STREAM")
     " " :PAR (:ISSUE NIL "PATHNAME-SYMBOL") " " (:PARAM NIL "defaults") "—a "
     (:TERM NIL "pathname designator") ". " (:ENDISSUE NIL "PATHNAME-SYMBOL")
     " The default is the " (:TERM NIL "value") " of "
     (:VARREF NIL "*default-pathname-defaults*") ". " :PAR
     (:PARAM NIL "namestring") "—a " (:TERM NIL "string") " or "
     (:MISC NIL "nil") ". "
     (:EDITORNOTE NIL "KMP: Under what circumstances can NIL be returned??")
     (:COMMENT NIL "!!!") :PAR)
    (:PART (:NAME "Description") " " :PAR (:ISSUE NIL "PATHNAME-SYMBOL") " "
     (:COMMENT NIL " Reference to conversion of symbol to a pathname removed.")
     (:ENDISSUE NIL "PATHNAME-SYMBOL") " " :PAR "These functions convert "
     (:PARAM NIL "pathname") " into a namestring. "
     (:COMMENT NIL "% 23.1.2 31") "The name represented by "
     (:PARAM NIL "pathname") " is returned as a " (:TERM NIL "namestring")
     " in an " (:TERM NIL "implementation-dependent") " canonical form. " :PAR
     (:COMMENT NIL "% 23.1.2 33") (:FUNREF NIL "namestring")
     " returns the full form of " (:PARAM NIL "pathname") ". " :PAR
     (:FUNREF NIL "file-namestring")
     " returns just the name, type, and version components of "
     (:PARAM NIL "pathname") ". " :PAR (:FUNREF NIL "directory-namestring")
     " returns the directory name portion. " :PAR
     (:FUNREF NIL "host-namestring") " returns the host name. "
     (:COMMENT NIL "% 23.1.2 34") :PAR (:FUNREF NIL "enough-namestring")
     " returns an abbreviated namestring that is just sufficient to identify the file named by "
     (:PARAM NIL "pathname") " when considered relative to the "
     (:PARAM NIL "defaults") ". It is required that " :PAR
     (:CODE NIL
      " (merge-pathnames (enough-namestring pathname defaults) defaults)
≡ (merge-pathnames (parse-namestring pathname nil defaults) defaults)
")
     " in all cases, and the result of " (:FUNREF NIL "enough-namestring")
     " is the shortest reasonable " (:TERM NIL "string")
     " that will satisfy this criterion. " :PAR
     "It is not necessarily possible to construct a valid "
     (:TERM NIL "namestring") " by concatenating some of the three shorter "
     (:TERM NIL "namestrings") " in some order. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:COMMENT NIL
      "!!! This example needs to use real filenames instead of \"\\i{directory-name}\", etc.")
     (:CODE NIL " (namestring \"getty\")            
→ \"getty\"
 (setq q (make-pathname :host \"kathy\" 
                         :directory 
                           (pathname-directory *default-pathname-defaults*)
                         :name \"getty\")) 
→ #S(PATHNAME :HOST \"kathy\" :DEVICE NIL :DIRECTORY "
      (:I NIL "directory-name") " 
       :NAME \"getty\" :TYPE NIL :VERSION NIL)
 (file-namestring q) → \"getty\"
 (directory-namestring q) → "
      (:I NIL "directory-name") "
 (host-namestring q) → \"kathy\" 
")
     " " (:ISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " "
     (:CODE NIL " ;;;Using Unix syntax and the wildcard conventions used by the
 ;;;particular version of Unix on which this example was created:
 (namestring
   (translate-pathname \"/usr/dmr/hacks/frob.l\"
                       \"/usr/d*/hacks/*.l\"
                       \"/usr/d*/backup/hacks/backup-*.*\"))
→ \"/usr/dmr/backup/hacks/backup-frob.l\"
 (namestring
   (translate-pathname \"/usr/dmr/hacks/frob.l\"
                       \"/usr/d*/hacks/fr*.l\"
                       \"/usr/d*/backup/hacks/backup-*.*\"))
→ \"/usr/dmr/backup/hacks/backup-ob.l\"
 
 ;;;This is similar to the above example but uses two different hosts,
 ;;;U: which is a Unix and V: which is a VMS.  Note the translation
 ;;;of file type and alphabetic case conventions.
 (namestring
   (translate-pathname \"U:/usr/dmr/hacks/frob.l\"
                       \"U:/usr/d*/hacks/*.l\"
                       \"V:SYS$DISK:[D*.BACKUP.HACKS]BACKUP-*.*\"))
→ \"V:SYS$DISK:[DMR.BACKUP.HACKS]BACKUP-FROB.LSP\"
 (namestring
   (translate-pathname \"U:/usr/dmr/hacks/frob.l\"
                       \"U:/usr/d*/hacks/fr*.l\"
                       \"V:SYS$DISK:[D*.BACKUP.HACKS]BACKUP-*.*\"))
→ \"V:SYS$DISK:[DMR.BACKUP.HACKS]BACKUP-OB.LSP\"
")
     " " (:ENDISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:FUNREF NIL "truename") ", " (:FUNREF NIL "merge-pathnames") ", "
     (:TYPEREF NIL "pathname") ", " (:TYPEREF NIL "logical-pathname") ", "
     (:SECREF NIL :FILE-SYSTEM-CONCEPTS) ", "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   :PAR (:COMMENT NIL "%% ========== PARSE-NAMESTRING")
   (:COM (:NAME "parse-namestring" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "parse-namestring")
      (:ARGLIST NIL "thing " (:KEYWORD NIL " &optional")
       " host default-pathname " (:KEYWORD NIL " &key")
       " start end junk-allowed")
      (:VALUES NIL "pathname, position"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PATHNAME-SYMBOL") " " (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:PARAM NIL "thing") "—a " (:TERM NIL "string") ", a "
     (:TERM NIL "pathname") ", or a "
     (:TERM NIL "stream associated with a file") ". "
     (:COMMENT NIL
      "% This isn't quite right.  The start/end thing puts a wrinkle in things. -kmp 29-Aug-93"
      "\\term{pathname designator}")
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ENDISSUE NIL "PATHNAME-SYMBOL") " " :PAR
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN") " "
     (:COMMENT NIL
      "% Added NIL here because the Description seemed to permit it. -kmp 29-Aug-93")
     (:PARAM NIL "host") "—a " (:TERM NIL "valid pathname host") ", a "
     (:TERM NIL "logical host") ", or " (:MISC NIL "nil") ". "
     (:ENDISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN") " "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR
     (:PARAM NIL "default-pathname") "—a " (:TERM NIL "pathname designator")
     ". The default is the " (:TERM NIL "value") " of "
     (:VARREF NIL "*default-pathname-defaults*") ". " :PAR
     (:COMMENT NIL "% This should go without saying!! -kmp 29-Aug-93"
      "It is an error if optional arguments do not accompany keyword arguments.")
     :PAR (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " "
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start") ", " (:PARAM NIL "end") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "thing")
     ". The defaults for " (:PARAM NIL "start") " and " (:PARAM NIL "end")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " " :PAR
     (:PARAM NIL "junk-allowed") "—a " (:TERM NIL "generalized boolean")
     ". The default is " (:TERM NIL "false") ". " :PAR (:PARAM NIL "pathname")
     "—a " (:TERM NIL "pathname") ", or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "position") "—a " (:TERM NIL "bounding index designator")
     " for " (:PARAM NIL "thing") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 23.1.2 9" "% 23.1.2 10") "Converts " (:PARAM NIL "thing")
     " into a " (:TERM NIL "pathname") ". " :PAR "The " (:PARAM NIL "host")
     " supplies a host name with respect to which the parsing occurs. "
     (:COMMENT NIL "% Removed per X3J13. -kmp 05-Oct-93"
      " If \\param{host} is \\nil,"
      " then the host name is extracted from \\param{default-pathname}"
      " and used to determine the syntax convention.  ")
     :PAR (:ISSUE NIL "PATHNAME-STREAM") " If " (:PARAM NIL "thing") " is a "
     (:TERM NIL "stream associated with a file")
     ", processing proceeds as if the " (:TERM NIL "pathname")
     " used to open that " (:TERM NIL "file") " had been supplied instead. "
     (:ENDISSUE NIL "PATHNAME-STREAM") " " :PAR "If " (:PARAM NIL "thing")
     " is a " (:TERM NIL "pathname") ", the " (:PARAM NIL "host")
     " and the host component of " (:PARAM NIL "thing") " are compared. "
     (:COMMENT NIL "% 23.1.2 15    "
      "If \\param{thing} is not a \\term{string}, then \\param{start} is returned as the second value.")
     "If they match, two values are immediately returned: "
     (:PARAM NIL "thing") " and " (:PARAM NIL "start")
     "; otherwise (if they do not match), an error is signaled. " :PAR
     (:ISSUE NIL "PATHNAME-SYMBOL") " "
     (:COMMENT NIL
      " If \\param{thing} is a \\term{symbol}, the print name is used.")
     (:ENDISSUE NIL "PATHNAME-SYMBOL") " " :PAR (:COMMENT NIL "% 23.1.2 11")
     "Otherwise (if " (:PARAM NIL "thing") " is a " (:TERM NIL "string") "), "
     (:FUNREF NIL "parse-namestring") " parses the name of a "
     (:TERM NIL "file") " within the substring of " (:PARAM NIL "thing")
     " bounded by " (:PARAM NIL "start") " and " (:PARAM NIL "end") ". " :PAR
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
     (:COMMENT NIL "% Replaced (again) per X3J13. -kmp 05-Oct-93"
      " \\param{thing} is recognized as a \\term{logical pathname} \\term{namestring}"
      " when \\param{host} is a \\term{logical host} "
      "        (or a \\term{string} that names a defined \\term{logical host}),"
      "      \\param{default-pathname} is a \\term{logical pathname},"
      " %% Per X3J13. -kmp 05-Oct-93"
      " %   or the substring begins with the name of a defined \\term{logical host}"
      " %      followed by a \\term{colon}."
      " or \\param{host} is unsupplied and \\param{thing} is a \\term{string} "
      " that is a syntactically valid \\term{logical pathname} \\term{namestring}"
      " containing an explicit host.")
     "If " (:PARAM NIL "thing") " is a " (:TERM NIL "string") " then "
     (:COMMENT NIL "% I added this. -kmp 05-Oct-93" " it") "the substring of "
     (:PARAM NIL "thing") " " (:TERM NIL "bounded") " by " (:PARAM NIL "start")
     " and " (:PARAM NIL "end") " is parsed into a " (:TERM NIL "pathname")
     " as follows: " :PAR
     (:LIST NIL
      (:ITEM NIL " If " (:PARAM NIL "host") " is a " (:TERM NIL "logical host")
       " then " (:PARAM NIL "thing") " is parsed as a "
       (:TERM NIL "logical pathname") " " (:TERM NIL "namestring") " "
       (:COMMENT NIL "% I added this. -kmp 05-Oct-93") "on the "
       (:PARAM NIL "host") ". " :PAR)
      (:ITEM NIL " If " (:PARAM NIL "host") " is " (:MISC NIL "nil") " and "
       (:PARAM NIL "thing") " is a syntactically valid "
       (:TERM NIL "logical pathname") " " (:TERM NIL "namestring")
       " containing an explicit host, then it is parsed as a "
       (:TERM NIL "logical pathname") " " (:TERM NIL "namestring") ". " :PAR)
      (:ITEM NIL " If " (:PARAM NIL "host") " is " (:MISC NIL "nil") ", "
       (:PARAM NIL "default-pathname") " is a " (:TERM NIL "logical pathname")
       ", and " (:PARAM NIL "thing") " is a syntactically valid "
       (:TERM NIL "logical pathname") " " (:TERM NIL "namestring")
       " without an explicit host, then it is parsed as a "
       (:TERM NIL "logical pathname") " " (:TERM NIL "namestring") " "
       (:COMMENT NIL "% Wording simplified by me. -kmp 05-Oct-93"
        "         with the host from \\param{default-pathname} "
        "          used as the host for the resulting \\term{pathname}.")
       "on the host that is the host component of "
       (:PARAM NIL "default-pathname") ". " :PAR)
      (:ITEM NIL " Otherwise, the parsing of " (:PARAM NIL "thing") " is "
       (:TERM NIL "implementation-defined") ". " :PAR))
     " " :PAR "In the first "
     (:COMMENT NIL
      "% Changed to match wording voted by X3J13 above. -kmp 05-Oct-93" "two")
     "of these "
     (:COMMENT NIL "% Don't bother trying to count. -kmp 05-Oct-93" "three")
     "cases, the host portion of the " (:TERM NIL "logical pathname")
     " namestring and its following " (:TERM NIL "colon") " are optional. "
     (:COMMENT NIL
      " Whether a host argument is logical if it is a \\term{string} "
      " that is \\term{string equal} to a \\term{logical pathname} host name is"
      " \\term{implementation-defined}.")
     (:ENDISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR
     "If the host portion of the namestring and " (:PARAM NIL "host")
     " are both present and do not match, an error is signaled. " :PAR
     (:COMMENT NIL "% 23.1.2 12") "If " (:PARAM NIL "junk-allowed") " is "
     (:TERM NIL "true") ", then the " (:TERM NIL "primary value") " is the "
     (:TERM NIL "pathname") " parsed or, if no syntactically correct "
     (:TERM NIL "pathname") " was seen, " (:MISC NIL "nil") ". "
     (:COMMENT NIL "% 23.1.2 13") "If " (:PARAM NIL "junk-allowed") " is "
     (:TERM NIL "false") ", then the entire substring is scanned, and the "
     (:TERM NIL "primary value") " is the " (:TERM NIL "pathname") " parsed. "
     :PAR (:COMMENT NIL "% 23.1.2 14") "In either case, the "
     (:TERM NIL "secondary value") " is the index into " (:PARAM NIL "thing")
     " of the delimiter that terminated the parse, or the index beyond the substring if the parse terminated at the end of the substring (as will always be the case if "
     (:PARAM NIL "junk-allowed") " is " (:TERM NIL "false") "). " :PAR
     (:COMMENT NIL "% 23.1.2 16") "Parsing a " (:TERM NIL "null") " "
     (:TERM NIL "string") " always succeeds, producing a "
     (:TERM NIL "pathname") " with all components (except the host) equal to "
     (:MISC NIL "nil") ". " :PAR (:COMMENT NIL "% 23.1.2 18") "If "
     (:PARAM NIL "thing")
     " contains an explicit host name and no explicit device name, then it is "
     (:TERM NIL "implementation-defined") " whether "
     (:FUNREF NIL "parse-namestring")
     " will supply the standard default device for that host as the device component of the resulting "
     (:TERM NIL "pathname") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:ISSUE NIL "PATHNAME-PRINT-READ:SHARPSIGN-P") " "
     (:CODE NIL " (setq q (parse-namestring \"test\"))  
→ #S(PATHNAME :HOST NIL :DEVICE NIL :DIRECTORY NIL :NAME \"test\" 
       :TYPE NIL :VERSION NIL)
 (pathnamep q) → "
      (:TERM NIL "true") "
 (parse-namestring \"test\") 
→ #S(PATHNAME :HOST NIL :DEVICE NIL :DIRECTORY NIL :NAME \"test\"
       :TYPE NIL :VERSION NIL), 4
 (setq s (open "
      (:I NIL "xxx") ")) → #<Input File Stream...>
 (parse-namestring s) 
→ #S(PATHNAME :HOST NIL :DEVICE NIL :DIRECTORY NIL :NAME "
      (:I NIL "xxx") " 
       :TYPE NIL :VERSION NIL), 0
 (parse-namestring \"test\" nil nil :start 2 :end 4 )
 → #S(PATHNAME ...), 15
 (parse-namestring \"foo.lisp\")
→ #P\"foo.lisp\"
")
     " " (:ENDISSUE NIL "PATHNAME-PRINT-READ:SHARPSIGN-P") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If "
     (:PARAM NIL "junk-allowed") " is " (:TERM NIL "false") ", an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "parse-error") " is signaled if "
     (:PARAM NIL "thing")
     " does not consist entirely of the representation of a "
     (:TERM NIL "pathname") ", possibly surrounded on either side by "
     (:TERM NIL "whitespace") (:SUB NIL "1")
     " characters if that is appropriate to the cultural conventions of the implementation. "
     :PAR (:COMMENT NIL "% 23.1.2 17") "If " (:PARAM NIL "host")
     " is supplied and not " (:MISC NIL "nil") ", and " (:PARAM NIL "thing")
     " contains a manifest host name, an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") " is signaled if the hosts do not match. " :PAR
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " If " (:PARAM NIL "thing") " is a "
     (:TERM NIL "logical pathname")
     " namestring and if the host portion of the namestring and "
     (:PARAM NIL "host") " are both present and do not match, an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error") " is signaled. "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR
     (:COMMENT NIL
      "% This is implied by stream associated with a file. -kmp 29-Aug-93"
      " \\issue{PATHNAME-STREAM}"
      " It is an error if \\param{thing} is a \\term{stream} that is "
      " created with \\funref{make-two-way-stream}, "
      " 	     \\funref{make-echo-stream},"
      " 	     \\funref{make-broadcast-stream}, "
      " 	     \\funref{make-concatenated-stream},"
      " 	     \\funref{make-string-input-stream},"
      " 	     \\funref{make-string-output-stream}."
      " \\endissue{PATHNAME-STREAM}")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:TYPEREF NIL "pathname") ", " (:TYPEREF NIL "logical-pathname") ", "
     (:SECREF NIL :FILE-SYSTEM-CONCEPTS) ", "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:SECREF NIL :UNSPECIFIC-COMPONENT) ", "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   :PAR
   (:COMMENT NIL "-------------------- Pathname Matching --------------------")
   :PAR (:COMMENT NIL "%% ========== WILD-PATHNAME-P")
   (:COM (:NAME "wild-pathname-p" :FTYPE "Function")
    (:ISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "wild-pathname-p")
      (:ARGLIST NIL "pathname " (:KEYWORD NIL " &optional") " field-key")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PATHNAME-STREAM") " " (:PARAM NIL "pathname") "—a "
     (:TERM NIL "pathname designator") ". " (:ENDISSUE NIL "PATHNAME-STREAM")
     " " :PAR (:PARAM NIL "Field-key") "—one of " (:KWD NIL "host") ", "
     (:KWD NIL "device") " " (:KWD NIL "directory") ", " (:KWD NIL "name") ", "
     (:KWD NIL "type") ", " (:KWD NIL "version") ", or " (:MISC NIL "nil") ". "
     :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "wild-pathname-p")
     " tests " (:PARAM NIL "pathname")
     " for the presence of wildcard components. " :PAR "If "
     (:PARAM NIL "pathname") " is a " (:TERM NIL "pathname")
     " (as returned by " (:FUNREF NIL "pathname")
     ") it represents the name used to open the file. This may be, but is not required to be, the actual name of the file. "
     :PAR "If " (:PARAM NIL "field-key") " is not supplied or "
     (:MISC NIL "nil") ", " (:FUNREF NIL "wild-pathname-p") " returns true if "
     (:PARAM NIL "pathname") " has any wildcard components, " (:MISC NIL "nil")
     " if " (:PARAM NIL "pathname") " has none. If " (:PARAM NIL "field-key")
     " is " (:TERM NIL "non-nil") ", " (:FUNREF NIL "wild-pathname-p")
     " returns true if the indicated component of " (:PARAM NIL "pathname")
     " is a wildcard, " (:MISC NIL "nil")
     " if the component is not a wildcard. " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL
      " ;;;The following examples are not portable.  They are written to run
 ;;;with particular file systems and particular wildcard conventions.
 ;;;Other implementations will behave differently.  These examples are
 ;;;intended to be illustrative, not to be prescriptive.
 
 (wild-pathname-p (make-pathname :name :wild)) → "
      (:TERM NIL "true") "
 (wild-pathname-p (make-pathname :name :wild) :name) → "
      (:TERM NIL "true") "
 (wild-pathname-p (make-pathname :name :wild) :type) → "
      (:TERM NIL "false") "
 (wild-pathname-p (pathname \"s:>foo>**>\")) → "
      (:TERM NIL "true") " ;Lispm
 (wild-pathname-p (pathname :name \"F*O\")) → "
      (:TERM NIL "true") " ;Most places
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If "
     (:PARAM NIL "pathname") " is not a " (:TERM NIL "pathname") ", a "
     (:TERM NIL "string") ", or a " (:TERM NIL "stream associated with a file")
     " an error of " (:TERM NIL "type") " " (:TYPEREF NIL "type-error")
     " is signaled. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:TYPEREF NIL "pathname") ", " (:TYPEREF NIL "logical-pathname") ", "
     (:SECREF NIL :FILE-SYSTEM-CONCEPTS) ", "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "Not all implementations support wildcards in all fields. See "
     (:SECREF NIL :WILD-COMPONENTS) " and "
     (:SECREF NIL :WILDCARD-RESTRICTIONS) ". " :PAR
     (:ENDISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " "))
   :PAR (:COMMENT NIL "%% ========== PATHNAME-MATCH-P")
   (:COM (:NAME "pathname-match-p" :FTYPE "Function")
    (:ISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "pathname-match-p")
      (:ARGLIST NIL "pathname wildcard") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PATHNAME-STREAM") " " (:PARAM NIL "pathname") "—a "
     (:TERM NIL "pathname designator") ". " :PAR (:PARAM NIL "wildcard") "—a "
     (:TERM NIL "designator") " for a " (:TERM NIL "wild") " "
     (:TERM NIL "pathname") ". " (:ENDISSUE NIL "PATHNAME-STREAM") " " :PAR
     (:PARAM NIL "generalized-boolean") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "pathname-match-p")
     " returns true if " (:PARAM NIL "pathname") " matches "
     (:PARAM NIL "wildcard") ", otherwise " (:MISC NIL "nil")
     ". The matching rules are " (:TERM NIL "implementation-defined")
     " but should be consistent with " (:FUNREF NIL "directory")
     ". Missing components of " (:PARAM NIL "wildcard") " default to "
     (:KWD NIL "wild") ". " :PAR "It is valid for " (:PARAM NIL "pathname")
     " to be a wild " (:TERM NIL "pathname") "; a wildcard field in "
     (:PARAM NIL "pathname") " only matches a wildcard field in "
     (:PARAM NIL "wildcard") " (" (:I NIL "i.e.") ",  "
     (:FUNREF NIL "pathname-match-p") " is not commutative). It is valid for "
     (:PARAM NIL "wildcard") " to be a non-wild " (:TERM NIL "pathname") ". "
     :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If "
     (:PARAM NIL "pathname") " or " (:PARAM NIL "wildcard") " is not a "
     (:TERM NIL "pathname") ", " (:TERM NIL "string") ", or "
     (:TERM NIL "stream associated with a file") " an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error") " is signaled. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:FUNREF NIL "directory") ", " (:TYPEREF NIL "pathname") ", "
     (:TYPEREF NIL "logical-pathname") ", " (:SECREF NIL :FILE-SYSTEM-CONCEPTS)
     ", " (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " "))
   :PAR (:COMMENT NIL "%% ========== TRANSLATE-LOGICAL-PATHNAME")
   (:COM (:NAME "translate-logical-pathname" :FTYPE "Function")
    (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "translate-logical-pathname")
      (:ARGLIST NIL "pathname " (:KEYWORD NIL " &key"))
      (:VALUES NIL "physical-pathname"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "pathname")
     "—a " (:TERM NIL "pathname designator") ", or a "
     (:TERM NIL "logical pathname") " " (:TERM NIL "namestring") ". " :PAR
     (:PARAM NIL "physical-pathname") "—a " (:TERM NIL "physical pathname")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Translates " (:PARAM NIL "pathname")
     " to a " (:TERM NIL "physical pathname") ", which it returns. " :PAR
     (:ISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " If "
     (:PARAM NIL "pathname") " is a " (:TERM NIL "stream") ", the "
     (:TERM NIL "stream") " can be either open or closed. "
     (:FUNREF NIL "translate-logical-pathname")
     " returns the same physical pathname after a file is closed as it did when the file was open. "
     (:ENDISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " "
     (:ISSUE NIL "PATHNAME-STREAM") " It is an error if "
     (:PARAM NIL "pathname") " is a " (:TERM NIL "stream")
     " that is created with " (:FUNREF NIL "make-two-way-stream") ", "
     (:FUNREF NIL "make-echo-stream") ", "
     (:FUNREF NIL "make-broadcast-stream") ", "
     (:FUNREF NIL "make-concatenated-stream") ", "
     (:FUNREF NIL "make-string-input-stream") ", "
     (:FUNREF NIL "make-string-output-stream") ". "
     (:ENDISSUE NIL "PATHNAME-STREAM") " " :PAR "If " (:PARAM NIL "pathname")
     " is a " (:TERM NIL "logical pathname")
     " namestring, the host portion of the " (:TERM NIL "logical pathname")
     " namestring and its following " (:TERM NIL "colon") " are required. "
     :PAR (:PARAM NIL "Pathname") " is first coerced to a "
     (:TERM NIL "pathname") ". If the coerced " (:PARAM NIL "pathname")
     " is a physical pathname, it is returned. If the coerced "
     (:PARAM NIL "pathname") " is a " (:TERM NIL "logical pathname")
     ", the first matching translation (according to "
     (:FUNREF NIL "pathname-match-p") ") of the "
     (:TERM NIL "logical pathname") " host is applied, as if by calling "
     (:FUNREF NIL "translate-pathname") ". If the result is a "
     (:TERM NIL "logical pathname")
     ", this process is repeated. When the result is finally a physical pathname, it is returned. If no translation matches, an error is signaled. "
     :PAR (:FUNREF NIL "translate-logical-pathname")
     " might perform additional translations, typically to provide translation of file types to local naming conventions, to accomodate physical file systems with limited length names, or to deal with special character requirements such as translating hyphens to underscores or uppercase letters to lowercase. Any such additional translations are "
     (:TERM NIL "implementation-defined")
     ". Some implementations do no additional translations. " :PAR
     "There are no specified keyword arguments for "
     (:FUNREF NIL "translate-logical-pathname")
     ", but implementations are permitted to extend it by adding keyword arguments. "
     :PAR
     (:COMMENT NIL
      "The following was deleted because part 2 of EXTRA-RETURN-VALUES didn't"
      "pass." "There is one specified return value"
      "    from TRANSLATE-LOGICAL-PATHNAME; implementations are permitted to"
      "    extend it by returning additional values.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR "See "
     (:FUNREF NIL "logical-pathname-translations") ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) (:COMMENT NIL "!!! Not likely.") :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If "
     (:PARAM NIL "pathname") " is incorrectly supplied, an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error") " is signaled. " :PAR
     "If no translation matches, an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "file-error") " is signaled. "
     (:EDITORNOTE NIL
      "KMP: Is file-error really right, or should it be pathname-error?")
     " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "logical-pathname") ", "
     (:FUNREF NIL "logical-pathname-translations") ", "
     (:TYPEREF NIL "logical-pathname") ", " (:SECREF NIL :FILE-SYSTEM-CONCEPTS)
     ", " (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== TRANSLATE-PATHNAME")
   (:COM (:NAME "translate-pathname" :FTYPE "Function")
    (:ISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "translate-pathname")
      (:ARGLIST NIL "source from-wildcard to-wildcard " (:KEYWORD NIL " &key"))
      (:VALUES NIL "translated-pathname"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "source") "—a "
     (:TERM NIL "pathname designator") ". " :PAR (:PARAM NIL "from-wildcard")
     "—a " (:TERM NIL "pathname designator") ". " :PAR
     (:PARAM NIL "to-wildcard") "—a " (:TERM NIL "pathname designator") ". "
     :PAR (:PARAM NIL "translated-pathname") "—a " (:TERM NIL "pathname") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "translate-pathname")
     " translates " (:PARAM NIL "source") " (that matches "
     (:PARAM NIL "from-wildcard") ") into a corresponding "
     (:TERM NIL "pathname") " that matches " (:PARAM NIL "to-wildcard")
     ", and returns the corresponding " (:TERM NIL "pathname") ". " :PAR
     "The resulting " (:TERM NIL "pathname") " is " (:PARAM NIL "to-wildcard")
     " with each wildcard or missing field replaced by a portion of "
     (:PARAM NIL "source") ". A “wildcard field” is a " (:TERM NIL "pathname")
     " component with a value of " (:KWD NIL "wild") ", a " (:KWD NIL "wild")
     " element of a " (:TERM NIL "list") "-valued directory component, or an "
     (:TERM NIL "implementation-defined")
     " portion of a component, such as the " (:TT NIL "\"*\"")
     " in the complex wildcard string " (:TT NIL "\"foo*bar\"")
     " that some implementations support. An implementation that adds other wildcard features, such as regular expressions, must define how "
     (:FUNREF NIL "translate-pathname")
     " extends to those features. A “missing field” is a "
     (:TERM NIL "pathname") " component with a value of " (:MISC NIL "nil")
     ". " :PAR "The portion of " (:PARAM NIL "source")
     " that is copied into the resulting " (:TERM NIL "pathname") " is "
     (:TERM NIL "implementation-defined")
     ". Typically it is determined by the user interface conventions of the file systems involved. Usually it is the portion of "
     (:PARAM NIL "source") " that matches a wildcard field of "
     (:PARAM NIL "from-wildcard")
     " that is in the same position as the wildcard or missing field of "
     (:PARAM NIL "to-wildcard") ". If there is no wildcard field in "
     (:PARAM NIL "from-wildcard")
     " at that position, then usually it is the entire corresponding "
     (:TERM NIL "pathname") " component of " (:PARAM NIL "source")
     ", or in the case of a " (:TERM NIL "list")
     "-valued directory component, the entire corresponding "
     (:TERM NIL "list") " element. " :PAR "During the copying of a portion of "
     (:PARAM NIL "source") " into the resulting " (:TERM NIL "pathname")
     ", additional " (:TERM NIL "implementation-defined") " translations of "
     (:TERM NIL "case")
     " or file naming conventions might occur, especially when "
     (:PARAM NIL "from-wildcard") " and " (:PARAM NIL "to-wildcard")
     " are for different hosts. " :PAR "It is valid for " (:PARAM NIL "source")
     " to be a wild " (:TERM NIL "pathname")
     "; in general this will produce a wild result. It is valid for "
     (:PARAM NIL "from-wildcard") " and/or " (:PARAM NIL "to-wildcard")
     " to be non-wild " (:TERM NIL "pathnames") ". " :PAR
     "There are no specified keyword arguments for "
     (:FUNREF NIL "translate-pathname")
     ", but implementations are permitted to extend it by adding keyword arguments. "
     :PAR
     (:COMMENT NIL
      "The following is deleted because part 2 of EXTRA-RETURN-VALUES didn't"
      "pass:"
      "    There is one specified return value from TRANSLATE-PATHNAME;"
      "    implementations are permitted to extend it by returning additional"
      "    values.")
     (:ISSUE NIL "PATHNAME-COMPONENT-CASE:KEYWORD-ARGUMENT") " "
     (:ISSUE NIL "JUN90-TRIVIAL-ISSUES:5") " "
     (:FUNREF NIL "translate-pathname") " maps customary case in "
     (:PARAM NIL "source") " into customary case in the output "
     (:TERM NIL "pathname") ". " (:ENDISSUE NIL "JUN90-TRIVIAL-ISSUES:5") " "
     (:ENDISSUE NIL "PATHNAME-COMPONENT-CASE:KEYWORD-ARGUMENT") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " ;; The results of the following five forms are all implementation-dependent.
 ;; The second item in particular is shown with multiple results just to 
 ;; emphasize one of many particular variations which commonly occurs.
 (pathname-name (translate-pathname \"foobar\" \"foo*\" \"*baz\")) → \"barbaz\"
 (pathname-name (translate-pathname \"foobar\" \"foo*\" \"*\"))
→ \"foobar\"
OR→ \"bar\"
 (pathname-name (translate-pathname \"foobar\" \"*\"    \"foo*\")) → \"foofoobar\"
 (pathname-name (translate-pathname \"bar\"    \"*\"    \"foo*\")) → \"foobar\"
 (pathname-name (translate-pathname \"foobar\" \"foo*\" \"baz*\")) → \"bazbar\"

 (defun translate-logical-pathname-1 (pathname rules)
   (let ((rule (assoc pathname rules :test #'pathname-match-p)))
     (unless rule (error \"No translation rule for ~A\" pathname))
     (translate-pathname pathname (first rule) (second rule))))
 (translate-logical-pathname-1 \"FOO:CODE;BASIC.LISP\"
                       '((\"FOO:DOCUMENTATION;\" \"MY-UNIX:/doc/foo/\")
                         (\"FOO:CODE;\"          \"MY-UNIX:/lib/foo/\")
                         (\"FOO:PATCHES;*;\"     \"MY-UNIX:/lib/foo/patch/*/\")))
→ #P\"MY-UNIX:/lib/foo/basic.l\"

;;;This example assumes one particular set of wildcard conventions
;;;Not all file systems will run this example exactly as written
 (defun rename-files (from to)
   (dolist (file (directory from))
     (rename-file file (translate-pathname file from to))))
 (rename-files \"/usr/me/*.lisp\" \"/dev/her/*.l\")
   ;Renames /usr/me/init.lisp to /dev/her/init.l
 (rename-files \"/usr/me/pcl*/*\" \"/sys/pcl/*/\")
   ;Renames /usr/me/pcl-5-may/low.lisp to /sys/pcl/pcl-5-may/low.lisp
   ;In some file systems the result might be /sys/pcl/5-may/low.lisp
 (rename-files \"/usr/me/pcl*/*\" \"/sys/library/*/\")
   ;Renames /usr/me/pcl-5-may/low.lisp to /sys/library/pcl-5-may/low.lisp
   ;In some file systems the result might be /sys/library/5-may/low.lisp
 (rename-files \"/usr/me/foo.bar\" \"/usr/me2/\")
   ;Renames /usr/me/foo.bar to /usr/me2/foo.bar
 (rename-files \"/usr/joe/*-recipes.text\" \"/usr/jim/cookbook/joe's-*-rec.text\")
   ;Renames /usr/joe/lamb-recipes.text to /usr/jim/cookbook/joe's-lamb-rec.text
   ;Renames /usr/joe/pork-recipes.text to /usr/jim/cookbook/joe's-pork-rec.text
   ;Renames /usr/joe/veg-recipes.text to /usr/jim/cookbook/joe's-veg-rec.text
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If any of "
     (:PARAM NIL "source") ", " (:PARAM NIL "from-wildcard") ", or "
     (:PARAM NIL "to-wildcard") " is not a " (:TERM NIL "pathname") ", a "
     (:TERM NIL "string") ", or a " (:TERM NIL "stream associated with a file")
     " an error of " (:TERM NIL "type") " " (:TYPEREF NIL "type-error")
     " is signaled. " :PAR
     (:TT NIL "(pathname-match-p " (:PARAM NIL "source from-wildcard") ")")
     " must be true or an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") " is signaled. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "namestring") ", "
     (:FUNREF NIL "pathname-host") ", " (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:TYPEREF NIL "pathname") ", " (:TYPEREF NIL "logical-pathname") ", "
     (:SECREF NIL :FILE-SYSTEM-CONCEPTS) ", "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The exact behavior of "
     (:FUNREF NIL "translate-pathname") " cannot be dictated by the "
     (:RM NIL " Common Lisp")
     " language and must be allowed to vary, depending on the user interface conventions of the file systems involved. "
     :PAR
     "The following is an implementation guideline. One file system performs this operation by examining each piece of the three "
     (:TERM NIL "pathnames") " in turn, where a piece is a "
     (:TERM NIL "pathname") " component or a " (:TERM NIL "list")
     " element of a structured component such as a hierarchical directory. Hierarchical directory elements in "
     (:PARAM NIL "from-wildcard") " and " (:PARAM NIL "to-wildcard")
     " are matched by whether they are wildcards, not by depth in the directory hierarchy. If the piece in "
     (:PARAM NIL "to-wildcard")
     " is present and not wild, it is copied into the result. If the piece in "
     (:PARAM NIL "to-wildcard") " is " (:KWD NIL "wild") " or "
     (:MISC NIL "nil") ", the piece in " (:PARAM NIL "source")
     " is copied into the result. Otherwise, the piece in "
     (:PARAM NIL "to-wildcard") " might be a complex wildcard such as "
     (:TT NIL "\"foo*bar\"") " and the piece in " (:PARAM NIL "from-wildcard")
     " should be wild; the portion of the piece in " (:PARAM NIL "source")
     " that matches the wildcard portion of the piece in "
     (:PARAM NIL "from-wildcard")
     " replaces the wildcard portion of the piece in "
     (:PARAM NIL "to-wildcard")
     " and the value produced is used in the result. " :PAR
     (:ENDISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " "))
   :PAR
   (:COMMENT NIL "-------------------- Pathname Merging --------------------")
   :PAR (:COMMENT NIL "%% ========== MERGE-PATHNAMES")
   (:COM (:NAME "merge-pathnames" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "merge-pathnames")
      (:ARGLIST NIL "pathname " (:KEYWORD NIL " &optional")
       " default-pathname default-version")
      (:VALUES NIL "merged-pathname"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PATHNAME-STREAM") " " (:PARAM NIL "pathname") "—a "
     (:TERM NIL "pathname designator") ". " (:ENDISSUE NIL "PATHNAME-STREAM")
     " " :PAR (:ISSUE NIL "PATHNAME-STREAM") " " (:COMMENT NIL "% 23.1.2 20")
     (:PARAM NIL "default-pathname") "—a " (:TERM NIL "pathname designator")
     ". " (:ENDISSUE NIL "PATHNAME-STREAM") " The default is the "
     (:TERM NIL "value") " of " (:VARREF NIL "*default-pathname-defaults*")
     ". " :PAR (:ISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN") " "
     (:PARAM NIL "default-version") "—a " (:TERM NIL "valid pathname version")
     ". " (:ENDISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN")
     " The default is " (:KWD NIL "newest") ". " :PAR
     (:PARAM NIL "merged-pathname") "—a " (:TERM NIL "pathname") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 23.1.2 19")
     "Constructs a " (:TERM NIL "pathname") " from " (:PARAM NIL "pathname")
     " by filling in any unsupplied components with the corresponding values from "
     (:PARAM NIL "default-pathname") " and " (:PARAM NIL "default-version")
     ". " :PAR (:COMMENT NIL "% 23.1.2 22")
     "Defaulting of pathname components is done by filling in components taken from another "
     (:TERM NIL "pathname") ". "
     (:ISSUE NIL "COMPILE-FILE-OUTPUT-FILE-DEFAULTS:INPUT-FILE") " "
     (:COMMENT NIL
      " Unsupplied components of the output \\term{pathname} come from \\param{pathname},"
      " except that the type should default not to the type of \\param{pathname} "
      " but to the appropriate default type for output from this program.")
     "This is especially useful for cases such as a program that has an input file and an output file. Unspecified components of the output pathname will come from the input pathname, except that the type should not default "
     (:COMMENT NIL "% \"not\" removed per X3J13. -kmp 05-Oct-93" "not")
     "to the type of the input pathname but rather to the appropriate default type for output from the program; for example, see the "
     (:TERM NIL "function") " " (:FUNREF NIL "compile-file-pathname") ". "
     (:ENDISSUE NIL "COMPILE-FILE-OUTPUT-FILE-DEFAULTS:INPUT-FILE") " " :PAR
     (:COMMENT NIL "% 23.1.2 23") "If no version is supplied, "
     (:PARAM NIL "default-version") " is used. If "
     (:PARAM NIL "default-version") " is " (:MISC NIL "nil")
     ", the version component will remain unchanged. " :PAR
     (:COMMENT NIL "% 23.1.2 24") "If " (:PARAM NIL "pathname")
     " explicitly specifies a host and not a device, and if the host component of "
     (:PARAM NIL "default-pathname") " matches the host component of "
     (:PARAM NIL "pathname") ", then the device is taken from the "
     (:PARAM NIL "default-pathname")
     "; otherwise the device will be the default file device for that host. If "
     (:PARAM NIL "pathname")
     " does not specify a host, device, directory, name, or type, each such component is copied from "
     (:PARAM NIL "default-pathname") ". If " (:PARAM NIL "pathname")
     " does not specify a name, then the version, if not provided, will come from "
     (:PARAM NIL "default-pathname") ", just like the other components. If "
     (:PARAM NIL "pathname")
     " does specify a name, then the version is not affected by "
     (:PARAM NIL "default-pathname")
     ". If this process leaves the version missing, the "
     (:PARAM NIL "default-version")
     " is used. If the host's file name syntax provides a way to input a version without a name or type, the user can let the name and type default but supply a version different from the one in "
     (:PARAM NIL "default-pathname") ". " :PAR
     (:ISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " If "
     (:PARAM NIL "pathname") " is a " (:TERM NIL "stream") ", "
     (:PARAM NIL "pathname") " effectively becomes "
     (:TT NIL "(pathname " (:PARAM NIL "pathname") ")") ". "
     (:FUNREF NIL "merge-pathnames")
     " can be used on either an open or a closed " (:TERM NIL "stream") ". "
     (:ENDISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " "
     (:COMMENT NIL "% This follows from \"stream associated with a file\","
      "% which is implicit in \"pathname designator\"."
      " \\issue{PATHNAME-STREAM}"
      " It is an error if \\param{pathname} is a \\term{stream} that is "
      " created with \\funref{make-two-way-stream}, "
      " \\funref{make-echo-stream}," " \\funref{make-broadcast-stream}, "
      " \\funref{make-concatenated-stream}, \\funref{make-string-input-stream},"
      " \\funref{make-string-output-stream}." " \\endissue{PATHNAME-STREAM}")
     :PAR "If " (:PARAM NIL "pathname") " is a " (:TERM NIL "pathname") " "
     (:COMMENT NIL "% Superfluous. -kmp 29-Aug-93"
      "(as returned by \\funref{pathname})")
     "it represents the name used to open the file. This may be, but is not required to be, the actual name of the file. "
     :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:FUNREF NIL "merge-pathnames") " recognizes a "
     (:TERM NIL "logical pathname") " " (:TERM NIL "namestring") " when "
     (:PARAM NIL "default-pathname") " is a " (:TERM NIL "logical pathname")
     ", " (:ISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES")
     " or when the " (:TERM NIL "namestring")
     " begins with the name of a defined " (:TERM NIL "logical host")
     " followed by a " (:TERM NIL "colon")
     ". In the first of these two cases, "
     (:ENDISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES")
     " the host portion of the " (:TERM NIL "logical pathname") " "
     (:TERM NIL "namestring") " and its following " (:TERM NIL "colon")
     " are optional. " (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " " (:FUNREF NIL "merge-pathnames")
     " returns a " (:TERM NIL "logical pathname")
     " if and only if its first argument is a " (:TERM NIL "logical pathname")
     ", " (:ISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES")
     " or its first argument is a " (:TERM NIL "logical pathname") " "
     (:TERM NIL "namestring")
     " with an explicit host, or its first argument does not specify a host and the "
     (:PARAM NIL "default-pathname") " is a " (:TERM NIL "logical pathname")
     ". " (:ENDISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES")
     " " (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR
     (:ISSUE NIL "PATHNAME-SUBDIRECTORY-LIST:NEW-REPRESENTATION") " "
     (:TERM NIL "Pathname")
     " merging treats a relative directory specially. If "
     (:TT NIL "(pathname-directory " (:PARAM NIL "pathname") ")") " is a "
     (:TERM NIL "list") " whose " (:TERM NIL "car") " is "
     (:KWD NIL "relative") ", and "
     (:TT NIL "(pathname-directory " (:PARAM NIL "default-pathname") ")")
     " is a " (:TERM NIL "list") ", then the merged directory is the value of "
     :PAR
     (:CODE NIL " (append (pathname-directory " (:PARAM NIL "default-pathname")
      ")
         (cdr  ;remove :relative from the front
           (pathname-directory "
      (:PARAM NIL "pathname") ")))
")
     " except that if the resulting " (:TERM NIL "list") " contains a "
     (:TERM NIL "string") " or " (:KWD NIL "wild") " immediately followed by "
     (:KWD NIL "back") ", both of them are removed. This removal of redundant "
     (:KWD NIL "back") " " (:TERM NIL "keywords")
     " is repeated as many times as possible. If "
     (:TT NIL "(pathname-directory " (:PARAM NIL "default-pathname") ")")
     " is not a " (:TERM NIL "list") " or "
     (:TT NIL "(pathname-directory " (:PARAM NIL "pathname") ")") " is not a "
     (:TERM NIL "list") " whose " (:TERM NIL "car") " is "
     (:KWD NIL "relative") ", the merged directory is "
     (:TT NIL "(or (pathname-directory " (:PARAM NIL "pathname")
      ") (pathname-directory " (:PARAM NIL "default-pathname") "))")
     " " (:ENDISSUE NIL "PATHNAME-SUBDIRECTORY-LIST:NEW-REPRESENTATION") " "
     :PAR (:ISSUE NIL "PATHNAME-COMPONENT-CASE:KEYWORD-ARGUMENT") " "
     (:FUNREF NIL "merge-pathnames") " maps customary case in "
     (:PARAM NIL "pathname") " into customary case in the output "
     (:TERM NIL "pathname") ". "
     (:ENDISSUE NIL "PATHNAME-COMPONENT-CASE:KEYWORD-ARGUMENT") " " :PAR)
    (:PART (:NAME "Examples") " " (:COMMENT NIL "% 23.1.2 21")
     (:CODE NIL " (merge-pathnames \"CMUC::FORMAT\"
                  \"CMUC::PS:<LISPIO>.FASL\")
→ #P\"CMUC::PS:<LISPIO>FORMAT.FASL.0\"
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:VARREF NIL "*default-pathname-defaults*") ", " (:TYPEREF NIL "pathname")
     ", " (:TYPEREF NIL "logical-pathname") ", "
     (:SECREF NIL :FILE-SYSTEM-CONCEPTS) ", "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 23.1.2 25")
     "The net effect "
     (:COMMENT NIL
      "% removed as redundant to avoid making this paragraph run onto next page by one word."
      " of \\funref{merge-pathnames} ")
     "is that if just a name is supplied, " (:COMMENT NIL "% ditto." "then")
     "the host, device, directory, and type will come from "
     (:PARAM NIL "default-pathname") ", but the version will come from "
     (:PARAM NIL "default-version")
     ". If nothing or just a directory is supplied, the name, type, and version will come from "
     (:PARAM NIL "default-pathname") " together. " :PAR)))
  " " :PAR)
 (:CHAPTER (:NUM "20" :TITLE ("Files") :NUMTAG :CHAP-TWENTY :NAMETAG :FILES)
  (:SECTION (:TITLE ("File System Concepts") :TAGS (:FILE-SYSTEM-CONCEPTS)) " "
   :PAR (:COMMENT NIL "% 23.0.0 6 was left out.") :PAR
   "This section describes the " (:RM NIL " Common Lisp")
   " interface to file systems. " (:COMMENT NIL "% 23.0.0 5")
   "The model used by this interface assumes that "
   (:NEWTERM (:IDX "file") "files") " are named by "
   (:NEWTERM (:IDX "filename") "filenames") ", that a " (:TERM NIL "filename")
   " can be represented by a " (:TERM NIL "pathname") " " (:TERM NIL "object")
   ", and that given a " (:TERM NIL "pathname") " a " (:NEWTERM NIL "stream")
   " can be constructed that connects to a " (:TERM NIL "file") " whose "
   (:TERM NIL "filename") " it represents. " :PAR
   "For information about opening and closing " (:TERM NIL "files")
   ", and manipulating their contents, see " (:CHAPREF NIL :STREAMS) ". " :PAR
   (:NEXTFIGURE (:CAPS T)) " lists some " (:TERM NIL "operators")
   " that are applicable to " (:TERM NIL "files") " and directories. " :PAR
   (:TABLE (:NAME ("File and Directory Operations"))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " compile-file"))
     (:CELL NIL (:FUNREF NIL "file-length")) (:CELL NIL (:FUNREF NIL "open")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " delete-file"))
     (:CELL NIL (:FUNREF NIL "file-position"))
     (:CELL NIL (:FUNREF NIL "probe-file")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " directory"))
     (:CELL NIL (:FUNREF NIL "file-write-date"))
     (:CELL NIL (:FUNREF NIL "rename-file")))
    (:ROW NIL (:CELL NIL (:FUNREF NIL " file-author"))
     (:CELL NIL (:FUNREF NIL "load"))
     (:CELL NIL (:FUNREF NIL "with-open-file"))))
   " " :PAR
   (:SUBSECTION
    (:TITLE ("Coercion of Streams to Pathnames") :TAGS (:STREAMS-TO-PATHNAMES))
    " " :PAR "A " (:NEWTERM NIL "stream associated with a file")
    " is either a " (:TERM NIL "file stream") " or a "
    (:TERM NIL "synonym stream") " whose target is a "
    (:NEWTERM NIL "stream associated with a file")
    ". Such streams can be used as " (:TERM NIL "pathname designators") ". "
    :PAR "Normally, when a " (:TERM NIL "stream associated with a file")
    " is used as a " (:TERM NIL "pathname designator") ", it denotes the "
    (:TERM NIL "pathname") " used to open the " (:TERM NIL "file")
    "; this may be, but is not required to be, the actual name of the "
    (:TERM NIL "file") ". " :PAR "Some functions, such as "
    (:FUNREF NIL "truename") " and " (:FUNREF NIL "delete-file") ", coerce "
    (:TERM NIL "streams") " to " (:TERM NIL "pathnames")
    " in a different way that involves referring to the actual "
    (:TERM NIL "file")
    " that is open, which might or might not be the file whose name was opened originally. Such special situations are always notated specifically and are not the default. "
    :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("File Operations on Open and Closed Streams") :TAGS
     (:OPEN-AND-CLOSED-STREAMS))
    " " :PAR (:ISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " " :PAR
    "Many " (:TERM NIL "functions") " that perform " (:TERM NIL "file")
    " operations accept either " (:TERM NIL "open") " or " (:TERM NIL "closed")
    " " (:TERM NIL "streams") " as " (:TERM NIL "arguments") "; see "
    (:SECREF NIL :STREAM-ARGS-TO-STANDARDIZED-FNS) ". " :PAR "Of these, the "
    (:TERM NIL "functions") " in " (:NEXTFIGURE NIL) " treat "
    (:TERM NIL "open") " and " (:TERM NIL "closed") " " (:TERM NIL "streams")
    " differently. " :PAR
    (:TABLE
     (:NAME ("File Functions that Treat Open and Closed Streams Differently"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " delete-file"))
      (:CELL NIL (:FUNREF NIL "file-author"))
      (:CELL NIL (:FUNREF NIL "probe-file")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " directory"))
      (:CELL NIL (:FUNREF NIL "file-write-date"))
      (:CELL NIL (:FUNREF NIL "truename"))))
    " " :PAR "Since treatment of " (:TERM NIL "open") " " (:TERM NIL "streams")
    " by the " (:TERM NIL "file system") " may vary considerably between "
    (:TERM NIL "implementations") ", however, a " (:TERM NIL "closed") " "
    (:TERM NIL "stream") " might be the most reliable kind of "
    (:TERM NIL "argument")
    " for some of these functions—in particular, those in " (:NEXTFIGURE NIL)
    ". For example, in some " (:TERM NIL "file systems") ", "
    (:TERM NIL "open") " " (:TERM NIL "files")
    " are written under temporary names and not renamed until "
    (:TERM NIL "closed") " and/or are held invisible until "
    (:TERM NIL "closed")
    ". In general, any code that is intended to be portable should use such "
    (:TERM NIL "functions") " carefully. " :PAR
    (:TABLE (:NAME ("File Functions where Closed Streams Might Work Best"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " directory"))
      (:CELL NIL (:FUNREF NIL "probe-file"))
      (:CELL NIL (:FUNREF NIL "truename"))))
    " " (:ENDISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Truenames") :TAGS (:TRUENAMES)) " " :PAR "Many "
    (:TERM NIL "file systems") " permit more than one " (:TERM NIL "filename")
    " to designate a particular " (:TERM NIL "file") ". " :PAR
    "Even where multiple names are possible, most " (:TERM NIL "file systems")
    " have a convention for generating a canonical " (:TERM NIL "filename")
    " in such situations. Such a canonical " (:TERM NIL "filename") " (or the "
    (:TERM NIL "pathname") " representing such a " (:TERM NIL "filename")
    ") is called a " (:NEWTERM NIL "truename") ". " :PAR
    (:COMMENT NIL "This came from the CLtL description of PROBE-FILE") "The "
    (:TERM NIL "truename") " of a " (:TERM NIL "file")
    " may differ from other " (:TERM NIL "filenames")
    " for the file because of symbolic links, version numbers, "
    (:COMMENT NIL
     " Added to distinguish from Sandra's addition that follows. -kmp 12-Dec-91")
    "logical device translations in the " (:TERM NIL "file system") ", "
    (:COMMENT NIL " Added per Sandra. -kmp 12-Dec-91")
    (:TERM NIL "logical pathname") " translations within "
    (:RM NIL " Common Lisp") ", or other artifacts of the "
    (:TERM NIL "file system") ". " :PAR "The " (:TERM NIL "truename") " for a "
    (:TERM NIL "file") " is often, but not necessarily, unique for each "
    (:TERM NIL "file") ". For instance, a Unix " (:TERM NIL "file")
    " with multiple hard links could have several " (:TERM NIL "truenames")
    ". " :PAR
    (:SUBSUBSECTION (:TITLE ("Examples of Truenames"))
     "For example, a DEC TOPS-20 system with " (:TERM NIL "files") " "
     (:TT NIL "PS:<JOE>FOO.TXT.1") " and " (:TT NIL "PS:<JOE>FOO.TXT.2")
     " might permit the second " (:TERM NIL "file") " to be referred to as "
     (:TT NIL "PS:<JOE>FOO.TXT.0") ", since the “" (:TT NIL ".0")
     "” notation denotes “newest” version of several " (:TERM NIL "files")
     ". In the same " (:TERM NIL "file system") ", a “logical device” “"
     (:TT NIL "JOE:") "” might be taken to refer to " (:TT NIL "PS:<JOE>")
     "” and so the names " (:TT NIL "JOE:FOO.TXT.2") " or "
     (:TT NIL "JOE:FOO.TXT.0") " might refer to " (:TT NIL "PS:<JOE>FOO.TXT.2")
     ". In all of these cases, the " (:TERM NIL "truename")
     " of the file would probably be " (:TT NIL "PS:<JOE>FOO.TXT.2") ". " :PAR
     "If a " (:TERM NIL "file") " is a symbolic link to another "
     (:TERM NIL "file") " (in a " (:TERM NIL "file system")
     " permitting such a thing), it is conventional for the "
     (:TERM NIL "truename") " to be the canonical name of the "
     (:TERM NIL "file")
     " after any symbolic links have been followed; that is, it is the canonical name of the "
     (:TERM NIL "file") " whose contents would become available if an "
     (:TERM NIL "input") " " (:TERM NIL "stream") " to that "
     (:TERM NIL "file") " were opened. " :PAR "In the case of a "
     (:TERM NIL "file") " still being created (that is, of an "
     (:TERM NIL "output") " " (:TERM NIL "stream") " open to such a "
     (:TERM NIL "file") "), the exact " (:TERM NIL "truename")
     " of the file might not be known until the " (:TERM NIL "stream")
     " is closed. In this case, the " (:TERM NIL "function") " "
     (:FUNREF NIL "truename") " might return different values for such a "
     (:TERM NIL "stream")
     " before and after it was closed. In fact, before it is closed, the name returned might not even be a valid name in the "
     (:TERM NIL "file system")
     "—for example, while a file is being written, it might have version "
     (:KWD NIL "newest")
     " and might only take on a specific numeric value later when the file is closed even in a "
     (:TERM NIL "file system") " where all files have numeric versions. " :PAR)
    :PAR))
  :PAR
  (:DICTIONARY NIL :PAR
   (:COMMENT NIL " Files" "  Directory" "   Directory Query"
    "    File Properties" "   Directory Modification")
   :PAR
   (:COMMENT NIL "-------------------- Directory Query --------------------")
   :PAR (:COMMENT NIL "%% ========== DIRECTORY")
   (:COM (:NAME "directory" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "directory")
      (:ARGLIST NIL "pathspec " (:KEYWORD NIL " &key"))
      (:VALUES NIL "pathnames"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " " (:PARAM NIL "pathspec") "—a "
     (:TERM NIL "pathname designator") ", which may contain "
     (:TERM NIL "wild") " components. " (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD")
     " " :PAR (:PARAM NIL "pathnames") "—a " (:TERM NIL "list") " of "
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " " (:TERM NIL "physical pathnames")
     ". " (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 23.5.0 4") :PAR
     "Determines which, if any, " (:TERM NIL "files")
     " that are present in the file system have names matching "
     (:PARAM NIL "pathspec") ", and returns a "
     (:ISSUE NIL "RESULT-LISTS-SHARED:SPECIFY") " " (:TERM NIL "fresh") " "
     (:ENDISSUE NIL "RESULT-LISTS-SHARED:SPECIFY") " " (:TERM NIL "list")
     " of " (:TERM NIL "pathnames") " corresponding to the "
     (:TERM NIL "truenames") " of those " (:TERM NIL "files") ". " :PAR "An "
     (:TERM NIL "implementation") " may be extended to accept "
     (:TERM NIL "implementation-defined") " keyword arguments to "
     (:FUNREF NIL "directory") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The host computer's file system. "
     :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR")
     " If the attempt to obtain a directory listing is not successful, an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error") " is signaled. "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:TYPEREF NIL "pathname") ", "
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " " (:TYPEREF NIL "logical-pathname")
     ", " (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:FUNREF NIL "ensure-directories-exist") ", "
     (:SECREF NIL :FILE-SYSTEM-CONCEPTS) ", "
     (:SECREF NIL :OPEN-AND-CLOSED-STREAMS) ", "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "If the " (:PARAM NIL "pathspec")
     " is not " (:TERM NIL "wild")
     ", the resulting list will contain either zero or one elements. " :PAR
     (:RM NIL " Common Lisp") " specifies “" (:KEYWORD NIL " &key")
     "” in the argument list to " (:FUNREF NIL "directory") " even though no "
     (:TERM NIL "standardized") " keyword arguments to "
     (:FUNREF NIL "directory") " are defined. “"
     (:TT NIL ":allow-other-keys t") "” may be used in "
     (:TERM NIL "conforming programs")
     " in order to quietly ignore any additional keywords which are passed by the program but not supported by the "
     (:TERM NIL "implementation") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PROBE-FILE")
   (:COM (:NAME "probe-file" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "probe-file")
      (:ARGLIST NIL "pathspec") (:VALUES NIL "truename"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " " (:PARAM NIL "pathspec") "—a "
     (:TERM NIL "pathname designator") ". "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " " (:PARAM NIL "truename") "—a "
     (:TERM NIL "physical pathname") " or " (:MISC NIL "nil") ". "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "probe-file")
     " tests whether a file exists. " :PAR (:COMMENT NIL "% 23.3.0 12")
     (:FUNREF NIL "probe-file") " returns " (:TERM NIL "false")
     " if there is no file named " (:PARAM NIL "pathspec")
     ", and otherwise returns the " (:TERM NIL "truename") " of "
     (:PARAM NIL "pathspec") ". " :PAR "If the " (:PARAM NIL "pathspec") " "
     (:TERM NIL "designator") " is an open " (:TERM NIL "stream") ", then "
     (:FUNREF NIL "probe-file") " produces the " (:TERM NIL "truename")
     " of its associated " (:TERM NIL "file") ". "
     (:COMMENT NIL
      "!!! Sandra wonders if the following is implied by \"pathname designator\":")
     (:ISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " If "
     (:PARAM NIL "pathspec") " is a " (:TERM NIL "stream")
     ", whether open or closed, it is coerced to a " (:TERM NIL "pathname")
     " as if by the " (:TERM NIL "function") " " (:FUNREF NIL "pathname") ". "
     (:ENDISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The host computer's file system. "
     :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:ISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error") " is signaled if "
     (:PARAM NIL "pathspec") " is " (:TERM NIL "wild") ". "
     (:ENDISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:COMMENT NIL "% Wording changed per x3j13 (05-Oct-93) -kmp"
      " If the probe attempt is not successful,"
      " an error \\oftype{file-error} is signaled.")
     "An error of " (:TERM NIL "type") " " (:TYPEREF NIL "file-error")
     " is signaled if the " (:TERM NIL "file system")
     " cannot perform the requested operation. "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "truename") ", "
     (:FUNREF NIL "open") ", " (:FUNREF NIL "ensure-directories-exist") ", "
     (:TYPEREF NIL "pathname") ", " (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:TYPEREF NIL "logical-pathname") ", "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:SECREF NIL :FILE-SYSTEM-CONCEPTS) ", "
     (:SECREF NIL :OPEN-AND-CLOSED-STREAMS) ", "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ENSURE-DIRECTORIES-EXIST")
   (:COM (:NAME "ensure-directories-exist" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "ensure-directories-exist")
      (:ARGLIST NIL "pathspec " (:KEYWORD NIL " &key") " verbose")
      (:VALUES NIL "pathspec, created"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "pathspec")
     "—a " (:TERM NIL "pathname designator") ". " :PAR (:PARAM NIL "verbose")
     "—a " (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "created")
     "—a " (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "Tests whether the directories containing the specified "
     (:TERM NIL "file")
     " actually exist, and attempts to create them if they do not. " :PAR
     "If the containing directories do not exist and if "
     (:PARAM NIL "verbose") " is " (:TERM NIL "true") ", then the "
     (:TERM NIL "implementation")
     " is permitted (but not required) to perform output to "
     (:TERM NIL "standard output")
     " saying what directories were created. If the containing directories exist, or if "
     (:PARAM NIL "verbose") " is " (:TERM NIL "false")
     ", this function performs no output. " :PAR "The "
     (:TERM NIL "primary value") " is the given " (:PARAM NIL "pathspec")
     " so that this operation can be straightforwardly composed with other file manipulation expressions. The "
     (:TERM NIL "secondary value") ", " (:PARAM NIL "created") ", is "
     (:TERM NIL "true") " if any directories were created. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The host computer's file system. "
     :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:COMMENT NIL
      "% Confusion over type of error signaled resolved by x3j13 05-Oct-93"
      "%  (type-error => file-error). -kmp")
     "An error of " (:TERM NIL "type") " " (:TYPEREF NIL "file-error")
     " is signaled if the host, device, or directory part of "
     (:PARAM NIL "pathspec") " is " (:TERM NIL "wild") ". "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR")
     " If the directory creation attempt is not successful, an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error")
     " is signaled; if this occurs, it might be the case that none, some, or all of the requested creations have actually occurred within the "
     (:TERM NIL "file system") ". "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR
     (:COMMENT NIL "% Removed per X3J13 05-Oct-93."
      "%  See first paragraph of Exceptional Situations above. -kmp"
      " \\issue{FILE-OPEN-ERROR:SIGNAL-FILE-ERROR}"
      " An error \\oftype{file-error} might be signaled if \\param{pathspec}"
      " is a \\term{designator} for a \\term{wild} \\term{pathname}."
      " \\endissue{FILE-OPEN-ERROR:SIGNAL-FILE-ERROR}")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "probe-file") ", "
     (:FUNREF NIL "open") ", " (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR")
     " " (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== TRUENAME")
   (:COM (:NAME "truename" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "truename") (:ARGLIST NIL "filespec")
      (:VALUES NIL "truename"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " " (:PARAM NIL "filespec") "—a "
     (:TERM NIL "pathname designator") ". "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " " (:PARAM NIL "truename") "—a "
     (:TERM NIL "physical pathname") ". "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "truename")
     " tries to find the " (:TERM NIL "file") " indicated by "
     (:PARAM NIL "filespec") " and returns its " (:TERM NIL "truename") ". "
     (:COMMENT NIL
      "!!! Sandra wonders if the following is implied by \"pathname designator\":"
      "% 23.1.2 6")
     "If the " (:PARAM NIL "filespec") " " (:TERM NIL "designator")
     " is an open " (:TERM NIL "stream") ", its associated " (:TERM NIL "file")
     " is used. " (:ISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " If "
     (:PARAM NIL "filespec") " is a " (:TERM NIL "stream") ", "
     (:FUNREF NIL "truename") " can be used whether the " (:TERM NIL "stream")
     " is open or closed. It is permissible for " (:FUNREF NIL "truename")
     " to return more specific information after the " (:TERM NIL "stream")
     " is closed than when the " (:TERM NIL "stream") " was open. "
     (:ENDISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " If "
     (:PARAM NIL "filespec") " is a " (:TERM NIL "pathname")
     " it represents the name used to open the file. This may be, but is not required to be, the actual name of the file. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      ";; An example involving version numbers.  Note that the precise nature of
;; the truename is implementation-dependent while the file is still open.
 (with-open-file (stream \">vistor>test.text.newest\")
   (values (pathname stream)
           (truename stream)))
→ #P\"S:>vistor>test.text.newest\", #P\"S:>vistor>test.text.1\"
OR→ #P\"S:>vistor>test.text.newest\", #P\"S:>vistor>test.text.newest\"
OR→ #P\"S:>vistor>test.text.newest\", #P\"S:>vistor>_temp_._temp_.1\"

;; In this case, the file is closed when the truename is tried, so the
;; truename information is reliable.
 (with-open-file (stream \">vistor>test.text.newest\")
   (close stream)
   (values (pathname stream)
           (truename stream)))
→ #P\"S:>vistor>test.text.newest\", #P\"S:>vistor>test.text.1\"

;; An example involving TOP-20's implementation-dependent concept 
;; of logical devices -- in this case, \"DOC:\" is shorthand for
;; \"PS:<DOCUMENTATION>\" ...
 (with-open-file (stream \"CMUC::DOC:DUMPER.HLP\")
   (values (pathname stream)
           (truename stream)))
→ #P\"CMUC::DOC:DUMPER.HLP\", #P\"CMUC::PS:<DOCUMENTATION>DUMPER.HLP.13\"
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error")
     " is signaled if an appropriate " (:TERM NIL "file")
     " cannot be located within the " (:TERM NIL "file system")
     " for the given " (:PARAM NIL "filespec") ", "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:COMMENT NIL "% Additional constraint per x3j13 (05-Oct-93) -kmp")
     "or if the " (:TERM NIL "file system")
     " cannot perform the requested operation. "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:ISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error") " is signaled if "
     (:PARAM NIL "pathname") " is " (:TERM NIL "wild") ". "
     (:ENDISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:TYPEREF NIL "pathname") ", " (:TYPEREF NIL "logical-pathname") ", "
     (:SECREF NIL :FILE-SYSTEM-CONCEPTS) ", "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 23.1.2 7")
     (:FUNREF NIL "truename") " may be used to account for any "
     (:TERM NIL "filename") " translations performed by the "
     (:TERM NIL "file system") ". " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- File Properties --------------------")
   :PAR (:COMMENT NIL "%% ========== FILE-AUTHOR")
   (:COM (:NAME "file-author" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "file-author")
      (:ARGLIST NIL "pathspec") (:VALUES NIL "author"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " " (:PARAM NIL "pathspec") "—a "
     (:TERM NIL "pathname designator") ". "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR (:PARAM NIL "author")
     "—a " (:TERM NIL "string") " or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 23.3.0 15")
     "Returns a " (:TERM NIL "string") " naming the author of the "
     (:TERM NIL "file") " specified by " (:PARAM NIL "pathspec") ", or "
     (:MISC NIL "nil") " if the author's name cannot be determined. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (with-open-file (stream \">relativity>general.text\")
   (file-author stream))
→ \"albert\"
")
     " " :PAR)
    (:PART (:NAME "Affected By") " The host computer's file system. " :PAR
     "Other users of the " (:TERM NIL "file") " named by "
     (:PARAM NIL "pathspec") ". ")
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:ISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error") " is signaled if "
     (:PARAM NIL "pathspec") " is " (:TERM NIL "wild") ". "
     (:ENDISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:COMMENT NIL "% Wording changed per x3j13 (05-Oct-93) -kmp"
      " If the attempt to obtain authorship information is not successful,"
      " an error \\oftype{file-error} is signaled.")
     "An error of " (:TERM NIL "type") " " (:TYPEREF NIL "file-error")
     " is signaled if the " (:TERM NIL "file system")
     " cannot perform the requested operation. "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:TYPEREF NIL "pathname") ", " (:TYPEREF NIL "logical-pathname") ", "
     (:SECREF NIL :FILE-SYSTEM-CONCEPTS) ", "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FILE-WRITE-DATE")
   (:COM (:NAME "file-write-date" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "file-write-date")
      (:ARGLIST NIL "pathspec") (:VALUES NIL "date"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " " (:PARAM NIL "pathspec") "—a "
     (:TERM NIL "pathname designator") ". "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR (:PARAM NIL "date") "—a "
     (:TERM NIL "universal time") " or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 23.3.0 14")
     "Returns a " (:TERM NIL "universal time")
     " representing the time at which the " (:TERM NIL "file") " specified by "
     (:PARAM NIL "pathspec") " was last written (or created), or returns "
     (:MISC NIL "nil") " if such a time cannot be determined. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (with-open-file (s \"noel.text\" 
                    :direction :output :if-exists :error)
   (format s \"~&Dear Santa,~2%I was good this year.  ~
                Please leave lots of toys.~2%Love, Sue~
             ~2%attachments: milk, cookies~%\")
   (truename s))
→ #P\"CUPID:/susan/noel.text\"
 (with-open-file (s \"noel.text\")
   (file-write-date s))
→ 2902600800
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The host computer's file system. "
     :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:ISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error") " is signaled if "
     (:PARAM NIL "pathspec") " is " (:TERM NIL "wild") ". "
     (:ENDISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:COMMENT NIL "% Wording changed per x3j13 (05-Oct-93) -kmp"
      " If the attempt to obtain write-date information is not successful,"
      " an error \\oftype{file-error} is signaled.")
     "An error of " (:TERM NIL "type") " " (:TYPEREF NIL "file-error")
     " is signaled if the " (:TERM NIL "file system")
     " cannot perform the requested operation. "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :UNIVERSAL-TIME) ", "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL
    "-------------------- Directory Modification --------------------")
   :PAR (:COMMENT NIL "%% ========== RENAME-FILE")
   (:COM (:NAME "rename-file" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "rename-file")
      (:ARGLIST NIL "filespec new-name")
      (:VALUES NIL "defaulted-new-name, old-truename, new-truename"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " " (:PARAM NIL "filespec") "—a "
     (:TERM NIL "pathname designator") ". "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR (:PARAM NIL "new-name")
     "—a " (:TERM NIL "pathname designator") " "
     (:COMMENT NIL
      "!!! it used to say (or pathname string symbol), so I added this for now ... ??")
     "other than a " (:TERM NIL "stream") ". " :PAR
     (:PARAM NIL "defaulted-new-name") "—a " (:TERM NIL "pathname") " " :PAR
     (:PARAM NIL "old-truename") "—a " (:TERM NIL "physical pathname") ". "
     :PAR (:PARAM NIL "new-truename") "—a " (:TERM NIL "physical pathname")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 23.3.0 3")
     (:FUNREF NIL "rename-file")
     " modifies the file system in such a way that the file indicated by "
     (:PARAM NIL "filespec") " is renamed to "
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93" "\\param{new-name}.")
     (:PARAM NIL "defaulted-new-name") ". " :PAR
     (:COMMENT NIL "% 23.3.0 6"
      "!!! Sandra asks whether this first is a prohition on \"filespec\" or \"new-name\" or both?")
     "It is an error to specify a filename containing a " (:TERM NIL "wild")
     " component, for " (:PARAM NIL "filespec") " to contain a "
     (:MISC NIL "nil") " component where the file system does not permit a "
     (:MISC NIL "nil")
     " component, or for the result of defaulting missing components of "
     (:PARAM NIL "new-name") " from " (:PARAM NIL "filespec") " to contain a "
     (:MISC NIL "nil") " component where the file system does not permit a "
     (:MISC NIL "nil") " component. " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD")
     " If " (:PARAM NIL "new-name") " is a " (:TERM NIL "logical pathname")
     ", " (:FUNREF NIL "rename-file") " returns a "
     (:TERM NIL "logical pathname") " as its " (:TERM NIL "primary value") ". "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR
     (:COMMENT NIL "% 23.3.0 4") (:FUNREF NIL "rename-file")
     " returns three values if successful. The " (:TERM NIL "primary value")
     ", " (:PARAM NIL "defaulted-new-name")
     ", is the resulting name which is composed of " (:PARAM NIL "new-name")
     " with any missing components filled in by performing a "
     (:FUNREF NIL "merge-pathnames") " operation using "
     (:PARAM NIL "filespec") " as the defaults. The "
     (:TERM NIL "secondary value") ", " (:PARAM NIL "old-truename") ", is the "
     (:TERM NIL "truename") " of the " (:TERM NIL "file")
     " before it was renamed. The " (:TERM NIL "tertiary value") ", "
     (:PARAM NIL "new-truename") ", is the " (:TERM NIL "truename") " of the "
     (:TERM NIL "file") " after it was renamed. " :PAR "If the "
     (:PARAM NIL "filespec") " " (:TERM NIL "designator") " is an open "
     (:TERM NIL "stream") ", then the " (:TERM NIL "stream")
     " itself and the file associated with it are affected (if the "
     (:TERM NIL "file system") " permits). " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL ";; An example involving logical pathnames.
 (with-open-file (stream \"sys:chemistry;lead.text\"
                         :direction :output :if-exists :error)
   (princ \"eureka\" stream)
   (values (pathname stream) (truename stream)))
→ #P\"SYS:CHEMISTRY;LEAD.TEXT.NEWEST\", #P\"Q:>sys>chem>lead.text.1\"
 (rename-file \"sys:chemistry;lead.text\" \"gold.text\")
→ #P\"SYS:CHEMISTRY;GOLD.TEXT.NEWEST\",
   #P\"Q:>sys>chem>lead.text.1\",
   #P\"Q:>sys>chem>gold.text.1\"
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL "% 23.3.0 5")
     "If the renaming operation is not successful, an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error") " is signaled. " :PAR
     (:ISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error")
     " might be signaled if " (:PARAM NIL "filespec") " is " (:TERM NIL "wild")
     ". "
     (:COMMENT NIL
      "!!! Sandra asks whether this should extend to  \"new-name\" as well?")
     (:ENDISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:FUNREF NIL "truename") ", " (:TYPEREF NIL "pathname") ", "
     (:TYPEREF NIL "logical-pathname") ", " (:SECREF NIL :FILE-SYSTEM-CONCEPTS)
     ", " (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DELETE-FILE")
   (:COM (:NAME "delete-file" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "delete-file")
      (:ARGLIST NIL "filespec") (:VALUES NIL (:MISC NIL "t")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " " (:PARAM NIL "filespec") "—a "
     (:TERM NIL "pathname designator") ". "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "Deletes the " (:TERM NIL "file")
     " specified by " (:PARAM NIL "filespec") ". " :PAR
     (:COMMENT NIL "!!! Sandra thinks this makes no sense. -kmp 12-Dec-91")
     "If the " (:PARAM NIL "filespec") " " (:TERM NIL "designator")
     " is an open " (:TERM NIL "stream") ", then " (:PARAM NIL "filespec")
     " and the file associated with it are affected (if the file system permits), in which case "
     (:PARAM NIL "filespec")
     " might be closed immediately, and the deletion might be immediate or delayed until "
     (:PARAM NIL "filespec")
     " is explicitly closed, depending on the requirements of the file system. "
     :PAR "It is " (:TERM NIL "implementation-dependent")
     " whether an attempt to delete a nonexistent file is considered to be successful. "
     :PAR (:COMMENT NIL "% 23.3.0 8" "% 23.3.0 9") (:FUNREF NIL "delete-file")
     " returns " (:TERM NIL "true") " if it succeeds, or signals an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error") " if it does not. "
     :PAR (:COMMENT NIL "% 23.3.0 10") "The consequences are undefined if "
     (:PARAM NIL "filespec") " has a " (:TERM NIL "wild") " component, or if "
     (:PARAM NIL "filespec") " has a " (:MISC NIL "nil")
     " component and the file system does not permit a " (:MISC NIL "nil")
     " component. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (with-open-file (s \"delete-me.text\" :direction :output :if-exists :error))
→ NIL
 (setq p (probe-file \"delete-me.text\")) → #P\"R:>fred>delete-me.text.1\"
 (delete-file p) → T
 (probe-file \"delete-me.text\") → "
      (:TERM NIL "false") "
 (with-open-file (s \"delete-me.text\" :direction :output :if-exists :error)
   (delete-file s))
→ T
 (probe-file \"delete-me.text\") → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "If the deletion operation is not successful, an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error") " is signaled. " :PAR
     (:ISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error")
     " might be signaled if " (:PARAM NIL "filespec") " is " (:TERM NIL "wild")
     ". " (:ENDISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:TYPEREF NIL "pathname") ", " (:TYPEREF NIL "logical-pathname") ", "
     (:SECREF NIL :FILE-SYSTEM-CONCEPTS) ", "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- File Errors --------------------") :PAR
   (:COM (:NAME "file-error" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "file-error") ", "
     (:TYPEREF NIL "error") ", " (:TYPEREF NIL "serious-condition") ", "
     (:TYPEREF NIL "condition") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "file-error")
     " consists of error conditions that occur during an attempt to open or close a file, or during some low-level transactions with a file system. The “offending pathname” is initialized by the "
     (:KWD NIL "pathname") " initialization argument to "
     (:FUNREF NIL "make-condition") ", and is " (:TERM NIL "accessed")
     " by the " (:TERM NIL "function") " " (:FUNREF NIL "file-error-pathname")
     ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR "file-error-pathname, "
     (:FUNREF NIL "open") ", " (:FUNREF NIL "probe-file") ", "
     (:FUNREF NIL "directory") ", " (:FUNREF NIL "ensure-directories-exist")
     " " :PAR))
   :PAR (:COMMENT NIL "%% ========== FILE-ERROR-PATHNAME")
   (:COM (:NAME "file-error-pathname" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "file-error-pathname")
      (:ARGLIST NIL "condition") (:VALUES NIL "pathspec"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "condition")
     "—a " (:TERM NIL "condition") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "file-error") ". " :PAR (:PARAM NIL "pathspec") "—a "
     (:TERM NIL "pathname designator") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "Returns the “offending pathname” of a " (:TERM NIL "condition") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL
      " This might signal an error (probably TYPE-ERROR, but you can't say that"
      " because it's not been voted in yet) if argument is not of correct type."
      " (Part of the issue here is whether anyone might define other signatures.)")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:TYPEREF NIL "file-error") ", "
     (:SECREF NIL :CONDITIONS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL
      "% Removed because no primitive is provided to do this! -kmp"
      "It is an error to use \\macref{setf} with \\funref{file-error-pathname}.")
     :PAR))
   " ")
  " " :PAR)
 (:CHAPTER
  (:NUM "21" :TITLE ("Streams") :NUMTAG :CHAP-TWENTY-ONE :NAMETAG :STREAMS)
  (:SECTION (:TITLE ("Stream Concepts") :TAGS (:STREAM-CONCEPTS)) " " :PAR
   (:SUBSECTION (:TITLE ("Introduction to Streams")) "A "
    (:NEWTERM NIL "stream") " is an " (:TERM NIL "object")
    " that can be used with an input or output function to identify an appropriate source or sink of "
    (:TERM NIL "characters") " or " (:TERM NIL "bytes") " for that operation. "
    (:COMMENT NIL "% 21.0.0 3" "% 21.0.0 4") "A " (:NEWTERM NIL "character")
    " " (:NEWTERM NIL "stream") " is a source or sink of "
    (:TERM NIL "characters") ". A " (:NEWTERM NIL "binary") " "
    (:NEWTERM NIL "stream") " is a source or sink of " (:TERM NIL "bytes") ". "
    :PAR "Some operations may be performed on any kind of "
    (:TERM NIL "stream") "; " (:NEXTFIGURE NIL) " provides a list of "
    (:TERM NIL "standardized")
    " operations that are potentially useful with any kind of "
    (:TERM NIL "stream") ". " :PAR
    (:TABLE (:NAME ("Some General-Purpose Stream Operations"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " close"))
      (:CELL NIL (:FUNREF NIL "stream-element-type")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " input-stream-p"))
      (:CELL NIL (:FUNREF NIL "streamp")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " interactive-stream-p"))
      (:CELL NIL (:FUNREF NIL "with-open-stream")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " output-stream-p")) (:CELL NIL)))
    " " :PAR "Other operations are only meaningful on certain "
    (:TERM NIL "stream") " " (:TERM NIL "types") ". For example, "
    (:FUNREF NIL "read-char") " is only defined for " (:TERM NIL "character")
    " " (:TERM NIL "streams") " and " (:FUNREF NIL "read-byte")
    " is only defined for " (:TERM NIL "binary") " " (:TERM NIL "streams") ". "
    :PAR
    (:SUBSUBSECTION (:TITLE ("Abstract Classifications of Streams"))
     (:SUBSUBSUBSECTION (:TITLE ("Input, Output, and Bidirectional Streams"))
      "A " (:TERM NIL "stream") ", whether a " (:TERM NIL "character") " "
      (:TERM NIL "stream") " or a " (:TERM NIL "binary") " "
      (:TERM NIL "stream") ", can be an " (:NEWTERM NIL "input") " "
      (:NEWTERM NIL "stream") " (source of data), an " (:NEWTERM NIL "output")
      " " (:NEWTERM NIL "stream") " (sink for data), both, or ("
      (:I NIL "e.g.") ",  when “" (:TT NIL ":direction :probe")
      "” is given to " (:FUNREF NIL "open") ") neither. " :PAR
      (:NEXTFIGURE (:CAPS T)) " shows " (:TERM NIL "operators") " relating to "
      (:TERM NIL "input") " " (:TERM NIL "streams") ". " :PAR " "
      (:TABLE
       (:NAME ("Operators relating to Input Streams.") :TAGS
        (:INPUT-STREAM-OPS))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " clear-input"))
        (:CELL NIL (:FUNREF NIL "read-byte"))
        (:CELL NIL (:FUNREF NIL "read-from-string")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " listen"))
        (:CELL NIL (:FUNREF NIL "read-char"))
        (:CELL NIL (:FUNREF NIL "read-line")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " peek-char"))
        (:CELL NIL (:FUNREF NIL "read-char-no-hang"))
        (:CELL NIL (:FUNREF NIL "read-preserving-whitespace")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " read"))
        (:CELL NIL (:FUNREF NIL "read-delimited-list"))
        (:CELL NIL (:FUNREF NIL "unread-char"))))
      " " :PAR (:NEXTFIGURE (:CAPS T)) " shows " (:TERM NIL "operators")
      " relating to " (:TERM NIL "output") " " (:TERM NIL "streams") ". " :PAR
      " "
      (:TABLE
       (:NAME ("Operators relating to Output Streams.") :TAGS
        (:OUTPUT-STREAM-OPS))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " clear-output"))
        (:CELL NIL (:FUNREF NIL "prin1")) (:CELL NIL (:FUNREF NIL "write")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " finish-output"))
        (:CELL NIL (:FUNREF NIL "prin1-to-string"))
        (:CELL NIL (:FUNREF NIL "write-byte")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " force-output"))
        (:CELL NIL (:FUNREF NIL "princ"))
        (:CELL NIL (:FUNREF NIL "write-char")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " format"))
        (:CELL NIL (:FUNREF NIL "princ-to-string"))
        (:CELL NIL (:FUNREF NIL "write-line")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " fresh-line"))
        (:CELL NIL (:FUNREF NIL "print"))
        (:CELL NIL (:FUNREF NIL "write-string")))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " pprint"))
        (:CELL NIL (:FUNREF NIL "terpri"))
        (:CELL NIL (:FUNREF NIL "write-to-string"))))
      " " :PAR "A " (:TERM NIL "stream") " that is both an "
      (:TERM NIL "input") " " (:TERM NIL "stream") " and an "
      (:TERM NIL "output") " " (:TERM NIL "stream") " is called a "
      (:NEWTERM NIL "bidirectional") " " (:NEWTERM NIL "stream") ". See the "
      (:TERM NIL "functions") " " (:FUNREF NIL "input-stream-p") " and "
      (:FUNREF NIL "output-stream-p") ". " :PAR "Any of the "
      (:TERM NIL "operators") " listed in " (:FIGREF NIL :INPUT-STREAM-OPS)
      " or " (:FIGREF NIL :OUTPUT-STREAM-OPS) " can be used with "
      (:TERM NIL "bidirectional") " " (:TERM NIL "streams") ". In addition, "
      (:NEXTFIGURE NIL) " shows a list of " (:TERM NIL "operators")
      " that relate specificaly to " (:TERM NIL "bidirectional") " "
      (:TERM NIL "streams") ". " :PAR
      (:TABLE (:NAME ("Operators relating to Bidirectional Streams."))
       (:ROW NIL (:CELL NIL (:FUNREF NIL " y-or-n-p"))
        (:CELL NIL (:FUNREF NIL "yes-or-no-p"))))
      " " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Open and Closed Streams") :TAGS (:OPEN-AND-CLOSED-STREAMS)) " "
      :PAR (:TERM NIL "Streams") " are either " (:NEWTERM NIL "open") " or "
      (:NEWTERM NIL "closed") ". " :PAR
      "Except as explicitly specified otherwise, operations that create and return "
      (:TERM NIL "streams") " return " (:TERM NIL "open") " "
      (:TERM NIL "streams") ". " :PAR "The action of " (:TERM NIL "closing")
      " a " (:TERM NIL "stream")
      " marks the end of its use as a source or sink of data, permitting the "
      (:TERM NIL "implementation")
      " to reclaim its internal data structures, and to free any external resources which might have been locked by the "
      (:TERM NIL "stream") " when it was opened. " :PAR
      "Except as explicitly specified otherwise, the consequences are undefined when a "
      (:TERM NIL "closed") " " (:TERM NIL "stream") " is used where a "
      (:TERM NIL "stream") " is called for. " :PAR "Coercion of "
      (:TERM NIL "streams") " to " (:TERM NIL "pathnames")
      " is permissible for " (:TERM NIL "closed") " " (:TERM NIL "streams")
      "; in some situations, such as for a " (:TERM NIL "truename")
      " computation, the result might be different for an " (:TERM NIL "open")
      " " (:TERM NIL "stream") " and for that same " (:TERM NIL "stream")
      " once it has been " (:TERM NIL "closed") ". " :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Interactive Streams") :TAGS (:INTERACTIVE-STREAMS)) " " :PAR
      "An " (:NEWTERM NIL "interactive stream")
      " is one on which it makes sense to perform interactive querying. " :PAR
      "The precise meaning of an " (:TERM NIL "interactive stream") " is "
      (:TERM NIL "implementation-defined")
      ", and may depend on the underlying operating system. Some examples of the things that an "
      (:TERM NIL "implementation")
      " might choose to use as identifying characteristics of an "
      (:TERM NIL "interactive stream") " include: " :PAR
      (:LIST NIL
       (:ITEM NIL " The " (:TERM NIL "stream")
        " is connected to a person (or equivalent) in such a way that the program can prompt for information and expect to receive different input depending on the prompt. "
        :PAR)
       (:ITEM NIL
        " The program is expected to prompt for input and support “normal input editing”. "
        :PAR)
       (:ITEM NIL " " (:FUNREF NIL "read-char")
        " might wait for the user to type something before returning instead of immediately returning a character or end-of-file. "
        :PAR))
      " " :PAR "The general intent of having some " (:TERM NIL "streams")
      " be classified as " (:TERM NIL "interactive streams")
      " is to allow them to be distinguished from streams containing batch (or background or command-file) input. Output to batch streams is typically discarded or saved for later viewing, so interactive queries to such streams might not have the expected effect. "
      :PAR (:TERM NIL "Terminal I/O") " might or might not be an "
      (:TERM NIL "interactive stream") ". " :PAR)
     :PAR)
    (:SUBSUBSECTION (:TITLE ("Abstract Classifications of Streams"))
     (:SUBSUBSUBSECTION (:TITLE ("File Streams")) "Some " (:TERM NIL "streams")
      ", called " (:NEWTERM (:IDX "file stream") "file streams")
      ", provide access to " (:TERM NIL "files") ". An " (:TERM NIL "object")
      " of " (:TERM NIL "class") " " (:TYPEREF NIL "file-stream")
      " is used to represent a " (:TERM NIL "file stream") ". " :PAR
      "The basic operation for opening a " (:TERM NIL "file") " is "
      (:FUNREF NIL "open") ", which typically returns a "
      (:TERM NIL "file stream")
      " (see its dictionary entry for details). The basic operation for closing a "
      (:TERM NIL "stream") " is " (:FUNREF NIL "close") ". The macro "
      (:MACREF NIL "with-open-file")
      " is useful to express the common idiom of opening a " (:TERM NIL "file")
      " for the duration of a given body of " (:TERM NIL "code")
      ", and assuring that the resulting " (:TERM NIL "stream")
      " is closed upon exit from that body. " :PAR)
     :PAR)
    (:SUBSUBSECTION (:TITLE ("Other Subclasses of Stream")) "The "
     (:TERM NIL "class") " " (:TYPEREF NIL "stream") " has a number of "
     (:TERM NIL "subclasses") " defined by this specification. "
     (:NEXTFIGURE (:CAPS T)) " shows some information about these subclasses. "
     :PAR
     (:TABLE (:NAME ("Defined Names related to Specialized Streams"))
      (:ROW NIL (:CELL NIL "Class") (:CELL NIL "Related Operators"))
      (:ROW NIL (:CELL NIL (:TYPEREF NIL "broadcast-stream"))
       (:CELL NIL (:FUNREF NIL "make-broadcast-stream") (:BR NIL)
        (:FUNREF NIL "broadcast-stream-streams")))
      (:ROW NIL (:CELL NIL (:TYPEREF NIL "concatenated-stream"))
       (:CELL NIL (:FUNREF NIL "make-concatenated-stream") (:BR NIL)
        (:FUNREF NIL "concatenated-stream-streams")))
      (:ROW NIL (:CELL NIL (:TYPEREF NIL "echo-stream"))
       (:CELL NIL (:FUNREF NIL "make-echo-stream") (:BR NIL)
        (:FUNREF NIL "echo-stream-input-stream") (:BR NIL)
        (:FUNREF NIL "echo-stream-output-stream")))
      (:ROW NIL (:CELL NIL (:TYPEREF NIL "string-stream"))
       (:CELL NIL (:FUNREF NIL "make-string-input-stream") (:BR NIL)
        (:MACREF NIL "with-input-from-string") (:BR NIL)
        (:FUNREF NIL "make-string-output-stream") (:BR NIL)
        (:MACREF NIL "with-output-to-string") (:BR NIL)
        (:FUNREF NIL "get-output-stream-string")))
      (:ROW NIL (:CELL NIL (:TYPEREF NIL "synonym-stream"))
       (:CELL NIL (:FUNREF NIL "make-synonym-stream") (:BR NIL)
        (:FUNREF NIL "synonym-stream-symbol")))
      (:ROW NIL (:CELL NIL (:TYPEREF NIL "two-way-stream"))
       (:CELL NIL (:FUNREF NIL "make-two-way-stream") (:BR NIL)
        (:FUNREF NIL "two-way-stream-input-stream") (:BR NIL)
        (:FUNREF NIL "two-way-stream-output-stream"))))
     " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Stream Variables")) (:TERM NIL "Variables") " whose "
    (:TERM NIL "values") " must be " (:TERM NIL "streams")
    " are sometimes called "
    (:NEWTERM (:IDX "stream variable") "stream variables") ". " :PAR "Certain "
    (:TERM NIL "stream variables")
    " are defined by this specification to be the proper source of input or output in various "
    (:TERM NIL "situations") " where no specific " (:TERM NIL "stream")
    " has been specified instead. A complete list of such "
    (:TERM NIL "standardized") " " (:TERM NIL "stream variables")
    " appears in " (:NEXTFIGURE NIL) ". "
    (:COMMENT NIL
     "Added by agreement of Barrett, Loosemore, and KMP. -kmp 14-Feb-92")
    "The consequences are undefined if at any time the " (:TERM NIL "value")
    " of any of these " (:TERM NIL "variables") " is not an "
    (:TERM NIL "open") " " (:TERM NIL "stream") ". " :PAR " "
    (:TABLE
     (:NAME ("Standardized Stream Variables") :TAGS
      (:STANDARDIZED-STREAM-VARS))
     (:ROW NIL (:CELL NIL "Glossary Term") (:CELL NIL "Variable Name"))
     (:ROW NIL (:CELL NIL (:TERM NIL "debug I/O"))
      (:CELL NIL (:VARREF NIL "*debug-io*")))
     (:ROW NIL (:CELL NIL (:TERM NIL "error output"))
      (:CELL NIL (:VARREF NIL "*error-output*")))
     (:ROW NIL (:CELL NIL (:TERM NIL "query I/O"))
      (:CELL NIL (:VARREF NIL "*query-io*")))
     (:ROW NIL (:CELL NIL (:TERM NIL "standard input"))
      (:CELL NIL (:VARREF NIL "*standard-input*")))
     (:ROW NIL (:CELL NIL (:TERM NIL "standard output"))
      (:CELL NIL (:VARREF NIL "*standard-output*")))
     (:ROW NIL (:CELL NIL (:TERM NIL "terminal I/O"))
      (:CELL NIL (:VARREF NIL "*terminal-io*")))
     (:ROW NIL (:CELL NIL (:TERM NIL "trace output"))
      (:CELL NIL (:VARREF NIL "*trace-output*"))))
    " " :PAR "Note that, by convention, " (:TERM NIL "standardized") " "
    (:TERM NIL "stream variables") " have names ending in “"
    (:TT NIL "-input*") "” if they must be " (:TERM NIL "input") " "
    (:TERM NIL "streams") ", ending in “" (:TT NIL "-output*")
    "” if they must be " (:TERM NIL "output") " " (:TERM NIL "streams")
    ", or ending in “" (:TT NIL "-io*") "” if they must be "
    (:TERM NIL "bidirectional") " " (:TERM NIL "streams") ". " :PAR
    "User programs may " (:TERM NIL "assign") " or " (:TERM NIL "bind") " any "
    (:TERM NIL "standardized") " " (:TERM NIL "stream variable") " except "
    (:VARREF NIL "*terminal-io*") ". " :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Stream Arguments to Standardized Functions") :TAGS
     (:STREAM-ARGS-TO-STANDARDIZED-FNS))
    " " :PAR
    (:COMMENT NIL
     "This list conjured by KMP, Barrett, and Loosemore. -kmp 14-Feb-92")
    "The " (:TERM NIL "operators") " in " (:NEXTFIGURE NIL) " accept "
    (:TERM NIL "stream") " " (:TERM NIL "arguments") " that might be either "
    (:TERM NIL "open") " or " (:TERM NIL "closed") " " (:TERM NIL "streams")
    ". " :PAR " "
    (:TABLE
     (:NAME ("Operators that accept either Open or Closed Streams") :TAGS
      (:OPEN-OR-CLOSED-STREAM-OPS))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " broadcast-stream-streams"))
      (:CELL NIL (:FUNREF NIL "file-author"))
      (:CELL NIL (:FUNREF NIL "pathnamep")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " close"))
      (:CELL NIL (:FUNREF NIL "file-namestring"))
      (:CELL NIL (:FUNREF NIL "probe-file")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " compile-file"))
      (:CELL NIL (:FUNREF NIL "file-write-date"))
      (:CELL NIL (:FUNREF NIL "rename-file")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " compile-file-pathname"))
      (:CELL NIL (:FUNREF NIL "host-namestring"))
      (:CELL NIL (:FUNREF NIL "streamp")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " concatenated-stream-streams"))
      (:CELL NIL (:FUNREF NIL "load"))
      (:CELL NIL (:FUNREF NIL "synonym-stream-symbol")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " delete-file"))
      (:CELL NIL (:FUNREF NIL "logical-pathname"))
      (:CELL NIL (:FUNREF NIL "translate-logical-pathname")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " directory"))
      (:CELL NIL (:FUNREF NIL "merge-pathnames"))
      (:CELL NIL (:FUNREF NIL "translate-pathname")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " directory-namestring"))
      (:CELL NIL (:FUNREF NIL "namestring"))
      (:CELL NIL (:FUNREF NIL "truename")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " dribble"))
      (:CELL NIL (:FUNREF NIL "open"))
      (:CELL NIL (:FUNREF NIL "two-way-stream-input-stream")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " echo-stream-input-stream"))
      (:CELL NIL (:FUNREF NIL "open-stream-p"))
      (:CELL NIL (:FUNREF NIL "two-way-stream-output-stream")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL "echo-stream-output-stream"))
      (:CELL NIL (:FUNREF NIL "parse-namestring"))
      (:CELL NIL (:FUNREF NIL "wild-pathname-p")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " ed"))
      (:CELL NIL (:FUNREF NIL "pathname"))
      (:CELL NIL (:FUNREF NIL "with-open-file")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " enough-namestring"))
      (:CELL NIL (:FUNREF NIL "pathname-match-p")) (:CELL NIL)))
    " " :PAR
    (:COMMENT NIL
     "This list conjured by KMP, Barrett, and Loosemore. -kmp 14-Feb-92")
    "The " (:TERM NIL "operators") " in " (:NEXTFIGURE NIL) " accept "
    (:TERM NIL "stream") " " (:TERM NIL "arguments") " that must be "
    (:TERM NIL "open") " " (:TERM NIL "streams") ". " :PAR
    (:TABLE (:NAME ("Operators that accept Open Streams only"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " clear-input"))
      (:CELL NIL (:FUNREF NIL "output-stream-p"))
      (:CELL NIL (:FUNREF NIL "read-char-no-hang")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " clear-output"))
      (:CELL NIL (:FUNREF NIL "peek-char"))
      (:CELL NIL (:FUNREF NIL "read-delimited-list")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " file-length"))
      (:CELL NIL (:FUNREF NIL "pprint")) (:CELL NIL (:FUNREF NIL "read-line")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " file-position"))
      (:CELL NIL (:FUNREF NIL "pprint-fill"))
      (:CELL NIL (:FUNREF NIL "read-preserving-whitespace")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " file-string-length"))
      (:CELL NIL (:FUNREF NIL "pprint-indent"))
      (:CELL NIL (:FUNREF NIL "stream-element-type")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " finish-output"))
      (:CELL NIL (:FUNREF NIL "pprint-linear"))
      (:CELL NIL (:FUNREF NIL "stream-external-format")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " force-output"))
      (:CELL NIL (:FUNREF NIL "pprint-logical-block"))
      (:CELL NIL (:FUNREF NIL "terpri")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " format"))
      (:CELL NIL (:FUNREF NIL "pprint-newline"))
      (:CELL NIL (:FUNREF NIL "unread-char")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " fresh-line"))
      (:CELL NIL (:FUNREF NIL "pprint-tab"))
      (:CELL NIL (:FUNREF NIL "with-open-stream")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " get-output-stream-string"))
      (:CELL NIL (:FUNREF NIL "pprint-tabular"))
      (:CELL NIL (:FUNREF NIL "write")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " input-stream-p"))
      (:CELL NIL (:FUNREF NIL "prin1")) (:CELL NIL (:FUNREF NIL "write-byte")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " interactive-stream-p"))
      (:CELL NIL (:FUNREF NIL "princ")) (:CELL NIL (:FUNREF NIL "write-char")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " listen"))
      (:CELL NIL (:FUNREF NIL "print")) (:CELL NIL (:FUNREF NIL "write-line")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " make-broadcast-stream"))
      (:CELL NIL (:FUNREF NIL "print-object"))
      (:CELL NIL (:FUNREF NIL "write-string")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " make-concatenated-stream"))
      (:CELL NIL (:FUNREF NIL "print-unreadable-object"))
      (:CELL NIL (:FUNREF NIL "y-or-n-p")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " make-echo-stream"))
      (:CELL NIL (:FUNREF NIL "read")) (:CELL NIL (:FUNREF NIL "yes-or-no-p")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " make-synonym-stream"))
      (:CELL NIL (:FUNREF NIL "read-byte")) (:CELL NIL))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " make-two-way-stream"))
      (:CELL NIL (:FUNREF NIL "read-char")) (:CELL NIL)))
    " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Restrictions on Composite Streams"))
    "The consequences are undefined if any " (:TERM NIL "component") " of a "
    (:TERM NIL "composite stream") " is " (:TERM NIL "closed") " before the "
    (:TERM NIL "composite stream") " is " (:TERM NIL "closed") ". " :PAR
    "The consequences are undefined if the "
    (:TERM NIL "synonym stream symbol") " is not " (:TERM NIL "bound")
    " to an " (:TERM NIL "open") " " (:TERM NIL "stream")
    " from the time of the " (:TERM NIL "synonym stream")
    "'s creation until the time it is " (:TERM NIL "closed") ". " :PAR))
  :PAR
  (:DICTIONARY NIL :PAR " " :PAR
   (:COMMENT NIL " Streams" "  Stream I/O" "   Binary I/O" "    Byte I/O"
    "   Text I/O" "    Character I/O" "    String I/O" "   General I/O"
    "    File Position" "    File Opening" "    Stream Closing"
    "    Stream Buffering" "    Query Functions" "  File Streams"
    "  Synonym Streams" "  Broadcast Streams" "  Two-Way-Streams"
    "  Echo Streams" "  Concatenated Streams" "  String Streams"
    "  Stream Variables")
   :PAR (:COMMENT NIL "-------------------- Stream Types --------------------")
   :PAR (:COMMENT NIL "% 2.10.0 1")
   (:COM (:NAME "stream" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "stream") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "stream") " is an "
     (:TERM NIL "object")
     " that can be used with an input or output function to identify an appropriate source or sink of "
     (:TERM NIL "characters") " or " (:TERM NIL "bytes")
     " for that operation. " :PAR "For more complete information, see "
     (:SECREF NIL :STREAM-CONCEPTS) ". " :PAR
     (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     (:COMMENT NIL " \\issue{STREAM-ACCESS:ADD-TYPES-ACCESSORS}" " The types"
      " \\typeref{broadcast-stream}," " \\typeref{concatenated-stream},"
      " \\typeref{echo-stream}," " \\typeref{file-stream},"
      " \\typeref{string-stream}," " \\typeref{synonym-stream}, and"
      " \\typeref{two-way-stream} are \\term{pairwise} \\term{disjoint} \\subtypesof{stream}."
      " \\endissue{STREAM-ACCESS:ADD-TYPES-ACCESSORS}")
     (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :STREAM-CONCEPTS) ", "
     (:SECREF NIL :PRINTING-OTHER-OBJECTS) ", " (:CHAPREF NIL :PRINTER) ", "
     (:CHAPREF NIL :READER) " " :PAR))
   (:COM (:NAME "broadcast-stream" :FTYPE "System Class")
    (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
    (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
    (:PART (:NAME "Class Precedence List") " " :PAR
     (:TYPEREF NIL "broadcast-stream") ", " (:TYPEREF NIL "stream") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "broadcast stream")
     " is an " (:TERM NIL "output") " " (:TERM NIL "stream")
     " which has associated with it a set of zero or more "
     (:TERM NIL "output") " " (:TERM NIL "streams")
     " such that any output sent to the " (:TERM NIL "broadcast stream")
     " gets passed on as output to each of the associated "
     (:TERM NIL "output") " " (:TERM NIL "streams") ". (If a "
     (:TERM NIL "broadcast stream") " has no " (:TERM NIL "component streams")
     ", then all output to the " (:TERM NIL "broadcast stream")
     " is discarded.) " :PAR
     "The set of operations that may be performed on a "
     (:TERM NIL "broadcast stream")
     " is the intersection of those for its associated " (:TERM NIL "output")
     " " (:TERM NIL "streams") ". " :PAR
     (:COMMENT NIL " Except as explicitly stated otherwise, "
      " the values returned by a stream operation are "
      " the values resulting from performing the operation "
      " on the last of its \\term{component streams};"
      " the values resulting from performing the operation"
      " on all preceding \\term{streams} are discarded.                    "
      " %Barmar: What if no streams are supplied?"
      " %Sandra: Actually, aren't the results of functions that operate on streams"
      " % specified explicitly in the descriptions of those functions?"
      " %KMP: I'm not sure this answers the question for objects of type BROADCAST-STREAM."
      " %Sandra: CLOSE is a stream operation and this statement is certainly not"
      " %   true for CLOSE -- the component streams are not closed."
      "% Trying to untangle all the mail on this. -kmp 11-Feb-92")
     "Some output operations (" (:I NIL "e.g.") ",  "
     (:FUNREF NIL "fresh-line") ") return " (:TERM NIL "values")
     " based on the state of the " (:TERM NIL "stream")
     " at the time of the operation. "
     (:ISSUE NIL "BROADCAST-STREAM-RETURN-VALUES:CLARIFY-MINIMALLY")
     " Since these " (:TERM NIL "values") " might differ for each of the "
     (:TERM NIL "component streams")
     ", it is necessary to describe their return value specifically: " :PAR
     (:LIST NIL
      (:ITEM NIL " " (:FUNREF NIL "stream-element-type")
       " returns the value from the last component stream, or "
       (:TYPEREF NIL "t") " if there are no component streams. " :PAR)
      (:ITEM NIL " " (:FUNREF NIL "fresh-line")
       " returns the value from the last component stream, or "
       (:MISC NIL "nil") " if there are no component streams. " :PAR)
      (:ITEM NIL " The functions " (:FUNREF NIL "file-length") ", "
       (:FUNREF NIL "file-position") ", " (:FUNREF NIL "file-string-length")
       ", and " (:FUNREF NIL "stream-external-format")
       " return the value from the last component stream; if there are no component streams, "
       (:FUNREF NIL "file-length") " and " (:FUNREF NIL "file-position")
       " return " (:TT NIL "0") ", " (:FUNREF NIL "file-string-length")
       " returns " (:TT NIL "1") ", and "
       (:FUNREF NIL "stream-external-format") " returns " (:KWD NIL "default")
       ". " :PAR)
      (:ITEM NIL " The functions " (:FUNREF NIL "streamp") " and "
       (:FUNREF NIL "output-stream-p") " always return " (:TERM NIL "true")
       " for " (:TERM NIL "broadcast streams") ". " :PAR)
      (:ITEM NIL " The functions " (:FUNREF NIL "open-stream-p")
       " tests whether the " (:TERM NIL "broadcast stream") " is "
       (:TERM NIL "open") (:SUB NIL "2")
       ", not whether its component streams are " (:TERM NIL "open") ". " :PAR)
      (:ITEM NIL " The functions " (:FUNREF NIL "input-stream-p") " and "
       (:FUNREF NIL "interactive-stream-p") " return an "
       (:TERM NIL "implementation-defined") ", "
       (:TERM NIL "generalized boolean") " value. " :PAR)
      (:ITEM NIL " For the input operations " (:FUNREF NIL "clear-input") " "
       (:FUNREF NIL "listen") ", " (:FUNREF NIL "peek-char") ", "
       (:FUNREF NIL "read-byte") ", " (:FUNREF NIL "read-char-no-hang") ", "
       (:FUNREF NIL "read-char") ", " (:FUNREF NIL "read-line") ", and "
       (:FUNREF NIL "unread-char")
       ", the consequences are undefined if the indicated operation is performed. However, an "
       (:TERM NIL "implementation")
       " is permitted to define such a behavior as an "
       (:TERM NIL "implementation-dependent") " extension. "))
     " " :PAR
     "For any output operations not having their return values explicitly specified above or elsewhere in this document, it is defined that the "
     (:TERM NIL "values") " returned by such an operation are the "
     (:TERM NIL "values")
     " resulting from performing the operation on the last of its "
     (:TERM NIL "component streams") "; the " (:TERM NIL "values")
     " resulting from performing the operation on all preceding "
     (:TERM NIL "streams") " are discarded. If there are no "
     (:TERM NIL "component streams") ", the value is "
     (:TERM NIL "implementation-dependent") ". "
     (:ENDISSUE NIL "BROADCAST-STREAM-RETURN-VALUES:CLARIFY-MINIMALLY") " "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "broadcast-stream-streams")
     ", " (:FUNREF NIL "make-broadcast-stream") " " :PAR
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " "
     (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     :PAR))
   (:COM (:NAME "concatenated-stream" :FTYPE "System Class")
    (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
    (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
    (:PART (:NAME "Class Precedence List") " " :PAR
     (:TYPEREF NIL "concatenated-stream") ", " (:TYPEREF NIL "stream") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A "
     (:TERM NIL "concatenated stream") " is an " (:TERM NIL "input") " "
     (:TERM NIL "stream") " which is a " (:TERM NIL "composite stream")
     " of zero or more other " (:TERM NIL "input") " " (:TERM NIL "streams")
     ", such that the sequence of data which can be read from the "
     (:TERM NIL "concatenated stream")
     " is the same as the concatenation of the sequences of data which could be read from each of the constituent "
     (:TERM NIL "streams") ". " :PAR "Input from a "
     (:TERM NIL "concatenated stream")
     " is taken from the first of the associated " (:TERM NIL "input streams")
     " until it reaches " (:TERM NIL "end of file") (:SUB NIL "1")
     "; then that " (:TERM NIL "stream")
     " is discarded, and subsequent input is taken from the next "
     (:TERM NIL "input stream") ", and so on. "
     (:COMMENT NIL "I added the following to round things out. -kmp 22-Apr-91")
     "An " (:TERM NIL "end of file") " on the associated "
     (:TERM NIL "input streams") " is always managed invisibly by the "
     (:TERM NIL "concatenated stream") "—the only time a client of a "
     (:TERM NIL "concatenated stream") " sees an " (:TERM NIL "end of file")
     " is when an attempt is made to obtain data from the "
     (:TERM NIL "concatenated stream") " but it has no remaining "
     (:TERM NIL "input streams") " from which to obtain such data. " :PAR
     (:COMMENT NIL "!!!" "Moon:"
      "  I'm not sure about a concatenated stream with no streams.  Presumably the"
      "  valid set of operations for a concatenated stream is the intersection of"
      "  the valid set of operations for the component streams (this is never"
      "  specified, though).  Maybe an empty concatenated stream accepts all"
      "  operations, both character and binary, and always gives eof?  Or maybe"
      "  it shouldn't be allowed?")
     :PAR (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " "
     (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:FUNREF NIL "concatenated-stream-streams") ", "
     (:FUNREF NIL "make-concatenated-stream") " " :PAR))
   (:COM (:NAME "echo-stream" :FTYPE "System Class")
    (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
    (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
    (:PART (:NAME "Class Precedence List") " " :PAR
     (:TYPEREF NIL "echo-stream") ", " (:TYPEREF NIL "stream") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "An " (:TERM NIL "echo stream")
     " is a " (:TERM NIL "bidirectional") " " (:TERM NIL "stream")
     " that gets its input from an associated " (:TERM NIL "input") " "
     (:TERM NIL "stream") " and sends its output to an associated "
     (:TERM NIL "output") " " (:TERM NIL "stream") ". " :PAR
     "All input taken from the " (:TERM NIL "input") " " (:TERM NIL "stream")
     " is echoed to the " (:TERM NIL "output") " " (:TERM NIL "stream")
     ". Whether the input is echoed immediately after it is encountered, or after it has been read from the "
     (:TERM NIL "input stream") " is " (:TERM NIL "implementation-dependent")
     ". " :PAR (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " "
     (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "echo-stream-input-stream")
     ", " (:FUNREF NIL "echo-stream-output-stream") ", "
     (:FUNREF NIL "make-echo-stream") " " :PAR))
   (:COM (:NAME "file-stream" :FTYPE "System Class")
    (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
    (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
    (:PART (:NAME "Class Precedence List") " " :PAR
     (:TYPEREF NIL "file-stream") ", " (:TYPEREF NIL "stream") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "An " (:TERM NIL "object") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-stream") " is a "
     (:TERM NIL "stream") " the direct source or sink of which is a "
     (:TERM NIL "file") ". Such a " (:TERM NIL "stream")
     " is created explicitly by " (:FUNREF NIL "open") " and "
     (:MACREF NIL "with-open-file") ", and implicitly by "
     (:TERM NIL "functions") " such as " (:FUNREF NIL "load") " that process "
     (:TERM NIL "files") ". " :PAR
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " "
     (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "load") ", "
     (:FUNREF NIL "open") ", " (:MACREF NIL "with-open-file") " " :PAR))
   (:COM (:NAME "string-stream" :FTYPE "System Class")
    (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
    (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
    (:PART (:NAME "Class Precedence List") " " :PAR
     (:TYPEREF NIL "string-stream") ", " (:TYPEREF NIL "stream") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "string stream")
     " is a " (:TERM NIL "stream")
     " which reads input from or writes output to an associated "
     (:TERM NIL "string") ". " :PAR "The " (:TERM NIL "stream element type")
     " of a " (:TERM NIL "string stream") " is always a " (:TERM NIL "subtype")
     " of " (:TERM NIL "type") " " (:TYPEREF NIL "character") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-string-input-stream")
     ", " (:FUNREF NIL "make-string-output-stream") ", "
     (:MACREF NIL "with-input-from-string") ", "
     (:MACREF NIL "with-output-to-string") " " :PAR
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " "
     (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     :PAR))
   (:COM (:NAME "synonym-stream" :FTYPE "System Class")
    (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
    (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
    (:PART (:NAME "Class Precedence List") " " :PAR
     (:TYPEREF NIL "synonym-stream") ", " (:TYPEREF NIL "stream") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "stream")
     " that is an alias for another " (:TERM NIL "stream") ", which is the "
     (:TERM NIL "value") " of a " (:TERM NIL "dynamic variable") " whose "
     (:TERM NIL "name") " is the " (:TERM NIL "synonym stream symbol")
     " of the " (:TERM NIL "synonym stream") ". " :PAR "Any operations on a "
     (:TERM NIL "synonym stream") " will be performed on the "
     (:TERM NIL "stream") " that is then the " (:TERM NIL "value") " of the "
     (:TERM NIL "dynamic variable") " named by the "
     (:TERM NIL "synonym stream symbol") ". If the " (:TERM NIL "value")
     " of the " (:TERM NIL "variable") " should change, or if the "
     (:TERM NIL "variable") " should be " (:TERM NIL "bound") ", then the "
     (:TERM NIL "stream") " will operate on the new " (:TERM NIL "value")
     " of the " (:TERM NIL "variable") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-synonym-stream") ", "
     (:FUNREF NIL "synonym-stream-symbol") " " :PAR
     (:COMMENT NIL "% This should go without saying." " \\label Notes::" " "
      " A \\term{synonym stream} is created by \\funref{make-synonym-stream}.")
     :PAR (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " "
     (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     :PAR))
   (:COM (:NAME "two-way-stream" :FTYPE "System Class")
    (:ISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
    (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
    (:PART (:NAME "Class Precedence List") " " :PAR
     (:TYPEREF NIL "two-way-stream") ", " (:TYPEREF NIL "stream") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "bidirectional") " "
     (:TERM NIL "composite stream")
     " that receives its input from an associated " (:TERM NIL "input") " "
     (:TERM NIL "stream") " and sends its output to an associated "
     (:TERM NIL "output") " " (:TERM NIL "stream") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-two-way-stream") ", "
     (:FUNREF NIL "two-way-stream-input-stream") ", "
     (:FUNREF NIL "two-way-stream-output-stream") " " :PAR
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
     (:ENDISSUE NIL "TYPE-OF-AND-PREDEFINED-CLASSES:UNIFY-AND-EXTEND") " "
     :PAR))
   :PAR (:COMMENT NIL "-------------------- Streams --------------------") :PAR
   (:COMMENT NIL "%% ========== INPUT-STREAM-P"
    "%% ========== OUTPUT-STREAM-P")
   (:COM (:NAME "input-stream-p, output-stream-p" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "input-stream-p")
      (:ARGLIST NIL "stream") (:VALUES NIL "generalized-boolean"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "output-stream-p")
      (:ARGLIST NIL "stream") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "stream") "—a "
     (:TERM NIL "stream") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 21.3.0 4")
     (:FUNREF NIL "input-stream-p") " returns " (:TERM NIL "true") " if "
     (:PARAM NIL "stream") " is an " (:TERM NIL "input") " "
     (:TERM NIL "stream") "; otherwise, returns " (:TERM NIL "false") ". " :PAR
     (:COMMENT NIL "% 21.3.0 5") (:FUNREF NIL "output-stream-p") " returns "
     (:TERM NIL "true") " if " (:PARAM NIL "stream") " is an "
     (:TERM NIL "output") " " (:TERM NIL "stream") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (input-stream-p *standard-input*) → " (:TERM NIL "true") "
 (input-stream-p *terminal-io*) → "
      (:TERM NIL "true") "
 (input-stream-p (make-string-output-stream)) → "
      (:TERM NIL "false") "

 (output-stream-p *standard-output*) → "
      (:TERM NIL "true") "
 (output-stream-p *terminal-io*) → "
      (:TERM NIL "true") "
 (output-stream-p (make-string-input-stream \"jr\")) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "stream") " is not a "
     (:TERM NIL "stream") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== INTERACTIVE-STREAM-P")
   (:COM (:NAME "interactive-stream-p" :FTYPE "Function")
    (:ISSUE NIL "STREAM-CAPABILITIES:INTERACTIVE-STREAM-P") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "interactive-stream-p")
      (:ARGLIST NIL "stream") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "stream") "—a "
     (:TERM NIL "stream") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns " (:TERM NIL "true") " if "
     (:PARAM NIL "stream") " is an " (:TERM NIL "interactive stream")
     "; otherwise, returns " (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (when (> measured limit)
   (let ((error (round (* (- measured limit) 100)
                       limit)))
     (unless (if (interactive-stream-p *query-io*)
                 (yes-or-no-p \"The frammis is out of tolerance by ~D%.~@
                               Is it safe to proceed? \" error)
                 (< error 15))  ;15% is acceptable
       (error \"The frammis is out of tolerance by ~D%.\" error))))
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL
      " The cleanup said \"signals\", but that's stylistically inconsistent."
      " Barrett and I decided to just ignore the cleanup and fix things up. -kmp 22-Jan-92")
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "stream") " is not a "
     (:TERM NIL "stream") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :STREAM-CONCEPTS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "STREAM-CAPABILITIES:INTERACTIVE-STREAM-P") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== OPEN-STREAM-P")
   (:COM (:NAME "open-stream-p" :FTYPE "Function")
    (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "open-stream-p")
      (:ARGLIST NIL "stream") (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "stream") "—a "
     (:TERM NIL "stream") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns " (:TERM NIL "true") " if "
     (:PARAM NIL "stream") " is an " (:TERM NIL "open") " "
     (:TERM NIL "stream") "; otherwise, returns " (:TERM NIL "false") ". " :PAR
     (:TERM NIL "Streams")
     " are open until they have been explicitly closed with "
     (:FUNREF NIL "close")
     ", or until they are implicitly closed due to exit from a "
     (:MACREF NIL "with-output-to-string") ", " (:MACREF NIL "with-open-file")
     ", " (:MACREF NIL "with-input-from-string") ", or "
     (:MACREF NIL "with-open-stream") " " (:TERM NIL "form") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (open-stream-p *standard-input*) → " (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:FUNREF NIL "close") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "stream") " is not a "
     (:TERM NIL "stream") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== STREAM-ELEMENT-TYPE")
   (:COM (:NAME "stream-element-type" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "stream-element-type")
      (:ARGLIST NIL "stream") (:VALUES NIL "typespec"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "stream") "—a "
     (:TERM NIL "stream") ". " :PAR (:PARAM NIL "typespec") "—a "
     (:TERM NIL "type specifier") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 21.3.0 6")
     (:FUNREF NIL "stream-element-type") " returns a "
     (:TERM NIL "type specifier") " that indicates the " (:TERM NIL "types")
     " of " (:TERM NIL "objects") " that may be read from or written to "
     (:PARAM NIL "stream") ". " :PAR (:TERM NIL "Streams") " created by "
     (:FUNREF NIL "open") " have an " (:TERM NIL "element type")
     " restricted to " (:TYPEREF NIL "integer") " or a " (:TERM NIL "subtype")
     " of " (:TERM NIL "type") " " (:TYPEREF NIL "character") ". "
     (:COMMENT NIL
      "%KMP (2-Jan-91): How?? What would it mean?  Does this have formal impact?"
      " but in principle a \\term{stream} may conduct transactions using any"
      " \\term{objects}."
      "% Removed on instruction of Barrett, who concurred, saying:"
      "%  I'm not convinced this is even true, since OPEN just says \"acceptable\","
      "%  which I read as saying undefined consequences, which permits an implementation"
      "%  to extend to allow other kinds of objects.  Even without that, the statement "
      "%  isn't all that interesting, since OPEN only defined to deal with filestreams,"
      "%   and an implementation could provide other kinds of streams which pass aribitrary objects.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      ";; Note that the stream must accomodate at least the specified type,
;; but might accomodate other types.  Further note that even if it does
;; accomodate exactly the specified type, the type might be specified in
;; any of several ways.
 (with-open-file (s \"test\" :element-type '(integer 0 1)
                           :if-exists :error
                           :direction :output)
   (stream-element-type s))
→ INTEGER
OR→ (UNSIGNED-BYTE 16)
OR→ (UNSIGNED-BYTE 8)
OR→ BIT
OR→ (UNSIGNED-BYTE 1)
OR→ (INTEGER 0 1)
OR→ (INTEGER 0 (2))
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "stream") " is not a "
     (:TERM NIL "stream") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== STREAMP")
   (:COM (:NAME "streamp" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "streamp") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 21.3.0 3")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "stream") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR
     (:ISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " "
     (:FUNREF NIL "streamp") " is unaffected by whether " (:PARAM NIL "object")
     ", if it is a " (:TERM NIL "stream") ", is " (:TERM NIL "open")
     " or closed. " (:ENDISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (streamp *terminal-io*) → " (:TERM NIL "true") "
 (streamp 1) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (streamp " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'stream)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "-------------------- Byte Io --------------------")
   :PAR (:COMMENT NIL "%% ========== READ-BYTE")
   (:COM (:NAME "read-byte" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "read-byte")
      (:ARGLIST NIL "stream " (:KEYWORD NIL " &optional")
       " eof-error-p eof-value")
      (:VALUES NIL "byte"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "stream") "—a "
     (:TERM NIL "binary") " " (:TERM NIL "input") " " (:TERM NIL "stream") ". "
     :PAR (:PARAM NIL "eof-error-p") "—a " (:TERM NIL "generalized boolean")
     ". The default is " (:TERM NIL "true") ". " :PAR
     (:ISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " "
     (:PARAM NIL "eof-value") "—an " (:TERM NIL "object") ". The default is "
     (:MISC NIL "nil") ". " (:ENDISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY")
     " " :PAR (:PARAM NIL "byte") "—an " (:TERM NIL "integer") ", "
     (:COMMENT NIL
      "% Removed by KMP because in the presence of stream element type upgrading, "
      "% this won't necessarily work as expected if the file was written with an"
      "% incompatible element type." "  of the \\term{stream element type}"
      " 		  of \\term{stream}")
     "or the " (:PARAM NIL "eof-value") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.2.2 3")
     (:FUNREF NIL "read-byte") " reads and returns one byte from "
     (:PARAM NIL "stream") ". " :PAR "If an " (:TERM NIL "end of file")
     (:SUB NIL "2") " occurs and " (:PARAM NIL "eof-error-p") " is "
     (:TERM NIL "false") ", the " (:PARAM NIL "eof-value") " is returned. "
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (with-open-file (s \"temp-bytes\" 
                     :direction :output
                     :element-type 'unsigned-byte)
    (write-byte 101 s)) → 101
 (with-open-file (s \"temp-bytes\" :element-type 'unsigned-byte)
    (format t \"~S ~S\" (read-byte s) (read-byte s nil 'eof)))
⊳ 101 EOF
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "Modifies " (:PARAM NIL "stream")
     ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "stream") " is not a "
     (:TERM NIL "stream") ". " :PAR "Should signal an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error") " if " (:PARAM NIL "stream")
     " is not a " (:TERM NIL "binary") " " (:TERM NIL "input") " "
     (:TERM NIL "stream") ". " :PAR "If there are no " (:TERM NIL "bytes")
     " remaining in the " (:PARAM NIL "stream") " and "
     (:PARAM NIL "eof-error-p") " is " (:TERM NIL "true") ", an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "end-of-file") " is signaled. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "read-char") ", "
     (:ISSUE NIL "READ-AND-WRITE-BYTES:NEW-FUNCTIONS") " "
     (:FUNREF NIL "read-sequence") ", "
     (:ENDISSUE NIL "READ-AND-WRITE-BYTES:NEW-FUNCTIONS") " "
     (:FUNREF NIL "write-byte") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== WRITE-BYTE")
   (:COM (:NAME "write-byte" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "write-byte")
      (:ARGLIST NIL "byte stream") (:VALUES NIL "byte"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "byte") "—an "
     (:TERM NIL "integer") " of the " (:TERM NIL "stream element type") " of "
     (:TERM NIL "stream") ". " :PAR (:PARAM NIL "stream") "—a "
     (:TERM NIL "binary") " " (:TERM NIL "output") " " (:TERM NIL "stream")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.3.2 4")
     (:FUNREF NIL "write-byte") " writes one byte, " (:PARAM NIL "byte")
     ", to " (:PARAM NIL "stream") ". " :PAR
     (:COMMENT NIL
      "The size of the byte written depends on the {\\bf :element-type} argument"
      "from \\funref{open} or \\macref{with-open-file}.  "
      "Unless the byte size of that"
      "element type is one, two, or four bits, each call to \\funref{write-byte}"
      "generates an integral number of 8-bit bytes, namely the minimum number"
      "necessary to hold the number of bits indicated by the given element type."
      "If the byte size of the element type is one, two, or four bits, then as many"
      "elements as possible (eight, four, or two respectively) are packed into"
      "each 8-bit byte.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (with-open-file (s \"temp-bytes\" 
                    :direction :output
                    :element-type 'unsigned-byte)
    (write-byte 101 s)) → 101
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR (:PARAM NIL "stream")
     " is modified. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The " (:TERM NIL "element type")
     " of the " (:PARAM NIL "stream") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "stream") " is not a "
     (:TERM NIL "stream") ". Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") " if " (:PARAM NIL "stream") " is not a "
     (:TERM NIL "binary") " " (:TERM NIL "output") " " (:TERM NIL "stream")
     ". " :PAR "Might signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "byte") " is not an "
     (:TERM NIL "integer") " of the " (:TERM NIL "stream element type") " of "
     (:TERM NIL "stream") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "read-byte") ", "
     (:FUNREF NIL "write-char") ", "
     (:ISSUE NIL "READ-AND-WRITE-BYTES:NEW-FUNCTIONS") " "
     (:FUNREF NIL "write-sequence") " "
     (:ENDISSUE NIL "READ-AND-WRITE-BYTES:NEW-FUNCTIONS") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Character Io --------------------") :PAR
   (:COMMENT NIL "%% ========== PEEK-CHAR")
   (:COM (:NAME "peek-char" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "peek-char")
      (:ARGLIST NIL (:KEYWORD NIL " &optional")
       " peek-type input-stream eof-error-p eof-value recursive-p")
      (:VALUES NIL "char"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "peek-type")
     "—a " (:TERM NIL "character") " or " (:MISC NIL "t") " or "
     (:MISC NIL "nil") ". " :PAR (:PARAM NIL "input-stream") "—"
     (:TERM NIL "input") " " (:TERM NIL "stream designator")
     ". The default is " (:TERM NIL "standard input") ". " :PAR
     (:PARAM NIL "eof-error-p") "—a " (:TERM NIL "generalized boolean")
     ". The default is " (:TERM NIL "true") ". " :PAR
     (:ISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " "
     (:PARAM NIL "eof-value") "—an " (:TERM NIL "object") ". The default is "
     (:MISC NIL "nil") ". " (:ENDISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY")
     " " :PAR (:PARAM NIL "recursive-p") "—a "
     (:TERM NIL "generalized boolean") ". The default is " (:TERM NIL "false")
     ". " :PAR (:PARAM NIL "char") "—a " (:TERM NIL "character") " or the "
     (:PARAM NIL "eof-value") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "peek-char")
     " obtains the next character in " (:PARAM NIL "input-stream")
     " without actually reading it, thus leaving the character to be read at a later time. It can also be used to skip over and discard intervening characters in the "
     (:PARAM NIL "input-stream") " until a particular character is found. "
     :PAR (:COMMENT NIL "% 22.2.1 33") "If " (:PARAM NIL "peek-type")
     " is not supplied or " (:MISC NIL "nil") ", " (:FUNREF NIL "peek-char")
     " returns the next character to be read from " (:PARAM NIL "input-stream")
     ", without actually removing it from " (:PARAM NIL "input-stream")
     ". The next time input is done from " (:PARAM NIL "input-stream")
     ", the character will still be there. " (:COMMENT NIL "% 22.2.1 34") "If "
     (:PARAM NIL "peek-type") " is " (:MISC NIL "t") ", then "
     (:FUNREF NIL "peek-char") " skips over " (:TERM NIL "whitespace")
     (:SUB NIL "2") " " (:TERM NIL "characters")
     ", but not comments, and then performs the peeking operation on the next character. The last character examined, the one that starts an "
     (:TERM NIL "object") ", is not removed from " (:PARAM NIL "input-stream")
     ". " (:COMMENT NIL "% 22.2.1 35") "If " (:PARAM NIL "peek-type") " is a "
     (:TERM NIL "character") ", then " (:FUNREF NIL "peek-char")
     " skips over input characters until a character that is "
     (:FUNREF NIL "char=") " to that " (:TERM NIL "character")
     " is found; that character is left in " (:PARAM NIL "input-stream") ". "
     :PAR "If an " (:TERM NIL "end of file") (:SUB NIL "2") " occurs and "
     (:PARAM NIL "eof-error-p") " is " (:TERM NIL "false") ", "
     (:PARAM NIL "eof-value") " is returned. " :PAR (:MATH NIL) "If "
     (:PARAM NIL "recursive-p") " is " (:TERM NIL "true")
     ", this call is expected to be embedded in a higher-level call to "
     (:FUNREF NIL "read") " or a similar " (:TERM NIL "function")
     " used by the " (:TERM NIL "Lisp reader") ". " :PAR
     (:ISSUE NIL "PEEK-CHAR-READ-CHAR-ECHO:FIRST-READ-CHAR") " When "
     (:PARAM NIL "input-stream") " is an " (:TERM NIL "echo stream")
     ", characters that are only peeked at are not echoed. In the case that "
     (:PARAM NIL "peek-type") " is not " (:MISC NIL "nil")
     ", the characters that are passed by " (:FUNREF NIL "peek-char")
     " are treated as if by " (:FUNREF NIL "read-char")
     ", and so are echoed unless they have been marked otherwise by "
     (:FUNREF NIL "unread-char") ". "
     (:ENDISSUE NIL "PEEK-CHAR-READ-CHAR-ECHO:FIRST-READ-CHAR") " " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (with-input-from-string (input-stream \"    1 2 3 4 5\")
    (format t \"~S ~S ~S\" 
            (peek-char t input-stream)
            (peek-char #\\4 input-stream)
            (peek-char nil input-stream)))
⊳ #\\1 #\\4 #\\4
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*readtable*") ", "
     (:VARREF NIL "*standard-input*") ", " (:VARREF NIL "*terminal-io*") ". "
     :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If "
     (:PARAM NIL "eof-error-p") " is " (:TERM NIL "true") " and an "
     (:TERM NIL "end of file") (:SUB NIL "2") " occurs an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "end-of-file") " is signaled. " :PAR
     "If " (:PARAM NIL "peek-type") " is a " (:TERM NIL "character") ", an "
     (:TERM NIL "end of file") (:SUB NIL "2") " occurs, and "
     (:PARAM NIL "eof-error-p") " is " (:TERM NIL "true") ", an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "end-of-file") " is signaled. " :PAR
     (:COMMENT NIL
      "!!! Barrett is concerned about the case of eof-error-p here.")
     "If " (:PARAM NIL "recursive-p") " is " (:TERM NIL "true") " and an "
     (:TERM NIL "end of file") (:SUB NIL "2") " occurs, an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "end-of-file") " is signaled. " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== READ-CHAR")
   (:COM (:NAME "read-char" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "read-char")
      (:ARGLIST NIL (:KEYWORD NIL " &optional")
       " input-stream eof-error-p eof-value recursive-p")
      (:VALUES NIL "char"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "input-stream")
     "—an " (:TERM NIL "input") " " (:TERM NIL "stream designator")
     ". The default is " (:TERM NIL "standard input") ". " :PAR
     (:PARAM NIL "eof-error-p") "—a " (:TERM NIL "generalized boolean")
     ". The default is " (:TERM NIL "true") ". " :PAR
     (:ISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " "
     (:PARAM NIL "eof-value") "—an " (:TERM NIL "object") ". The default is "
     (:MISC NIL "nil") ". " (:ENDISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY")
     " " :PAR (:PARAM NIL "recursive-p") "—a "
     (:TERM NIL "generalized boolean") ". The default is " (:TERM NIL "false")
     ". " :PAR (:PARAM NIL "char") "—a " (:TERM NIL "character") " or the "
     (:PARAM NIL "eof-value") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.2.1 28")
     (:FUNREF NIL "read-char") " returns the next " (:TERM NIL "character")
     " from " (:PARAM NIL "input-stream") ". " :PAR
     (:ISSUE NIL "PEEK-CHAR-READ-CHAR-ECHO:FIRST-READ-CHAR") " When "
     (:PARAM NIL "input-stream") " is an " (:PARAM NIL "echo stream")
     ", the character is echoed on " (:PARAM NIL "input-stream")
     " the first time the character is "
     (:COMMENT NIL "Sandra: \"seen\"? awfully vague.")
     "seen. Characters that are not echoed by " (:FUNREF NIL "read-char")
     " are those that were put there by " (:FUNREF NIL "unread-char")
     " and hence are assumed to have been echoed already by a previous call to "
     (:FUNREF NIL "read-char") ". "
     (:ENDISSUE NIL "PEEK-CHAR-READ-CHAR-ECHO:FIRST-READ-CHAR") " " :PAR
     (:MATH NIL) "If " (:PARAM NIL "recursive-p") " is " (:TERM NIL "true")
     ", this call is expected to be embedded in a higher-level call to "
     (:FUNREF NIL "read") " or a similar " (:TERM NIL "function")
     " used by the " (:TERM NIL "Lisp reader") ". " :PAR "If an "
     (:TERM NIL "end of file") (:SUB NIL "2") " occurs and "
     (:PARAM NIL "eof-error-p") " is " (:TERM NIL "false") ", "
     (:PARAM NIL "eof-value") " is returned. " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (with-input-from-string (is \"0123\")
    (do ((c (read-char is) (read-char is nil 'the-end)))
        ((not (characterp c)))
     (format t \"~S \" c)))
⊳ #\\0 #\\1 #\\2 #\\3
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*standard-input*") ", "
     (:VARREF NIL "*terminal-io*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If an "
     (:TERM NIL "end of file") (:SUB NIL "2")
     " occurs before a character can be read, and " (:PARAM NIL "eof-error-p")
     " is " (:TERM NIL "true") ", an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "end-of-file") " is signaled. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "read-byte") ", "
     (:ISSUE NIL "READ-AND-WRITE-BYTES:NEW-FUNCTIONS") " "
     (:FUNREF NIL "read-sequence") ", "
     (:ENDISSUE NIL "READ-AND-WRITE-BYTES:NEW-FUNCTIONS") " "
     (:FUNREF NIL "write-char") ", " (:FUNREF NIL "read") " " :PAR)
    (:PART (:NAME "Notes") " " (:COMMENT NIL "% 22.2.1 29")
     "The corresponding output function is " (:FUNREF NIL "write-char") ". "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== READ-CHAR-NO-HANG")
   (:COM (:NAME "read-char-no-hang" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "read-char-no-hang")
      (:ARGLIST NIL (:KEYWORD NIL " &optional")
       " input-stream eof-error-p eof-value recursive-p")
      (:VALUES NIL "char"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "input-stream")
     "—an " (:TERM NIL "input") " " (:TERM NIL "stream designator")
     ". The default is " (:TERM NIL "standard input") ". " :PAR
     (:PARAM NIL "eof-error-p") "—a " (:TERM NIL "generalized boolean")
     ". The default is " (:TERM NIL "true") ". " :PAR
     (:ISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " "
     (:PARAM NIL "eof-value") "—an " (:TERM NIL "object") ". The default is "
     (:MISC NIL "nil") ". " (:ENDISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY")
     " " :PAR (:PARAM NIL "recursive-p") "—a "
     (:TERM NIL "generalized boolean") ". The default is " (:TERM NIL "false")
     ". " :PAR (:PARAM NIL "char") "—a " (:TERM NIL "character") " or "
     (:MISC NIL "nil") " or the " (:PARAM NIL "eof-value") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "read-char-no-hang")
     " returns a character from " (:PARAM NIL "input-stream")
     " if such a character is available. If no character is available, "
     (:FUNREF NIL "read-char-no-hang") " returns " (:MISC NIL "nil") ". " :PAR
     (:MATH NIL) "If " (:PARAM NIL "recursive-p") " is " (:TERM NIL "true")
     ", this call is expected to be embedded in a higher-level call to "
     (:FUNREF NIL "read") " or a similar " (:TERM NIL "function")
     " used by the " (:TERM NIL "Lisp reader") ". " :PAR "If an "
     (:TERM NIL "end of file") (:SUB NIL "2") " occurs and "
     (:PARAM NIL "eof-error-p") " is " (:TERM NIL "false") ", "
     (:PARAM NIL "eof-value") " is returned. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:COMMENT NIL
      "!!! This example suffers from the `newline problem' -kmp 8-May-91")
     (:CODE NIL
      ";; This code assumes an implementation in which a newline is not
;; required to terminate input from the console.
 (defun test-it ()
   (unread-char (read-char))
   (list (read-char-no-hang) 
         (read-char-no-hang) 
         (read-char-no-hang)))
→ TEST-IT
;; Implementation A, where a Newline is not required to terminate
;; interactive input on the console.
 (test-it)
⊳ "
      (:IN NIL "a") "
→ (#\\a NIL NIL)
;; Implementation B, where a Newline is required to terminate
;; interactive input on the console, and where that Newline remains
;; on the input stream.
 (test-it)
⊳ "
      (:IN NIL "a↩") "
→ (#\\a #\\Newline NIL)
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*standard-input*") ", "
     (:VARREF NIL "*terminal-io*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If an "
     (:TERM NIL "end of file") (:SUB NIL "2") " occurs when "
     (:PARAM NIL "eof-error-p") " is " (:TERM NIL "true") ", an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "end-of-file") " is signaled . "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "listen") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 22.2.1 37")
     (:FUNREF NIL "read-char-no-hang") " is exactly like "
     (:FUNREF NIL "read-char")
     ", except that if it would be necessary to wait in order to get a character (as from a keyboard), "
     (:MISC NIL "nil") " is immediately returned without waiting. " :PAR
     (:COMMENT NIL
      "!!! Symbolics doesn't echo the char from this. Should it? -kmp")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== TERPRI" "%% ========== FRESH-LINE")
   (:COM (:NAME "terpri, fresh-line" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "terpri")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " output-stream")
      (:VALUES NIL (:MISC NIL "nil")))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "fresh-line")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " output-stream")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "output-stream")
     "—an " (:TERM NIL "output") " " (:TERM NIL "stream designator")
     ". The default is " (:TERM NIL "standard output") ". " :PAR
     (:PARAM NIL "generalized-boolean") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "terpri") " outputs a "
     (:TERM NIL "newline") " to " (:PARAM NIL "output-stream") ". " :PAR
     (:COMMENT NIL "% 22.3.1 18") :PAR (:FUNREF NIL "fresh-line")
     " is similar to " (:FUNREF NIL "terpri") " but outputs a "
     (:TERM NIL "newline") " only if the " (:PARAM NIL "output-stream")
     " is not already at the start of a line. If for some reason this cannot be determined, then a "
     (:TERM NIL "newline") " is output anyway. " (:FUNREF NIL "fresh-line")
     " returns " (:TERM NIL "true") " if it outputs a " (:TERM NIL "newline")
     "; otherwise it returns " (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (with-output-to-string (s)
    (write-string \"some text\" s)
    (terpri s)
    (terpri s)
    (write-string \"more text\" s))
→ \"some text

more text\"
 (with-output-to-string (s)
    (write-string \"some text\" s)
    (fresh-line s)
    (fresh-line s)
    (write-string \"more text\" s))
→ \"some text
more text\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:PARAM NIL "output-stream")
     " is modified. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*standard-output*")
     ", " (:VARREF NIL "*terminal-io*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "None. "
     (:REVIEWER NIL "Barmar: What if stream is closed?") (:COMMENT NIL "!!!")
     :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "terpri")
     " is identical in effect to " :PAR
     (:CODE NIL " (write-char #\\Newline output-stream)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== UNREAD-CHAR")
   (:COM (:NAME "unread-char" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR (:COMMENT NIL "% 22.2.1 30")
     (:DEF (:KIND "function") (:NAMES NIL "unread-char")
      (:ARGLIST NIL "character " (:KEYWORD NIL " &optional") " input-stream")
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:COMMENT NIL "% 22.2.1 31")
     (:PARAM NIL "character") "—a " (:TERM NIL "character")
     "; must be the last " (:TERM NIL "character") " that was read from "
     (:PARAM NIL "input-stream") ". " :PAR (:PARAM NIL "input-stream") "—an "
     (:TERM NIL "input") " " (:TERM NIL "stream designator")
     ". The default is " (:TERM NIL "standard input") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "unread-char")
     " places " (:PARAM NIL "character") " back onto the front of "
     (:PARAM NIL "input-stream")
     " so that it will again be the next character in "
     (:PARAM NIL "input-stream") ". " :PAR
     (:ISSUE NIL "PEEK-CHAR-READ-CHAR-ECHO:FIRST-READ-CHAR") " When "
     (:PARAM NIL "input-stream") " is an " (:TERM NIL "echo stream")
     ", no attempt is made to undo any echoing of the character that might already have been done on "
     (:PARAM NIL "input-stream") ". However, characters placed on "
     (:PARAM NIL "input-stream") " by " (:FUNREF NIL "unread-char")
     " are marked in such a way as to inhibit later re-echo by "
     (:FUNREF NIL "read-char") ". "
     (:ENDISSUE NIL "PEEK-CHAR-READ-CHAR-ECHO:FIRST-READ-CHAR") " " :PAR
     "It is an error to invoke " (:FUNREF NIL "unread-char")
     " twice consecutively on the same " (:TERM NIL "stream")
     " without an intervening call to " (:FUNREF NIL "read-char")
     " (or some other input operation which implicitly reads characters) on that "
     (:TERM NIL "stream") ". " :PAR
     (:ISSUE NIL "UNREAD-CHAR-AFTER-PEEK-CHAR:DONT-ALLOW") " Invoking "
     (:FUNREF NIL "peek-char") " or " (:FUNREF NIL "read-char")
     " commits all previous characters. The consequences of invoking "
     (:FUNREF NIL "unread-char")
     " on any character preceding that which is returned by "
     (:FUNREF NIL "peek-char") " (including those passed over by "
     (:FUNREF NIL "peek-char") " that has a " (:TERM NIL "non-nil") " "
     (:PARAM NIL "peek-type")
     ") are unspecified. In particular, the consequences of invoking "
     (:FUNREF NIL "unread-char") " after " (:FUNREF NIL "peek-char")
     " are unspecified. "
     (:ENDISSUE NIL "UNREAD-CHAR-AFTER-PEEK-CHAR:DONT-ALLOW") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (with-input-from-string (is \"0123\")
    (dotimes (i 6)
      (let ((c (read-char is)))
        (if (evenp i) (format t \"~&~S ~S~%\" i c) (unread-char c is)))))
⊳ 0 #\\0
⊳ 2 #\\1
⊳ 4 #\\2
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*standard-input*") ", "
     (:VARREF NIL "*terminal-io*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "peek-char") ", "
     (:FUNREF NIL "read-char") ", " (:SECREF NIL :STREAM-CONCEPTS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 22.2.1 32")
     (:FUNREF NIL "unread-char")
     " is intended to be an efficient mechanism for allowing the "
     (:TERM NIL "Lisp reader")
     " and other parsers to perform one-character lookahead in "
     (:PARAM NIL "input-stream") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== WRITE-CHAR")
   (:COM (:NAME "write-char" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "write-char")
      (:ARGLIST NIL "character " (:KEYWORD NIL " &optional") " output-stream")
      (:VALUES NIL "character"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "character")
     "—a " (:TERM NIL "character") ". " :PAR (:PARAM NIL "output-stream")
     "—an " (:TERM NIL "output") " " (:TERM NIL "stream designator")
     ". The default is " (:TERM NIL "standard output") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.3.1 12")
     (:FUNREF NIL "write-char") " outputs " (:PARAM NIL "character") " to "
     (:PARAM NIL "output-stream") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (write-char #\\a)
⊳ a
→ #\\a
 (with-output-to-string (s) 
   (write-char #\\a s)
   (write-char #\\Space s)
   (write-char #\\b s))
→ \"a b\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:PARAM NIL "output-stream")
     " is modified. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*standard-output*")
     ", " (:VARREF NIL "*terminal-io*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "read-char") ", "
     (:FUNREF NIL "write-byte") ", "
     (:ISSUE NIL "READ-AND-WRITE-BYTES:NEW-FUNCTIONS") " "
     (:FUNREF NIL "write-sequence") " "
     (:ENDISSUE NIL "READ-AND-WRITE-BYTES:NEW-FUNCTIONS") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- String I/O --------------------") :PAR
   (:COMMENT NIL "%% ========== READ-LINE")
   (:COM (:NAME "read-line" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "read-line")
      (:ARGLIST NIL (:KEYWORD NIL " &optional")
       " input-stream eof-error-p eof-value recursive-p")
      (:VALUES NIL "line, missing-newline-p"))
     " "
     (:COMMENT NIL
      "!!! Barrett wonders if the second return value should really be required"
      "    when the first value is an eof-value...")
     :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "input-stream")
     "—an " (:TERM NIL "input") " " (:TERM NIL "stream designator")
     ". The default is " (:TERM NIL "standard input") ". " :PAR
     (:PARAM NIL "eof-error-p") "—a " (:TERM NIL "generalized boolean")
     ". The default is " (:TERM NIL "true") ". " :PAR
     (:ISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " "
     (:PARAM NIL "eof-value") "—an " (:TERM NIL "object") ". The default is "
     (:MISC NIL "nil") ". " (:ENDISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY")
     " " :PAR (:PARAM NIL "recursive-p") "—a "
     (:TERM NIL "generalized boolean") ". The default is " (:TERM NIL "false")
     ". " :PAR (:PARAM NIL "line") "—a " (:TERM NIL "string") " or the "
     (:PARAM NIL "eof-value") ". " :PAR (:PARAM NIL "missing-newline-p") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.2.1 26")
     "Reads from " (:PARAM NIL "input-stream")
     " a line of text that is terminated by a " (:TERM NIL "newline") " or "
     (:TERM NIL "end of file") ". "
     (:COMMENT NIL "% This should follow without saying. -kmp 11-Feb-92"
      "Interactively, this \\term{function} can be used to get a line of input from the \\term{user}.")
     :PAR (:MATH NIL) "If " (:PARAM NIL "recursive-p") " is "
     (:TERM NIL "true")
     ", this call is expected to be embedded in a higher-level call to "
     (:FUNREF NIL "read") " or a similar " (:TERM NIL "function")
     " used by the " (:TERM NIL "Lisp reader") ". " :PAR "The "
     (:TERM NIL "primary value") ", " (:PARAM NIL "line")
     ", is the line that is read, represented as a " (:TERM NIL "string")
     " (without the trailing " (:TERM NIL "newline") ", if any). If "
     (:PARAM NIL "eof-error-p") " is " (:TERM NIL "false") " and the "
     (:TERM NIL "end of file") " for " (:PARAM NIL "input-stream")
     " is reached before any " (:TERM NIL "characters") " are read, "
     (:PARAM NIL "eof-value") " is returned as the " (:PARAM NIL "line") ". "
     :PAR "The " (:TERM NIL "secondary value") ", "
     (:PARAM NIL "missing-newline-p") ", is a "
     (:TERM NIL "generalized boolean") " that is " (:TERM NIL "false")
     " if the " (:PARAM NIL "line") " was terminated by a "
     (:TERM NIL "newline") ", or " (:TERM NIL "true") " if the "
     (:PARAM NIL "line") " was terminated by the " (:TERM NIL "end of file")
     " for " (:PARAM NIL "input-stream") " "
     (:COMMENT NIL
      "KMP: What's the right second value when the first return value is the eof flag?"
      "Moon: Surely true, since there was no newline."
      "KMP: Added the following:")
     "(or if the " (:PARAM NIL "line") " is the " (:PARAM NIL "eof-value")
     "). " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq a \"line 1
 line2\")
→ \"line 1
 line2\"
 (read-line (setq input-stream (make-string-input-stream a)))
→ \"line 1\", "
      (:TERM NIL "false") "
 (read-line input-stream)
→ \"line2\", "
      (:TERM NIL "true") "
 (read-line input-stream nil nil)
→ NIL, "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*standard-input*") ", "
     (:VARREF NIL "*terminal-io*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If an "
     (:TERM NIL "end of file") (:SUB NIL "2")
     " occurs before any characters are read in the line, an error is signaled if "
     (:PARAM NIL "eof-error-p") " is " (:TERM NIL "true") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "read") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 22.2.1 27")
     "The corresponding output function is " (:FUNREF NIL "write-line") ". "
     :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== WRITE-STRING" "%% ========== WRITE-LINE")
   (:COM (:NAME "write-string, write-line" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "write-string")
      (:ARGLIST NIL "string " (:KEYWORD NIL " &optional") " output-stream "
       (:KEYWORD NIL " &key") " start end")
      (:VALUES NIL "string"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "write-line")
      (:ARGLIST NIL "string " (:KEYWORD NIL " &optional") " output-stream "
       (:KEYWORD NIL " &key") " start end")
      (:VALUES NIL "string"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "string") "—a "
     (:TERM NIL "string") ". " :PAR (:PARAM NIL "output-stream") "—an "
     (:TERM NIL "output") " " (:TERM NIL "stream designator")
     ". The default is " (:TERM NIL "standard output") ". " :PAR
     (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " "
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start") ", " (:PARAM NIL "end") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "string")
     ". The defaults for " (:PARAM NIL "start") " and " (:PARAM NIL "end")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.3.1 13")
     (:FUNREF NIL "write-string") " writes the " (:TERM NIL "characters")
     " of the subsequence of " (:PARAM NIL "string") " " (:TERM NIL "bounded")
     " by " (:PARAM NIL "start") " and " (:PARAM NIL "end") " to "
     (:PARAM NIL "output-stream") ". " (:FUNREF NIL "write-line")
     " does the same thing, but then outputs a newline afterwards. " :PAR
     (:COMMENT NIL "% Redundant with \"bounded by\" above. -kmp 23-Jan-92"
      " \\param{start} specifies the offset into \\param{string}."
      " \\param{end} marks the the position following the last element of the substring.")
     :PAR (:COMMENT NIL "% 22.3.1 16" "% this paragraph was left out") :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL
      " (prog1 (write-string \"books\" nil :end 4) (write-string \"worms\"))
⊳ bookworms
→ \"books\"
 (progn (write-char #\\*)
        (write-line \"test12\" *standard-output* :end 5) 
        (write-line \"*test2\")
        (write-char #\\*)
        nil)
⊳ *test1
⊳ *test2
⊳ *
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*standard-output*")
     ", " (:VARREF NIL "*terminal-io*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "read-line") ", "
     (:FUNREF NIL "write-char") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "write-line") " and "
     (:FUNREF NIL "write-string") " return " (:PARAM NIL "string")
     ", not the substring " (:TERM NIL "bounded") " by " (:PARAM NIL "start")
     " and " (:PARAM NIL "end") ". " :PAR
     (:CODE NIL " (write-string string)
≡ (dotimes (i (length string)
      (write-char (char string i)))

 (write-line string)
≡ (prog1 (write-string string) (terpri))
")
     " " (:COMMENT NIL "The WRITE-LINE equivalence supplied by Barmar.") :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Block-Mode I/O --------------------")
   :PAR (:ISSUE NIL "READ-AND-WRITE-BYTES:NEW-FUNCTIONS") " " :PAR
   (:COMMENT NIL "%% ========== READ-SEQUENCE")
   (:COM (:NAME "read-sequence" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "read-sequence")
      (:ARGLIST NIL "sequence stream " (:KEYWORD NIL " &key") " start end")
      (:VALUES NIL "position"))
     " " :PAR (:PARAM NIL "sequence") "—a " (:TERM NIL "sequence") ". " :PAR
     (:PARAM NIL "stream") "—an " (:TERM NIL "input") " " (:TERM NIL "stream")
     ". " :PAR (:PARAM NIL "start") ", " (:PARAM NIL "end") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "sequence")
     ". The defaults for " (:PARAM NIL "start") " and " (:PARAM NIL "end")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. " :PAR
     (:PARAM NIL "position") "—an " (:TERM NIL "integer")
     " greater than or equal to zero, and less than or equal to the "
     (:TERM NIL "length") " of the " (:PARAM NIL "sequence") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Destructively modifies "
     (:PARAM NIL "sequence") " by replacing the " (:TERM NIL "elements") " of "
     (:PARAM NIL "sequence") " " (:TERM NIL "bounded") " by "
     (:PARAM NIL "start") " and " (:PARAM NIL "end") " with "
     (:TERM NIL "elements") " read from " (:PARAM NIL "stream") ". " :PAR
     (:PARAM NIL "Sequence")
     " is destructively modified by copying successive " (:TERM NIL "elements")
     " into it from " (:PARAM NIL "stream") ". If the "
     (:TERM NIL "end of file") " for " (:PARAM NIL "stream")
     " is reached before copying all " (:TERM NIL "elements")
     " of the subsequence, then the extra " (:TERM NIL "elements")
     " near the end of " (:PARAM NIL "sequence") " are not updated. " :PAR
     (:PARAM NIL "Position") " is the index of the first "
     (:TERM NIL "element") " of " (:PARAM NIL "sequence")
     " that was not updated, which might be less than " (:PARAM NIL "end")
     " because the " (:TERM NIL "end of file") " was reached. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defvar *data* (make-array 15 :initial-element nil))
 (values (read-sequence *data* (make-string-input-stream \"test string\")) *data*)
 → 11, #(#\\t #\\e #\\s #\\t #\\Space #\\s #\\t #\\r #\\i #\\n #\\g NIL NIL NIL NIL)
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "Modifies " (:PARAM NIL "stream")
     " and " (:PARAM NIL "sequence") ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "sequence") " is not a "
     (:TERM NIL "proper sequence") ". Should signal an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error") " if "
     (:PARAM NIL "start") " is not a non-negative " (:TERM NIL "integer")
     ". Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "end")
     " is not a non-negative " (:TERM NIL "integer") " or " (:MISC NIL "nil")
     ". " :PAR "Might signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if an " (:TERM NIL "element")
     " read from the " (:PARAM NIL "stream") " is not a member of the "
     (:TERM NIL "element type") " of the " (:PARAM NIL "sequence") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :CONSTANT-MODIFICATION)
     ", " (:FUNREF NIL "write-sequence") ", " (:FUNREF NIL "read-line") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "read-sequence")
     " is identical in effect to iterating over the indicated subsequence and reading one "
     (:TERM NIL "element") " at a time from " (:PARAM NIL "stream")
     " and storing it into " (:PARAM NIL "sequence")
     ", but may be more efficient than the equivalent loop. An efficient implementation is more likely to exist for the case where the "
     (:PARAM NIL "sequence") " is a " (:TERM NIL "vector") " with the same "
     (:TERM NIL "element type") " as the " (:PARAM NIL "stream") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== WRITE-SEQUENCE")
   (:COM (:NAME "write-sequence" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "write-sequence")
      (:ARGLIST NIL "sequence stream " (:KEYWORD NIL " &key") " start end")
      (:VALUES NIL "sequence"))
     " " :PAR (:PARAM NIL "sequence") "—a " (:TERM NIL "sequence") ". " :PAR
     (:PARAM NIL "stream") "—an " (:TERM NIL "output") " " (:TERM NIL "stream")
     ". " :PAR (:PARAM NIL "start") ", " (:PARAM NIL "end") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "sequence")
     ". The defaults for " (:PARAM NIL "start") " and " (:PARAM NIL "end")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "write-sequence")
     " writes the " (:TERM NIL "elements") " of the subsequence of "
     (:PARAM NIL "sequence") " " (:TERM NIL "bounded") " by "
     (:PARAM NIL "start") " and " (:PARAM NIL "end") " to "
     (:PARAM NIL "stream") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (write-sequence \"bookworms\" *standard-output* :end 4)
 ⊳ book
 → \"bookworms\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "Modifies " (:PARAM NIL "stream")
     ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should be prepared to signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "sequence") " is not a "
     (:TERM NIL "proper sequence") ". Should signal an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error") " if "
     (:PARAM NIL "start") " is not a non-negative " (:TERM NIL "integer")
     ". Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "end")
     " is not a non-negative " (:TERM NIL "integer") " or " (:MISC NIL "nil")
     ". " :PAR "Might signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if an " (:TERM NIL "element") " of the "
     (:TERM NIL "bounded") " " (:TERM NIL "sequence")
     " is not a member of the " (:TERM NIL "stream element type") " of the "
     (:PARAM NIL "stream") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :CONSTANT-MODIFICATION)
     ", " (:FUNREF NIL "read-sequence") ", " (:FUNREF NIL "write-string") ", "
     (:FUNREF NIL "write-line") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "write-sequence")
     " is identical in effect to iterating over the indicated subsequence and writing one "
     (:TERM NIL "element") " at a time to " (:PARAM NIL "stream")
     ", but may be more efficient than the equivalent loop. An efficient implementation is more likely to exist for the case where the "
     (:PARAM NIL "sequence") " is a " (:TERM NIL "vector") " with the same "
     (:TERM NIL "element type") " as the " (:PARAM NIL "stream") ". " :PAR))
   " " :PAR (:ENDISSUE NIL "READ-AND-WRITE-BYTES:NEW-FUNCTIONS") " " :PAR
   (:COMMENT NIL "-------------------- File Position --------------------")
   :PAR (:COMMENT NIL "%% ========== FILE-LENGTH")
   (:COM (:NAME "file-length" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "file-length")
      (:ARGLIST NIL "stream") (:VALUES NIL "length"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "stream") "—a "
     (:TERM NIL "stream associated with a file") ". " :PAR
     (:PARAM NIL "length") "—a non-negative " (:TERM NIL "integer") " or "
     (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 23.3.0 21")
     (:FUNREF NIL "file-length") " returns the length of "
     (:PARAM NIL "stream") ", or " (:MISC NIL "nil")
     " if the length cannot be determined. " :PAR
     "For a binary file, the length is measured in units of the "
     (:TERM NIL "element type") " of the " (:PARAM NIL "stream") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (with-open-file (s \"decimal-digits.text\" 
                    :direction :output :if-exists :error)
   (princ \"0123456789\" s)
   (truename s))
→ #P\"A:>Joe>decimal-digits.text.1\"
 (with-open-file (s \"decimal-digits.text\")
   (file-length s))
→ 10
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "stream") " is not a "
     (:TERM NIL "stream associated with a file") ". "
     (:COMMENT NIL "!!! Is this going to run into trouble in cases like:"
      "    (with-input-from-string (s \"foo\") (file-length s))"
      "    which an implementation might want to support even thought it's not required?"
      "    -kmp 26-Apr-91")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "open") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FILE-POSITION")
   (:COM (:NAME "file-position" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "file-position")
      (:ARGLIST NIL "stream") (:VALUES NIL "position"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "file-position")
      (:ARGLIST NIL "stream position-spec") (:VALUES NIL "success-p"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "stream") "—a "
     (:TERM NIL "stream") ". " :PAR (:PARAM NIL "position-spec") "—a "
     (:TERM NIL "file position designator") ". " :PAR (:PARAM NIL "position")
     "—a " (:TERM NIL "file position") " or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "success-p") "—a " (:TERM NIL "generalized boolean") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 23.3.0 16")
     "Returns or changes the current position within a " (:PARAM NIL "stream")
     ". " :PAR (:COMMENT NIL "% 23.3.0 17") "When "
     (:PARAM NIL "position-spec") " is not supplied, "
     (:FUNREF NIL "file-position") " returns the current "
     (:TERM NIL "file position") " in the " (:PARAM NIL "stream") ", or "
     (:MISC NIL "nil") " if this cannot be determined. " :PAR
     (:COMMENT NIL "% 23.3.0 18") "When " (:PARAM NIL "position-spec")
     " is supplied, the " (:TERM NIL "file position") " in "
     (:PARAM NIL "stream") " is set to that " (:TERM NIL "file position")
     " (if possible). " (:FUNREF NIL "file-position") " returns "
     (:TERM NIL "true") " if the repositioning is performed successfully, or "
     (:TERM NIL "false") " if it is not. " :PAR
     (:COMMENT NIL
      "%KMP: I could find no reference which supported this claim. It looks well-defined to me."
      " The consequences are undefined if \\param{file-stream} "
      " is not a \\term{stream} that is open to a random-access file. ")
     :PAR "An " (:TERM NIL "integer") " returned by "
     (:FUNREF NIL "file-position") " of one argument should be acceptable as "
     (:PARAM NIL "position-spec") " for use with the same file. " :PAR
     "For a character file, performing a single " (:FUNREF NIL "read-char")
     " or " (:FUNREF NIL "write-char")
     " operation may cause the file position to be increased by more than 1 because of character-set translations (such as translating between the "
     (:RM NIL " Common Lisp") " " (:TT NIL "#\\Newline")
     " character and an external ASCII carriage-return/line-feed sequence) and other aspects of the implementation. For a binary file, every "
     (:FUNREF NIL "read-byte") " or " (:FUNREF NIL "write-byte")
     " operation increases the file position by 1. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun tester ()
   (let ((noticed '()) file-written)
     (flet ((notice (x) (push x noticed) x))
       (with-open-file (s \"test.bin\" 
                          :element-type '(unsigned-byte 8)
                          :direction :output
                          :if-exists :error)
          (notice (file-position s)) ;1
          (write-byte 5 s) 
          (write-byte 6 s)
          (let ((p (file-position s)))
            (notice p) ;2
            (notice (when p (file-position s (1- p))))) ;3
          (write-byte 7 s)
          (notice (file-position s)) ;4
          (setq file-written (truename s)))
        (with-open-file (s file-written
                           :element-type '(unsigned-byte 8)
                           :direction :input)
          (notice (file-position s)) ;5
          (let ((length (file-length s)))
            (notice length) ;6
            (when length
              (dotimes (i length)
                (notice (read-byte s)))))) ;7,...
        (nreverse noticed))))
→ tester
 (tester)
→ (0 2 T 2 0 2 5 7)
OR→ (0 2 NIL 3 0 3 5 6 7)
OR→ (NIL NIL NIL NIL NIL NIL)
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "When the "
     (:PARAM NIL "position-spec") " argument is supplied, the "
     (:TERM NIL "file position") " in the " (:PARAM NIL "stream")
     " might be moved. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The value returned by "
     (:FUNREF NIL "file-position")
     " increases monotonically as input or output operations are performed. "
     :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL
      "Note: KMP thinks there are implemetantions which might provide extensions to allow"
      "   non-integer position specs and that we should use special error terminology here"
      "   in order to give them some latitude.")
     "If " (:PARAM NIL "position-spec")
     " is supplied, but is too large or otherwise inappropriate, an error is signaled. "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "file-length") ", "
     (:FUNREF NIL "file-string-length") ", " (:FUNREF NIL "open") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 23.3.0 19")
     "Implementations that have character files represented as a sequence of records of bounded size might choose to encode the file position as, for example, "
     (:METAVAR NIL "record-number") "*" (:METAVAR NIL "max-record-size") "+"
     (:METAVAR NIL "character-within-record")
     ". This is a valid encoding because it increases monotonically as each character is read or written, though not necessarily by 1 at each step. An "
     (:TERM NIL "integer") " might then be considered “inappropriate” as "
     (:PARAM NIL "position-spec") " to " (:FUNREF NIL "file-position")
     " if, when decoded into record number and character number, it turned out that the supplied record was too short for the specified character number. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FILE-STRING-LENGTH")
   (:COM (:NAME "file-string-length" :FTYPE "Function")
    (:ISSUE NIL "CHARACTER-PROPOSAL:2-5-7") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "file-string-length")
      (:ARGLIST NIL "stream object") (:VALUES NIL "length"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "stream") "—an "
     (:TERM NIL "output") " " (:TERM NIL "character") " "
     (:TERM NIL "file stream") ". " :PAR (:PARAM NIL "object") "—a "
     (:TERM NIL "string") " or a " (:TERM NIL "character") ". " :PAR
     (:PARAM NIL "length") "—a non-negative " (:TERM NIL "integer") ", or "
     (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "file-string-length")
     " returns the difference between what "
     (:TT NIL "(file-position " (:PARAM NIL "stream") ")")
     " would be after writing " (:PARAM NIL "object")
     " and its current value, or " (:MISC NIL "nil")
     " if this cannot be determined. " :PAR
     "The returned value corresponds to the current state of "
     (:PARAM NIL "stream") " at the time of the call and might not be "
     (:COMMENT NIL " valid if it is called twice;"
      " two different values may occur.")
     "the same if it is called again when the state of the "
     (:TERM NIL "stream") " has changed. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-5-7") " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- File Opening --------------------") :PAR
   (:COMMENT NIL " %%% ========== OPEN" " \\begincom{open}\\ftype{Function}"
    " " " \\label Syntax::" " " " \\DefunWithValuesNewline open"
    " 		 	{filespec {\\key} \\vtop{\\hbox{direction element-type}"
    " 				               \\hbox{if-exists if-does-not-exist"
    " 						     external-format}}}" " 		        {stream}" " "
    " \\label Arguments and Values::" " "
    " \\param{filespec}---a \\term{pathname designator}." " "
    " \\param{direction}---one of \\kwd{input}, \\kwd{output}, \\kwd{io}, or \\kwd{probe}."
    "  \\Default{\\kwd{input}}" " " " %% 23.2.0 9" " %% 23.2.0 10"
    " %% 23.2.0 11" " %% 23.2.0 12" " %% 23.2.0 13" " %% 23.2.0 14"
    " %% 23.2.0 15" " %% 23.2.0 16" " %% 23.2.0 17" " %% 23.2.0 18"
    " %% 23.2.0 19" " \\param{element-type}---a \\term{type specifier} "
    " 		       for \\term{recognizable subtype} of \\typeref{character};"
    " 		    or a \\term{type specifier} "
    " 		       for a \\term{finite} \\term{recognizable subtype} of \\term{integer};"
    " 		    or one of the \\term{symbols} "
    "                           \\misc{signed-byte},"
    "                           \\misc{unsigned-byte},"
    " 		       or \\kwd{default}."
    " % \\param{element-type}---\\term{type specifier};"
    " %   a \\term{subtype} of \\typeref{character} or \\typeref{integer};"
    " %   one of the following:" " %      \\typeref{character},"
    " %      \\f{(unsigned-byte \\i{n})}," " %      \\typeref{unsigned-byte},"
    " %      \\f{(signed-byte \\i{n})}," " %      \\typeref{signed-byte},"
    " %      \\typeref{bit}," " %      \\f{(mod \\i{n})},"
    " %   or \\kwd{default}," " % where \\i{n} is an \\term{integer}."
    "   \\Default{\\typeref{character}}" " " " %% 23.2.0 21" " %% 23.2.0 22"
    " %% 23.2.0 23" " %% 23.2.0 24" " %% 23.2.0 25" " %% 23.2.0 26"
    " %% 23.2.0 27" " %% 23.2.0 28"
    " \\param{if-exists}---one of \\kwd{error}, \\kwd{new-version}, \\kwd{rename},"
    " 		  \\kwd{rename-and-delete}, \\kwd{overwrite}, \\kwd{append},"
    " 		  \\kwd{supersede}, or \\nil." " " " %% 23.2.0 35" " %% 23.2.0 36"
    " \\param{if-does-not-exist}---one of \\kwd{error}, \\kwd{create}, or \\nil."
    " " " \\issue{CHARACTER-PROPOSAL:2-5-2}"
    " \\param{external-format}---an \\term{external file format designator}."
    "   \\Default{\\kwd{default}}" " \\endissue{CHARACTER-PROPOSAL:2-5-2}" " "
    " \\issue{STREAM-ACCESS:ADD-TYPES-ACCESSORS}"
    " \\param{stream}---a \\term{file stream} or \\nil."
    " \\endissue{STREAM-ACCESS:ADD-TYPES-ACCESSORS}" " "
    " \\label Description::" " " " %% 23.2.0 2" " %% 23.2.0 3"
    " \\funref{open} creates, opens, and returns a \\term{file stream} "
    " that is connected to the file specified by \\param{filespec}."
    " \\param{Filespec} is the name of the file to be opened.  "
    " %% Moon: Mostly redundant."
    " % \\issue{CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY}"
    " % If \\param{filespec} is a \\term{stream},"
    " % \\param{filespec} effectively"
    " % becomes {\\tt (pathname \\param{filespec})}. \\funref{open}"
    " % can be used on either an open or a closed \\term{stream},"
    " % \\endissue{CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY}"
    " % and the \\term{stream} is not" " % closed first or otherwise affected."
    " % \\issue{PATHNAME-STREAM}"
    " % Also, if \\param{filespec} is a \\term{stream}, "
    " % that \\term{stream}" " % can only have been originally opened by"
    " % \\funref{open} or \\macref{with-open-file}, "
    " % or is a \\term{synonym stream} whose \\term{symbol} is bound"
    " % to a \\term{stream} originally opened by"
    " % \\funref{open} or \\macref{with-open-file}."
    " % If \\param{filespec} is a \\term{pathname} (as returned by \\funref{pathname})"
    " % it represents the name used to open the file. This might be, but is"
    " % not required to be, the actual name of the file. "
    " % \\issue{PATHNAME-LOGICAL:ADD}"
    " % If \\param{filespec} is a \\term{logical pathname}, it is translated"
    " % into a physical pathname as if by calling \\funref{translate-logical-pathname}."
    " % \\endissue{PATHNAME-LOGICAL:ADD}"
    " %% Salvaged from the above. -kmp 16-Feb-92"
    " If the \\param{filespec} \\term{designator} is a \\term{stream},"
    " that \\term{stream} is not closed first or otherwise affected." " "
    " %% Implied by pathname designator. -kmp 16-Feb-92"
    " % It is an error if \\param{filespec} is a \\term{stream} that is "
    " % created with \\funref{make-two-way-stream}, "
    " % \\funref{make-echo-stream}," " % \\funref{make-broadcast-stream}, "
    " % \\funref{make-concatenated-stream}, \\funref{make-string-input-stream},"
    " % \\funref{make-string-output-stream}." " %\\endissue{PATHNAME-STREAM}"
    " " " The keyword arguments to \\funref{open} specify the characteristics "
    " of the \\term{file stream} that is returned, and how to handle errors."
    " " " %% 23.2.0 30" " If \\param{direction} is \\kwd{input}"
    " %% Barrett: defaults" " %, not supplied, " " or \\kwd{probe},"
    " or if \\param{if-exists} is not \\kwd{new-version}"
    " and the version component of the \\param{filespec} is \\kwd{newest},"
    " then the file opened is that file already existing in the file system"
    " that has a version greater than that of any other file in the file system"
    " whose other pathname components are the same as those of \\param{filespec}."
    " " " " " %% 23.2.0 31" " %% 23.2.0 32"
    " An implementation is required to recognize all of "
    " the \\funref{open} keyword options "
    " and to do something reasonable in the context of the host operating"
    " system.  "
    " For example, if a file system does not support distinct file"
    " versions and does not distinguish the notions of deletion and expunging,"
    " \\kwd{new-version} might be treated the same as"
    " \\kwd{rename} or \\kwd{supersede}, and \\kwd{rename-and-delete} might"
    " be treated the same as \\kwd{supersede}." " " " \\beginlist"
    " \\itemitem{\\bf :direction}" " " " "
    " \\Thenextfigure\\ lists the possible values for \\param{direction} options and their meanings."
    " %% 23.2.0 4" " %% 23.2.0 5" " %% 23.2.0 6" " %% 23.2.0 7" " %% 23.2.0 8"
    " \\boxfig" " {\\dimen0=.75pc" " \\tabskip \\dimen0 plus .5 fil"
    " \\halign to \\hsize {#\\hfil\\tabskip \\dimen0 plus 1fil&#\\hfil\\cr "
    " \\noalign{\\vskip -9pt}"
    " \\hfil{\\bf Direction} & {\\bf Result with respect to the created \\term{stream}} \\cr"
    " \\noalign{\\vskip 2pt\\hrule\\vskip 2pt}" " \\kwd{input}"
    " % or not supplied"
    " 			    & Creates an \\term{input} \\term{file stream}. \\cr"
    " 			    & \\cr"
    " \\kwd{output} 	            & Creates an \\term{output} \\term{file stream}. \\cr"
    " 			    & \\cr"
    " \\kwd{io} 		    & Creates a \\term{bidirectional} \\term{file stream}. \\cr"
    " 			    & \\cr"
    " \\kwd{probe} 	            & Creates a no-directional \\term{file stream};"
    " 			      the \\term{file stream}  \\cr"
    "              		    & is in effect created and then closed. \\cr"
    " \\noalign{\\vskip -9pt}" " }}" " \\caption{Options for open---1}"
    " \\endfig" " " " " " \\itemitem{\\bf :element-type}" " "
    " \\param{element-type} specifies the unit of transaction for the \\term{file stream}."
    " %% This is the only salvaged info from the next block of commented out stuff. -kmp 14-Feb-92"
    " If it is \\kwd{default}, the unit is determined by \\term{file system},"
    " possibly based on the \\term{file}." " % "
    " % \\Thenextfigure\\ gives the correspondence between the listed values for"
    " % \\param{element-type} and the unit of transaction." " % " " % \\boxfig"
    " % {\\dimen0=.75pc" " % \\tabskip \\dimen0 plus .5 fil"
    " % \\halign to \\hsize {#\\hfil\\tabskip \\dimen0 plus 1fil&#\\hfil\\cr "
    " % \\noalign{\\vskip -9pt}"
    " % \\hfil{\\bf Element-type} & {\\bf Unit of Transaction} \\cr"
    " % \\noalign{\\vskip 2pt\\hrule\\vskip 2pt}"
    " % %{\\tt string-char} or not supplied & a \\term{string-char} \\cr"
    " % %& \\cr" " % {\\tt character} & Any \\term{character} \\cr" " % & \\cr"
    " % {\\tt (unsigned-byte \\i{n})} & A non-negative \\term{integer} of size"
    " % \\i{n} \\cr" " % & \\cr"
    " % {\\tt unsigned-byte} & A non-negative \\term{integer} (size determined"
    " % by file system) \\cr" " % & \\cr"
    " % {\\tt (signed-byte \\i{n})} & Signed byte of size \\i{n} \\cr"
    " % & \\cr"
    " % {\\tt signed-byte} & Signed byte (size determined by file system) \\cr"
    " % & \\cr" " % {\\tt bit} & Values \\f{0} and \\f{1} \\cr" " % & \\cr"
    " % {\\tt (mod \\i{n})} & A non-negative \\term{integer} less than \\i{n}"
    " % \\cr" " % & \\cr"
    " % \\kwd{default} & Determined by file system based on the file \\cr"
    " % \\noalign{\\vskip -9pt}" " % }}" " % \\caption{Options for open---2}"
    " % \\endfig" " " " \\itemitem{\\bf :if-exists}" " "
    " \\param{if-exists} specifies the action to be taken if \\param{direction} is"
    " \\kwd{output} or \\kwd{io} and a file of the name \\param{filespec} "
    " already exists."
    " If \\param{direction} is \\kwd{input}, not supplied, or \\kwd{probe}, "
    " \\param{if-exists} is ignored."
    " \\Thenextfigure\\ gives the result of \\funref{open} as modified "
    " by \\param{if-exists}." " %% 23.2.0 29" " %% 23.2.0 20" " " " \\boxfig"
    " {\\dimen0=.75pc" " \\tabskip \\dimen0 plus .5 fil"
    " \\halign to \\hsize {#\\hfil\\tabskip \\dimen0 plus 1fil&#\\hfil\\cr "
    " \\noalign{\\vskip -9pt}"
    " \\hfil{\\bf If-exists} & {\\bf Result with respect to file named \\param{filespec}} \\cr"
    " \\noalign{\\vskip 2pt\\hrule\\vskip 2pt}"
    " \\kwd{error} or not supplied & An error \\oftype{file-error} is signaled. \\cr"
    " when the version component of & \\cr"
    " \\param{filespec} is not \\kwd{newest} & \\cr" "  & \\cr"
    " \\kwd{new-version} or not supplied & A new file is created \\cr"
    " when the version component of &	with a larger version number. \\cr"
    " \\param{filespec} is \\kwd{newest} & \\cr" "  & \\cr"
    " \\kwd{rename} & The existing file is renamed \\cr"
    " 	& to some other name and then a new file is created. \\cr" " & \\cr"
    " \\kwd{rename-and-delete} & The existing file is renamed \\cr"
    " 	& to some other name, then it is deleted \\cr"
    " 	& but not expunged, and then a new file is created. \\cr" " & \\cr"
    " \\kwd{overwrite} & Output operations on the \\term{stream} \\cr"
    " 	& destructively modify the existing file. \\cr"
    " 	& If \\param{direction} is \\kwd{io} the file is  \\cr"
    "       	& opened in a bidirectional mode that allows both \\cr"
    " 	& reading and writing.  The file pointer is initially \\cr"
    "    	& positioned at the beginning of the file; however, \\cr"
    "         & the file is not truncated back to length zero \\cr"
    "    	& when it is opened. \\cr" " & \\cr"
    " \\kwd{append} & Output operations on the \\term{stream} \\cr"
    " 	& destructively modify the existing file.  \\cr"
    " 	& The file pointer is initially positioned at \\cr"
    "         & the end of the file. \\cr"
    " 	& If \\param{direction} is \\kwd{io}, \\cr"
    "  	& the file is opened in a bidirectional mode that \\cr"
    " 	& allows both reading and writing. \\cr" " & \\cr"
    " \\kwd{supersede} & The existing file is superseded,   \\cr"
    " 	& \\ie a new file with the same name as the old \\cr"
    " 	& one is created. If possible, the implementation \\cr"
    " 	& should not destroy the old file until the new \\cr"
    "         &  \\term{stream} is closed. \\cr" " & \\cr"
    " \\nil\\ & No file or \\term{stream} is created. \\cr"
    " 	& \\nil\\ is returned to indicate failure. \\cr"
    " \\noalign{\\vskip -9pt}" " }}" " \\caption{Options for open---3}"
    " \\endfig" "                                      "
    " \\itemitem{\\bf :if-does-not-exist}" " " " %% 23.2.0 34"
    " \\param{if-does-not-exist}" " specifies the action to be taken if"
    " a file of name \\param{filespec} does not already exist."
    " \\Thenextfigure\\  gives the result of \\funref{open} as modified by "
    " \\param{if-does-not-exist}." " " " " " %% 23.2.0 37"
    " \\boxfig                             " " {\\dimen0=.75pc"
    " \\tabskip \\dimen0 plus .5 fil"
    " \\halign to \\hsize {#\\hfil\\tabskip \\dimen0 plus 1fil&#\\hfil\\cr "
    " \\noalign{\\vskip -9pt}"
    " \\hfil{\\bf If-does-not-exist} & {\\bf Result with respect to file named \\param{filespec}} \\cr"
    " \\noalign{\\vskip 2pt\\hrule\\vskip 2pt}"
    " \\kwd{error} or not supplied & An error \\oftype{file-error} is signaled. \\cr"
    " and \\param{direction} is \\kwd{input}, & \\cr"
    " or if \\param{if-exists} is  & \\cr"
    " \\kwd{overwrite} or \\kwd{append}. & \\cr" "  & \\cr"
    " \\kwd{create} or not supplied & An empty file is created. \\cr"
    " when \\param{direction} is \\kwd{output}& Processing continues  as if the file \\cr"
    " or \\kwd{io}, and \\param{if-exists} & had already existed but no processing as \\cr"
    " is anything but \\kwd{overwrite} & directed by \\param{if-exists} is performed. \\cr"
    " or \\kwd{append}. & \\cr" "  & \\cr"
    " \\nil\\ or not supplied & No file or \\term{stream} is created. \\cr"
    " when \\param{direction} is \\kwd{probe}.& \\nil\\ is returned to indicate failure. \\cr"
    " \\noalign{\\vskip -9pt}" " }}" " \\caption{Options for open---4}"
    " \\endfig" " " " \\issue{CHARACTER-PROPOSAL:2-5-2}"
    " \\itemitem{\\kwd{external-format}}" " "
    " This option selects an \\term{external file format} for the \\term{file}:"
    " % There are no conforming"
    " % \\term{values} for \\param{external-format} other than the default \\term{value},"
    " % \\kwd{default}, which selects a format that can accomodate at least the"
    " % \\term{base characters}.  \\term{Implementations} are permitted to define"
    " % additional external file formats."
    " The only \\term{standardized} value for this option is \\kwd{default},"
    " although \\term{implementations} are permitted to define additional "
    " \\term{external file formats} and \\term{implementation-dependent} values "
    " returned by \\funref{stream-external-format} can also be used by \\term{conforming programs}."
    "  " " % The \\param{external-format} is meaningful for "
    " %      \\term{input}," " %      \\term{output},"
    " %  and \\term{bidirectional} \\term{streams}."
    " %% Rewritten by KMP based on discussions with RWK:"
    " The \\param{external-format} is meaningful for"
    " any kind of \\term{file stream} whose \\term{element type}"
    " is a \\term{subtype} of \\term{character}."
    " This option is ignored for \\term{streams} for which it is not meaningful;"
    " however, \\term{implementations} may define other \\term{element types} "
    " for which it is meaningful." " %End of rewrite."
    " The consequences are unspecified if a \\term{character} is written "
    " that cannot be represented by the given \\term{external file format}."
    " \\endissue{CHARACTER-PROPOSAL:2-5-2}" " " " \\endlist" " "
    " %% 23.2.0 1 "
    " When a file is opened, a \\term{file stream} is constructed to serve"
    " as the file system's ambassador to the \\Lisp\\ environment;"
    " operations on the \\term{file stream} are reflected by operations on the file"
    " in the file system.  " " "
    " A file can be deleted, renamed, or destructively modified by \\funref{open}."
    " " " For information about opening relative pathnames,"
    " \\seesection\\MergingPathnames." " " " \\label Examples::" " " " \\code"
    "  (open \\i{filespec} :direction :probe)  \\EV #<Closed Probe File Stream...>"
    "  (setq q (merge-pathnames (user-homedir-pathname) \"test\"))"
    " \\EV #<PATHNAME :HOST NIL :DEVICE \\i{device-name} :DIRECTORY \\i{directory-name}"
    "     :NAME \"test\" :TYPE NIL :VERSION :NEWEST>"
    "  (open \\i{filespec} :if-does-not-exist :create) \\EV #<Input File Stream...>"
    "  (setq s (open \\i{filespec} :direction :probe)) \\EV #<Closed Probe File Stream...>"
    "  (truename s) \\EV #<PATHNAME :HOST NIL :DEVICE \\i{device-name} :DIRECTORY"
    "     \\i{directory-name} :NAME \\i{filespec} :TYPE \\i{extension} :VERSION 1>"
    "  (open s :direction :output :if-exists nil) \\EV NIL " " \\endcode" " "
    " \\label Affected By::" " "
    " The nature and state of the host computer's \\term{file system}." " "
    " \\label Exceptional Situations::                        " " "
    " If \\param{if-exists} is \\kwd{error}, (subject to the"
    " constraints on the meaning of \\param{if-exists} listed above),"
    " an error \\oftype{file-error} is signaled.                        " " "
    " If \\param{if-does-not-exist} is \\kwd{error} (subject to the"
    " constraints on the meaning of \\param{if-does-not-exist} listed above),"
    " an error \\oftype{file-error} is signaled." " " " %% 23.2.0 33"
    " If it is impossible for an implementation to handle some option"
    " in a manner close to what is specified here,"
    " an error \\oftype{error} might be signaled." " "
    " \\issue{PATHNAME-WILD:NEW-FUNCTIONS}"
    " % !!! Moon: I would have assumed type-error rather than file-error for this one."
    " %           I have no strong opinion, though."
    " An error \\oftype{file-error} is signaled if"
    " {\\tt (wild-pathname-p \\param{filespec})} returns true."
    " \\endissue{PATHNAME-WILD:NEW-FUNCTIONS}" " "
    " \\issue{CHARACTER-PROPOSAL:2-5-2}"
    " An error \\oftype{error} is signaled if the \\param{external-format} "
    " is not understood by the \\term{implementation}."
    " \\endissue{CHARACTER-PROPOSAL:2-5-2}" " "
    " % Refer to minutes of Dec-91 meeting (issue STREAM-ELEMENT-TYPE-UPGRADING) for"
    " % an explanation of where this came from. -kmp 12-Feb-92"
    " The various \\term{file systems} in existence today have widely differing capabilities,"
    " and some aspects of the \\term{file system} are beyond the scope of this specification"
    " to define.  A given \\term{implementation} might not be able to support all of these options "
    " in exactly the manner stated.  An \\term{implementation} is required to recognize all of "
    " these option keywords and to try to do something ``reasonable'' in the context of the "
    " host \\term{file system}.  Where necessary to accomodate the \\term{file system},"
    " an \\term{implementation} deviate slightly from the semantics specified here without "
    " being disqualified for consideration as a \\term{conforming implementation}."
    " If it is utterly impossible for an \\term{implementation} to handle some option"
    " in a manner similar to what is specified here, it may simply signal an error."
    " " " With regard to the \\kwd{element-type} option, if a \\term{type} is"
    " requested that is not supported by the \\term{file system}, a substitution of types "
    " such as that which goes on in \\term{upgrading} is permissible.  As a minimum "
    " requirement, it should be the case that opening an \\term{output} \\term{stream}"
    " to a \\term{file} in a given \\term{element type} and later opening "
    " an \\term{input} \\term{stream} to the same \\term{file} in the same \\term{element type}"
    " should work compatibly." " " " \\label See Also::" " "
    " \\issue{PATHNAME-LOGICAL:ADD}" " \\funref{with-open-file},"
    " \\funref{close}," " \\typeref{pathname}," " \\typeref{logical-pathname},"
    " \\endissue{PATHNAME-LOGICAL:ADD}" " {\\secref\\MergingPathnames}" " "
    " \\label Notes::" " "
    " \\issue{PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES}"
    " % \\issue{PATHNAME-LOGICAL:ADD}"
    " % Whether or not \\funref{open} recognizes \\term{logical pathname} \\term{namestrings}"
    " % is \\term{implementation-defined}."
    " % \\endissue{PATHNAME-LOGICAL:ADD}"
    " \\endissue{PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES}" "  "
    " %% 23.2.0 38"
    " \\funref{open} does not automatically close the file when an abnormal"
    " exit occurs." " "
    " When \\param{element-type} is a \\term{subtype} of \\typeref{character},"
    " \\funref{read-char} and/or \\funref{write-char} can be"
    " used on the resulting \\term{file stream}. " " "
    " When \\param{element-type} is a \\term{subtype} of \\term{integer},"
    " \\funref{read-byte} and/or \\funref{write-byte} can be used on the resulting \\term{file stream}."
    " " " % When \\param{element-type} is " " %     \\typeref{unsigned-byte},"
    " %     {\\tt (unsigned-byte \\i{n})}," " %     \\typeref{signed-byte},"
    " %     {\\tt (signed-byte \\i{n})}," " %     \\typeref{bit}, "
    " %  or {\\tt (mod \\i{n})},"
    " % \\funref{read-byte} and/or \\funref{write-byte} can be"
    " % used on the resulting \\term{file stream}." " "
    " When \\param{element-type} is \\kwd{default},"
    " the \\term{type} can be determined by using \\funref{stream-element-type}."
    " " " \\endcom")
   :PAR (:COMMENT NIL "%% ========== OPEN")
   (:COM (:NAME "open" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "open")
      (:ARGLIST NIL "filespec " (:KEYWORD NIL " &key")
       " direction element-type if-exists if-does-not-exist external-format")
      (:VALUES NIL "stream"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "filespec")
     "—a " (:TERM NIL "pathname designator") ". " :PAR (:PARAM NIL "direction")
     "—one of " (:KWD NIL "input") ", " (:KWD NIL "output") ", "
     (:KWD NIL "io") ", or " (:KWD NIL "probe") ". The default is "
     (:KWD NIL "input") ". " :PAR
     (:COMMENT NIL "% 23.2.0 9" "% 23.2.0 10" "% 23.2.0 11" "% 23.2.0 12"
      "% 23.2.0 13" "% 23.2.0 14" "% 23.2.0 15" "% 23.2.0 16" "% 23.2.0 17"
      "% 23.2.0 18" "% 23.2.0 19")
     (:PARAM NIL "element-type") "—a " (:TERM NIL "type specifier") " for "
     (:TERM NIL "recognizable subtype") " of " (:TYPEREF NIL "character")
     "; or a " (:TERM NIL "type specifier") " for a " (:TERM NIL "finite") " "
     (:TERM NIL "recognizable subtype") " of " (:TERM NIL "integer")
     "; or one of the " (:TERM NIL "symbols") " " (:MISC NIL "signed-byte")
     ", " (:MISC NIL "unsigned-byte") ", or " (:KWD NIL "default")
     ". The default is " (:TYPEREF NIL "character") ". " :PAR
     (:COMMENT NIL "% 23.2.0 21" "% 23.2.0 22" "% 23.2.0 23" "% 23.2.0 24"
      "% 23.2.0 25" "% 23.2.0 26" "% 23.2.0 27" "% 23.2.0 28")
     (:PARAM NIL "if-exists") "—one of " (:KWD NIL "error") ", "
     (:KWD NIL "new-version") ", " (:KWD NIL "rename") ", "
     (:KWD NIL "rename-and-delete") ", " (:KWD NIL "overwrite") ", "
     (:KWD NIL "append") ", " (:KWD NIL "supersede") ", or " (:MISC NIL "nil")
     ". The default is " (:KWD NIL "new-version")
     " if the version component of " (:PARAM NIL "filespec") " is "
     (:KWD NIL "newest") ", or " (:KWD NIL "error") " otherwise. " :PAR
     (:COMMENT NIL "% 23.2.0 35" "% 23.2.0 36")
     (:PARAM NIL "if-does-not-exist") "—one of " (:KWD NIL "error") ", "
     (:KWD NIL "create") ", or " (:MISC NIL "nil") ". The default is "
     (:KWD NIL "error") " if " (:PARAM NIL "direction") " is "
     (:KWD NIL "input") " or " (:PARAM NIL "if-exists") " is "
     (:KWD NIL "overwrite") " or " (:KWD NIL "append") "; " (:KWD NIL "create")
     " if " (:PARAM NIL "direction") " is " (:KWD NIL "output") " or "
     (:KWD NIL "io") ", and " (:PARAM NIL "if-exists") " is neither "
     (:KWD NIL "overwrite") " nor " (:KWD NIL "append") "; or "
     (:MISC NIL "nil") " when " (:PARAM NIL "direction") " is "
     (:KWD NIL "probe") ". " :PAR (:ISSUE NIL "CHARACTER-PROPOSAL:2-5-2") " "
     (:PARAM NIL "external-format") "—an "
     (:TERM NIL "external file format designator") ". The default is "
     (:KWD NIL "default") ". " (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-5-2") " "
     :PAR (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " "
     (:PARAM NIL "stream") "—a " (:TERM NIL "file stream") " or "
     (:MISC NIL "nil") ". " (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS")
     " " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 23.2.0 2" "% 23.2.0 3") (:FUNREF NIL "open")
     " creates, opens, and returns a " (:TERM NIL "file stream")
     " that is connected to the file specified by " (:PARAM NIL "filespec")
     ". " (:PARAM NIL "Filespec") " is the name of the file to be opened. "
     (:COMMENT NIL "% Moon: Mostly redundant."
      " \\issue{CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY}"
      " If \\param{filespec} is a \\term{stream},"
      " \\param{filespec} effectively"
      " becomes {\\tt (pathname \\param{filespec})}. \\funref{open}"
      " can be used on either an open or a closed \\term{stream},"
      " \\endissue{CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY}"
      " and the \\term{stream} is not" " closed first or otherwise affected."
      " \\issue{PATHNAME-STREAM}"
      " Also, if \\param{filespec} is a \\term{stream}, "
      " that \\term{stream}" " can only have been originally opened by"
      " \\funref{open} or \\macref{with-open-file}, "
      " or is a \\term{synonym stream} whose \\term{symbol} is bound"
      " to a \\term{stream} originally opened by"
      " \\funref{open} or \\macref{with-open-file}."
      " If \\param{filespec} is a \\term{pathname} (as returned by \\funref{pathname})"
      " it represents the name used to open the file. This might be, but is"
      " not required to be, the actual name of the file. "
      " \\issue{PATHNAME-LOGICAL:ADD}"
      " If \\param{filespec} is a \\term{logical pathname}, it is translated"
      " into a physical pathname as if by calling \\funref{translate-logical-pathname}."
      " \\endissue{PATHNAME-LOGICAL:ADD}"
      "% Salvaged from the above. -kmp 16-Feb-92")
     "If the " (:PARAM NIL "filespec") " " (:TERM NIL "designator") " is a "
     (:TERM NIL "stream") ", that " (:TERM NIL "stream")
     " is not closed first or otherwise affected. " :PAR
     "The keyword arguments to " (:FUNREF NIL "open")
     " specify the characteristics of the " (:TERM NIL "file stream")
     " that is returned, and how to handle errors. " :PAR
     (:COMMENT NIL "% 23.2.0 30") "If " (:PARAM NIL "direction") " is "
     (:KWD NIL "input") " "
     (:COMMENT NIL "% Barrett: defaults" ", not supplied, ") "or "
     (:KWD NIL "probe") ", or if " (:PARAM NIL "if-exists") " is not "
     (:KWD NIL "new-version") " and the version component of the "
     (:PARAM NIL "filespec") " is " (:KWD NIL "newest")
     ", then the file opened is that file already existing in the file system that has a version greater than that of any other file in the file system whose other pathname components are the same as those of "
     (:PARAM NIL "filespec") ". " :PAR
     (:COMMENT NIL "% 23.2.0 31" "% 23.2.0 32")
     "An implementation is required to recognize all of the "
     (:FUNREF NIL "open")
     " keyword options and to do something reasonable in the context of the host operating system. For example, if a file system does not support distinct file versions and does not distinguish the notions of deletion and expunging, "
     (:KWD NIL "new-version") " might be treated the same as "
     (:KWD NIL "rename") " or " (:KWD NIL "supersede") ", and "
     (:KWD NIL "rename-and-delete") " might be treated the same as "
     (:KWD NIL "supersede") ". " :PAR
     (:LIST NIL
      (:ITEM NIL (:KWD NIL "direction") " " :PAR
       "These are the possible values for " (:PARAM NIL "direction")
       ", and how they affect the nature of the " (:TERM NIL "stream")
       " that is created: " :PAR
       (:LIST NIL
        (:ITEM NIL (:KWD NIL "input") " " :PAR "Causes the creation of an "
         (:TERM NIL "input") " " (:TERM NIL "file stream") ". " :PAR)
        (:ITEM NIL (:KWD NIL "output") " " :PAR "Causes the creation of an "
         (:TERM NIL "output") " " (:TERM NIL "file stream") ". " :PAR)
        (:ITEM NIL (:KWD NIL "io") " " :PAR "Causes the creation of a "
         (:TERM NIL "bidirectional") " " (:TERM NIL "file stream") ". " :PAR)
        (:ITEM NIL (:KWD NIL "probe") " " :PAR
         "Causes the creation of a “no-directional” " (:TERM NIL "file stream")
         "; in effect, the " (:TERM NIL "file stream")
         " is created and then closed prior to being returned by "
         (:FUNREF NIL "open") ". " :PAR))
       " " :PAR)
      (:ITEM NIL (:KWD NIL "element-type") " " :PAR "The "
       (:PARAM NIL "element-type")
       " specifies the unit of transaction for the " (:TERM NIL "file stream")
       ". "
       (:COMMENT NIL
        "% This is the only salvaged info from the next block of commented out stuff. -kmp 14-Feb-92")
       "If it is " (:KWD NIL "default") ", the unit is determined by "
       (:TERM NIL "file system") ", possibly based on the " (:TERM NIL "file")
       ". " :PAR)
      (:ITEM NIL (:KWD NIL "if-exists") " " :PAR (:PARAM NIL "if-exists")
       " specifies the action to be taken if " (:PARAM NIL "direction") " is "
       (:KWD NIL "output") " or " (:KWD NIL "io") " and a file of the name "
       (:PARAM NIL "filespec") " already exists. If " (:PARAM NIL "direction")
       " is " (:KWD NIL "input") ", not supplied, or " (:KWD NIL "probe") ", "
       (:PARAM NIL "if-exists") " is ignored. These are the results of "
       (:FUNREF NIL "open") " as modified by " (:PARAM NIL "if-exists") ": "
       (:COMMENT NIL "% 23.2.0 29" "% 23.2.0 20") :PAR
       (:LIST NIL
        (:ITEM NIL (:KWD NIL "error") " " :PAR "An error of "
         (:TERM NIL "type") " " (:TYPEREF NIL "file-error") " is signaled. "
         :PAR)
        (:ITEM NIL (:KWD NIL "new-version") " " :PAR
         "A new file is created with a larger version number. " :PAR)
        (:ITEM NIL (:KWD NIL "rename") " " :PAR
         "The existing file is renamed to some other name and then a new file is created. "
         :PAR)
        (:ITEM NIL (:KWD NIL "rename-and-delete") " " :PAR
         "The existing file is renamed to some other name, then it is deleted but not expunged, and then a new file is created. "
         :PAR)
        (:ITEM NIL (:KWD NIL "overwrite") " " :PAR "Output operations on the "
         (:TERM NIL "stream") " destructively modify the existing file. If "
         (:PARAM NIL "direction") " is " (:KWD NIL "io")
         " the file is opened in a bidirectional mode that allows both reading and writing. The file pointer is initially positioned at the beginning of the file; however, the file is not truncated back to length zero when it is opened. "
         :PAR)
        (:ITEM NIL (:KWD NIL "append") " " :PAR "Output operations on the "
         (:TERM NIL "stream")
         " destructively modify the existing file. The file pointer is initially positioned at the end of the file. "
         :PAR "If " (:PARAM NIL "direction") " is " (:KWD NIL "io")
         ", the file is opened in a bidirectional mode that allows both reading and writing. "
         :PAR)
        (:ITEM NIL (:KWD NIL "supersede") " " :PAR
         "The existing file is superseded; that is, a new file with the same name as the old one is created. If possible, the implementation should not destroy the old file until the new "
         (:TERM NIL "stream") " is closed. " :PAR)
        (:ITEM NIL (:MISC NIL "nil") " " :PAR "No file or "
         (:TERM NIL "stream") " is created; instead, " (:MISC NIL "nil")
         " is returned to indicate failure. " :PAR))
       " " :PAR)
      (:ITEM NIL (:KWD NIL "if-does-not-exist") " " :PAR
       (:COMMENT NIL "% 23.2.0 34") (:PARAM NIL "if-does-not-exist")
       " specifies the action to be taken if a file of name "
       (:PARAM NIL "filespec")
       " does not already exist. These are the results of "
       (:FUNREF NIL "open") " as modified by " (:PARAM NIL "if-does-not-exist")
       ": " :PAR (:COMMENT NIL "% 23.2.0 37")
       (:LIST NIL
        (:ITEM NIL (:KWD NIL "error") " " :PAR "An error of "
         (:TERM NIL "type") " " (:TYPEREF NIL "file-error") " is signaled. "
         :PAR)
        (:ITEM NIL (:KWD NIL "create") " " :PAR
         "An empty file is created. Processing continues as if the file had already existed but no processing as directed by "
         (:PARAM NIL "if-exists") " is performed. " :PAR)
        (:ITEM NIL (:MISC NIL "nil") " " :PAR "No file or "
         (:TERM NIL "stream") " is created; instead, " (:MISC NIL "nil")
         " is returned to indicate failure. " :PAR))
       " " :PAR (:ISSUE NIL "CHARACTER-PROPOSAL:2-5-2") " ")
      (:ITEM NIL (:KWD NIL "external-format") " " :PAR
       "This option selects an " (:TERM NIL "external file format") " for the "
       (:TERM NIL "file") ": "
       (:COMMENT NIL " There are no conforming"
        " \\term{values} for \\param{external-format} other than the default \\term{value},"
        " \\kwd{default}, which selects a format that can accomodate at least the"
        " \\term{base characters}.  \\term{Implementations} are permitted to define"
        " additional external file formats.")
       "The only " (:TERM NIL "standardized") " value for this option is "
       (:KWD NIL "default") ", although " (:TERM NIL "implementations")
       " are permitted to define additional "
       (:TERM NIL "external file formats") " and "
       (:TERM NIL "implementation-dependent") " values returned by "
       (:FUNREF NIL "stream-external-format") " can also be used by "
       (:TERM NIL "conforming programs") ". " :PAR
       (:COMMENT NIL " The \\param{external-format} is meaningful for "
        "      \\term{input}," "      \\term{output},"
        "  and \\term{bidirectional} \\term{streams}."
        "% Rewritten by KMP based on discussions with RWK:")
       "The " (:PARAM NIL "external-format") " is meaningful for any kind of "
       (:TERM NIL "file stream") " whose " (:TERM NIL "element type") " is a "
       (:TERM NIL "subtype") " of " (:TERM NIL "character")
       ". This option is ignored for " (:TERM NIL "streams")
       " for which it is not meaningful; however, "
       (:TERM NIL "implementations") " may define other "
       (:TERM NIL "element types") " for which it is meaningful. "
       (:COMMENT NIL "End of rewrite.")
       "The consequences are unspecified if a " (:TERM NIL "character")
       " is written that cannot be represented by the given "
       (:TERM NIL "external file format") ". "
       (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-5-2") " " :PAR))
     " " :PAR (:COMMENT NIL "% 23.2.0 1 ") "When a file is opened, a "
     (:TERM NIL "file stream")
     " is constructed to serve as the file system's ambassador to the "
     (:RM NIL " Lisp") " environment; operations on the "
     (:TERM NIL "file stream")
     " are reflected by operations on the file in the file system. " :PAR
     "A file can be deleted, renamed, or destructively modified by "
     (:FUNREF NIL "open") ". " :PAR
     "For information about opening relative pathnames, see "
     (:SECREF NIL :MERGING-PATHNAMES) ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (open " (:I NIL "filespec")
      " :direction :probe)  → #<Closed Probe File Stream...>
 (setq q (merge-pathnames (user-homedir-pathname) \"test\"))
→ #<PATHNAME :HOST NIL :DEVICE "
      (:I NIL "device-name") " :DIRECTORY " (:I NIL "directory-name") "
    :NAME \"test\" :TYPE NIL :VERSION :NEWEST>
 (open "
      (:I NIL "filespec")
      " :if-does-not-exist :create) → #<Input File Stream...>
 (setq s (open "
      (:I NIL "filespec") " :direction :probe)) → #<Closed Probe File Stream...>
 (truename s) → #<PATHNAME :HOST NIL :DEVICE "
      (:I NIL "device-name") " :DIRECTORY
    "
      (:I NIL "directory-name") " :NAME " (:I NIL "filespec") " :TYPE "
      (:I NIL "extension") " :VERSION 1>
 (open s :direction :output :if-exists nil) → NIL 
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "The nature and state of the host computer's " (:TERM NIL "file system")
     ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If "
     (:PARAM NIL "if-exists") " is " (:KWD NIL "error")
     ", (subject to the constraints on the meaning of "
     (:PARAM NIL "if-exists") " listed above), an error of " (:TERM NIL "type")
     " " (:TYPEREF NIL "file-error") " is signaled. " :PAR "If "
     (:PARAM NIL "if-does-not-exist") " is " (:KWD NIL "error")
     " (subject to the constraints on the meaning of "
     (:PARAM NIL "if-does-not-exist") " listed above), an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error") " is signaled. " :PAR
     (:COMMENT NIL "% 23.2.0 33")
     "If it is impossible for an implementation to handle some option in a manner close to what is specified here, an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error") " might be signaled. " :PAR
     (:ISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " "
     (:COMMENT NIL
      " !!! Moon: I would have assumed type-error rather than file-error for this one."
      "           I have no strong opinion, though.")
     "An error of " (:TERM NIL "type") " " (:TYPEREF NIL "file-error")
     " is signaled if "
     (:TT NIL " (wild-pathname-p " (:PARAM NIL "filespec") ")")
     " returns true. " (:ENDISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " " :PAR
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-5-2") " An error of " (:TERM NIL "type")
     " " (:TYPEREF NIL "error") " is signaled if the "
     (:PARAM NIL "external-format") " is not understood by the "
     (:TERM NIL "implementation") ". "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-5-2") " " :PAR
     (:COMMENT NIL
      " Refer to minutes of Dec-91 meeting (issue STREAM-ELEMENT-TYPE-UPGRADING) for"
      " an explanation of where this came from. -kmp 12-Feb-92")
     "The various " (:TERM NIL "file systems")
     " in existence today have widely differing capabilities, and some aspects of the "
     (:TERM NIL "file system")
     " are beyond the scope of this specification to define. A given "
     (:TERM NIL "implementation")
     " might not be able to support all of these options in exactly the manner stated. An "
     (:TERM NIL "implementation")
     " is required to recognize all of these option keywords and to try to do something “reasonable” in the context of the host "
     (:TERM NIL "file system") ". Where necessary to accomodate the "
     (:TERM NIL "file system") ", an " (:TERM NIL "implementation")
     " deviate slightly from the semantics specified here without being disqualified for consideration as a "
     (:TERM NIL "conforming implementation")
     ". If it is utterly impossible for an " (:TERM NIL "implementation")
     " to handle some option in a manner similar to what is specified here, it may simply signal an error. "
     :PAR "With regard to the " (:KWD NIL "element-type") " option, if a "
     (:TERM NIL "type") " is requested that is not supported by the "
     (:TERM NIL "file system")
     ", a substitution of types such as that which goes on in "
     (:TERM NIL "upgrading")
     " is permissible. As a minimum requirement, it should be the case that opening an "
     (:TERM NIL "output") " " (:TERM NIL "stream") " to a " (:TERM NIL "file")
     " in a given " (:TERM NIL "element type") " and later opening an "
     (:TERM NIL "input") " " (:TERM NIL "stream") " to the same "
     (:TERM NIL "file") " in the same " (:TERM NIL "element type")
     " should work compatibly. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:MACREF NIL "with-open-file") ", " (:FUNREF NIL "close") ", "
     (:TYPEREF NIL "pathname") ", " (:TYPEREF NIL "logical-pathname") ", "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:SECREF NIL :MERGING-PATHNAMES) ", "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:ISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
     (:COMMENT NIL " \\issue{PATHNAME-LOGICAL:ADD}"
      " Whether or not \\funref{open} recognizes \\term{logical pathname} \\term{namestrings}"
      " is \\term{implementation-defined}."
      " \\endissue{PATHNAME-LOGICAL:ADD}")
     (:ENDISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
     :PAR (:COMMENT NIL "% 23.2.0 38") (:FUNREF NIL "open")
     " does not automatically close the file when an abnormal exit occurs. "
     :PAR "When " (:PARAM NIL "element-type") " is a " (:TERM NIL "subtype")
     " of " (:TYPEREF NIL "character") ", " (:FUNREF NIL "read-char")
     " and/or " (:FUNREF NIL "write-char") " can be used on the resulting "
     (:TERM NIL "file stream") ". " :PAR "When " (:PARAM NIL "element-type")
     " is a " (:TERM NIL "subtype") " of " (:TERM NIL "integer") ", "
     (:FUNREF NIL "read-byte") " and/or " (:FUNREF NIL "write-byte")
     " can be used on the resulting " (:TERM NIL "file stream") ". " :PAR
     (:COMMENT NIL " When \\param{element-type} is "
      "     \\typeref{unsigned-byte}," "     {\\tt (unsigned-byte \\i{n})},"
      "     \\typeref{signed-byte}," "     {\\tt (signed-byte \\i{n})},"
      "     \\typeref{bit}, " "  or {\\tt (mod \\i{n})},"
      " \\funref{read-byte} and/or \\funref{write-byte} can be"
      " used on the resulting \\term{file stream}.")
     :PAR "When " (:PARAM NIL "element-type") " is " (:KWD NIL "default")
     ", the " (:TERM NIL "type") " can be determined by using "
     (:FUNREF NIL "stream-element-type") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== STREAM-EXTERNAL-FORMAT")
   (:COM (:NAME "stream-external-format" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "stream-external-format")
      (:ARGLIST NIL "stream") (:VALUES NIL "format"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "stream") "—a "
     (:TERM NIL "file stream") ". " :PAR (:PARAM NIL "format") "—an "
     (:TERM NIL "external file format") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns an "
     (:TERM NIL "external file format designator") " for the "
     (:PARAM NIL "stream") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (with-open-file (stream \"test\" :direction :output)
   (stream-external-format stream))
→ :DEFAULT
OR→ :ISO8859/1-1987
OR→ (:ASCII :SAIL)
OR→ ACME::PROPRIETARY-FILE-FORMAT-17
OR→ #<FILE-FORMAT :ISO646-1983 2343673>
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR "the " (:KWD NIL "external-format") " "
     (:TERM NIL "argument") " to the " (:TERM NIL "function") " "
     (:FUNREF NIL "open") " and the " (:FUNREF NIL "with-open-file") " "
     (:TERM NIL "macro") ". " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The " (:PARAM NIL "format")
     " returned is not necessarily meaningful to other "
     (:TERM NIL "implementations") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== WITH-OPEN-FILE")
   (:COM (:NAME "with-open-file" :FTYPE "Macro") (:ISSUE NIL "DECLS-AND-DOC")
    " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "with-open-file")
      (:ARGLIST NIL
       (:PAREN NIL "stream filespec "
        (:STAR NIL (:CURLY NIL (:PARAM NIL "options"))))
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL "results"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "stream")
     "—a variable. " :PAR (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " "
     (:PARAM NIL "filespec") "—a " (:TERM NIL "pathname designator") ". "
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
     (:COMMENT NIL "!!! I doubt this can be right. -kmp 22-Apr-91")
     (:PARAM NIL "options") "—" (:TERM NIL "forms") "; evaluated. " :PAR
     (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR (:PARAM NIL "forms")
     "—an " (:TERM NIL "implicit progn") ". " :PAR (:PARAM NIL "results")
     "—the " (:TERM NIL "values") " returned by the " (:PARAM NIL "forms") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " "
     (:MACREF NIL "with-open-file") " uses " (:FUNREF NIL "open")
     " to create a " (:TERM NIL "file stream") " "
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " to "
     (:TERM NIL "file") " named by " (:PARAM NIL "filespec") ". "
     (:COMMENT NIL "% 23.2.0 41") (:PARAM NIL "Filespec")
     " is the name of the file to be opened. " (:PARAM NIL "Options")
     " are used as keyword arguments to " (:FUNREF NIL "open") ". "
     (:COMMENT NIL "% Moon thought this was \"drivel\". -kmp 11-Feb-92"
      " Then \\macref{with-open-file} performs a "
      " specified series of actions on the open file."
      "% This is implied by \"pathname designator\". -kmp 16-Feb-92"
      " \\issue{PATHNAME-STREAM}"
      " If \\param{filespec} is a \\term{file stream}, that \\term{file stream}"
      " can only have been originally opened by"
      " \\funref{open} or \\macref{with-open-file}, "
      " or is a \\term{synonym stream} whose \\term{symbol} is bound"
      " to a \\term{file stream} originally opened by"
      " \\funref{open} or \\macref{with-open-file}."
      " If \\param{filespec} is a \\term{pathname} (as returned by \\funref{pathname}"
      " it represents the name used to open the file. This may be, but is"
      " not required to be, the actual name of the file. "
      " \\endissue{PATHNAME-STREAM}" " \\issue{PATHNAME-LOGICAL:ADD}"
      " If \\param{filespec} is a \\term{logical pathname}, it is translated"
      " into a physical pathname as if by calling \\funref{translate-logical-pathname}."
      " \\endissue{PATHNAME-LOGICAL:ADD}")
     :PAR (:ISSUE NIL "WITH-OPEN-FILE-STREAM-EXTENT:DYNAMIC-EXTENT") " The "
     (:TERM NIL "stream") " " (:TERM NIL "object") " to which the "
     (:PARAM NIL "stream") " " (:TERM NIL "variable") " is "
     (:TERM NIL "bound") " has " (:TERM NIL "dynamic extent") "; its "
     (:TERM NIL "extent") " ends when the " (:TERM NIL "form") " is exited. "
     (:ENDISSUE NIL "WITH-OPEN-FILE-STREAM-EXTENT:DYNAMIC-EXTENT") " " :PAR
     (:COMMENT NIL "% 23.2.0 39") (:MACREF NIL "with-open-file")
     " evaluates the " (:PARAM NIL "forms") " as an "
     (:TERM NIL "implicit progn") " with " (:PARAM NIL "stream") " bound to "
     (:ISSUE NIL "WITH-OPEN-FILE-DOES-NOT-EXIST:STREAM-IS-NIL")
     " the value returned by " (:FUNREF NIL "open") ". "
     (:ENDISSUE NIL "WITH-OPEN-FILE-DOES-NOT-EXIST:STREAM-IS-NIL") " " :PAR
     (:COMMENT NIL "% 23.2.0 40")
     "When control leaves the body, either normally or abnormally (such as by use of "
     (:SPECREF NIL "throw")
     "), the file is automatically closed. If a new output file is being written, and control leaves abnormally, the file is aborted and the file system is left, so far as possible, as if the file had never been opened. "
     :PAR "It is possible by the use of " (:TT NIL ":if-exists nil") " or "
     (:TT NIL ":if-does-not-exist nil") " for " (:PARAM NIL "stream")
     " to be bound to " (:MISC NIL "nil") ". "
     (:ISSUE NIL "WITH-OPEN-FILE-DOES-NOT-EXIST:STREAM-IS-NIL") " Users of "
     (:TT NIL ":if-does-not-exist nil") " should check for a valid "
     (:TERM NIL "stream") ". "
     (:ENDISSUE NIL "WITH-OPEN-FILE-DOES-NOT-EXIST:STREAM-IS-NIL") " " :PAR
     (:COMMENT NIL "% 23.2.0 42" " %This looks suspect to me. -kmp 22-Apr-91"
      " %Moon: Yes, this is drivel."
      " \\macref{with-open-file} opens, modifies, and "
      " tries to close the \\param{file stream}.")
     :PAR (:ISSUE NIL "WITH-OPEN-FILE-SETQ:EXPLICITLY-VAGUE")
     " The consequences are undefined if an attempt is made to "
     (:TERM NIL "assign") " the " (:PARAM NIL "stream") " "
     (:TERM NIL "variable")
     ". The compiler may choose to issue a warning if such an attempt is detected. "
     (:ENDISSUE NIL "WITH-OPEN-FILE-SETQ:EXPLICITLY-VAGUE") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq p (merge-pathnames \"test\"))
→ #<PATHNAME :HOST NIL :DEVICE "
      (:I NIL "device-name") " :DIRECTORY " (:I NIL "directory-name") "
    :NAME \"test\" :TYPE NIL :VERSION :NEWEST>
 (with-open-file (s p :direction :output :if-exists :supersede)
    (format s \"Here are a couple~%of test data lines~%\")) → NIL
 (with-open-file (s p)
    (do ((l (read-line s) (read-line s nil 'eof)))
        ((eq l 'eof) \"Reached end of file.\")
     (format t \"~&*** ~A~%\" l)))
⊳ *** Here are a couple
⊳ *** of test data lines
→ \"Reached end of file.\"
")
     " " :PAR
     (:COMMENT NIL "\\code" " (with-open-file (ifile name :direction :input)"
      "   (with-open-file (ofile (merge-pathname-defaults ifile"
      "                                                   nil"
      "                                                   \"out\")"
      "                          :direction :output"
      "                          :if-exists :supersede)"
      "     (transduce-file ifile ofile)))" "\\endcode")
     :PAR (:ISSUE NIL "WITH-OPEN-FILE-DOES-NOT-EXIST:STREAM-IS-NIL") " "
     (:COMMENT NIL
      "!!! This example is -way- too weird to be included without more commentary.")
     (:CODE NIL ";; Normally one would not do this intentionally because it is
;; not perspicuous, but beware when using :IF-DOES-NOT-EXIST NIL
;; that this doesn't happen to you accidentally...
 (with-open-file (foo \"no-such-file\" :if-does-not-exist nil)
   (read foo))
⊳ "
      (:IN NIL "hello?") "
→ HELLO? ;This value was read from the terminal, not a file!

;; Here's another bug to avoid...
 (with-open-file (foo \"no-such-file\" :direction :output :if-does-not-exist nil)
   (format foo \"Hello\"))
→ \"Hello\" ;FORMAT got an argument of NIL!
")
     " " (:ENDISSUE NIL "WITH-OPEN-FILE-DOES-NOT-EXIST:STREAM-IS-NIL") " "
     :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "Creates a " (:TERM NIL "stream")
     " to the " (:TERM NIL "file") " named by " (:PARAM NIL "filename")
     " (upon entry), and closes the " (:TERM NIL "stream")
     " (upon exit). In some " (:TERM NIL "implementations") ", the "
     (:TERM NIL "file")
     " might be locked in some way while it is open. If the "
     (:TERM NIL "stream") " is an " (:TERM NIL "output") " "
     (:TERM NIL "stream") ", a " (:TERM NIL "file") " might be created. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The host computer's file system. "
     :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:COMMENT NIL
      "% This restriction (and more) is already manifest in OPEN, so just omit it here."
      " \\issue{PATHNAME-WILD:NEW-FUNCTIONS}"
      " % !!! Moon: I would have assumed type-error rather than file-error for this one."
      " %           I have no strong opinion, though."
      " An error \\oftype{file-error} is signaled if"
      " \\f{(wild-pathname-p \\param{filespec})} returns true."
      " \\endissue{PATHNAME-WILD:NEW-FUNCTIONS}")
     "See the " (:TERM NIL "function") " " (:FUNREF NIL "open") ". "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:FUNREF NIL "open") ", " (:FUNREF NIL "close") ", "
     (:TYPEREF NIL "pathname") ", " (:TYPEREF NIL "logical-pathname") ", "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
     (:COMMENT NIL " \\issue{PATHNAME-LOGICAL:ADD}"
      " Whether or not \\macref{with-open-file} recognizes \\term{logical pathname} \\term{namestrings}"
      " is \\term{implementation-defined}."
      " \\endissue{PATHNAME-LOGICAL:ADD}")
     (:ENDISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
     :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Stream Closing --------------------")
   :PAR (:COMMENT NIL "%% ========== CLOSE")
   (:COM (:NAME "close" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "RETURN-VALUES-UNSPECIFIED:SPECIFY") " "
     (:DEF (:KIND "function") (:NAMES NIL "close")
      (:ARGLIST NIL "stream " (:KEYWORD NIL " &key") " abort")
      (:VALUES NIL "result"))
     " " (:ENDISSUE NIL "RETURN-VALUES-UNSPECIFIED:SPECIFY") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:COMMENT NIL "% 21.3.0 7")
     (:PARAM NIL "stream") "—a " (:TERM NIL "stream") " (either "
     (:TERM NIL "open") " or " (:TERM NIL "closed") "). " :PAR
     (:PARAM NIL "abort") "—a " (:TERM NIL "generalized boolean")
     ". The default is " (:TERM NIL "false") ". " :PAR
     (:ISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " "
     (:PARAM NIL "result") "—" (:MISC NIL "t") " if the " (:PARAM NIL "stream")
     " was " (:TERM NIL "open") " at the time it was received as an "
     (:TERM NIL "argument") ", or " (:TERM NIL "implementation-dependent")
     " otherwise. " (:ENDISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " "
     :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 21.3.0 7" "% 23.2.0 1") (:FUNREF NIL "close") " closes "
     (:PARAM NIL "stream") ". Closing a " (:TERM NIL "stream")
     " means that it may no longer be used in input or output operations. The act of "
     (:TERM NIL "closing") " a " (:TERM NIL "file stream")
     " ends the association between the " (:TERM NIL "stream")
     " and its associated " (:TERM NIL "file") "; the transaction with the "
     (:TERM NIL "file system")
     " is terminated, and input/output may no longer be performed on the "
     (:TERM NIL "stream") ". " :PAR "If " (:PARAM NIL "abort") " is "
     (:TERM NIL "true")
     ", an attempt is made to clean up any side effects of having created "
     (:PARAM NIL "stream") ". If " (:PARAM NIL "stream")
     " performs output to a file that was created when the "
     (:TERM NIL "stream")
     " was created, the file is deleted and any previously existing file is not superseded. "
     :PAR "It is permissible to close an already closed " (:TERM NIL "stream")
     ", but in that case the " (:PARAM NIL "result") " is "
     (:TERM NIL "implementation-dependent") ". " :PAR "After "
     (:PARAM NIL "stream")
     " is closed, it is still possible to perform the following query operations upon it: "
     (:ISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " "
     (:FUNREF NIL "streamp") ", " (:FUNREF NIL "pathname") ", "
     (:FUNREF NIL "truename") ", " (:FUNREF NIL "merge-pathnames") ", "
     (:FUNREF NIL "pathname-host") ", " (:FUNREF NIL "pathname-device") ", "
     (:FUNREF NIL "pathname-directory") "," (:FUNREF NIL "pathname-name") ", "
     (:FUNREF NIL "pathname-type") ", " (:FUNREF NIL "pathname-version") ", "
     (:FUNREF NIL "namestring") ", " (:FUNREF NIL "file-namestring") ", "
     (:FUNREF NIL "directory-namestring") ", " (:FUNREF NIL "host-namestring")
     ", " (:FUNREF NIL "enough-namestring") ", " (:FUNREF NIL "open") ", "
     (:FUNREF NIL "probe-file") ", and " (:FUNREF NIL "directory") ". "
     (:ENDISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " " :PAR
     (:ISSUE NIL "CLOSE-CONSTRUCTED-STREAM:ARGUMENT-STREAM-ONLY")
     " The effect of " (:FUNREF NIL "close") " on a "
     (:TERM NIL "constructed stream") " is to close the argument "
     (:PARAM NIL "stream") " only. There is no effect on the "
     (:TERM NIL "constituents") " of " (:TERM NIL "composite streams") ". "
     :PAR "For a " (:TERM NIL "stream") " created with "
     (:FUNREF NIL "make-string-output-stream") ", the result of "
     (:FUNREF NIL "get-output-stream-string") " is unspecified after "
     (:FUNREF NIL "close") ". "
     (:COMMENT NIL "% Sandra: Redundant." " For a \\term{composite stream},"
      " the call to \\funref{close} has no effect on any of its \\term{constituents}.")
     (:ENDISSUE NIL "CLOSE-CONSTRUCTED-STREAM:ARGUMENT-STREAM-ONLY") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:COMMENT NIL "!!! Need to look at this!  -kmp 23-Apr-91")
     (:CODE NIL " (setq s (make-broadcast-stream)) → #<BROADCAST-STREAM>
 (close s) → T
 (output-stream-p s) → "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:PARAM NIL "stream") " is "
     (:TERM NIL "closed") " (if necessary). If " (:PARAM NIL "abort") " is "
     (:TERM NIL "true") " and the " (:PARAM NIL "stream") " is an "
     (:TERM NIL "output") " " (:TERM NIL "file stream") ", its associated "
     (:TERM NIL "file") " might be deleted. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "open") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== WITH-OPEN-STREAM")
   (:COM (:NAME "with-open-stream" :FTYPE "Macro") (:ISSUE NIL "DECLS-AND-DOC")
    " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "with-open-stream")
      (:ARGLIST NIL (:PAREN NIL "var stream") " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "var") "—a "
     (:TERM NIL "variable") " " (:TERM NIL "name") ". " :PAR
     (:PARAM NIL "stream") "—a " (:TERM NIL "form") "; evaluated to produce a "
     (:TERM NIL "stream") ". " :PAR (:PARAM NIL "declaration") "—a "
     (:MISC NIL "declare") " " (:TERM NIL "expression") "; not evaluated. "
     :PAR (:PARAM NIL "forms") "—an " (:TERM NIL "implicit progn") ". " :PAR
     (:PARAM NIL "results") "—the " (:TERM NIL "values") " returned by the "
     (:PARAM NIL "forms") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "with-open-stream")
     " performs a series of operations on " (:PARAM NIL "stream")
     ", returns a value, and then closes the " (:PARAM NIL "stream") ". " :PAR
     (:COMMENT NIL "% 21.2.0 11") (:PARAM NIL "Var")
     " is bound to the value of " (:PARAM NIL "stream") ", and then "
     (:PARAM NIL "forms") " are executed as an " (:TERM NIL "implicit progn")
     ". " (:PARAM NIL "stream") " is automatically closed on exit from "
     (:MACREF NIL "with-open-stream")
     ", no matter whether the exit is normal or abnormal. "
     (:ISSUE NIL "WITH-OPEN-FILE-STREAM-EXTENT:DYNAMIC-EXTENT") " "
     (:COMMENT NIL "!!!"
      "Moon: I don't see how the following could possibly be true, "
      "      since WITH-OPEN-STREAM does not create the stream.  "
      "      WITH-OPEN-FILE is different.  On the other hand,"
      "      this accurately reflects the cleanup and CLtL."
      "KMP: I concur, but it will take a technical vote to fix it.")
     "The " (:PARAM NIL "stream") " has " (:TERM NIL "dynamic extent") "; its "
     (:TERM NIL "extent") " ends when the " (:TERM NIL "form") " is exited. "
     (:ENDISSUE NIL "WITH-OPEN-FILE-STREAM-EXTENT:DYNAMIC-EXTENT") " " :PAR
     (:ISSUE NIL "WITH-OPEN-FILE-SETQ:EXPLICITLY-VAGUE")
     " The consequences are undefined if an attempt is made to "
     (:TERM NIL "assign") " the the " (:TERM NIL "variable") " "
     (:PARAM NIL "var") " with the " (:PARAM NIL "forms") ". "
     (:COMMENT NIL
      "The compiler may choose to issue a warning if such an attempt is detected.")
     (:ENDISSUE NIL "WITH-OPEN-FILE-SETQ:EXPLICITLY-VAGUE") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (with-open-stream (s (make-string-input-stream \"1 2 3 4\"))
    (+ (read s) (read s) (read s))) → 6
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:PARAM NIL "stream")
     " is closed (upon exit). " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "close") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " "
     :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Stream Buffering --------------------")
   :PAR (:COMMENT NIL "%% ========== LISTEN")
   (:COM (:NAME "listen" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "listen")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " input-stream")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "input-stream")
     "—an " (:TERM NIL "input") " " (:TERM NIL "stream designator")
     ". The default is " (:TERM NIL "standard input") ". " :PAR
     (:PARAM NIL "generalized-boolean") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.2.1 36")
     "Returns " (:TERM NIL "true")
     " if there is a character immediately available from "
     (:PARAM NIL "input-stream") "; otherwise, returns " (:TERM NIL "false")
     ". On a non-interactive " (:PARAM NIL "input-stream") ", "
     (:FUNREF NIL "listen") " returns " (:TERM NIL "true") " except when at "
     (:TERM NIL "end of file") (:SUB NIL "1") ". If an "
     (:TERM NIL "end of file") " is encountered, " (:FUNREF NIL "listen")
     " returns " (:TERM NIL "false") ". " (:FUNREF NIL "listen")
     " is intended to be used when " (:PARAM NIL "input-stream")
     " obtains characters from an interactive device such as a keyboard. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (progn (unread-char (read-char)) (list (listen) (read-char)))
⊳ "
      (:IN NIL "1") "
→ (T #\\1)
 (progn (clear-input) (listen))
→ NIL ;Unless you're a very fast typist!
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*standard-input*") " "
     :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "interactive-stream-p")
     ", " (:FUNREF NIL "read-char-no-hang") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== CLEAR-INPUT")
   (:COM (:NAME "clear-input" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "clear-input")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " input-stream")
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "input-stream")
     "—an " (:TERM NIL "input") " " (:TERM NIL "stream designator")
     ". The default is " (:TERM NIL "standard input") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.2.1 38")
     "Clears any available input from " (:PARAM NIL "input-stream") ". " :PAR
     "If " (:FUNREF NIL "clear-input") " does not make sense for "
     (:PARAM NIL "input-stream") ", then " (:FUNREF NIL "clear-input")
     " does nothing. " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL
      ";; The exact I/O behavior of this example might vary from implementation
;; to implementation depending on the kind of interactive buffering that
;; occurs.  (The call to SLEEP here is intended to help even out the 
;; differences in implementations which do not do line-at-a-time buffering.)

(defun read-sleepily (&optional (clear-p nil) (zzz 0))
  (list (progn (print '>) (read))
        ;; Note that input typed within the first ZZZ seconds 
        ;; will be discarded.
        (progn (print '>) 
               (if zzz (sleep zzz))
               (print '>>)
               (if clear-p (clear-input))
               (read))))

(read-sleepily)
⊳ > "
      (:IN NIL "10") "
⊳ >
⊳ >> "
      (:IN NIL "20") "
→ (10 20)

(read-sleepily t)
⊳ > "
      (:IN NIL "10") "
⊳ >
⊳ >> "
      (:IN NIL "20") "
→ (10 20)

(read-sleepily t 10)
⊳ > "
      (:IN NIL "10") "
⊳ > "
      (:IN NIL "20") "  ; Some implementations won't echo typeahead here.
⊳ >> "
      (:IN NIL "30") "
→ (10 30)
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:PARAM NIL "input-stream")
     " is modified. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*standard-input*") " "
     :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "input-stream")
     " is not a " (:TERM NIL "stream designator") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "clear-output") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== FINISH-OUTPUT" "%% ========== FORCE-OUTPUT"
    "%% ========== CLEAR-OUTPUT")
   (:COM (:NAME "finish-output, force-output, clear-output" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "finish-output")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " output-stream")
      (:VALUES NIL (:MISC NIL "nil")))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "force-output")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " output-stream")
      (:VALUES NIL (:MISC NIL "nil")))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "clear-output")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " output-stream")
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "output-stream")
     "—an " (:TERM NIL "output") " " (:TERM NIL "stream designator")
     ". The default is " (:TERM NIL "standard output") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "finish-output") ", "
     (:FUNREF NIL "force-output") ", and " (:FUNREF NIL "clear-output")
     " exercise control over the internal handling of buffered stream output. "
     :PAR (:FUNREF NIL "finish-output")
     " attempts to ensure that any buffered output sent to "
     (:PARAM NIL "output-stream")
     " has reached its destination, and then returns. " :PAR
     (:FUNREF NIL "force-output")
     " initiates the emptying of any internal buffers but does not wait for completion or acknowledgment to return. "
     :PAR (:COMMENT NIL "% 22.3.1 19") (:FUNREF NIL "clear-output")
     " attempts to abort any outstanding output operation in progress in order to allow as little output as possible to continue to the destination. "
     :PAR
     (:COMMENT NIL
      " This next sentence was added per Moon, since it was present in CLtL for CLEAR-INPUT"
      " and probably only accidentally omitted here. (I agree.) -kmp 11-Feb-92")
     "If any of these operations does not make sense for "
     (:PARAM NIL "output-stream") ", then it does nothing. "
     (:COMMENT NIL "% 22.3.1 20") "The precise actions of these "
     (:TERM NIL "functions") " are " (:TERM NIL "implementation-dependent")
     ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL ";; Implementation A
 (progn (princ \"am i seen?\") (clear-output))
→ NIL

;; Implementation B
 (progn (princ \"am i seen?\") (clear-output))
⊳ am i seen?
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*standard-output*") " "
     :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "output-stream")
     " is not a " (:TERM NIL "stream designator") ". " :PAR
     (:COMMENT NIL "!!! Barmar: Are conditions signaled if stream is closed?")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "clear-input") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Query Functions --------------------")
   :PAR (:COMMENT NIL "%% ========== Y-OR-N-P" "%% ========== YES-OR-NO-P")
   (:COM (:NAME "y-or-n-p, yes-or-no-p" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "y-or-n-p")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " control "
       (:KEYWORD NIL " &rest") " arguments")
      (:VALUES NIL "generalized-boolean"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "yes-or-no-p")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " control "
       (:KEYWORD NIL " &rest") " arguments")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " (:PARAM NIL "control")
     "—a " (:TERM NIL "format control") ". "
     (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR
     (:PARAM NIL "arguments") "—" (:TERM NIL "format arguments") " for "
     (:PARAM NIL "control") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "These functions ask a question and parse a response from the user. They return "
     (:TERM NIL "true") " if the answer is affirmative, or "
     (:TERM NIL "false") " if the answer is negative. " :PAR
     (:COMMENT NIL "% 22.4.0 2" "% 22.4.0 9") (:FUNREF NIL "y-or-n-p")
     " is for asking the user a question whose answer is either “yes” or “no.” It is intended that the reply require the user to answer a yes-or-no question with a single character. "
     (:COMMENT NIL "% 22.4.0 7") (:FUNREF NIL "yes-or-no-p")
     " is also for asking the user a question whose answer is either “Yes” or “No.” It is intended that the reply require the user to take more action than just a single keystroke, such as typing the full word "
     (:TT NIL "yes") " or " (:TT NIL "no") " followed by a newline. " :PAR
     (:COMMENT NIL "% 22.4.0 6" "% this paragraph was left out") :PAR
     (:FUNREF NIL "y-or-n-p")
     " types out a message (if supplied), reads an answer in some "
     (:TERM NIL "implementation-dependent")
     " manner (intended to be short and simple, such as reading a single character such as "
     (:TT NIL "Y") " or " (:TT NIL "N") "). " (:FUNREF NIL "yes-or-no-p")
     " types out a message (if supplied), attracts the user's attention (for example, by ringing the terminal's bell), and reads an answer in some "
     (:TERM NIL "implementation-dependent")
     " manner (intended to be multiple characters, such as " (:TT NIL "YES")
     " or " (:TT NIL "NO") "). " :PAR (:COMMENT NIL "% 22.4.0 3" "% 22.4.0 8")
     "If " (:PARAM NIL "format-control") " is supplied and not "
     (:MISC NIL "nil") ", then a " (:FUNREF NIL "fresh-line")
     " operation is performed; then a message is printed as if "
     (:PARAM NIL "format-control") " and " (:PARAM NIL "arguments")
     " were given to " (:FUNREF NIL "format") ". In any case, "
     (:FUNREF NIL "yes-or-no-p") " and " (:FUNREF NIL "y-or-n-p")
     " will provide a prompt such as “" (:TT NIL "(Y or N)") "” or “"
     (:TT NIL "(Yes or No)") "” if appropriate. " :PAR
     (:COMMENT NIL "% 22.4.0 4" "% 22.4.0 9" "% 22.4.0 1")
     "All input and output are performed using " (:TERM NIL "query I/O") ". "
     :PAR)
    (:PART (:NAME "Examples") " " (:COMMENT NIL "% 22.4.0 5")
     (:CODE NIL " (y-or-n-p \"(t or nil) given by\")
⊳ (t or nil) given by (Y or N) "
      (:IN NIL "Y") "
→ "
      (:TERM NIL "true") "
 (yes-or-no-p \"a ~S message\" 'frightening) 
⊳ a FRIGHTENING message (Yes or No) "
      (:IN NIL "no") "
→ "
      (:TERM NIL "false") "
 (y-or-n-p \"Produce listing file?\") 
⊳ Produce listing file?
⊳ Please respond with Y or N. "
      (:IN NIL "n") "
→ "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "Output to and input from "
     (:TERM NIL "query I/O") " will occur. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*query-io*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "format") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "yes-or-no-p") " and "
     (:FUNREF NIL "yes-or-no-p")
     " do not add question marks to the end of the prompt string, so any desired question mark or other punctuation should be explicitly included in the text query. "
     :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- File Streams --------------------") :PAR
   (:COMMENT NIL "-------------------- Synonym Streams --------------------")
   :PAR (:COMMENT NIL "%% ========== MAKE-SYNONYM-STREAM")
   (:COM (:NAME "make-synonym-stream" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-synonym-stream")
      (:ARGLIST NIL "symbol") (:VALUES NIL "synonym-stream"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "symbol") "—a "
     (:TERM NIL "symbol") " that names a " (:TERM NIL "dynamic variable") ". "
     :PAR (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " "
     (:PARAM NIL "synonym-stream") "—a " (:TERM NIL "synonym stream") ". "
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 21.2.0 3")
     "Returns a " (:TERM NIL "synonym stream") " whose "
     (:TERM NIL "synonym stream symbol") " is " (:PARAM NIL "symbol") ". "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq a-stream (make-string-input-stream \"a-stream\")
        b-stream (make-string-input-stream \"b-stream\"))
→ #<String Input Stream> 
 (setq s-stream (make-synonym-stream 'c-stream))
→ #<SYNONYM-STREAM for C-STREAM> 
 (setq c-stream a-stream)
→ #<String Input Stream> 
 (read s-stream) → A-STREAM
 (setq c-stream b-stream)
→ #<String Input Stream> 
 (read s-stream) → B-STREAM
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "Should signal "
     (:TYPEREF NIL "type-error") " if its argument is not a "
     (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :STREAM-CONCEPTS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SYNONYM-STREAM-SYMBOL")
   (:COM (:NAME "synonym-stream-symbol" :FTYPE "Function")
    (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "synonym-stream-symbol")
      (:ARGLIST NIL "synonym-stream") (:VALUES NIL "symbol"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "synonym-stream") "—a " (:TERM NIL "synonym stream") ". " :PAR
     (:PARAM NIL "symbol") "—a " (:TERM NIL "symbol") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns the " (:TERM NIL "symbol")
     " whose " (:FUNREF NIL "symbol-value") " the "
     (:PARAM NIL "synonym-stream") " is using. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-synonym-stream") " "
     :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Broadcast Streams --------------------")
   :PAR (:COMMENT NIL "%% ========== BROADCAST-STREAM-STREAMS")
   (:COM (:NAME "broadcast-stream-streams" :FTYPE "Function")
    (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "broadcast-stream-streams")
      (:ARGLIST NIL "broadcast-stream") (:VALUES NIL "streams"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "broadcast-stream") "—a " (:TERM NIL "broadcast stream") ". "
     :PAR (:PARAM NIL "streams") "—a " (:TERM NIL "list") " of "
     (:TERM NIL "streams") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns a " (:TERM NIL "list")
     " of output " (:TERM NIL "streams") " that constitute all the "
     (:TERM NIL "streams") " to which the " (:PARAM NIL "broadcast-stream")
     " is broadcasting. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MAKE-BROADCAST-STREAM")
   (:COM (:NAME "make-broadcast-stream" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-broadcast-stream")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " streams")
      (:VALUES NIL "broadcast-stream"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "stream") "—an "
     (:TERM NIL "output") " " (:TERM NIL "stream") ". " :PAR
     (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
     (:PARAM NIL "broadcast-stream") "—a " (:TERM NIL "broadcast stream") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 21.2.0 4")
     "Returns a " (:TERM NIL "broadcast stream") ". "
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (setq a-stream (make-string-output-stream)
        b-stream (make-string-output-stream)) → #<String Output Stream>
 (format (make-broadcast-stream a-stream b-stream)
          \"this will go to both streams\") → NIL
 (get-output-stream-string a-stream) → \"this will go to both streams\"
 (get-output-stream-string b-stream) → \"this will go to both streams\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR
     (:COMMENT NIL "% Sandra thinks this is excessive."
      "A \\term{broadcast stream} is created.")
     :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if any " (:PARAM NIL "stream") " is not an "
     (:TERM NIL "output") " " (:TERM NIL "stream") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "broadcast-stream-streams")
     " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- two-Way Streams --------------------")
   :PAR (:COMMENT NIL "%% ========== MAKE-TWO-WAY-STREAM")
   (:COM (:NAME "make-two-way-stream" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-two-way-stream")
      (:ARGLIST NIL "input-stream output-stream")
      (:VALUES NIL "two-way-stream"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "input-stream")
     "—a " (:TERM NIL "stream") ". " :PAR (:PARAM NIL "output-stream") "—a "
     (:TERM NIL "stream") ". " :PAR
     (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " "
     (:PARAM NIL "two-way-stream") "—a " (:TERM NIL "two-way stream") ". "
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 21.2.0 6")
     "Returns a " (:TERM NIL "two-way stream") " that gets its input from "
     (:PARAM NIL "input-stream") " and sends its output to "
     (:PARAM NIL "output-stream") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (with-output-to-string (out)
    (with-input-from-string (in \"input...\")
      (let ((two (make-two-way-stream in out)))
        (format two \"output...\")
        (setq what-is-read (read two))))) → \"output...\"
 what-is-read → INPUT... 
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "input-stream")
     " is not an " (:TERM NIL "input") " " (:TERM NIL "stream")
     ". Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "output-stream")
     " is not an " (:TERM NIL "output") " " (:TERM NIL "stream") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== TWO-WAY-STREAM-INPUT-STREAM"
    "%% ========== TWO-WAY-STREAM-OUTPUT-STREAM")
   (:COM
    (:NAME "two-way-stream-input-stream, two-way-stream-output-stream" :FTYPE
     "Function")
    (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "two-way-stream-input-stream")
      (:ARGLIST NIL "two-way-stream") (:VALUES NIL "input-stream"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "two-way-stream-output-stream")
      (:ARGLIST NIL "two-way-stream") (:VALUES NIL "output-stream"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "two-way-stream") "—a " (:TERM NIL "two-way stream") ". " :PAR
     (:PARAM NIL "input-stream") "—an " (:TERM NIL "input") " "
     (:TERM NIL "stream") ". " :PAR (:PARAM NIL "output-stream") "—an "
     (:TERM NIL "output") " " (:TERM NIL "stream") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:FUNREF NIL "two-way-stream-input-stream") " returns the "
     (:TERM NIL "stream") " from which " (:PARAM NIL "two-way-stream")
     " receives input. " :PAR (:FUNREF NIL "two-way-stream-output-stream")
     " returns the " (:TERM NIL "stream") " to which "
     (:PARAM NIL "two-way-stream") " sends output. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Echo Streams --------------------") :PAR
   (:COMMENT NIL "%% ========== ECHO-STREAM-INPUT-STREAM"
    "%% ========== ECHO-STREAM-OUTPUT-STREAM")
   (:COM
    (:NAME "echo-stream-input-stream, echo-stream-output-stream" :FTYPE
     "Function")
    (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "echo-stream-input-stream")
      (:ARGLIST NIL "echo-stream") (:VALUES NIL "input-stream"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "echo-stream-output-stream")
      (:ARGLIST NIL "echo-stream") (:VALUES NIL "output-stream"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "echo-stream")
     "—an " (:TERM NIL "echo stream") ". " :PAR (:PARAM NIL "input-stream")
     "—an " (:TERM NIL "input") " " (:TERM NIL "stream") ". " :PAR
     (:PARAM NIL "output-stream") "—an " (:TERM NIL "output") " "
     (:TERM NIL "stream") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:FUNREF NIL "echo-stream-input-stream") " returns the "
     (:TERM NIL "input") " " (:TERM NIL "stream") " from which "
     (:PARAM NIL "echo-stream") " receives input. " :PAR
     (:FUNREF NIL "echo-stream-output-stream") " returns the "
     (:TERM NIL "output") " " (:TERM NIL "stream") " to which "
     (:PARAM NIL "echo-stream") " sends output. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MAKE-ECHO-STREAM")
   (:COM (:NAME "make-echo-stream" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-echo-stream")
      (:ARGLIST NIL "input-stream output-stream") (:VALUES NIL "echo-stream"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "input-stream")
     "—an " (:TERM NIL "input") " " (:TERM NIL "stream") ". " :PAR
     (:PARAM NIL "output-stream") "—an " (:TERM NIL "output") " "
     (:TERM NIL "stream") ". " :PAR (:PARAM NIL "echo-stream") "—an "
     (:TERM NIL "echo stream") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 21.2.0 7")
     "Creates and returns an " (:TERM NIL "echo stream")
     " that takes input from " (:PARAM NIL "input-stream")
     " and sends output to " (:PARAM NIL "output-stream") ". " :PAR
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (let ((out (make-string-output-stream)))
    (with-open-stream 
        (s (make-echo-stream
            (make-string-input-stream \"this-is-read-and-echoed\")
            out))
      (read s)
      (format s \" * this-is-direct-output\")
      (get-output-stream-string out)))
→ \"this-is-read-and-echoed * this-is-direct-output\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "echo-stream-input-stream")
     ", " (:FUNREF NIL "echo-stream-output-stream") ", "
     (:FUNREF NIL "make-two-way-stream") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL
    "-------------------- Concatenated Streams --------------------")
   :PAR (:COMMENT NIL "%% ========== CONCATENATED-STREAM-STREAMS")
   (:COM (:NAME "concatenated-stream-streams" :FTYPE "Function")
    (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "concatenated-stream-streams")
      (:ARGLIST NIL "concatenated-stream") (:VALUES NIL "streams"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "concatenated-stream") "—a " (:TERM NIL "concatenated stream")
     ". " :PAR (:PARAM NIL "streams") "—a " (:TERM NIL "list") " of "
     (:TERM NIL "input") " " (:TERM NIL "streams") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns a " (:TERM NIL "list")
     " of " (:TERM NIL "input") " " (:TERM NIL "streams")
     " that constitute the ordered set of " (:TERM NIL "streams") " the "
     (:PARAM NIL "concatenated-stream")
     " still has to read from, starting with the current one it is reading from. The list may be "
     (:TERM NIL "empty") " if no more " (:TERM NIL "streams")
     " remain to be read. " :PAR "The consequences are undefined if the "
     (:TERM NIL "list structure") " of the " (:PARAM NIL "streams")
     " is ever modified. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MAKE-CONCATENATED-STREAM")
   (:COM (:NAME "make-concatenated-stream" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-concatenated-stream")
      (:ARGLIST NIL (:KEYWORD NIL " &rest") " input-streams")
      (:VALUES NIL "concatenated-stream"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "input-stream")
     "—an " (:TERM NIL "input") " " (:TERM NIL "stream") ". " :PAR
     (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
     (:PARAM NIL "concatenated-stream") "—a " (:TERM NIL "concatenated stream")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 21.2.0 5")
     "Returns a " (:TERM NIL "concatenated stream") " that has the indicated "
     (:PARAM NIL "input-streams") " initially associated with it. " :PAR
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR)
    (:PART (:NAME "Examples") " "
     (:COMMENT NIL "% POSSIBLE CLEAN-UP ISSUE Symbolics returns 1.")
     (:CODE NIL " (read (make-concatenated-stream
         (make-string-input-stream \"1\")
         (make-string-input-stream \"2\"))) → 12
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "Should signal "
     (:TYPEREF NIL "type-error") " if any argument is not an "
     (:TERM NIL "input") " " (:TERM NIL "stream") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:FUNREF NIL "concatenated-stream-streams") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- String Streams --------------------")
   :PAR (:COMMENT NIL "%% ========== GET-OUTPUT-STREAM-STRING")
   (:COM (:NAME "get-output-stream-string" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "get-output-stream-string")
      (:ARGLIST NIL "string-output-stream") (:VALUES NIL "string"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "string-output-stream") "—a " (:TERM NIL "stream") ". " :PAR
     (:PARAM NIL "string") "—a " (:TERM NIL "string") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 21.2.0 10")
     "Returns a " (:TERM NIL "string") " containing, in order, all the "
     (:TERM NIL "characters") " that have been output to "
     (:PARAM NIL "string-output-stream") ". This operation clears any "
     (:TERM NIL "characters") " on " (:PARAM NIL "string-output-stream")
     ", so the " (:PARAM NIL "string") " contains only those "
     (:TERM NIL "characters") " which have been output since the last call to "
     (:FUNREF NIL "get-output-stream-string") " or since the creation of the "
     (:PARAM NIL "string-output-stream") ", whichever occurred most recently. "
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (setq a-stream (make-string-output-stream)
        a-string \"abcdefghijklm\") → \"abcdefghijklm\"
 (write-string a-string a-stream) → \"abcdefghijklm\"
 (get-output-stream-string a-stream) → \"abcdefghijklm\"
 (get-output-stream-string a-stream) → \"\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The "
     (:PARAM NIL "string-output-stream") " is cleared. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "CLOSE-CONSTRUCTED-STREAM:ARGUMENT-STREAM-ONLY") " "
     (:COMMENT NIL
      "The result of calling \\funref{get-output-stream-string} on "
      " the \\param{string-stream} returned by \\funref{make-string-output-stream} "
      " is unspecified after \\funref{close}. " "% Rewritten for Sandra:")
     "The consequences are undefined if " (:PARAM NIL "stream-output-string")
     " is " (:TERM NIL "closed") ". "
     (:ENDISSUE NIL "CLOSE-CONSTRUCTED-STREAM:ARGUMENT-STREAM-ONLY") " " :PAR
     "The consequences are undefined if " (:PARAM NIL "string-output-stream")
     " is a " (:TERM NIL "stream") " that was not produced by "
     (:FUNREF NIL "make-string-output-stream") ". "
     (:ISSUE NIL "STRING-OUTPUT-STREAM-BASHING:UNDEFINED")
     " The consequences are undefined if " (:PARAM NIL "string-output-stream")
     " was created implicitly by " (:MACREF NIL "with-output-to-string") " or "
     (:FUNREF NIL "format") ". " :PAR
     (:COMMENT NIL
      "% Redundant -- Said already in WITH-OUTPUT-TO-STRING and FORMAT. -kmp 14-Feb-92"
      " In the cases where a \\term{string} argument with a \\term{fill pointer} is supplied"
      " as an \\term{argument} to \\macref{with-output-to-string} or \\funref{format},"
      " the consequences are undefined if destructive modifications are performed"
      " directly on the \\term{string} during the \\term{dynamic extent} of the call.")
     (:ENDISSUE NIL "STRING-OUTPUT-STREAM-BASHING:UNDEFINED") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:FUNREF NIL "make-string-output-stream") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MAKE-STRING-INPUT-STREAM")
   (:COM (:NAME "make-string-input-stream" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-string-input-stream")
      (:ARGLIST NIL "string " (:KEYWORD NIL " &optional") " start end")
      (:VALUES NIL "string-stream"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "string") "—a "
     (:TERM NIL "string") ". " :PAR
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start") ", " (:PARAM NIL "end") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "string")
     ". The defaults for " (:PARAM NIL "start") " and " (:PARAM NIL "end")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " :PAR (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " "
     (:PARAM NIL "string-stream") "—an " (:TERM NIL "input") " "
     (:TERM NIL "string stream") ". "
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 21.2.0 8")
     "Returns an " (:TERM NIL "input") " " (:TERM NIL "string stream")
     ". This " (:TERM NIL "stream") " will supply, in order, the "
     (:TERM NIL "characters") " in the substring of " (:PARAM NIL "string") " "
     (:TERM NIL "bounded") " by " (:PARAM NIL "start") " and "
     (:PARAM NIL "end") ". After the last " (:TERM NIL "character")
     " has been supplied, the " (:TERM NIL "string stream") " will then be at "
     (:TERM NIL "end of file") ". " :PAR
     (:COMMENT NIL "% Implied by bounded. -kmp 14-Feb-92"
      " \\param{Start} marks the beginning position of the substring."
      " \\param{End}   marks the position following the last element of the substring.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (let ((string-stream (make-string-input-stream \"1 one \")))
   (list (read string-stream nil nil)
         (read string-stream nil nil)
         (read string-stream nil nil)))
→ (1 ONE NIL)

 (read (make-string-input-stream \"prefixtargetsuffix\" 6 12)) → TARGET
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "with-input-from-string")
     " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MAKE-STRING-OUTPUT-STREAM")
   (:COM (:NAME "make-string-output-stream" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-string-output-stream")
      (:ARGLIST NIL (:KEYWORD NIL " &key") " element-type")
      (:VALUES NIL "string-stream"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-5-6") " " (:PARAM NIL "element-type")
     "—a " (:TERM NIL "type specifier") ". The default is "
     (:TYPEREF NIL "character") ". " (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-5-6")
     " " :PAR (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " "
     (:PARAM NIL "string-stream") "—an " (:TERM NIL "output") " "
     (:TERM NIL "string stream") ". "
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 21.2.0 9")
     "Returns " (:ISSUE NIL "CHARACTER-PROPOSAL:2-5-6") " an "
     (:TERM NIL "output") " " (:TERM NIL "string stream") " that accepts "
     (:TERM NIL "characters") " and makes available (via "
     (:FUNREF NIL "get-output-stream-string") ") a " (:TERM NIL "string")
     " that contains the " (:TERM NIL "characters")
     " that were actually output. " :PAR "The " (:PARAM NIL "element-type")
     " names the " (:TERM NIL "type") " of the " (:TERM NIL "elements")
     " of the " (:TERM NIL "string") "; a " (:TERM NIL "string")
     " is constructed of the most specialized " (:TERM NIL "type")
     " that can accommodate " (:TERM NIL "elements") " of that "
     (:PARAM NIL "element-type") ". "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-5-6") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (let ((s (make-string-output-stream)))
   (write-string \"testing... \" s)
   (prin1 1234 s)
   (get-output-stream-string s))
→ \"testing... 1234\"
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR "None.. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "get-output-stream-string")
     ", " (:MACREF NIL "with-output-to-string") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== WITH-INPUT-FROM-STRING")
   (:COM (:NAME "with-input-from-string" :FTYPE "Macro")
    (:ISSUE NIL "DECLS-AND-DOC") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "with-input-from-string")
      (:ARGLIST NIL
       (:PAREN NIL "var string " (:KEYWORD NIL " &key") " index start end") " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "var") "—a "
     (:TERM NIL "variable") " " (:TERM NIL "name") ". " :PAR
     (:PARAM NIL "string") "—a " (:TERM NIL "form") "; evaluated to produce a "
     (:TERM NIL "string") ". " :PAR (:PARAM NIL "index") "—a "
     (:TERM NIL "place") ". " :PAR
     (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS:IS-AN-ERROR") " " (:PARAM NIL "start")
     ", " (:PARAM NIL "end") "—" (:TERM NIL "bounding index designators")
     " of " (:PARAM NIL "string") ". The defaults for " (:PARAM NIL "start")
     " and " (:PARAM NIL "end") " are " (:TT NIL "0") " and " (:MISC NIL "nil")
     ", respectively. " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS:IS-AN-ERROR") " "
     :PAR (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR (:PARAM NIL "forms")
     "—an " (:TERM NIL "implicit progn") ". " :PAR (:PARAM NIL "result")
     "—the " (:TERM NIL "values") " returned by the " (:PARAM NIL "forms") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR "Creates an "
     (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " (:TERM NIL "input")
     " " (:TERM NIL "string stream") ", "
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS")
     " provides an opportunity to perform operations on the "
     (:TERM NIL "stream") " (returning zero or more " (:TERM NIL "values")
     "), and then closes the " (:TERM NIL "string stream") ". " :PAR
     (:COMMENT NIL "% 21.2.0 12") (:PARAM NIL "String")
     " is evaluated first, and " (:PARAM NIL "var") " is bound to a character "
     (:TERM NIL "input") " " (:TERM NIL "string stream") " that supplies "
     (:TERM NIL "characters") " from the subsequence of the resulting "
     (:TERM NIL "string") " " (:TERM NIL "bounded") " by " (:PARAM NIL "start")
     " and " (:PARAM NIL "end") ". The body is executed as an "
     (:TERM NIL "implicit progn") ". " :PAR (:COMMENT NIL "% 21.2.0 13") "The "
     (:TERM NIL "input") " " (:TERM NIL "string stream")
     " is automatically closed on exit from "
     (:MACREF NIL "with-input-from-string")
     ", no matter whether the exit is normal or abnormal. "
     (:ISSUE NIL "WITH-OPEN-FILE-STREAM-EXTENT:DYNAMIC-EXTENT") " The "
     (:TERM NIL "input") " " (:TERM NIL "string stream") " to which the "
     (:TERM NIL "variable") " " (:PARAM NIL "var") " is " (:TERM NIL "bound")
     " has " (:TERM NIL "dynamic extent") "; its " (:TERM NIL "extent")
     " ends when the " (:TERM NIL "form") " is exited. "
     (:ENDISSUE NIL "WITH-OPEN-FILE-STREAM-EXTENT:DYNAMIC-EXTENT") " " :PAR
     (:COMMENT NIL "% 21.2.0 14" "% 21.2.0 15" " \\beginlist"
      " \\itemitem{\\kwd{index}}")
     :PAR "The " (:PARAM NIL "index") " is a pointer within the "
     (:PARAM NIL "string") " to be advanced. If "
     (:MACREF NIL "with-input-from-string") " is exited normally, then "
     (:PARAM NIL "index") " will have " (:COMMENT NIL " stored into it ")
     "as its " (:TERM NIL "value") " the index into the " (:PARAM NIL "string")
     " indicating the first character not read which is "
     (:TT NIL " (length " (:PARAM NIL "string") ")")
     " if all characters were used. The place specified by "
     (:PARAM NIL "index")
     " is not updated as reading progresses, but only at the end of the operation. "
     :PAR
     (:COMMENT NIL "% This is redundant with \"bounded\"." " %% 21.2.0 16"
      " \\itemitem{\\kwd{start}}" " "
      " \\kwd{start} indicates the beginning of a substring of \\param{string} to be used."
      " If \\kwd{start} is not supplied or \\nil, the beginning position is 0."
      " " " %% 21.2.0 17" " \\itemitem{\\kwd{end}}" " "
      " \\kwd{end} indicates the end of a substring of \\param{string} to be used."
      " If \\kwd{end} is not supplied or \\nil, the ending position is {\\tt (length \\param{string})}."
      " \\endlist")
     :PAR (:COMMENT NIL "% 21.2.0 19") (:PARAM NIL "start") " and "
     (:PARAM NIL "index")
     " may both specify the same variable, which is a pointer within the "
     (:PARAM NIL "string")
     " to be advanced, perhaps repeatedly by some containing loop. " :PAR
     (:ISSUE NIL "WITH-OPEN-FILE-SETQ:EXPLICITLY-VAGUE")
     " The consequences are undefined if an attempt is made to "
     (:TERM NIL "assign") " the " (:TERM NIL "variable") " " (:PARAM NIL "var")
     ". "
     (:COMMENT NIL "% Sandra thinks this isn't needed."
      " The compiler may choose to issue a"
      " warning if such an attempt is detected.")
     (:ENDISSUE NIL "WITH-OPEN-FILE-SETQ:EXPLICITLY-VAGUE") " " :PAR)
    (:PART (:NAME "Examples") " " (:COMMENT NIL "% 21.2.0 18")
     (:CODE NIL " (with-input-from-string (s \"XXX1 2 3 4xxx\"
                             :index ind
                             :start 3 :end 10)
    (+ (read s) (read s) (read s))) → 6
 ind → 9
 (with-input-from-string (s \"Animal Crackers\" :index j :start 6)
   (read s)) → CRACKERS
")
     " The variable " (:TT NIL "j") " is set to " (:TT NIL "15") ". " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:TERM NIL "value")
     " of the " (:TERM NIL "place") " named by " (:PARAM NIL "index")
     ", if any, is modified. " :PAR
     (:COMMENT NIL "% Sandra thinks this is excessive."
      "A \\term{string stream} is created (upon entry) and closed (upon exit).")
     :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "make-string-input-stream")
     ", " (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== WITH-OUTPUT-TO-STRING")
   (:COM (:NAME "with-output-to-string" :FTYPE "Macro")
    (:ISSUE NIL "DECLS-AND-DOC") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "with-output-to-string")
      (:ARGLIST NIL
       (:PAREN NIL "var " (:KEYWORD NIL " &optional") " string-form "
        (:KEYWORD NIL " &key") " element-type")
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "var") "—a "
     (:TERM NIL "variable") " " (:TERM NIL "name") ". " :PAR
     (:PARAM NIL "string-form") "—a " (:TERM NIL "form") " or "
     (:MISC NIL "nil") "; if " (:TERM NIL "non-nil") ", evaluated to produce "
     (:PARAM NIL "string") ". " :PAR (:PARAM NIL "string") "—a "
     (:TERM NIL "string") " that has a " (:TERM NIL "fill pointer") ". " :PAR
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-5-6") " " (:PARAM NIL "element-type")
     "—a " (:TERM NIL "type specifier") "; evaluated. "
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-3-6") " The default is "
     (:TYPEREF NIL "character") ". " (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-3-6")
     " " (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-5-6") " " :PAR
     (:PARAM NIL "declaration") "—a " (:MISC NIL "declare") " "
     (:TERM NIL "expression") "; not evaluated. " :PAR (:PARAM NIL "forms")
     "—an " (:TERM NIL "implicit progn") ". " :PAR (:PARAM NIL "results")
     "—If a " (:PARAM NIL "string-form") " is not supplied or "
     (:MISC NIL "nil") ", a " (:TERM NIL "string") "; otherwise, the "
     (:TERM NIL "values") " returned by the " (:PARAM NIL "forms") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "with-output-to-string")
     " creates a " (:ISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS")
     " character " (:TERM NIL "output") " " (:TERM NIL "stream")
     ", performs a series of operations that may send results to this "
     (:TERM NIL "stream") ", and then closes the " (:TERM NIL "stream") ". "
     (:ENDISSUE NIL "STREAM-ACCESS:ADD-TYPES-ACCESSORS") " " :PAR
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-3-6") " The "
     (:PARAM NIL "element-type") " names the " (:TERM NIL "type")
     " of the elements of the " (:TERM NIL "stream") "; a "
     (:TERM NIL "stream") " is constructed of the most specialized "
     (:TERM NIL "type") " that can accommodate elements of the given "
     (:TERM NIL "type") ". " (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-3-6") " "
     :PAR (:COMMENT NIL "% 21.2.0 20") "The body is executed as an "
     (:TERM NIL "implicit progn") " with " (:PARAM NIL "var") " bound to an "
     (:TERM NIL "output") " " (:TERM NIL "string stream")
     ". All output to that " (:TERM NIL "string stream") " is saved in a "
     (:TERM NIL "string") ". " :PAR (:COMMENT NIL "% 21.2.0 22")
     (:ISSUE NIL "WITH-OUTPUT-TO-STRING-APPEND-STYLE:VECTOR-PUSH-EXTEND")
     " If " (:PARAM NIL "string") " is supplied, " (:PARAM NIL "element-type")
     " is ignored, and the output is incrementally appended to "
     (:PARAM NIL "string") " as if by use of "
     (:FUNREF NIL "vector-push-extend") ". "
     (:ENDISSUE NIL "WITH-OUTPUT-TO-STRING-APPEND-STYLE:VECTOR-PUSH-EXTEND")
     " " :PAR (:COMMENT NIL "% 21.2.0 24" "% Sandra: Huh?" "In either case, ")
     "The " (:TERM NIL "output") " " (:TERM NIL "stream")
     " is automatically closed on exit from "
     (:MACREF NIL "with-output-to-string")
     ", no matter whether the exit is normal or abnormal. "
     (:ISSUE NIL "WITH-OPEN-FILE-STREAM-EXTENT:DYNAMIC-EXTENT") " The "
     (:TERM NIL "output") " " (:TERM NIL "string stream") " to which the "
     (:TERM NIL "variable") " " (:PARAM NIL "var") " is " (:TERM NIL "bound")
     " has " (:TERM NIL "dynamic extent") "; its " (:TERM NIL "extent")
     " ends when the " (:TERM NIL "form") " is exited. "
     (:ENDISSUE NIL "WITH-OPEN-FILE-STREAM-EXTENT:DYNAMIC-EXTENT") " " :PAR
     (:COMMENT NIL "% 21.2.0 21") "If no " (:PARAM NIL "string")
     " is provided, then " (:MACREF NIL "with-output-to-string") " "
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-5-6") " produces a "
     (:TERM NIL "stream") " that accepts characters and returns a "
     (:TERM NIL "string") " of the indicated " (:PARAM NIL "element-type") ". "
     (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-5-6") " If " (:PARAM NIL "string")
     " is provided, " (:MACREF NIL "with-output-to-string")
     " returns the results of evaluating the last " (:PARAM NIL "form") ". "
     :PAR (:ISSUE NIL "WITH-OPEN-FILE-SETQ:EXPLICITLY-VAGUE")
     " The consequences are undefined if an attempt is made to "
     (:TERM NIL "assign") " the " (:TERM NIL "variable") " " (:PARAM NIL "var")
     ". "
     (:COMMENT NIL "% Sandra: unnecessary."
      "The compiler may choose to issue a"
      "warning if such an attempt is detected.")
     (:ENDISSUE NIL "WITH-OPEN-FILE-SETQ:EXPLICITLY-VAGUE") " " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (setq fstr (make-array '(0) :element-type 'base-char
                             :fill-pointer 0 :adjustable t)) → \"\"
 (with-output-to-string (s fstr)
    (format s \"here's some output\")
    (input-stream-p s)) → "
      (:TERM NIL "false") "
 fstr → \"here's some output\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:PARAM NIL "string")
     " is modified. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "STRING-OUTPUT-STREAM-BASHING:UNDEFINED")
     " The consequences are undefined if destructive modifications are performed directly on the "
     (:PARAM NIL "string") " during the " (:TERM NIL "dynamic extent")
     " of the call. " (:ENDISSUE NIL "STRING-OUTPUT-STREAM-BASHING:UNDEFINED")
     " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:FUNREF NIL "make-string-output-stream") ", "
     (:FUNREF NIL "vector-push-extend") ", "
     (:ISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     (:SECREF NIL :TRAVERSAL-RULES) " "
     (:ENDISSUE NIL "MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE") " "
     :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR (:ENDISSUE NIL "DECLS-AND-DOC") " "
     :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Stream Variables --------------------")
   :PAR
   (:COMMENT NIL " \\def\\iovarconstraint#1#2 #3{"
    " \\issue{STANDARD-INPUT-INITIAL-BINDING:DEFINED-CONTRACTS}"
    " \\term{implementation-dependent}, but it must be an \\term{open},"
    " \\term{#1} \\term{stream} which is not a "
    " \\term{generalized synonym stream} to any of the \\term{symbols} #3, but"
    " which might be a \\term{generalized synonym stream} to the "
    " \\term{value} of one of those \\term{symbols}.  #2"
    " \\endissue{STANDARD-INPUT-INITIAL-BINDING:DEFINED-CONTRACTS}" " }" " "
    " \\def\\TerminalIOsynOK{%"
    " The initial value might also be a \\term{generalized synonym stream} "
    " to either the \\term{symbol} \\varref{*terminal-io*} or to the \\term{stream} "
    " which is its \\term{value}.}" " " " \\def\\iovarrationale#1{"
    " \\issue{STANDARD-INPUT-INITIAL-BINDING:DEFINED-CONTRACTS}"
    " The intent of the constraints on the initial \\term{value} "
    " is to ensure that it is always safe to bind \\varref{*#1*} "
    " to one of the above-mentioned variables without"
    " unduly restricting implementation flexibility."
    " \\endissue{STANDARD-INPUT-INITIAL-BINDING:DEFINED-CONTRACTS}" " }"
    " %%% ========== *DEBUG-IO*" " \\begincom{*debug-io*}\\ftype{Variable}" " "
    " \\label Value Type::" " " " a \\term{bidirectional} \\term{stream}." " "
    " \\label Initial Value::" " "
    " \\iovarconstraint{bidirectional}{\\TerminalIOsynOK}"
    "  {\\varref{*standard-input*}," "   \\varref{*standard-output*}, "
    "   \\varref{*error-output*}," "   \\varref{*trace-output*}, or"
    "   \\varref{*query-io*}}" " " " \\label Description::" " " " %% 21.1.0 7"
    " A \\term{stream} to be used for interactive debugging purposes.  " " "
    " \\label Examples:\\None." " "
    " %% Moon: Not only is this example under *debug-io* disgusting, it is not correct Common"
    " %%       Lisp because it violates dynamic extent:"
    " %% KMP:  I concur! Commented out." " %" " % \\code"
    " %  (with-output-to-string (out)"
    " %    (with-input-from-string (in \"enter > \")"
    " %      (let ((two-way (make-two-way-stream in out)))"
    " %        (setq *debug-io* two-way)))) \\EV \"\"           "
    " %  *debug-io* \\EV #<TWO-WAY-STREAM>" " % \\endcode" " "
    " \\label Affected By:\\None." " " " \\label See Also::" " "
    " \\varref{*query-io*}," " \\funref{make-synonym-stream}" " "
    " \\label Notes::" " " " \\iovarrationale{debug-io}" " "
    " Frequently \\varref{*debug-io*} is bound to the same \\term{stream} as \\varref{*query-io*}."
    " " " \\endcom" " " " %%% ========== *ERROR-OUTPUT*"
    " \\begincom{*error-output*}\\ftype{Variable}" " " " \\label Value Type::"
    " " " an \\term{output} \\term{stream}." " " " \\label Initial Value::" " "
    " \\iovarconstraint{output}{\\TerminalIOsynOK}"
    "  {\\varref{*standard-input*}," "   \\varref{*standard-output*},"
    "   \\varref{*trace-output*}," "   \\varref{*query-io*}, or"
    "   \\varref{*debug-io*}}" " " " \\label Description::" " " " %% 21.1.0 5"
    " \\Thevalueof{*error-output*} is a \\term{stream} to which error messages should be sent.  "
    " " " \\label Examples::" " " " \\code"
    "  (with-output-to-string (*error-output*)"
    "    (warn \"this string is sent to *error-output*\"))"
    "  \\EV \"Warning: this string is sent to *error-output*"
    " \" ;The exact format of this string is \\term{implementation-dependent}."
    " \\endcode" " " " \\label Affected By:\\None." " " " %%Sandra: Gratuitous"
    " %The \\term{implementation}." " " " \\label See Also::" " "
    " \\varref{*standard-output*}," " \\varref{*terminal-io*},"
    " \\funref{make-synonym-stream}," " \\funref{warn}," " \\funref{error},"
    " \\funref{cerror}," " \\funref{break}," " \\macref{check-type},"
    " \\macref{assert}," " \\macref{etypecase}," " \\macref{ctypecase},"
    " \\macref{ecase}," " \\macref{ccase}" "      " " \\label Notes::" " "
    " \\iovarrationale{error-output}" " "
    " Frequently \\varref{*error-output*} is bound to the \\term{same} \\term{stream}"
    " as \\varref{*standard-output*}." " " " \\endcom" " "
    " %%% ========== *QUERY-IO*" " \\begincom{*query-io*}\\ftype{Variable}" " "
    " \\label Value Type::" " " " a \\term{bidirectional} \\term{stream}." " "
    " \\label Initial Value::" " "
    " \\iovarconstraint{bidirectional}{\\TerminalIOsynOK}"
    "  {\\varref{*standard-input*}," "   \\varref{*standard-output*},"
    "   \\varref{*error-output*}," "   \\varref{*trace-output*}, or"
    "   \\varref{*debug-io*}}" " " " \\label Description::" " " " %% 21.1.0 6"
    " \\Thevalueof{*query-io*}, \\term{query I/O}, is a \\term{bidirectional} \\term{stream} "
    " to be used when asking questions of the user.  The question should be output "
    " to this \\term{stream}, and the answer read from it." " "
    " \\label Examples:\\None." " " " \\label Affected By:\\None." " "
    " %%Sandra: Gratuitous" " %The \\term{implementation}." " "
    " \\label See Also::" " " " \\varref{*debug-io*},"
    " \\varref{*terminal-io*}," " \\funref{make-synonym-stream},"
    " \\funref{y-or-n-p}," " \\funref{yes-or-no-p}" " " " \\label Notes::" " "
    " \\iovarrationale{query-io}" " "
    " %\\varref{*query-io*} is normally a \\term{synonym stream} to \\varref{*terminal-io*}."
    " " " \\varref{*query-io*} is used by such functions as \\funref{y-or-n-p}"
    " and \\funref{yes-or-no-p}." " \\endcom" " "
    " %%% ========== *STANDARD-INPUT*"
    " \\begincom{*standard-input*}\\ftype{Variable}" " "
    " \\label Value Type::" " " " an \\term{input} \\term{stream}." " "
    " \\label Initial Value::" " "
    " \\iovarconstraint{input}{\\TerminalIOsynOK}"
    "  {\\varref{*standard-output*}," "   \\varref{*error-output*},"
    "   \\varref{*trace-output*}," "   \\varref{*query-io*}, or"
    "   \\varref{*debug-io*}}" " " " \\label Description::" " "
    " \\issue{STANDARD-INPUT-INITIAL-BINDING:DEFINED-CONTRACTS}"
    " \\Thevalueof{*standard-input*}, \\term{standard input}, is a \\term{stream}"
    " that is used by many \\term{operators} as a default source of input when "
    " no specific \\term{input} \\term{stream} is explicitly supplied."
    " \\endissue{STANDARD-INPUT-INITIAL-BINDING:DEFINED-CONTRACTS} " " "
    " \\label Examples::" " " " \\code"
    "  (with-input-from-string (*standard-input* \"1001\")"
    "     (+ 990 (read))) \\EV 1991                       " " \\endcode" " "
    " \\label Affected By:\\None." " " " %%Sandra: Gratuitous"
    " %The \\term{implementation}." " " " \\label See Also::" " "
    " \\funref{make-synonym-stream}" " " " \\label Notes::" " "
    " \\iovarrationale{standard-input}" " " " %% 21.1.0 3" " %% 22.2.1 1"
    " In the normal \\term{Lisp read-eval-print loop}, input is read from"
    " \\term{standard input}.  Many input functions, including \\funref{read} "
    " and \\funref{read-char}, take a \\term{stream} argument that defaults "
    " to \\term{standard input}." " " " \\endcom" " " " "
    " %%% ========== *STANDARD-OUTPUT*"
    " \\begincom{*standard-output*}\\ftype{Variable}" " "
    " \\label Value Type::" " " " an \\term{output} \\term{stream}." " "
    " \\label Initial Value::" " "
    " \\iovarconstraint{output}{\\TerminalIOsynOK}"
    "  {\\varref{*standard-input*}," "   \\varref{*error-output*},"
    "   \\varref{*trace-output*}," "   \\varref{*query-io*}, or"
    "   \\varref{*debug-io*}}" " " " \\label Description::" " "
    " \\Thevalueof{*standard-output*}, \\term{standard output}, is a \\term{stream}"
    " that is used by many \\term{operators} as a default destination for output"
    " when no specific \\term{output} \\term{stream} is explicitly supplied."
    " " " \\label Examples::" " \\code"
    "  (progn (setq out (with-output-to-string (*standard-output*)"
    "                      (print \"print and format t send things to\")"
    "                      (format t \"*standard-output* now going to a string\")))"
    "         :done)" " \\EV :DONE" "  out" " \\EV \""
    " \\\\\"print and format t send things to\\\\\" *standard-output* now going to a string\""
    " \\endcode" " " " \\label Affected By:\\None." " " " %%Sandra: Gratuitous"
    " %The \\term{implementation}." " " " \\label See Also::" " "
    " \\funref{make-synonym-stream}" " " " \\label Notes::" " " " %% 21.1.0 4"
    " In the normal \\term{Lisp read-eval-print loop}, output is sent to \\term{standard output}."
    " Many output functions, including \\funref{print} and \\funref{write-char}, "
    " take a \\term{stream} argument that defaults to \\term{standard output}."
    " "
    " %!!! This needs to be cross-checked against the new descriptions of these streams."
    " %% 21.1.0 11"
    " A program that wants, for example, to divert output to a file should do so by "
    " \\term{binding} \\varref{*standard-output*}; that way error messages sent to"
    " \\varref{*error-output*} can still get to the user by going through"
    " \\varref{*terminal-io*} (if \\varref{*error-output*} is bound to \\varref{*terminal-io*}),"
    " which is usually what is desired." " " " \\endcom" " " " "
    " %%% ========== *TRACE-OUTPUT*"
    " \\begincom{*trace-output*}\\ftype{Variable}" " " " \\label Value Type::"
    " " " an \\term{output} \\term{stream}." " " " \\label Initial Value::" " "
    " \\iovarconstraint{output}{\\TerminalIOsynOK}"
    "  {\\varref{*standard-input*}," "   \\varref{*standard-output*},"
    "   \\varref{*error-output*}," "   \\varref{*query-io*}, or"
    "   \\varref{*debug-io*}}" " " " \\label Description::" " " " %% 21.1.0 9"
    " The \\term{stream} on which traced functions (see \\macref{trace})"
    " and \\themacro{time} print their output." " " " \\label Examples::" " "
    " \\code" "  (defun fact (n) (if (< n 2) 1 (* n (fact (- n 1)))))"
    " \\EV FACT" "  (trace fact)" " \\EV (FACT)"
    " ;; Of course, the format of traced output is implementation-dependent."
    "  (with-output-to-string (*trace-output*)" "    (fact 3)) " " \\EV \""
    " 1 Enter FACT 3" " | 2 Enter FACT 2" " |   3 Enter FACT 1"
    " |   3 Exit FACT 1" " | 2 Exit FACT 2" " 1 Exit FACT 6\"" " \\endcode" " "
    " \\label Affected By:\\None." " " " %%Sandra: Gratuitous"
    " %The \\term{implementation}." " " " \\label See Also::" " "
    " \\funref{make-synonym-stream}," " \\macref{trace}," " \\macref{time}."
    "            " " \\label Notes::" " " " \\iovarrationale{trace-output}" " "
    " \\endcom" " %%% ========== *TERMINAL-IO*"
    " \\begincom{*terminal-io*}\\ftype{Variable}" " " " \\label Value Type::"
    " " " a \\term{bidirectional} \\term{stream}." " "
    " \\label Initial Value::" " "
    " \\editornote{KMP: Doesn't debug-io belong in this list?}" " "
    " \\iovarconstraint{bidirectional}{}" "  {\\varref{*standard-input*},"
    "   \\varref{*standard-output*}," "   \\varref{*error-output*},"
    "   \\varref{*trace-output*}, or" "   \\varref{*query-io*}}" " "
    " \\label Description::" " " " %% 21.1.0 8"
    " \\Thevalueof{*terminal-io*}, \\term{terminal I/O}, is ordinarily "
    " a \\term{bidirectional} \\term{stream} that connects to the user's console."
    " Typically, writing to this \\term{stream} "
    " would cause the output to appear"
    " on a display screen, for example, and reading from the \\term{stream} would"
    " accept input from a keyboard.  It is intended"
    " that standard input functions such as \\funref{read} and \\funref{read-char},"
    " when used with this \\term{stream}, cause echoing of the input"
    " into the output side of the \\term{stream}. The means by which this is"
    " accomplished are \\term{implementation-dependent}." " "
    " %% 21.1.0 11, clarified by KMP"
    " The effect of changing \\thevalueof{*terminal-io*},"
    " either by \\term{binding} or \\term{assignment},"
    " is \\term{implementation-defined}." " " " \\label Examples::" " "
    " \\code" "  (progn (prin1 'foo) (prin1 'bar *terminal-io*))"
    " \\OUT FOOBAR" " \\EV BAR" "  (with-output-to-string (*standard-output*)"
    "    (prin1 'foo) " "    (prin1 'bar *terminal-io*))" " \\OUT BAR"
    " \\EV \"FOO\"" " \\endcode" " " " \\label Affected By:\\None." " "
    " %%Sandra: Gratuitous" " %The \\term{implementation}." " "
    " \\label See Also:\\None." " " " \\label Notes:\\None." " " " \\endcom")
   :PAR
   (:COMMENT NIL "%% ========== *DEBUG-IO*" "%% ========== *ERROR-OUTPUT*"
    "%% ========== *QUERY-IO*" "%% ========== *STANDARD-INPUT*"
    "%% ========== *STANDARD-OUTPUT*" "%% ========== *TRACE-OUTPUT*")
   (:COM
    (:NAME
     "*debug-io*, *error-output*, *query-io*, *standard-input*, *standard-output*, *trace-output*"
     :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "For "
     (:VARREF NIL "*standard-input*") ": an " (:TERM NIL "input") " "
     (:TERM NIL "stream") " " :PAR "For " (:VARREF NIL "*error-output*") ", "
     (:VARREF NIL "*standard-output*") ", and " (:VARREF NIL "*trace-output*")
     ": an " (:TERM NIL "output") " " (:TERM NIL "stream") ". " :PAR "For "
     (:VARREF NIL "*debug-io*") ", " (:VARREF NIL "*query-io*") ": a "
     (:TERM NIL "bidirectional") " " (:TERM NIL "stream") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR
     (:TERM NIL "implementation-dependent") ", but it must be an "
     (:TERM NIL "open") " " (:TERM NIL "stream") " that is not a "
     (:TERM NIL "generalized synonym stream") " to an "
     (:TERM NIL "I/O customization variables") " but that might be a "
     (:TERM NIL "generalized synonym stream") " to the value of some "
     (:TERM NIL "I/O customization variable")
     ". The initial value might also be a "
     (:TERM NIL "generalized synonym stream") " to either the "
     (:TERM NIL "symbol") " " (:VARREF NIL "*terminal-io*") " or to the "
     (:TERM NIL "stream") " that is its " (:TERM NIL "value") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "These " (:TERM NIL "variables")
     " are collectively called the " (:TERM NIL "standardized") " "
     (:TERM NIL "I/O customization variables") ". They can be "
     (:TERM NIL "bound") " or " (:TERM NIL "assigned")
     " in order to change the default destinations for input and/or output used by various "
     (:TERM NIL "standardized") " " (:TERM NIL "operators") " and facilities. "
     :PAR (:COMMENT NIL "% 21.1.0 7") "The " (:TERM NIL "value") " of "
     (:VARREF NIL "*debug-io*") ", called " (:TERM NIL "debug I/O") ", is a "
     (:TERM NIL "stream") " to be used for interactive debugging purposes. "
     :PAR (:COMMENT NIL "% 21.1.0 5") "The " (:TERM NIL "value") " of "
     (:VARREF NIL "*error-output*") ", called " (:TERM NIL "error output")
     ", is a " (:TERM NIL "stream")
     " to which warnings and non-interactive error messages should be sent. "
     :PAR (:COMMENT NIL "% 21.1.0 6") "The " (:TERM NIL "value") " of "
     (:VARREF NIL "*query-io*") ", called " (:TERM NIL "query I/O") ", is a "
     (:TERM NIL "bidirectional") " " (:TERM NIL "stream")
     " to be used when asking questions of the user. The question should be output to this "
     (:TERM NIL "stream") ", and the answer read from it. " :PAR
     (:ISSUE NIL "STANDARD-INPUT-INITIAL-BINDING:DEFINED-CONTRACTS") " The "
     (:TERM NIL "value") " of " (:VARREF NIL "*standard-input*") ", called "
     (:TERM NIL "standard input") ", is a " (:TERM NIL "stream")
     " that is used by many " (:TERM NIL "operators")
     " as a default source of input when no specific " (:TERM NIL "input") " "
     (:TERM NIL "stream") " is explicitly supplied. "
     (:ENDISSUE NIL "STANDARD-INPUT-INITIAL-BINDING:DEFINED-CONTRACTS") " "
     :PAR "The " (:TERM NIL "value") " of " (:VARREF NIL "*standard-output*")
     ", called " (:TERM NIL "standard output") ", is a " (:TERM NIL "stream")
     " that is used by many " (:TERM NIL "operators")
     " as a default destination for output when no specific "
     (:TERM NIL "output") " " (:TERM NIL "stream") " is explicitly supplied. "
     :PAR (:COMMENT NIL "% 21.1.0 9") "The " (:TERM NIL "value") " of "
     (:VARREF NIL "*trace-output*") ", called " (:TERM NIL "trace output")
     ", is the " (:TERM NIL "stream") " on which traced functions (see "
     (:MACREF NIL "trace") ") and the " (:FUNREF NIL "time") " "
     (:TERM NIL "macro") " print their output. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (with-output-to-string (*error-output*)
   (warn \"this string is sent to *error-output*\"))
 → \"Warning: this string is sent to *error-output*
\" ;The exact format of this string is "
      (:TERM NIL "implementation-dependent") ".

 (with-input-from-string (*standard-input* \"1001\")
    (+ 990 (read))) → 1991                       

 (progn (setq out (with-output-to-string (*standard-output*)
                     (print \"print and format t send things to\")
                     (format t \"*standard-output* now going to a string\")))
        :done)
→ :DONE
 out
→ \"
\\\"print and format t send things to\\\" *standard-output* now going to a string\"

 (defun fact (n) (if (< n 2) 1 (* n (fact (- n 1)))))
→ FACT
 (trace fact)
→ (FACT)
;; Of course, the format of traced output is implementation-dependent.
 (with-output-to-string (*trace-output*)
   (fact 3)) 
→ \"
1 Enter FACT 3
| 2 Enter FACT 2
|   3 Enter FACT 1
|   3 Exit FACT 1
| 2 Exit FACT 2
1 Exit FACT 6\"
")
     " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:VARREF NIL "*terminal-io*") ", "
     (:TYPEREF NIL "synonym-stream") ", " (:MACREF NIL "time") ", "
     (:MACREF NIL "trace") ", " (:CHAPREF NIL :CONDITIONS) ", "
     (:CHAPREF NIL :READER) ", " (:CHAPREF NIL :PRINTER) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:ISSUE NIL "STANDARD-INPUT-INITIAL-BINDING:DEFINED-CONTRACTS")
     " The intent of the constraints on the initial " (:TERM NIL "value")
     " of the " (:TERM NIL "I/O customization variables")
     " is to ensure that it is always safe to " (:TERM NIL "bind") " or "
     (:TERM NIL "assign") " such a " (:TERM NIL "variable") " to the "
     (:TERM NIL "value") " of another "
     (:TERM NIL "I/O customization variable") ", without unduly restricting "
     (:TERM NIL "implementation") " flexibility. "
     (:ENDISSUE NIL "STANDARD-INPUT-INITIAL-BINDING:DEFINED-CONTRACTS") " "
     :PAR "It is common for an " (:TERM NIL "implementation")
     " to make the initial " (:TERM NIL "values") " of "
     (:VARREF NIL "*debug-io*") " and " (:VARREF NIL "*query-io*") " be the "
     (:TERM NIL "same") " " (:TERM NIL "stream") ", and to make the initial "
     (:TERM NIL "values") " of " (:VARREF NIL "*error-output*") " and "
     (:VARREF NIL "*standard-output*") " be the " (:TERM NIL "same") " "
     (:TERM NIL "stream") ". " :PAR "The functions " (:FUNREF NIL "y-or-n-p")
     " and " (:FUNREF NIL "yes-or-no-p") " use " (:TERM NIL "query I/O")
     " for their input and output. " :PAR
     (:COMMENT NIL "% 21.1.0 3" "% 22.2.1 1") "In the normal "
     (:TERM NIL "Lisp read-eval-print loop") ", input is read from "
     (:TERM NIL "standard input") ". Many input functions, including "
     (:FUNREF NIL "read") " and " (:FUNREF NIL "read-char") ", take a "
     (:TERM NIL "stream") " argument that defaults to "
     (:TERM NIL "standard input") ". " :PAR (:COMMENT NIL "% 21.1.0 4")
     "In the normal " (:TERM NIL "Lisp read-eval-print loop")
     ", output is sent to " (:TERM NIL "standard output")
     ". Many output functions, including " (:FUNREF NIL "print") " and "
     (:FUNREF NIL "write-char") ", take a " (:TERM NIL "stream")
     " argument that defaults to " (:TERM NIL "standard output") ". " :PAR
     (:COMMENT NIL "% 21.1.0 11")
     "A program that wants, for example, to divert output to a file should do so by "
     (:TERM NIL "binding") " " (:VARREF NIL "*standard-output*")
     "; that way error messages sent to " (:VARREF NIL "*error-output*")
     " can still get to the user by going through "
     (:VARREF NIL "*terminal-io*") " (if " (:VARREF NIL "*error-output*")
     " is bound to " (:VARREF NIL "*terminal-io*")
     "), which is usually what is desired. " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *TERMINAL-IO*")
   (:COM (:NAME "*terminal-io*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "bidirectional") " "
     (:TERM NIL "stream") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR
     (:TERM NIL "implementation-dependent") ", but it must be an "
     (:TERM NIL "open") " " (:TERM NIL "stream") " that is not a "
     (:TERM NIL "generalized synonym stream") " to an "
     (:TERM NIL "I/O customization variables") " but that might be a "
     (:TERM NIL "generalized synonym stream") " to the " (:TERM NIL "value")
     " of some " (:TERM NIL "I/O customization variable") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 21.1.0 8") "The "
     (:TERM NIL "value") " of " (:VARREF NIL "*terminal-io*") ", called "
     (:TERM NIL "terminal I/O") ", is ordinarily a "
     (:TERM NIL "bidirectional") " " (:TERM NIL "stream")
     " that connects to the user's console. Typically, writing to this "
     (:TERM NIL "stream")
     " would cause the output to appear on a display screen, for example, and reading from the "
     (:TERM NIL "stream")
     " would accept input from a keyboard. It is intended that standard input functions such as "
     (:FUNREF NIL "read") " and " (:FUNREF NIL "read-char")
     ", when used with this " (:TERM NIL "stream")
     ", cause echoing of the input into the output side of the "
     (:TERM NIL "stream") ". The means by which this is accomplished are "
     (:TERM NIL "implementation-dependent") ". " :PAR
     (:COMMENT NIL "% 21.1.0 11, clarified by KMP")
     "The effect of changing the " (:TERM NIL "value") " of "
     (:VARREF NIL "*terminal-io*") ", either by " (:TERM NIL "binding") " or "
     (:TERM NIL "assignment") ", is " (:TERM NIL "implementation-defined") ". "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (progn (prin1 'foo) (prin1 'bar *terminal-io*))
⊳ FOOBAR
→ BAR
 (with-output-to-string (*standard-output*)
   (prin1 'foo) 
   (prin1 'bar *terminal-io*))
⊳ BAR
→ \"FOO\"
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:VARREF NIL "*debug-io*") ", "
     (:VARREF NIL "*error-output*") ", " (:VARREF NIL "*query-io*") ", "
     (:VARREF NIL "*standard-input*") ", " (:VARREF NIL "*standard-output*")
     ", " (:VARREF NIL "*trace-output*") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Stream Errors --------------------")
   :PAR
   (:COM (:NAME "stream-error" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "stream-error")
     ", " (:TYPEREF NIL "error") ", " (:TYPEREF NIL "serious-condition") ", "
     (:TYPEREF NIL "condition") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "stream-error")
     " consists of error conditions that are related to receiving input from or sending output to a "
     (:TERM NIL "stream") ". The “offending stream” is initialized by the "
     (:KWD NIL "stream") " initialization argument to "
     (:FUNREF NIL "make-condition") ", and is " (:TERM NIL "accessed")
     " by the " (:TERM NIL "function") " " (:FUNREF NIL "stream-error-stream")
     ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "stream-error-stream") " "
     :PAR))
   :PAR (:COMMENT NIL "%% ========== STREAM-ERROR-STREAM")
   (:COM (:NAME "stream-error-stream" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "stream-error-stream")
      (:ARGLIST NIL "condition") (:VALUES NIL "stream"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "condition")
     "—a " (:TERM NIL "condition") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "stream-error") ". " :PAR (:PARAM NIL "stream") "—a "
     (:TERM NIL "stream") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns the offending "
     (:TERM NIL "stream") " of a " (:TERM NIL "condition") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "stream-error") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (with-input-from-string (s \"(FOO\")
   (handler-case (read s)
     (end-of-file (c)
       (format nil \"~&End of file on ~S.\" (stream-error-stream c)))))
\"End of file on #<String Stream>.\"
")
     " " (:COMMENT NIL " )") :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:TYPEREF NIL "stream-error") ", "
     (:SECREF NIL :CONDITIONS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL "% This shouldn't be needed."
      "It is an error to use \\macref{setf} with \\funref{stream-error-stream}.")
     :PAR))
   " " :PAR
   (:COM (:NAME "end-of-file" :FTYPE "Condition Type")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "end-of-file")
     ", " (:TYPEREF NIL "stream-error") ", " (:TYPEREF NIL "error") ", "
     (:TYPEREF NIL "serious-condition") ", " (:TYPEREF NIL "condition") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "end-of-file")
     " consists of error conditions related to read operations that are done on "
     (:TERM NIL "streams") " that have no more data. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "stream-error-stream") " "
     :PAR)))
  " " :PAR)
 (:CHAPTER
  (:NUM "22" :TITLE ("Printer") :NUMTAG :CHAP-TWENTY-TWO :NAMETAG :PRINTER)
  (:SECTION (:TITLE ("The Lisp Printer") :TAGS (:THE-LISP-PRINTER)) " " :PAR
   (:SUBSECTION (:TITLE ("Overview of The Lisp Printer"))
    (:RM NIL " Common Lisp") " provides a representation of most "
    (:TERM NIL "objects")
    " in the form of printed text called the printed representation. Functions such as "
    (:FUNREF NIL "print") " take an " (:TERM NIL "object")
    " and send the characters of its printed representation to a "
    (:TERM NIL "stream")
    ". The collection of routines that does this is known as the ("
    (:RM NIL " Common Lisp") ") printer. " :PAR (:COMMENT NIL "% 22.1.0 2")
    "Reading a printed representation "
    (:COMMENT NIL "Added qualifier, since clearly this is just rule of thumb."
     "e.g., Waters complained that this is mostly only true for `simple things'")
    "typically produces an " (:TERM NIL "object") " that is "
    (:FUNREF NIL "equal") " to the originally printed " (:TERM NIL "object")
    ". " :PAR
    (:SUBSUBSECTION (:TITLE ("Multiple Possible Textual Representations"))
     "Most " (:TERM NIL "objects")
     " have more than one possible textual representation. For example, the positive "
     (:TERM NIL "integer")
     " with a magnitude of twenty-seven can be textually expressed in any of these ways: "
     :PAR
     (:CODE NIL " 27    27.    #o33    #x1B    #b11011    #.(* 3 3 3)    81/3
")
     " " :PAR "A list containing the two symbols " (:TT NIL "A") " and "
     (:TT NIL "B") " can also be textually expressed in a variety of ways: "
     :PAR
     (:CODE NIL " (A B)    (a b)    (  a  b )    (\\A |B|) 
(|\\A|
  B
)
")
     " " :PAR "In general, " (:ISSUE NIL "PRINTER-WHITESPACE:JUST-ONE-SPACE")
     " "
     (:COMMENT NIL
      "% Added extra constraint about reader to make it clear that we aren't "
      "% trying to override other printer behavior specified elsewhere."
      "% -kmp 22-Aug-93")
     "from the point of view of the " (:TERM NIL "Lisp reader") ", "
     (:ENDISSUE NIL "PRINTER-WHITESPACE:JUST-ONE-SPACE") " wherever "
     (:TERM NIL "whitespace")
     " is permissible in a textual representation, any number of "
     (:TERM NIL "spaces") " and " (:TERM NIL "newlines") " can appear in "
     (:TERM NIL "standard syntax") ". " :PAR (:COMMENT NIL "% 22.1.0 4")
     "When a function such as " (:FUNREF NIL "print")
     " produces a printed representation, it must choose "
     (:COMMENT NIL "% It's not totally arbitrary! -kmp 22-Aug-93"
      "arbitrarily")
     "from among many possible textual representations. In most cases, it chooses a "
     (:COMMENT NIL
      "Waters thought this meant human-readable, so I added the qualifier \"program\","
      "and then some exposition which follows here. -kmp 11-Feb-91")
     "program readable representation, but in certain cases it might use a more compact notation that is not program-readable. "
     :PAR "A number of option variables, called "
     (:NEWTERM (:IDX "printer control variable") "printer control variables")
     ", are provided to permit control of individual aspects of the printed representation of "
     (:TERM NIL "objects") ". " (:NEXTFIGURE (:CAPS T)) " shows the "
     (:TERM NIL "standardized") " " (:TERM NIL "printer control variables")
     "; there might also be " (:TERM NIL "implementation-defined") " "
     (:TERM NIL "printer control variables") ". " :PAR " "
     (:TABLE
      (:NAME ("Standardized Printer Control Variables") :TAGS
       (:STD-PRINTER-CONTROL-VARS))
      (:ROW NIL (:CELL NIL (:VARREF NIL " *print-array*"))
       (:CELL NIL (:VARREF NIL "*print-gensym*"))
       (:CELL NIL (:VARREF NIL "*print-pprint-dispatch*")))
      (:ROW NIL (:CELL NIL (:VARREF NIL " *print-base*"))
       (:CELL NIL (:VARREF NIL "*print-length*"))
       (:CELL NIL (:VARREF NIL "*print-pretty*")))
      (:ROW NIL (:CELL NIL (:VARREF NIL " *print-case*"))
       (:CELL NIL (:VARREF NIL "*print-level*"))
       (:CELL NIL (:VARREF NIL "*print-radix*")))
      (:ROW NIL (:CELL NIL (:VARREF NIL " *print-circle*"))
       (:CELL NIL (:VARREF NIL "*print-lines*"))
       (:CELL NIL (:VARREF NIL "*print-readably*")))
      (:ROW NIL (:CELL NIL (:VARREF NIL " *print-escape*"))
       (:CELL NIL (:VARREF NIL "*print-miser-width*"))
       (:CELL NIL (:VARREF NIL "*print-right-margin*"))))
     " " :PAR "In addition to the " (:TERM NIL "printer control variables")
     ", the following additional " (:TERM NIL "defined names")
     " relate to or affect the behavior of the " (:TERM NIL "Lisp printer")
     ": " :PAR
     (:TABLE (:NAME ("Additional Influences on the Lisp printer."))
      (:ROW NIL (:CELL NIL (:MISC NIL " *package*"))
       (:CELL NIL (:MISC NIL "*read-eval*"))
       (:CELL NIL (:MISC NIL "readtable-case")))
      (:ROW NIL (:CELL NIL (:MISC NIL " *read-default-float-format*"))
       (:CELL NIL (:MISC NIL "*readtable*")) (:CELL NIL)))
     " " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Printer Escaping")) "The "
      (:TERM NIL "variable") " " (:VARREF NIL "*print-escape*")
      " controls whether the " (:TERM NIL "Lisp printer")
      " tries to produce notations such as escape characters and package prefixes. "
      :PAR "The " (:TERM NIL "variable") " " (:VARREF NIL "*print-readably*")
      " can be used to override many of the individual aspects controlled by the other "
      (:TERM NIL "printer control variables")
      " when program-readable output is especially important. " :PAR
      (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY")
      " One of the many effects of making the " (:TERM NIL "value") " of "
      (:VARREF NIL "*print-readably*") " be " (:TERM NIL "true")
      " is that the " (:TERM NIL "Lisp printer") " behaves as if "
      (:VARREF NIL "*print-escape*") " were also " (:TERM NIL "true")
      ". For notational convenience, we say that if the value of either "
      (:VARREF NIL "*print-readably*") " or " (:VARREF NIL "*print-escape*")
      " is " (:TERM NIL "true") ", then " (:NEWTERM NIL "printer escaping")
      " is “enabled”; and we say that if the values of both "
      (:VARREF NIL "*print-readably*") " and " (:VARREF NIL "*print-escape*")
      " are " (:TERM NIL "false") ", then " (:TERM NIL "printer escaping")
      " is “disabled”. " (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " "
      :PAR)
     :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Printer Dispatching") :TAGS (:PRINTER-DISPATCH)) " "
    :PAR (:ISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
    (:COMMENT NIL
     " The \\term{Lisp printer} makes its determination of how to print an"
     " \\term{object} as follows:" " "
     " If \\thevalueof{*print-pretty*} is \\term{true}:" " " " \\beginlist "
     "   \\item{} Printing is controlled by the \\term{pprint dispatch table}"
     "           contained in the variable \\varref{*print-pprint-dispatch*};"
     "           \\seesection\\PPrintDispatchTables." " \\endlist" " "
     " Otherwise (if \\thevalueof{*print-pretty*} is \\term{false}):" " "
     " \\beginlist"
     " \\item{} If the \\term{object} is a \\term{structure} for which a"
     "         \\kwd{print-function} option is in effect (either directly or by inheritance),"
     "         that function is used; \\seefun{defstruct}." " "
     " \\item{} Otherwise (if the \\term{object} is not a \\term{structure} or"
     " 	if it is a \\term{structure} but has no \\kwd{print-function} option in effect),"
     " 	its \\funref{print-object} method is used; \\seesection\\DefaultPrintObjMeths."
     " \\endlist")
    :PAR "The " (:TERM NIL "Lisp printer")
    " makes its determination of how to print an " (:TERM NIL "object")
    " as follows: " :PAR "If the " (:TERM NIL "value") " of "
    (:VARREF NIL "*print-pretty*") " is " (:TERM NIL "true")
    ", printing is controlled by the "
    (:TERM NIL "current pprint dispatch table") "; "
    (:COMMENT NIL
     "contained in the variable \\varref{*print-pprint-dispatch*};")
    "see " (:SECREF NIL :PPRINT-DISPATCH-TABLES) ". " :PAR "Otherwise (if the "
    (:TERM NIL "value") " of " (:VARREF NIL "*print-pretty*") " is "
    (:TERM NIL "false") "), the object's " (:FUNREF NIL "print-object")
    " method is used; see " (:SECREF NIL :DEFAULT-PRINT-OBJ-METHS) ". "
    (:ENDISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " " :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Default Print-Object Methods") :TAGS (:DEFAULT-PRINT-OBJ-METHS))
    " " :PAR
    (:COMMENT NIL "% 22.1.6 3"
     " How an expression is printed depends on its \\term{type},"
     " as described in the following sections.")
    "This section describes the default behavior of "
    (:FUNREF NIL "print-object") " methods for the " (:TERM NIL "standardized")
    " " (:TERM NIL "types") ". " :PAR
    (:SUBSUBSECTION (:TITLE ("Printing Numbers"))
     (:SUBSUBSUBSECTION
      (:TITLE ("Printing Integers") :TAGS (:PRINTING-INTEGERS)) " "
      (:COMMENT NIL "% 22.1.6 4") :PAR (:TERM NIL "Integers")
      " are printed in the radix specified by the "
      (:TERM NIL "current output base")
      " in positional notation, most significant digit first. If appropriate, a radix specifier can be printed; see "
      (:VARREF NIL "*print-radix*") ". If an " (:TERM NIL "integer")
      " is negative, a minus sign is printed and then the absolute value of the "
      (:TERM NIL "integer") " is printed. The " (:TERM NIL "integer")
      " zero is represented by the single digit " (:TT NIL "0")
      " and never has a sign. A decimal point might be printed, depending on the "
      (:TERM NIL "value") " of " (:VARREF NIL "*print-radix*") ". " :PAR
      "For related information about the syntax of an " (:TERM NIL "integer")
      ", see " (:SECREF NIL :SYNTAX-OF-INTEGERS) ". " :PAR)
     (:SUBSUBSUBSECTION (:TITLE ("Printing Ratios") :TAGS (:PRINTING-RATIOS))
      (:IDXREF NIL "ratio") " " (:COMMENT NIL "% 22.1.6 5") :PAR
      (:TERM NIL "Ratios")
      " are printed as follows: the absolute value of the numerator is printed, as for an "
      (:TERM NIL "integer") "; then a " (:TT NIL "/")
      "; then the denominator. The numerator and denominator are both printed in the radix specified by the "
      (:TERM NIL "current output base") "; they are obtained as if by "
      (:FUNREF NIL "numerator") " and " (:FUNREF NIL "denominator") ", and so "
      (:TERM NIL "ratios")
      " are printed in reduced form (lowest terms). If appropriate, a radix specifier can be printed; see "
      (:VARREF NIL "*print-radix*")
      ". If the ratio is negative, a minus sign is printed before the numerator. "
      :PAR "For related information about the syntax of a " (:TERM NIL "ratio")
      ", see " (:SECREF NIL :SYNTAX-OF-RATIOS) ". " :PAR)
     (:SUBSUBSUBSECTION (:TITLE ("Printing Floats") :TAGS (:PRINTING-FLOATS))
      (:IDXREF NIL "float") " " (:COMMENT NIL "% 22.1.6 6") :PAR
      "If the magnitude of the " (:TERM NIL "float")
      " is either zero or between "
      (:MATH NIL
       (:MSUP NIL (:MN NIL "10") (:MROW NIL (:MO NIL "-") (:MN NIL "3"))))
      " (inclusive) and " (:MATH NIL (:MSUP NIL (:MN NIL "10") (:MN NIL "7")))
      " (exclusive), it is printed as the integer part of the number, then a decimal point, followed by the fractional part of the number; there is always at least one digit on each side of the decimal point. If the sign of the number (as determined by "
      (:FUNREF NIL "float-sign")
      ") is negative, then a minus sign is printed before the number. If the format of the number does not match that specified by "
      (:VARREF NIL "*read-default-float-format*") ", then the "
      (:TERM NIL "exponent marker") " for that format and the digit "
      (:TT NIL "0")
      " are also printed. For example, the base of the natural logarithms as a "
      (:TERM NIL "short float") " might be printed as " (:TT NIL "2.71828S0")
      ". " :PAR (:COMMENT NIL "% 22.1.6 7")
      "For non-zero magnitudes outside of the range "
      (:MATH NIL
       (:MSUP NIL (:MN NIL "10") (:MROW NIL (:MO NIL "-") (:MN NIL "3"))))
      " to " (:MATH NIL (:MSUP NIL (:MN NIL "10") (:MN NIL "7"))) ", a "
      (:TERM NIL "float")
      " is printed in computerized scientific notation. The representation of the number is scaled to be between 1 (inclusive) and 10 (exclusive) and then printed, with one digit before the decimal point and at least one digit after the decimal point. Next the "
      (:TERM NIL "exponent marker")
      " for the format is printed, except that if the format of the number matches that specified by "
      (:VARREF NIL "*read-default-float-format*") ", then the "
      (:TERM NIL "exponent marker") " " (:TT NIL "E")
      " is used. Finally, the power of ten by which the fraction must be multiplied to equal the original number is printed as a decimal integer. For example, Avogadro's number as a "
      (:TERM NIL "short float") " is printed as " (:TT NIL "6.02S23") ". " :PAR
      "For related information about the syntax of a " (:TERM NIL "float")
      ", see " (:SECREF NIL :SYNTAX-OF-FLOATS) ". " :PAR)
     (:SUBSUBSUBSECTION
      (:TITLE ("Printing Complexes") :TAGS (:PRINTING-COMPLEXES))
      (:IDXREF NIL "complex") " " (:COMMENT NIL "% 22.1.6 8") :PAR "A "
      (:TERM NIL "complex") " is printed as " (:TT NIL "#C")
      ", an open parenthesis, the printed representation of its real part, a space, the printed representation of its imaginary part, and finally a close parenthesis. "
      :PAR "For related information about the syntax of a "
      (:TERM NIL "complex") ", see " (:SECREF NIL :SYNTAX-OF-COMPLEXES) " and "
      (:SECREF NIL :SHARPSIGN-C) ". " :PAR)
     (:SUBSUBSUBSECTION (:TITLE ("Note about Printing Numbers"))
      "The printed representation of a number must not contain "
      (:TERM NIL "escape") " " (:TERM NIL "characters") "; see "
      (:SECREF NIL :ESC-CHARS-AND-POTENTIAL-NUMS) ". " :PAR))
    (:SUBSUBSECTION
     (:TITLE ("Printing Characters") :TAGS (:PRINTING-CHARACTERS)) " "
     (:COMMENT NIL "% 22.1.6 9") :PAR
     (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " "
     (:COMMENT NIL "When \\varref{*print-escape*} is \\term{false},") "When "
     (:TERM NIL "printer escaping") " is disabled, "
     (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " a "
     (:TERM NIL "character")
     " prints as itself; it is sent directly to the output "
     (:TERM NIL "stream") ". " (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY")
     " " (:COMMENT NIL "When \\varref{*print-escape*} is \\term{true},")
     "When " (:TERM NIL "printer escaping") " is enabled, "
     (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " then " (:TT NIL "#\\")
     " syntax is used. " :PAR
     (:COMMENT NIL "% 22.1.4 16"
      "% Some wording clarifications here per Loosemore #16 (first public review). -kmp 15-May-93")
     "When the printer types out the name of a " (:TERM NIL "character")
     ", it uses the same table as the " (:TT NIL "#\\") " "
     (:TERM NIL "reader macro") " would use; therefore any "
     (:TERM NIL "character")
     " name that is typed out is acceptable as input (in that "
     (:TERM NIL "implementation") "). If a " (:TERM NIL "non-graphic") " "
     (:TERM NIL "character") " has a " (:TERM NIL "standardized") " "
     (:TERM NIL "name") (:SUB NIL "5") ", that " (:TERM NIL "name")
     " is preferred over non-standard " (:TERM NIL "names") " for printing in "
     (:TT NIL "#\\") " notation. For the " (:TERM NIL "graphic") " "
     (:TERM NIL "standard characters") ", the " (:TERM NIL "character")
     " itself is always used for printing in " (:TT NIL "#\\")
     " notation—even if the " (:TERM NIL "character") " also has a "
     (:TERM NIL "name") (:SUB NIL "5") ". " :PAR "For details about the "
     (:TT NIL "#\\") " " (:TERM NIL "reader macro") ", see "
     (:SECREF NIL :SHARPSIGN-BACKSLASH) ". " :PAR)
    (:SUBSUBSECTION (:TITLE ("Printing Symbols") :TAGS (:PRINTING-SYMBOLS)) " "
     (:COMMENT NIL "% 22.1.6 10 ") :PAR
     (:COMMENT NIL
      "!!! Is this affected by READ-CASE-SENSITIVITY? -kmp 14-May-91")
     (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " "
     (:COMMENT NIL "When \\varref{*print-escape*} is \\term{false},") "When "
     (:TERM NIL "printer escaping") " is disabled, "
     (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY")
     " only the characters of the " (:TERM NIL "symbol") "'s "
     (:TERM NIL "name") " are output " (:COMMENT NIL " 22.1.6 17")
     (:ISSUE NIL "PRINT-CASE-BEHAVIOR:CLARIFY") " "
     (:COMMENT NIL
      "(but the case in which to print any uppercase characters in the \\term{name} is "
      "controlled by \\thevariable{*print-case*}).")
     "(but the case in which to print characters in the " (:TERM NIL "name")
     " is controlled by " (:VARREF NIL "*print-case*") "; see "
     (:SECREF NIL :READTABLE-CASE-PRINT-EFFECT) "). "
     (:ENDISSUE NIL "PRINT-CASE-BEHAVIOR:CLARIFY") " " :PAR
     (:COMMENT NIL "% 22.1.6 11") "The remainder of this section applies only "
     (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " "
     (:COMMENT NIL "when \\varref{*print-escape*} is \\term{true}.") "when "
     (:TERM NIL "printer escaping") " is enabled. "
     (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " " :PAR
     (:COMMENT NIL "% 22.1.6 12")
     (:ISSUE NIL "SYMBOL-PRINT-ESCAPE-BEHAVIOR:CLARIFY") " "
     (:COMMENT NIL
      " \\term{Backslashes} and \\term{vertical-bars} are included as required.  "
      " The \\term{current output base} at the time of printing might be relevant."
      " For example, if \\thevalueof{*print-base*} were \\f{16} "
      " when printing the symbol \\f{face}, it would have to be printed as"
      " \\f{\\\\FACE} or \\f{\\\\Face} or \\f{|FACE|}, "
      " because the token \\f{face} would be read as a hexadecimal"
      " number (decimal value 64206) if \\thevalueof{*read-base*} were \\f{16}.")
     "When printing a " (:TERM NIL "symbol") ", the printer inserts enough "
     (:TERM NIL "single escape") " and/or " (:TERM NIL "multiple escape")
     " characters (" (:TERM NIL "backslashes") " and/or "
     (:TERM NIL "vertical-bars") ") so that if " (:FUNREF NIL "read")
     " were called with the same " (:VARREF NIL "*readtable*") " and with "
     (:VARREF NIL "*read-base*") " bound to the "
     (:TERM NIL "current output base") ", it would return the same "
     (:TERM NIL "symbol") " (if it is not " (:TERM NIL "apparently uninterned")
     ") or an " (:TERM NIL "uninterned") " " (:TERM NIL "symbol")
     " with the same " (:TERM NIL "print name") " (otherwise). " :PAR
     "For example, if the " (:TERM NIL "value") " of "
     (:VARREF NIL "*print-base*") " were " (:TT NIL "16")
     " when printing the symbol " (:TT NIL "face")
     ", it would have to be printed as " (:TT NIL "\\FACE") " or "
     (:TT NIL "\\Face") " or " (:TT NIL "|FACE|") ", because the token "
     (:TT NIL "face")
     " would be read as a hexadecimal number (decimal value 64206) if the "
     (:TERM NIL "value") " of " (:VARREF NIL "*read-base*") " were "
     (:TT NIL "16") ". " :PAR
     "For additional restrictions concerning characters with nonstandard "
     (:TERM NIL "syntax types") " in the " (:TERM NIL "current readtable")
     ", see the " (:TERM NIL "variable") " " (:VARREF NIL "*print-readably*")
     " " (:ENDISSUE NIL "SYMBOL-PRINT-ESCAPE-BEHAVIOR:CLARIFY") " " :PAR
     "For information about how the " (:TERM NIL "Lisp reader") " parses "
     (:TERM NIL "symbols") ", see " (:SECREF NIL :SYMBOL-TOKENS) " and "
     (:SECREF NIL :SHARPSIGN-COLON) ". " :PAR
     (:COMMENT NIL
      "!!! Somewhat redundant with what's above--also, is this also affected"
      "    by READ-CASE-SENSITIVITY? -kmp 14-May-91" "% 22.1.6 13"
      " already said above.  --sjl 16 Mar 92"
      "The case in which to print any uppercase characters in the \\term{symbol}'s \\term{name} is "
      "controlled by \\varref{*print-case*}.")
     (:MISC NIL "nil") " might be printed as " (:TT NIL "()") " "
     (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " "
     (:COMMENT NIL
      "when \\varref{*print-escape*} and \\varref{*print-pretty*} are both \\term{true}.")
     "when " (:VARREF NIL "*print-pretty*") " is " (:TERM NIL "true") " and "
     (:TERM NIL "printer escaping") " is enabled. "
     (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " " :PAR
     (:SUBSUBSUBSECTION (:TITLE ("Package Prefixes for Symbols"))
      (:TERM NIL "Package prefixes")
      " are printed if necessary. The rules for "
      (:TERM NIL "package prefixes") " are as follows. When the "
      (:TERM NIL "symbol") " is printed, if it is in the "
      (:PACKREF NIL "keyword") " " (:TERM NIL "package") ", "
      (:COMMENT NIL
       " should this be ``colon'' or ``package marker''?  --sjl 16 Mar 92")
      "then it is printed with a preceding " (:TERM NIL "colon")
      "; otherwise, if it is " (:TERM NIL "accessible") " in the "
      (:TERM NIL "current package") ", it is printed without any "
      (:TERM NIL "package prefix") "; otherwise, it is printed with a "
      (:TERM NIL "package prefix") ". " :PAR (:COMMENT NIL "% 22.1.6 15") "A "
      (:TERM NIL "symbol") " that is " (:TERM NIL "apparently uninterned")
      " is printed preceded by “" (:TT NIL "#:") "” "
      (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " "
      (:COMMENT NIL
       " if \\varref{*print-gensym*} and \\varref{*print-escape*} are both \\term{non-nil};"
       " if either is \\nil,")
      "if " (:VARREF NIL "*print-gensym*") " is " (:TERM NIL "true") " and "
      (:TERM NIL "printer escaping") " is enabled; if "
      (:VARREF NIL "*print-gensym*") " is " (:TERM NIL "false") " or "
      (:TERM NIL "printer escaping") " is disabled, "
      (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " then the "
      (:TERM NIL "symbol")
      " is printed without a prefix, as if it were in the "
      (:TERM NIL "current package") ". " :PAR (:COMMENT NIL "% 22.1.6 16")
      "Because the " (:TT NIL "#:")
      " syntax does not intern the following symbol, it is necessary to use circular-list syntax if "
      (:VARREF NIL "*print-circle*") " is " (:TERM NIL "true")
      " and the same uninterned symbol appears several times in an expression to be printed. For example, the result of "
      :PAR
      (:CODE NIL " (let ((x (make-symbol \"FOO\"))) (list x x))
")
      " would be printed as " (:TT NIL "(#:foo #:foo)") " if "
      (:VARREF NIL "*print-circle*") " were " (:TERM NIL "false") ", but as "
      (:TT NIL "(#1=#:foo #1#)") " if " (:VARREF NIL "*print-circle*") " were "
      (:TERM NIL "true") ". " :PAR
      "A summary of the preceding package prefix rules follows: " :PAR
      (:LIST NIL
       (:ITEM NIL (:TT NIL "foo:bar") " " :PAR (:TT NIL "foo:bar")
        " is printed when " (:TERM NIL "symbol") " " (:TT NIL "bar")
        " is external in its " (:TERM NIL "home package") " " (:TT NIL "foo")
        " and is not " (:TERM NIL "accessible") " in the "
        (:TERM NIL "current package") ". " :PAR)
       (:ITEM NIL (:TT NIL "foo::bar") " " :PAR (:TT NIL "foo::bar")
        " is printed when " (:TT NIL "bar") " is internal in its "
        (:TERM NIL "home package") " " (:TT NIL "foo") " and is not "
        (:TERM NIL "accessible") " in the " (:TERM NIL "current package") ". "
        :PAR)
       (:ITEM NIL (:TT NIL ":bar") " " :PAR (:TT NIL ":bar")
        " is printed when the home package of " (:TT NIL "bar") " is the "
        (:PACKREF NIL "keyword") " " (:TERM NIL "package") ". " :PAR)
       (:ITEM NIL (:TT NIL " #:bar") " " :PAR (:TT NIL "#:bar")
        " is printed when " (:TT NIL "bar") " is "
        (:TERM NIL "apparently uninterned")
        ", even in the pathological case that " (:TT NIL "bar") " has no "
        (:TERM NIL "home package") " but is nevertheless somehow "
        (:TERM NIL "accessible") " in the " (:TERM NIL "current package")
        ". "))
      " " :PAR
      (:COMMENT NIL " Waters points out that this was already said above."
       " %% 22.1.6 17"
       " The case in which symbols are printed is controlled by "
       " \\varref{*print-case*}.")
      :PAR)
     :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Effect of Readtable Case on the Lisp Printer") :TAGS
       (:READTABLE-CASE-PRINT-EFFECT))
      " " :PAR (:ISSUE NIL "PRINT-CASE-BEHAVIOR:CLARIFY") " "
      (:COMMENT NIL " When \\term{escape} syntax is not being used,") "When "
      (:COMMENT NIL
       "both \\varref{*print-escape*} and \\varref{*print-readably*} are \\term{false},")
      (:TERM NIL "printer escaping")
      " is disabled, or the characters under consideration are not already quoted specifically by "
      (:TERM NIL "single escape") " or " (:TERM NIL "multiple escape")
      " syntax, " (:ENDISSUE NIL "PRINT-CASE-BEHAVIOR:CLARIFY") " the "
      (:TERM NIL "readtable case") " of the " (:TERM NIL "current readtable")
      " affects the way the " (:TERM NIL "Lisp printer") " writes "
      (:TERM NIL "symbols") " in the following ways: " :PAR
      (:LIST NIL
       (:ITEM NIL (:KWD NIL "upcase") " " :PAR "When the "
        (:TERM NIL "readtable case") " is " (:KWD NIL "upcase") ", "
        (:TERM NIL "uppercase") " " (:TERM NIL "characters")
        " are printed in the case specified by " (:VARREF NIL "*print-case*")
        ", and " (:TERM NIL "lowercase") " " (:TERM NIL "characters")
        " are printed in their own case. " :PAR)
       (:ITEM NIL (:KWD NIL "downcase") " " :PAR "When the "
        (:TERM NIL "readtable case") " is " (:KWD NIL "downcase") ", "
        (:TERM NIL "uppercase") " " (:TERM NIL "characters")
        " are printed in their own case, and " (:TERM NIL "lowercase") " "
        (:TERM NIL "characters") " are printed in the case specified by "
        (:VARREF NIL "*print-case*") ". " :PAR)
       (:ITEM NIL (:KWD NIL "preserve") " " :PAR "When the "
        (:TERM NIL "readtable case") " is " (:KWD NIL "preserve") ", all "
        (:TERM NIL "alphabetic") " " (:TERM NIL "characters")
        " are printed in their own case. " :PAR)
       (:ITEM NIL (:KWD NIL "invert") " " :PAR "When the "
        (:TERM NIL "readtable case") " is " (:KWD NIL "invert")
        ", the case of all " (:TERM NIL "alphabetic") " "
        (:TERM NIL "characters")
        " in single case symbol names is inverted. Mixed-case symbol names are printed as is. "))
      " " :PAR "The rules for escaping " (:TERM NIL "alphabetic") " "
      (:TERM NIL "characters") " in symbol names are affected by the "
      (:FUNREF NIL "readtable-case") " "
      (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " "
      (:COMMENT NIL "if \\varref{*print-escape*} is \\term{true}.") "if "
      (:TERM NIL "printer escaping") " is enabled. "
      (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " "
      (:TERM NIL "Alphabetic") " " (:TERM NIL "characters")
      " are escaped as follows: "
      (:LIST NIL
       (:ITEM NIL (:KWD NIL "upcase") " " :PAR "When the "
        (:TERM NIL "readtable case") " is " (:KWD NIL "upcase") ", all "
        (:TERM NIL "lowercase") " " (:TERM NIL "characters")
        " must be escaped. " :PAR)
       (:ITEM NIL (:KWD NIL "downcase") " " :PAR "When the "
        (:TERM NIL "readtable case") " is " (:KWD NIL "downcase") ", all "
        (:TERM NIL "uppercase") " " (:TERM NIL "characters")
        " must be escaped. " :PAR)
       (:ITEM NIL (:KWD NIL "preserve") " " :PAR "When the "
        (:TERM NIL "readtable case") " is " (:KWD NIL "preserve") ", no "
        (:TERM NIL "alphabetic") " " (:TERM NIL "characters")
        " need be escaped. " :PAR)
       (:ITEM NIL (:KWD NIL "invert") " " :PAR "When the "
        (:TERM NIL "readtable case") " is " (:KWD NIL "invert") ", no "
        (:TERM NIL "alphabetic") " " (:TERM NIL "characters")
        " need be escaped. " :PAR))
      " " :PAR
      (:SUBSUBSUBSUBSECTION
       (:TITLE ("Examples of Effect of Readtable Case on the Lisp Printer")
        :TAGS (:READTABLE-CASE-PRINT-EXAMPLES))
       " " :PAR
       (:CODE NIL " (defun test-readtable-case-printing ()
   (let ((*readtable* (copy-readtable nil))
         (*print-case* *print-case*))
     (format t \"READTABLE-CASE *PRINT-CASE*  Symbol-name  Output~
              ~%--------------------------------------------------~
              ~%\")
     (dolist (readtable-case '(:upcase :downcase :preserve :invert))
       (setf (readtable-case *readtable*) readtable-case)
       (dolist (print-case '(:upcase :downcase :capitalize))
         (dolist (symbol '(|ZEBRA| |Zebra| |zebra|))
           (setq *print-case* print-case)
           (format t \"~&:~A~15T:~A~29T~A~42T~A\"
                   (string-upcase readtable-case)
                   (string-upcase print-case)
                   (symbol-name symbol)
                   (prin1-to-string symbol)))))))
")
       " The output from " (:TT NIL "(test-readtable-case-printing)")
       " should be as follows: " :PAR
       (:CODE NIL "    READTABLE-CASE *PRINT-CASE*  Symbol-name  Output
    --------------------------------------------------
    :UPCASE        :UPCASE       ZEBRA        ZEBRA
    :UPCASE        :UPCASE       Zebra        |Zebra|
    :UPCASE        :UPCASE       zebra        |zebra|
    :UPCASE        :DOWNCASE     ZEBRA        zebra
    :UPCASE        :DOWNCASE     Zebra        |Zebra|
    :UPCASE        :DOWNCASE     zebra        |zebra|
    :UPCASE        :CAPITALIZE   ZEBRA        Zebra
    :UPCASE        :CAPITALIZE   Zebra        |Zebra|
    :UPCASE        :CAPITALIZE   zebra        |zebra|
    :DOWNCASE      :UPCASE       ZEBRA        |ZEBRA|
    :DOWNCASE      :UPCASE       Zebra        |Zebra|
    :DOWNCASE      :UPCASE       zebra        ZEBRA
    :DOWNCASE      :DOWNCASE     ZEBRA        |ZEBRA|
    :DOWNCASE      :DOWNCASE     Zebra        |Zebra|
    :DOWNCASE      :DOWNCASE     zebra        zebra
    :DOWNCASE      :CAPITALIZE   ZEBRA        |ZEBRA|
    :DOWNCASE      :CAPITALIZE   Zebra        |Zebra|
    :DOWNCASE      :CAPITALIZE   zebra        Zebra
    :PRESERVE      :UPCASE       ZEBRA        ZEBRA
    :PRESERVE      :UPCASE       Zebra        Zebra
    :PRESERVE      :UPCASE       zebra        zebra
    :PRESERVE      :DOWNCASE     ZEBRA        ZEBRA
    :PRESERVE      :DOWNCASE     Zebra        Zebra
    :PRESERVE      :DOWNCASE     zebra        zebra
    :PRESERVE      :CAPITALIZE   ZEBRA        ZEBRA
    :PRESERVE      :CAPITALIZE   Zebra        Zebra
    :PRESERVE      :CAPITALIZE   zebra        zebra
    :INVERT        :UPCASE       ZEBRA        zebra
    :INVERT        :UPCASE       Zebra        Zebra
    :INVERT        :UPCASE       zebra        ZEBRA
    :INVERT        :DOWNCASE     ZEBRA        zebra
    :INVERT        :DOWNCASE     Zebra        Zebra
    :INVERT        :DOWNCASE     zebra        ZEBRA
    :INVERT        :CAPITALIZE   ZEBRA        zebra
    :INVERT        :CAPITALIZE   Zebra        Zebra
    :INVERT        :CAPITALIZE   zebra        ZEBRA
")
       " " :PAR)
      :PAR)
     :PAR)
    (:SUBSUBSECTION (:TITLE ("Printing Strings") :TAGS (:PRINTING-STRINGS)) " "
     (:COMMENT NIL "% 22.1.6 18") :PAR "The characters of the "
     (:TERM NIL "string") " are output in order. "
     (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " "
     (:COMMENT NIL "If \\varref{*print-escape*} is \\term{true},") "If "
     (:TERM NIL "printer escaping") " is enabled, "
     (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " a "
     (:TERM NIL "double-quote") " is output before and after, and all "
     (:TERM NIL "double-quotes") " and " (:TERM NIL "single escapes")
     " are preceded by " (:TERM NIL "backslash") ". The printing of "
     (:TERM NIL "strings") " is not affected by " (:VARREF NIL "*print-array*")
     ". Only the " (:TERM NIL "active") " " (:TERM NIL "elements") " of the "
     (:TERM NIL "string") " are printed. " :PAR "For information on how the "
     (:TERM NIL "Lisp reader") " parses " (:TERM NIL "strings") ", see "
     (:SECREF NIL :DOUBLEQUOTE) ". " :PAR)
    (:SUBSUBSECTION
     (:TITLE ("Printing Lists and Conses") :TAGS (:PRINTING-LISTS-AND-CONSES))
     " " (:COMMENT NIL "% 22.1.6 19") :PAR
     "Wherever possible, list notation is preferred over dot notation. Therefore the following algorithm is used to print a "
     (:TERM NIL "cons") " " (:MATH NIL (:MI NIL "x")) ": " :PAR " "
     (:LIST NIL
      (:ITEM NIL "1. A " (:TERM NIL "left-parenthesis") " is printed. " :PAR
       " ")
      (:ITEM NIL "2. The " (:TERM NIL "car") " of " (:MATH NIL (:MI NIL "x"))
       " is printed. " :PAR " ")
      (:ITEM NIL "3. If the " (:TERM NIL "cdr") " of "
       (:MATH NIL (:MI NIL "x")) " is itself a " (:TERM NIL "cons")
       ", it is made to be the current " (:TERM NIL "cons") " ("
       (:I NIL "i.e.") ",  " (:MATH NIL (:MI NIL "x")) " becomes that "
       (:TERM NIL "cons") "), " (:ISSUE NIL "PRINT-WHITESPACE:JUST-ONE-SPACE")
       " a " (:TERM NIL "space") " "
       (:COMMENT NIL "         \\term{whitespace}\\meaning{1} ")
       (:ENDISSUE NIL "PRINT-WHITESPACE:JUST-ONE-SPACE")
       " is printed, and step 2 is re-entered. " :PAR " ")
      (:ITEM NIL "4. If the " (:TERM NIL "cdr") " of "
       (:MATH NIL (:MI NIL "x")) " is not " (:TERM NIL "null") ", "
       (:ISSUE NIL "PRINT-WHITESPACE:JUST-ONE-SPACE") " a " (:TERM NIL "space")
       ", " (:COMMENT NIL "         \\term{whitespace}\\meaning{1},")
       (:ENDISSUE NIL "PRINT-WHITESPACE:JUST-ONE-SPACE") " a "
       (:TERM NIL "dot") ", " (:ISSUE NIL "PRINT-WHITESPACE:JUST-ONE-SPACE")
       " a " (:TERM NIL "space") ", "
       (:COMMENT NIL "         \\term{whitespace}\\meaning{1},")
       (:ENDISSUE NIL "PRINT-WHITESPACE:JUST-ONE-SPACE") " and the "
       (:TERM NIL "cdr") " of " (:MATH NIL (:MI NIL "x")) " are printed. " :PAR
       " ")
      (:ITEM NIL "5. A " (:TERM NIL "right-parenthesis") " is printed. "))
     " " :PAR (:ISSUE NIL "PRINT-WHITESPACE:JUST-ONE-SPACE")
     " Actually, the above algorithm is only used when "
     (:VARREF NIL "*print-pretty*") " is " (:TERM NIL "false") ". When "
     (:VARREF NIL "*print-pretty*") " is " (:TERM NIL "true") " (or when "
     (:FUNREF NIL "pprint") " is used), additional " (:TERM NIL "whitespace")
     (:SUB NIL "1") " may replace the use of a single " (:TERM NIL "space")
     ", and a more elaborate algorithm with similar goals but more presentational flexibility is used; see "
     (:SECREF NIL :PRINTER-DISPATCH) ". "
     (:ENDISSUE NIL "PRINT-WHITESPACE:JUST-ONE-SPACE") " " :PAR
     (:COMMENT NIL "% 2.4.0 6" "% 22.1.6 20")
     "Although the two expressions below are equivalent, and the reader accepts either one and "
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93" "produce")
     "produces the same " (:TERM NIL "cons")
     ", the printer always prints such a " (:TERM NIL "cons")
     " in the second form. " :PAR
     (:CODE NIL " (a . (b . ((c . (d . nil)) . (e . nil))))
 (a b (c d) e)
")
     " The printing of " (:TERM NIL "conses") " is affected by "
     (:VARREF NIL "*print-level*") ", " (:VARREF NIL "*print-length*") ", and "
     (:VARREF NIL "*print-circle*") ". " :PAR
     " Following are examples of printed representations of "
     (:TERM NIL "lists") ": " :PAR
     (:CODE NIL " (a . b)     ;A dotted pair of a and b
 (a.b)       ;A list of one element, the symbol named a.b
 (a. b)      ;A list of two elements a. and b
 (a .b)      ;A list of two elements a and .b
 (a b . c)   ;A dotted list of a and b with c at the end; two conses
 .iot        ;The symbol whose name is .iot
 (. b)       ;Invalid -- an error is signaled if an attempt is made to read 
             ;this syntax.
 (a .)       ;Invalid -- an error is signaled.
 (a .. b)    ;Invalid -- an error is signaled.
 (a . . b)   ;Invalid -- an error is signaled.
 (a b c ...) ;Invalid -- an error is signaled.
 (a \\. b)    ;A list of three elements a, ., and b
 (a |.| b)   ;A list of three elements a, ., and b
 (a \\... b)  ;A list of three elements a, ..., and b
 (a |...| b) ;A list of three elements a, ..., and b
")
     " " :PAR "For information on how the " (:TERM NIL "Lisp reader")
     " parses " (:TERM NIL "lists") " and " (:TERM NIL "conses") ", see "
     (:SECREF NIL :LEFT-PAREN) ". " :PAR)
    (:SUBSUBSECTION
     (:TITLE ("Printing Bit Vectors") :TAGS (:PRINTING-BIT-VECTORS)) " "
     (:COMMENT NIL "% 22.1.6 21") :PAR "A " (:TERM NIL "bit vector")
     " is printed as " (:TT NIL "#*") " followed by the bits of the "
     (:TERM NIL "bit vector") " in order. If " (:VARREF NIL "*print-array*")
     " is " (:TERM NIL "false") ", then the " (:TERM NIL "bit vector")
     " is printed in a format (using " (:TT NIL "#<")
     ") that is concise but not readable. Only the " (:TERM NIL "active") " "
     (:TERM NIL "elements") " of the " (:TERM NIL "bit vector")
     " are printed. " :PAR
     (:REVIEWER NIL "Barrett: Need to provide for " (:TT NIL "#5*0")
      " as an alternate notation for " (:TT NIL "#*00000") ".")
     (:COMMENT NIL "!!!") :PAR
     (:COMMENT NIL "% Reworded to avoid awkward line break. -kmp 24-Apr-93")
     "For information on " (:TERM NIL "Lisp reader") " parsing of "
     (:TERM NIL "bit vectors") ", see " (:SECREF NIL :SHARPSIGN-STAR) ". "
     :PAR)
    (:SUBSUBSECTION
     (:TITLE ("Printing Other Vectors") :TAGS (:PRINTING-OTHER-VECTORS)) " "
     (:COMMENT NIL "% 22.1.6 22") :PAR
     (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " " (:COMMENT NIL "Any")
     "If " (:VARREF NIL "*print-array*") " is " (:TERM NIL "true") " and "
     (:VARREF NIL "*print-readably*") " is " (:TERM NIL "false") ", any "
     (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " " (:TERM NIL "vector")
     " other than a " (:TERM NIL "string") " or " (:TERM NIL "bit vector")
     " is printed using general-vector syntax; this means that information about specialized vector representations does not appear. The printed representation of a zero-length "
     (:TERM NIL "vector") " is " (:TT NIL "#()")
     ". The printed representation of a non-zero-length " (:TERM NIL "vector")
     " begins with " (:TT NIL "#(")
     ". Following that, the first element of the " (:TERM NIL "vector")
     " is printed. " (:ISSUE NIL "PRINTER-WHITESPACE:JUST-ONE-SPACE")
     " If there are any other elements, they are printed in turn, with each such additional element preceded by a "
     (:TERM NIL "space") " if " (:VARREF NIL "*print-pretty*") " is "
     (:TERM NIL "false") ", or " (:TERM NIL "whitespace") (:SUB NIL "1") " if "
     (:VARREF NIL "*print-pretty*") " is " (:TERM NIL "true") ". "
     (:ENDISSUE NIL "PRINTER-WHITESPACE:JUST-ONE-SPACE") " A "
     (:TERM NIL "right-parenthesis")
     " after the last element terminates the printed representation of the "
     (:TERM NIL "vector") ". The printing of " (:TERM NIL "vectors")
     " is affected by " (:VARREF NIL "*print-level*") " and "
     (:VARREF NIL "*print-length*") ". If the " (:TERM NIL "vector") " has a "
     (:TERM NIL "fill pointer") ", then only those elements below the "
     (:TERM NIL "fill pointer") " are printed. " :PAR
     (:COMMENT NIL "% 22.1.6 23")
     (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " "
     (:COMMENT NIL "If \\varref{*print-array*} is \\term{false}") "If both "
     (:VARREF NIL "*print-array*") " and " (:VARREF NIL "*print-readably*")
     " are " (:TERM NIL "false") ", "
     (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " the "
     (:TERM NIL "vector")
     " is not printed as described above, but in a format (using "
     (:TT NIL "#<") ") that is concise but not readable. " :PAR
     (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " If "
     (:VARREF NIL "*print-readably*") " is " (:TERM NIL "true") ", the "
     (:TERM NIL "vector") " prints in an " (:TERM NIL "implementation-defined")
     " manner; see the " (:TERM NIL "variable") " "
     (:VARREF NIL "*print-readably*") ". "
     (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " " :PAR
     "For information on how the " (:TERM NIL "Lisp reader")
     " parses these “other " (:TERM NIL "vectors") ",” see "
     (:SECREF NIL :SHARPSIGN-LEFT-PAREN) ". " :PAR)
    (:SUBSUBSECTION
     (:TITLE ("Printing Other Arrays") :TAGS (:PRINTING-OTHER-ARRAYS)) " "
     (:COMMENT NIL "% 22.1.6 24 ") :PAR
     (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " " (:COMMENT NIL "Any")
     "If " (:VARREF NIL "*print-array*") " is " (:TERM NIL "true") " and "
     (:VARREF NIL "*print-readably*") " is " (:TERM NIL "false") ", any "
     (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " " (:TERM NIL "array")
     " other than a " (:TERM NIL "vector") " is printed using " (:TT NIL "#")
     (:TT NIL "n") (:TT NIL "A") " format. Let " (:TT NIL "n") " be the "
     (:TERM NIL "rank") " of the " (:TERM NIL "array") ". Then " (:TT NIL "#")
     " is printed, then " (:TT NIL "n") " as a decimal integer, then "
     (:TT NIL "A") ", then " (:TT NIL "n") " open parentheses. Next the "
     (:TERM NIL "elements") " are scanned in row-major order, "
     (:COMMENT NIL " Added for Barmar:") "using " (:FUNREF NIL "write")
     " on each " (:TERM NIL "element") ", and separating "
     (:TERM NIL "elements") " from each other with " (:TERM NIL "whitespace")
     (:SUB NIL "1") ". "
     (:COMMENT NIL
      "% Barrett didn't like the odometer thing (probably for good reason)."
      "% I've rewritten it. -kmp 12-Oct-91")
     "The array's dimensions are numbered 0 to " (:TT NIL "n")
     "-1 from left to right, and are enumerated with the rightmost index changing fastest. "
     (:COMMENT NIL
      "Imagine the \\term{array} indices being enumerated in odometer fashion,"
      "recalling that the dimensions are numbered from 0 to \\f{n}-1.")
     "Every time the index for dimension " (:TT NIL "j")
     " is incremented, the following actions are taken: " :PAR
     (:COMMENT NIL "% 22.1.6 25")
     (:LIST NIL
      (:ITEM NIL " If " (:TT NIL "j") " < " (:TT NIL "n")
       "-1, then a close parenthesis is printed. " :PAR
       (:COMMENT NIL "% 22.1.6 26"))
      (:ITEM NIL " If incrementing the index for dimension " (:TT NIL "j")
       " caused it to equal dimension " (:TT NIL "j")
       ", that index is reset to zero and the index for dimension "
       (:TT NIL "j")
       "-1 is incremented (thereby performing these three steps recursively), unless "
       (:TT NIL "j")
       "=0, in which case the entire algorithm is terminated. If incrementing the index for dimension "
       (:TT NIL "j") " did not cause it to equal dimension " (:TT NIL "j")
       ", then a space is printed. " :PAR (:COMMENT NIL "% 22.1.6 27"))
      (:ITEM NIL " If " (:TT NIL "j") " < " (:TT NIL "n")
       "-1, then an open parenthesis is printed. "))
     " " :PAR
     "This causes the contents to be printed in a format suitable for "
     (:KWD NIL "initial-contents") " to " (:FUNREF NIL "make-array")
     ". The lists effectively printed by this procedure are subject to truncation by "
     (:VARREF NIL "*print-level*") " and " (:VARREF NIL "*print-length*") ". "
     :PAR (:COMMENT NIL "% 22.1.6 28") "If the " (:TERM NIL "array")
     " is of a specialized " (:TERM NIL "type")
     ", containing bits or characters, then the innermost lists generated by the algorithm given above can instead be printed using bit-vector or string syntax, provided that these innermost lists would not be subject to truncation by "
     (:VARREF NIL "*print-length*") ". "
     (:COMMENT NIL "For example," "a 3-by-2-by-4 \\term{array} "
      "of characters that would ordinarily be printed as" "\\code" " #3A("
      " ((#\\\\s #\\\\t #\\\\o #\\\\p) (#\\\\s #\\\\p #\\\\o #\\\\t))"
      " ((#\\\\p #\\\\o #\\\\s #\\\\t) (#\\\\p #\\\\o #\\\\t #\\\\s))"
      " ((#\\\\t #\\\\o #\\\\p #\\\\s) (#\\\\o #\\\\p #\\\\t #\\\\s)))"
      "\\endcode" "may instead be printed more concisely as"
      "                                                                               "
      "\\code"
      " #3A((\"stop\" \"spot\") (\"post\" \"pots\") (\"tops\" \"opts\"))"
      "\\endcode")
     :PAR (:COMMENT NIL "% 22.1.6 29")
     (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " "
     (:COMMENT NIL "If \\varref{*print-array*} is \\term{false},") "If both "
     (:VARREF NIL "*print-array*") " and " (:VARREF NIL "*print-readably*")
     " are " (:TERM NIL "false") ", "
     (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " then the "
     (:TERM NIL "array") " is printed in a format (using " (:TT NIL "#<")
     ") that is concise but not readable. " :PAR
     (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " If "
     (:VARREF NIL "*print-readably*") " is " (:TERM NIL "true") ", the "
     (:TERM NIL "array") " prints in an " (:TERM NIL "implementation-defined")
     " manner; see the " (:TERM NIL "variable") " "
     (:VARREF NIL "*print-readably*") ". "
     (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " "
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93")
     "In particular, this may be important for arrays having some dimension "
     (:TT NIL "0") ". " :PAR "For information on how the "
     (:TERM NIL "Lisp reader") " parses these “other " (:TERM NIL "arrays")
     ",” see " (:SECREF NIL :SHARPSIGN-A) ". " :PAR)
    (:SUBSUBSECTION (:TITLE ("Examples of Printing Arrays"))
     (:CODE NIL " (let ((a (make-array '(3 3)))
       (*print-pretty* t)
       (*print-array* t))
   (dotimes (i 3) (dotimes (j 3) (setf (aref a i j) (format nil \"<~D,~D>\" i j))))
   (print a)
   (print (make-array 9 :displaced-to a)))
⊳ #2A((\"<0,0>\" \"<0,1>\" \"<0,2>\") 
⊳     (\"<1,0>\" \"<1,1>\" \"<1,2>\") 
⊳     (\"<2,0>\" \"<2,1>\" \"<2,2>\")) 
⊳ #(\"<0,0>\" \"<0,1>\" \"<0,2>\" \"<1,0>\" \"<1,1>\" \"<1,2>\" \"<2,0>\" \"<2,1>\" \"<2,2>\") 
→ #<ARRAY 9 indirect 36363476>
")
     " " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Printing Random States") :TAGS (:PRINTING-RANDOM-STATES)) " "
     (:COMMENT NIL "% 12.9.0 18" "% 22.1.6 30 ") :PAR
     "A specific syntax for printing " (:TERM NIL "objects") " of "
     (:TERM NIL "type") " " (:TYPEREF NIL "random-state")
     " is not specified. However, every " (:TERM NIL "implementation")
     " must arrange to print a " (:TERM NIL "random state") " "
     (:TERM NIL "object")
     " in such a way that, within the same implementation, "
     (:FUNREF NIL "read")
     " can construct from the printed representation a copy of the "
     (:TERM NIL "random state") " object as if the copy had been made by "
     (:FUNREF NIL "make-random-state") ". " :PAR "If the type "
     (:TERM NIL "random state")
     " is effectively implemented by using the machinery for "
     (:MACREF NIL "defstruct")
     ", the usual structure syntax can then be used for printing "
     (:TERM NIL "random state") " objects; one might look something like " :PAR
     (:COMMENT NIL
      " Use of non-keyword #S keywords is deprecated.  --sjl 16 Mar 92"
      "\\code"
      " #S(RANDOM-STATE DATA #(14 49 98436589 786345 8734658324 ... ))"
      "\\endcode")
     (:CODE NIL
      " #S(RANDOM-STATE :DATA #(14 49 98436589 786345 8734658324 ... ))
")
     " where the components are " (:TERM NIL "implementation-dependent") ". "
     :PAR)
    (:SUBSUBSECTION (:TITLE ("Printing Pathnames") :TAGS (:PRINTING-PATHNAMES))
     " " (:COMMENT NIL "% 22.1.6 31 ") :PAR
     (:ISSUE NIL "PATHNAME-PRINT-READ:SHARPSIGN-P") " " :PAR
     (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " "
     (:COMMENT NIL "When \\varref{*print-escape*} is \\term{true},") "When "
     (:TERM NIL "printer escaping") " is enabled, "
     (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " the syntax "
     (:TT NIL "#P\"...\"") " is how a " (:TERM NIL "pathname")
     " is printed by " (:FUNREF NIL "write")
     " and the other functions herein described. "
     (:COMMENT NIL
      "!!! Probably \"a\" rather than \"the\" would go better here?? -kmp 11-Feb-91")
     "The " (:TT NIL "\"...\"")
     " is the namestring representation of the pathname. " :PAR
     (:COMMENT NIL "% !!! I'm thinking about adding the following."
      "%     Mail sent to get other opinions. -kmp 11-Feb-92"
      " If a suitable \\term{namestring} representation for the \\term{pathname} cannot be"
      " constructed (\\eg for pathname that is missing components required by "
      " the \\term{file system}), an \\term{implementation} is permitted (but not required)"
      " to use an alternate (\\term{implementation-dependent}) printed representation, "
      " such as \\f{\\#S(PATHNAME ...)}.")
     :PAR (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " "
     (:COMMENT NIL "When \\varref{*print-escape*} is \\term{false},") "When "
     (:TERM NIL "printer escaping") " is disabled, "
     (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " "
     (:FUNREF NIL "write") " writes a " (:TERM NIL "pathname") " " (:I NIL "P")
     " by writing " (:TT NIL "(namestring " (:I NIL "P") ")") " instead. " :PAR
     (:COMMENT NIL " The following will be deleted:" " "
      " A specific syntax for printing \\term{objects} \\oftype{pathname} is not specified."
      " However, every implementation must arrange to print a \\term{pathname} in such a way that,"
      " within the same implementation of \\clisp, "
      " \\funref{read} can construct from the printed representation an equivalent"
      " instance of the \\term{pathname} \\term{object}." " "
      " The printed representation of a pathname"
      " typically designates \\kwd{wild} by an asterisk; however, this is"
      " \\term{implementation-dependent}.    " " " " End of deletion.")
     :PAR "For information on how the " (:TERM NIL "Lisp reader") " parses "
     (:TERM NIL "pathnames") ", see " (:SECREF NIL :SHARPSIGN-P) ". " :PAR
     (:ENDISSUE NIL "PATHNAME-PRINT-READ:SHARPSIGN-P") " " :PAR)
    (:SUBSUBSECTION
     (:TITLE ("Printing Structures") :TAGS (:PRINTING-STRUCTURES)) " " :PAR
     (:ISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
     (:COMMENT NIL "% 19.1.0 10" "% 22.1.6 32"
      " \\term{Structures} defined by \\macref{defstruct} are printed under the"
      " control of the keyword \\kwd{print-function} to \\macref{defstruct}."
      " A default printing \\term{function} is supplied that prints the "
      " \\term{structure} using \\f{\\#S} syntax.")
     "By default, a " (:TERM NIL "structure") " of type "
     (:MATH NIL (:MI NIL "S")) " is printed using " (:TT NIL "#S")
     " syntax. This behavior can be customized by specifying a "
     (:KWD NIL "print-function") " or " (:KWD NIL "print-object")
     " option to the " (:MACREF NIL "defstruct") " " (:TERM NIL "form")
     " that defines " (:MATH NIL (:MI NIL "S")) ", or by writing a "
     (:FUNREF NIL "print-object") " " (:TERM NIL "method") " that is "
     (:TERM NIL "specialized") " for " (:TERM NIL "objects") " of type "
     (:MATH NIL (:MI NIL "S")) ". "
     (:ENDISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " " :PAR
     (:ISSUE NIL "STRUCTURE-READ-PRINT-SYNTAX:KEYWORDS") " "
     (:COMMENT NIL "% 2.12.0 2")
     "Different structures might print out in different ways; the default notation for structures is: "
     :PAR
     (:CODE NIL " #S(" (:PARAM NIL "structure-name") " "
      (:STAR NIL
       (:CURLY NIL (:PARAM NIL "slot-key") " " (:PARAM NIL "slot-value")))
      ")
")
     " where " (:TT NIL "#S") " indicates structure syntax, "
     (:PARAM NIL "structure-name") " is a " (:TERM NIL "structure name")
     ", each " (:PARAM NIL "slot-key") " is an initialization argument "
     (:TERM NIL "name") " for a " (:TERM NIL "slot") " in the "
     (:TERM NIL "structure") ", and each corresponding "
     (:PARAM NIL "slot-value") " is a representation of the "
     (:TERM NIL "object") " in that " (:TERM NIL "slot") ". "
     (:COMMENT NIL
      "The slot names need not be written with \\term{package prefixes}.")
     (:ENDISSUE NIL "STRUCTURE-READ-PRINT-SYNTAX:KEYWORDS") " " :PAR
     "For information on how the " (:TERM NIL "Lisp reader") " parses "
     (:TERM NIL "structures") ", see " (:SECREF NIL :SHARPSIGN-S) ". " :PAR)
    (:SUBSUBSECTION
     (:TITLE ("Printing Other Objects") :TAGS (:PRINTING-OTHER-OBJECTS)) " "
     :PAR (:COMMENT NIL "% 2.14.0 1" "% 22.1.6 33") "Other "
     (:TERM NIL "objects") " are printed in an "
     (:TERM NIL "implementation-dependent")
     " manner. It is not required that an " (:TERM NIL "implementation")
     " print those " (:TERM NIL "objects") " " (:TERM NIL "readably") ". " :PAR
     "For example, " (:TERM NIL "hash tables") ", " (:TERM NIL "readtables")
     ", " (:TERM NIL "packages") ", " (:TERM NIL "streams") ", and "
     (:TERM NIL "functions") " might not print " (:TERM NIL "readably") ". "
     :PAR "A common notation to use in this circumstance is "
     (:TT NIL "#<...>") ". Since " (:TT NIL "#<") " is not readable by the "
     (:TERM NIL "Lisp reader")
     ", the precise format of the text which follows is not important, but a common format to use is that provided by the "
     (:FUNREF NIL "print-unreadable-object") " " (:TERM NIL "macro") ". " :PAR
     "For information on how the " (:TERM NIL "Lisp reader")
     " treats this notation, see " (:SECREF NIL :SHARPSIGN-LEFT-ANGLE)
     ". For information on how to notate " (:TERM NIL "objects")
     " that cannot be printed " (:TERM NIL "readably") ", see "
     (:SECREF NIL :SHARPSIGN-DOT) ". " :PAR)
    :PAR)
   :PAR (:COMMENT NIL "% 22.1.6 34" "% this paragraph left out") :PAR
   (:SUBSECTION (:TITLE ("Examples of Printer Behavior"))
    (:CODE NIL " (let ((*print-escape* t)) (fresh-line) (write #\\a))
⊳ #\\a
→ #\\a
 (let ((*print-escape* nil) (*print-readably* nil))
   (fresh-line)
   (write #\\a))
⊳ a
→ #\\a
 (progn (fresh-line) (prin1 #\\a))
⊳ #\\a
→ #\\a
 (progn (fresh-line) (print #\\a))
⊳ 
⊳ #\\a
→ #\\a
 (progn (fresh-line) (princ #\\a))
⊳ a
→ #\\a

 (dolist (val '(t nil))
   (let ((*print-escape* val) (*print-readably* val))
     (print '#\\a) 
     (prin1 #\\a) (write-char #\\Space)
     (princ #\\a) (write-char #\\Space)
     (write #\\a)))
⊳ #\\a #\\a a #\\a
⊳ #\\a #\\a a a
→ NIL

 (progn (fresh-line) (write '(let ((a 1) (b 2)) (+ a b))))
⊳ (LET ((A 1) (B 2)) (+ A B))
→ (LET ((A 1) (B 2)) (+ A B))

 (progn (fresh-line) (pprint '(let ((a 1) (b 2)) (+ a b))))
⊳ (LET ((A 1)
⊳       (B 2))               
⊳   (+ A B))
→ (LET ((A 1) (B 2)) (+ A B))

 (progn (fresh-line) 
        (write '(let ((a 1) (b 2)) (+ a b)) :pretty t))
⊳ (LET ((A 1)
⊳       (B 2))
⊳   (+ A B))                 
→ (LET ((A 1) (B 2)) (+ A B))

 (with-output-to-string (s)  
    (write 'write :stream s)
    (prin1 'prin1 s))
→ \"WRITEPRIN1\"
")
    " " :PAR)
   :PAR)
  :PAR
  (:SECTION (:TITLE ("The Lisp Pretty Printer") :TAGS (:PPRINTER)) " " :PAR
   (:ISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR
   (:SUBSECTION (:TITLE ("Pretty Printer Concepts"))
    "The facilities provided by the " (:NEWTERM NIL "pretty printer")
    " permit " (:TERM NIL "programs") " to redefine the way in which "
    (:TERM NIL "code") " is displayed, and allow the full power of "
    (:TERM NIL "pretty printing")
    " to be applied to complex combinations of data structures. " :PAR
    "Whether any given style of output is in fact “pretty” is inherently a somewhat subjective issue. However, since the effect of the "
    (:TERM NIL "pretty printer") " can be customized by "
    (:TERM NIL "conforming programs")
    ", the necessary flexibility is provided for individual "
    (:TERM NIL "programs")
    " to achieve an arbitrary degree of aesthetic control. " :PAR
    "By providing direct access to the mechanisms within the pretty printer that make dynamic decisions about layout, the macros and functions "
    (:MACREF NIL "pprint-logical-block") ", " (:FUNREF NIL "pprint-newline")
    ", and " (:FUNREF NIL "pprint-indent")
    " make it possible to specify pretty printing layout rules as a part of any function that produces output. They also make it very easy for the detection of circularity and sharing, and abbreviation based on length and nesting depth to be supported by the function. "
    :PAR "The " (:TERM NIL "pretty printer")
    " is driven entirely by dispatch based on the " (:TERM NIL "value") " of "
    (:VARREF NIL "*print-pprint-dispatch*") ". The " (:TERM NIL "function") " "
    (:FUNREF NIL "set-pprint-dispatch") " makes it possible for "
    (:TERM NIL "conforming programs")
    " to associate new pretty printing functions with a " (:TERM NIL "type")
    ". " :PAR
    (:SUBSUBSECTION
     (:TITLE ("Dynamic Control of the Arrangement of Output") :TAGS
      (:DYNAMIC-CONTROL-OF-OUTPUT))
     " " :PAR "The actions of the " (:TERM NIL "pretty printer")
     " when a piece of output is too large to fit in the space available can be precisely controlled. Three concepts underlie the way these operations work—"
     (:NEWTERM NIL "logical blocks") ", " (:NEWTERM NIL "conditional newlines")
     ", and " (:NEWTERM NIL "sections")
     ". Before proceeding further, it is important to define these terms. "
     :PAR "The first line of " (:NEXTFIGURE NIL)
     " shows a schematic piece of output. Each of the characters in the output is represented by “"
     (:TT NIL "-")
     "”. The positions of conditional newlines are indicated by digits. The beginnings and ends of logical blocks are indicated by “"
     (:TT NIL "<") "” and “" (:TT NIL ">") "” respectively. " :PAR
     "The output as a whole is a logical block and the outermost section. This section is indicated by the "
     (:TT NIL "0")
     "'s on the second line of Figure 1. Logical blocks nested within the output are specified by the macro "
     (:MACREF NIL "pprint-logical-block")
     ". Conditional newline positions are specified by calls to "
     (:FUNREF NIL "pprint-newline")
     ". Each conditional newline defines two sections (one before it and one after it) and is associated with a third (the section immediately containing it). "
     :PAR
     "The section after a conditional newline consists of: all the output up to, but not including, (a) the next conditional newline immediately contained in the same logical block; or if (a) is not applicable, (b) the next newline that is at a lesser level of nesting in logical blocks; or if (b) is not applicable, (c) the end of the output. "
     :PAR
     "The section before a conditional newline consists of: all the output back to, but not including, (a) the previous conditional newline that is immediately contained in the same logical block; or if (a) is not applicable, (b) the beginning of the immediately containing logical block. The last four lines in Figure 1 indicate the sections before and after the four conditional newlines. "
     :PAR
     "The section immediately containing a conditional newline is the shortest section that contains the conditional newline in question. In "
     (:NEXTFIGURE NIL)
     ", the first conditional newline is immediately contained in the section marked with "
     (:TT NIL "0")
     "'s, the second and third conditional newlines are immediately contained in the section before the fourth conditional newline, and the fourth conditional newline is immediately contained in the section after the first conditional newline. "
     :PAR
     (:CODE NIL " <-1---<--<--2---3->--4-->->
 000000000000000000000000000
 11 111111111111111111111111
           22 222
              333 3333
        44444444444444 44444
")
     " "
     (:CAPTION NIL
      "Example of Logical Blocks, Conditional Newlines, and Sections")
     " " :PAR
     "Whenever possible, the pretty printer displays the entire contents of a section on a single line. However, if the section is too long to fit in the space available, line breaks are inserted at conditional newline positions within the section. "
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Format Directive Interface"))
     "The primary interface to operations for dynamically determining the arrangement of output is provided through the functions and macros of the pretty printer. "
     (:NEXTFIGURE (:CAPS T)) " shows the defined names related to "
     (:TERM NIL "pretty printing") ". " :PAR
     (:TABLE (:NAME ("Defined names related to pretty printing."))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " *print-lines*"))
       (:CELL NIL (:FUNREF NIL "pprint-dispatch"))
       (:CELL NIL (:FUNREF NIL "pprint-pop")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " *print-miser-width*"))
       (:CELL NIL (:FUNREF NIL "pprint-exit-if-list-exhausted"))
       (:CELL NIL (:FUNREF NIL "pprint-tab")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " *print-pprint-dispatch*"))
       (:CELL NIL (:FUNREF NIL "pprint-fill"))
       (:CELL NIL (:FUNREF NIL "pprint-tabular")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " *print-right-margin*"))
       (:CELL NIL (:FUNREF NIL "pprint-indent"))
       (:CELL NIL (:FUNREF NIL "set-pprint-dispatch")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " copy-pprint-dispatch"))
       (:CELL NIL (:FUNREF NIL "pprint-linear"))
       (:CELL NIL (:FUNREF NIL "write")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " format"))
       (:CELL NIL (:MACREF NIL "pprint-logical-block")) (:CELL NIL))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " formatter"))
       (:CELL NIL (:FUNREF NIL "pprint-newline")) (:CELL NIL)))
     " " :PAR (:NEXTFIGURE (:CAPS T)) " identifies a set of "
     (:TERM NIL "format directives")
     " which serve as an alternate interface to the same pretty printing operations in a more textually compact form. "
     :PAR
     (:COMMENT NIL "%Only of interest historically. -kmp"
      "In addition, it permits one would have to abandon the use of \\funref{format}"
      "when interacting with the pretty printer.")
     :PAR
     (:TABLE (:NAME ("Format directives related to Pretty Printing"))
      (:ROW NIL (:CELL NIL (:TT NIL "~I")) (:CELL NIL (:TT NIL "~W"))
       (:CELL NIL (:TT NIL "~<... :>")))
      (:ROW NIL (:CELL NIL (:TT NIL "~:T")) (:CELL NIL (:TT NIL "~/.../"))
       (:CELL NIL (:TT NIL "~_"))))
     " " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Compiling Format Strings") :TAGS (:COMPILING-FORMAT-STRINGS))
     " " :PAR (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " A "
     (:TERM NIL "format string")
     " is essentially a program in a special-purpose language that performs printing, and that is interpreted by the "
     (:TERM NIL "function") " " (:FUNREF NIL "format") ". The "
     (:FUNREF NIL "formatter") " " (:TERM NIL "macro")
     " provides the efficiency of using a " (:TERM NIL "compiled function")
     " to do that same printing but without losing the textual compactness of "
     (:TERM NIL "format strings") ". " :PAR "A "
     (:NEWTERM NIL "format control") " is either a "
     (:TERM NIL "format string") " or a " (:TERM NIL "function")
     " that was returned by the " (:FUNREF NIL "formatter") " "
     (:TERM NIL "macro") ". " (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY")
     " " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Pretty Print Dispatch Tables") :TAGS (:PPRINT-DISPATCH-TABLES))
     " " :PAR (:ISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " " :PAR
     (:COMMENT NIL "KAB: Are all type specifiers really valid?" "Waters: Yes."
      "KMP: Actually, CONS was not originally valid, but has been added due to a cleanup.")
     "A " (:NEWTERM NIL "pprint dispatch table")
     " is a mapping from keys to pairs of values. Each key is a "
     (:TERM NIL "type specifier")
     ". The values associated with a key are a “function” (specifically, a "
     (:TERM NIL "function designator") " or " (:MISC NIL "nil") ") "
     (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"
      " and a ``numerical priorities'' (specifically, a \\term{real}).")
     "and a “numerical priority” (specifically, a " (:TERM NIL "real")
     "). Basic insertion and retrieval is done based on the keys with the equality of keys being tested by "
     (:FUNREF NIL "equal") ". " :PAR "When " (:VARREF NIL "*print-pretty*")
     " is " (:TERM NIL "true") ", the "
     (:NEWTERM NIL "current pprint dispatch table") " (in "
     (:VARREF NIL "*print-pprint-dispatch*") ") controls how "
     (:TERM NIL "objects")
     " are printed. The information in this table takes precedence over all other mechanisms for specifying how to print "
     (:TERM NIL "objects") ". In particular, it " (:COMMENT NIL "overrides")
     "has priority over user-defined " (:FUNREF NIL "print-object") " "
     (:TERM NIL "methods") " "
     (:ISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
     (:COMMENT NIL "and print functions for \\term{structures} ")
     (:ENDISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93")
     " because the " (:TERM NIL "current pprint dispatch table")
     " is consulted first. " :PAR
     (:COMMENT NIL
      "%Just trying to simplify wording to fit context. -kmp 27-Aug-93"
      "The function to use when \\term{pretty printing} an \\term{object} is chosen ")
     "The function is chosen from the "
     (:TERM NIL "current pprint dispatch table")
     " by finding the highest priority function "
     (:COMMENT NIL "% Again, this should follow from context."
      "from the \\term{current pprint dispatch table} ")
     "that is associated with a " (:TERM NIL "type specifier")
     " that matches the " (:TERM NIL "object") "; "
     (:COMMENT NIL
      "KAB: What if there are several matches with equal priority?"
      "Waters: It's not well-defined."
      "KMP: I've added this text to clarify that point:")
     "if there is more than one such function, it is "
     (:TERM NIL "implementation-dependent") " which is used. " :PAR
     "However, if there is no "
     (:COMMENT NIL "% better parallel construction. -kmp 27-Aug-93"
      "specification")
     "information in the table about how to " (:TERM NIL "pretty print")
     " a particular kind of " (:TERM NIL "object") ", "
     (:COMMENT NIL " it is then printed using the standard mechanisms as if"
      " \\varref{*print-pretty*} were \\term{false}.")
     "a " (:TERM NIL "function") " is invoked which uses "
     (:FUNREF NIL "print-object") " to print the " (:TERM NIL "object")
     ". The value of " (:VARREF NIL "*print-pretty*") " is still "
     (:TERM NIL "true") " when this function is " (:TERM NIL "called")
     ", and individual methods for " (:FUNREF NIL "print-object")
     " might still elect to produce output in a special format conditional on the "
     (:TERM NIL "value") " of " (:VARREF NIL "*print-pretty*") ". "
     (:ENDISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Pretty Printer Margins"))
     "A primary goal of pretty printing is to keep the output between a pair of margins. "
     (:COMMENT NIL "This used to say:"
      "  The left margin is set at the column where the output begins."
      "KMP asked:" "  Does this mean that" "   a. the cursor is moved "
      "   b. the position at the cursor is assumed to be zero"
      "   c. that the position at the cursor becomes the new left margin?"
      "Waters replied (c), so the following new sentence was made:")
     "The column where the output begins is taken as the left margin. "
     (:COMMENT NIL "This used to say:"
      "  If this cannot be determined, the left margin is set to zero."
      "KMP asked:" "  Does this mean ``assumed to be''"
      "Waters replied yes, so the following new sentence was made:")
     "If the current column cannot be determined at the time output begins, the left margin is assumed to be zero. The right margin is controlled by "
     (:VARREF NIL "*print-right-margin*") ". " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Examples of using the Pretty Printer") :TAGS
     (:PRETTY-PRINTER-EXAMPLES))
    " " :PAR
    "As an example of the interaction of logical blocks, conditional newlines, and indentation, consider the function "
    (:TT NIL "simple-pprint-defun")
    " below. This function prints out lists whose " (:TERM NIL "cars") " are "
    (:MACREF NIL "defun")
    " in the standard way assuming that the list has exactly length "
    (:TT NIL "4") ". " :PAR
    (:CODE NIL "(defun simple-pprint-defun (*standard-output* list)
  (pprint-logical-block (*standard-output* list :prefix \"(\" :suffix \")\")
    (write (first list))
    (write-char #\\Space)
    (pprint-newline :miser)
    (pprint-indent :current 0)
    (write (second list))
    (write-char #\\Space)
    (pprint-newline :fill)
    (write (third list))
    (pprint-indent :block 1)
    (write-char #\\Space)
    (pprint-newline :linear)
    (write (fourth list))))
")
    " " :PAR "Suppose that one evaluates the following: " :PAR
    (:CODE NIL
     "(simple-pprint-defun *standard-output* '(defun prod (x y) (* x y)))
")
    " " :PAR "If the line width available is greater than or equal to "
    (:TT NIL "26")
    ", then all of the output appears on one line. If the line width available is reduced to "
    (:TT NIL "25")
    ", a line break is inserted at the linear-style conditional newline"
    (:IDXTEXT NIL "linear-style conditional newline") " before the "
    (:TERM NIL "expression") " " (:TT NIL "(* x y)")
    ", producing the output shown. The " (:TT NIL "(pprint-indent :block 1)")
    " causes " (:TT NIL "(* x y)")
    " to be printed at a relative indentation of " (:TT NIL "1")
    " in the logical block. " :PAR
    (:CODE NIL " (DEFUN PROD (X Y) 
   (* X Y))
")
    " " :PAR "If the line width available is " (:TT NIL "15")
    ", a line break is also inserted at the fill style conditional newline before the argument list. The call on "
    (:TT NIL "(pprint-indent :current 0)")
    " causes the argument list to line up under the function name. " :PAR
    (:CODE NIL "(DEFUN PROD
       (X Y)
  (* X Y))
")
    " " :PAR "If " (:VARREF NIL "*print-miser-width*")
    " were greater than or equal to 14, the example output above would have been as follows, because all indentation changes are ignored in miser mode and line breaks are inserted at miser-style conditional newlines."
    (:IDXTEXT NIL "miser-style conditional newline") " " :PAR
    (:CODE NIL " (DEFUN
  PROD
  (X Y)
  (* X Y))
")
    " " :PAR
    "As an example of a per-line prefix, consider that evaluating the following produces the output shown with a line width of "
    (:TT NIL "20") " and " (:VARREF NIL "*print-miser-width*") " of "
    (:MISC NIL "nil") ". " :PAR
    (:CODE NIL
     " (pprint-logical-block (*standard-output* nil :per-line-prefix \";;; \")
   (simple-pprint-defun *standard-output* '(defun prod (x y) (* x y))))
 
 ;;; (DEFUN PROD
 ;;;        (X Y)
 ;;;   (* X Y))
")
    " " :PAR
    "As a more complex (and realistic) example, consider the function "
    (:TT NIL "pprint-let") " below. This specifies how to print a "
    (:SPECREF NIL "let") " " (:TERM NIL "form")
    " in the traditional style. It is more complex than the example above, because it has to deal with nested structure. Also, unlike the example above it contains complete code to readably print any possible list that begins with the "
    (:TERM NIL "symbol") " " (:SPECREF NIL "let") ". The outermost "
    (:MACREF NIL "pprint-logical-block") " " (:TERM NIL "form")
    " handles the printing of the input list as a whole and specifies that parentheses should be printed in the output. The second "
    (:MACREF NIL "pprint-logical-block") " " (:TERM NIL "form")
    " handles the list of binding pairs. Each pair in the list is itself printed by the innermost "
    (:MACREF NIL "pprint-logical-block") ". (A " (:MACREF NIL "loop") " "
    (:TERM NIL "form")
    " is used instead of merely decomposing the pair into two "
    (:TERM NIL "objects")
    " so that readable output will be produced no matter whether the list corresponding to the pair has one element, two elements, or (being malformed) has more than two elements.) A space and a fill-style conditional newline"
    (:IDXTEXT NIL "fill-style conditional newline")
    " are placed after each pair except the last. The loop at the end of the topmost "
    (:MACREF NIL "pprint-logical-block") " " (:TERM NIL "form")
    " prints out the forms in the body of the " (:SPECREF NIL "let") " "
    (:TERM NIL "form")
    " separated by spaces and linear-style conditional newlines. " :PAR
    (:CODE NIL " (defun pprint-let (*standard-output* list)
   (pprint-logical-block (nil list :prefix \"(\" :suffix \")\")
     (write (pprint-pop))
     (pprint-exit-if-list-exhausted)
     (write-char #\\Space)
     (pprint-logical-block (nil (pprint-pop) :prefix \"(\" :suffix \")\")
       (pprint-exit-if-list-exhausted)
       (loop (pprint-logical-block (nil (pprint-pop) :prefix \"(\" :suffix \")\")
               (pprint-exit-if-list-exhausted)
               (loop (write (pprint-pop))
                     (pprint-exit-if-list-exhausted)
                     (write-char #\\Space)
                     (pprint-newline :linear)))
             (pprint-exit-if-list-exhausted)
             (write-char #\\Space)
             (pprint-newline :fill)))
     (pprint-indent :block 1)
     (loop (pprint-exit-if-list-exhausted)
           (write-char #\\Space)
           (pprint-newline :linear)
           (write (pprint-pop)))))
")
    " " :PAR "Suppose that one evaluates the following with "
    (:VARREF NIL "*print-level*") " being 4, and "
    (:VARREF NIL "*print-circle*") " being " (:TERM NIL "true") ". " :PAR
    (:CODE NIL " (pprint-let *standard-output*
             '#1=(let (x (*print-length* (f (g 3))) 
                       (z . 2) (k (car y)))
                   (setq x (sqrt z)) #1#))
")
    " " :PAR "If the line length is greater than or equal to " (:TT NIL "77")
    ", the output produced appears on one line. However, if the line length is "
    (:TT NIL "76")
    ", line breaks are inserted at the linear-style conditional newlines separating the forms in the body and the output below is produced. Note that, the degenerate binding pair "
    (:TT NIL "x")
    " is printed readably even though it fails to be a list; a depth abbreviation marker is printed in place of "
    (:TT NIL "(g 3)") "; the binding pair " (:TT NIL "(z . 2)")
    " is printed readably even though it is not a proper list; and appropriate circularity markers are printed. "
    :PAR
    (:CODE NIL " #1=(LET (X (*PRINT-LENGTH* (F #)) (Z . 2) (K (CAR Y))) 
      (SETQ X (SQRT Z))
      #1#)
")
    " " :PAR "If the line length is reduced to " (:TT NIL "35")
    ", a line break is inserted at one of the fill-style conditional newlines separating the binding pairs. "
    :PAR
    (:CODE NIL " #1=(LET (X (*PRINT-PRETTY* (F #))
          (Z . 2) (K (CAR Y)))
      (SETQ X (SQRT Z))
      #1#)
")
    " " :PAR "Suppose that the line length is further reduced to "
    (:TT NIL "22") " and " (:VARREF NIL "*print-length*") " is set to "
    (:TT NIL "3")
    ". In this situation, line breaks are inserted after both the first and second binding pairs. In addition, the second binding pair is itself broken across two lines. Clause (b) of the description of fill-style conditional newlines (see the "
    (:TERM NIL "function") " " (:FUNREF NIL "pprint-newline")
    ") prevents the binding pair " (:TT NIL "(z . 2)")
    " from being printed at the end of the third line. Note that the length abbreviation hides the circularity from view and therefore the printing of circularity markers disappears. "
    :PAR
    (:CODE NIL " (LET (X
       (*PRINT-LENGTH*
        (F #))
       (Z . 2) ...)
   (SETQ X (SQRT Z))
   ...)
")
    " " :PAR "The next function prints a vector using “" (:TT NIL "#(...)")
    "” notation. " :PAR
    (:CODE NIL "(defun pprint-vector (*standard-output* v)
  (pprint-logical-block (nil nil :prefix \"#(\" :suffix \")\")
    (let ((end (length v)) (i 0))
      (when (plusp end)
        (loop (pprint-pop)
              (write (aref v i))
              (if (= (incf i) end) (return nil))
              (write-char #\\Space)
              (pprint-newline :fill))))))
")
    " " :PAR
    "Evaluating the following with a line length of 15 produces the output shown. "
    :PAR
    (:CODE NIL
     " (pprint-vector *standard-output* '#(12 34 567 8 9012 34 567 89 0 1 23))
 
 #(12 34 567 8 
   9012 34 567 
   89 0 1 23)
")
    " " :PAR
    "As examples of the convenience of specifying pretty printing with "
    (:TERM NIL "format strings") ", consider that the functions "
    (:TT NIL "simple-pprint-defun") " and " (:TT NIL "pprint-let")
    " used as examples above can be compactly defined as follows. (The function "
    (:TT NIL "pprint-vector") " cannot be defined using "
    (:FUNREF NIL "format")
    " because the data structure it traverses is not a list.) " :PAR
    (:CODE NIL "(defun simple-pprint-defun (*standard-output* list)
  (format T \"~:<~W ~@_~:I~W ~:_~W~1I ~_~W~:>\" list))

(defun pprint-let (*standard-output* list)
  (format T \"~:<~W~^~:<~@{~:<~@{~W~^~_~}~:>~^~:_~}~:>~1I~@{~^~_~W~}~:>\" list)) 
")
    " " :PAR "In the following example, the first " (:TERM NIL "form")
    " restores " (:VARREF NIL "*print-pprint-dispatch*")
    " to the equivalent of its initial value. The next two forms then set up a special way to pretty print ratios. Note that the more specific "
    (:TERM NIL "type specifier")
    " has to be associated with a higher priority. " :PAR
    (:CODE NIL " (setq *print-pprint-dispatch* (copy-pprint-dispatch nil))

 (set-pprint-dispatch 'ratio
   #'(lambda (s obj)
       (format s \"#.(/ ~W ~W)\" 
                 (numerator obj) (denominator obj))))

 (set-pprint-dispatch '(and ratio (satisfies minusp))
   #'(lambda (s obj)
       (format s \"#.(- (/ ~W ~W))\" 
               (- (numerator obj)) (denominator obj)))
   5)

 (pprint '(1/3 -2/3))
 (#.(/ 1 3) #.(- (/ 2 3)))
")
    " " :PAR "The following two " (:TERM NIL "forms")
    " illustrate the definition of pretty printing functions for types of "
    (:TERM NIL "code") ". The first " (:TERM NIL "form")
    " illustrates how to specify the traditional method for printing quoted objects using "
    (:TERM NIL "single-quote")
    ". Note the care taken to ensure that data lists that happen to begin with "
    (:MISC NIL "quote")
    " will be printed readably. The second form specifies that lists beginning with the symbol "
    (:TT NIL "my-let") " should print the same way that lists beginning with "
    (:SPECREF NIL "let") " print when the initial "
    (:TERM NIL "pprint dispatch table") " is in effect. " :PAR
    (:CODE NIL " (set-pprint-dispatch '(cons (member quote)) () 
   #'(lambda (s list)
       (if (and (consp (cdr list)) (null (cddr list)))
          (funcall (formatter \"'~W\") s (cadr list))
          (pprint-fill s list))))
 
 (set-pprint-dispatch '(cons (member my-let)) 
                      (pprint-dispatch '(let) nil))
")
    " " :PAR
    "The next example specifies a default method for printing lists that do not correspond to function calls. Note that the functions "
    (:FUNREF NIL "pprint-linear") ", " (:FUNREF NIL "pprint-fill") ", and "
    (:FUNREF NIL "pprint-tabular") " are all defined with optional "
    (:PARAM NIL "colon-p") " and " (:PARAM NIL "at-sign-p")
    " arguments so that they can be used as "
    (:MISC NIL "pprint dispatch functions") " as well as " (:TT NIL "~/.../")
    " functions. " :PAR
    (:CODE NIL
     " (set-pprint-dispatch '(cons (not (and symbol (satisfies fboundp))))
                      #'pprint-fill -5)
 
 ;; Assume a line length of 9
 (pprint '(0 b c d e f g h i j k))
 (0 b c d
  e f g h
  i j k)
")
    " " :PAR
    "This final example shows how to define a pretty printing function for a user defined data structure. "
    :PAR
    (:CODE NIL " (defstruct family mom kids)
 
 (set-pprint-dispatch 'family
   #'(lambda (s f)
       (funcall (formatter \"~@<#<~;~W and ~2I~_~/pprint-fill/~;>~:>\")
               s (family-mom f) (family-kids f))))
")
    " " :PAR "The pretty printing function for the structure "
    (:TT NIL "family")
    " specifies how to adjust the layout of the output so that it can fit aesthetically into a variety of line widths. In addition, it obeys the printer control variables "
    (:VARREF NIL "*print-level*") ", " (:VARREF NIL "*print-length*") ", "
    (:VARREF NIL "*print-lines*") ", " (:VARREF NIL "*print-circle*") " "
    (:COMMENT NIL
     "% There's no such var.  (Flanagan pointed this out in private mail.) -kmp 26-Jul-93"
     ", \\varref{*print-shared*}")
    "and " (:VARREF NIL "*print-escape*")
    ", and can tolerate several different kinds of malformity in the data structure. The output below shows what is printed out with a right margin of "
    (:TT NIL "25") ", " (:VARREF NIL "*print-pretty*") " being "
    (:TERM NIL "true") ", " (:VARREF NIL "*print-escape*") " being "
    (:TERM NIL "false") ", and a malformed " (:TT NIL "kids") " list. " :PAR
    (:CODE NIL " (write (list 'principal-family
              (make-family :mom \"Lucy\"
                           :kids '(\"Mark\" \"Bob\" . \"Dan\")))
        :right-margin 25 :pretty T :escape nil :miser-width nil)
 (PRINCIPAL-FAMILY
  #<Lucy and
      Mark Bob . Dan>)
")
    " " :PAR (:ISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93")
    " Note that a pretty printing function for a structure is different from "
    (:COMMENT NIL "the structure's print function.") "the structure's "
    (:FUNREF NIL "print-object") " " (:TERM NIL "method") ". While "
    (:COMMENT NIL "print functions") (:FUNREF NIL "print-object") " "
    (:TERM NIL "methods")
    " are permanently associated with a structure, pretty printing functions are stored in "
    (:TERM NIL "pprint dispatch tables")
    " and can be rapidly changed to reflect different printing needs. If there is no pretty printing function for a structure in the current "
    (:TERM NIL "pprint dispatch table") ", "
    (:COMMENT NIL " the print function (if any) ") "its "
    (:FUNREF NIL "print-object") " " (:TERM NIL "method") " is used instead. "
    (:ENDISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Notes about the Pretty Printer's Background"))
    "For a background reference to the abstract concepts detailed in this section, see "
    (:BIB
     (:URL "https://dspace.mit.edu/handle/1721.1/6504" :HANDLE "1721.1/6504")
     "XP: A Common Lisp Pretty Printing System")
    ". The details of that paper are not binding on this document, but may be helpful in establishing a conceptual basis for understanding this material. "
    :PAR)
   :PAR (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " ")
  :PAR
  (:SECTION (:TITLE ("Formatted Output") :TAGS (:FORMATTED-OUTPUT)) " "
   (:COMMENT NIL "% Formatted Output") :PAR
   (:ISSUE NIL "PRETTY-PRINT-INTERFACE") " "
   (:EDITORNOTE NIL
    "KMP: This is transplanted from FORMAT and will need a bit of work before it looks good standing alone. Bear with me.")
   " " :PAR (:COMMENT NIL "% 22.3.1 21") (:FUNREF NIL "format")
   " is useful for producing nicely formatted text, producing good-looking messages, and so on. "
   (:FUNREF NIL "format") " can generate and return a " (:TERM NIL "string")
   " or output to " (:PARAM NIL "destination") ". " :PAR "The "
   (:PARAM NIL "control-string") " argument to " (:FUNREF NIL "format")
   " is actually a " (:TERM NIL "format control") ". "
   (:COMMENT NIL
    " It can be any function at all that does the right things with its"
    " arguments.  --sjl 16 Mar 92"
    "That is, it can be either a \\term{format string} or a \\term{function} that was returned")
   "That is, it can be either a " (:TERM NIL "format string") " or a "
   (:TERM NIL "function") ", for example a " (:TERM NIL "function")
   " returned by the " (:MACREF NIL "formatter") " " (:TERM NIL "macro") ". "
   :PAR "If it is a " (:TERM NIL "function") ", the " (:TERM NIL "function")
   " is called with the appropriate output stream as its first argument and the data arguments to "
   (:FUNREF NIL "format")
   " as its remaining arguments. The function should perform whatever output is necessary and return the unused tail of the arguments (if any). "
   :PAR "The compilation process performed by " (:MACREF NIL "formatter")
   " produces a " (:TERM NIL "function") " that would do with its "
   (:TERM NIL "arguments") " as the " (:FUNREF NIL "format")
   " interpreter would do with those " (:TERM NIL "arguments") ". " :PAR
   "The remainder of this section describes what happens if the "
   (:PARAM NIL "control-string") " is a " (:TERM NIL "format string") ". "
   (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR
   (:COMMENT NIL " Removed redundant text --sjl 16 Mar 92" "%% 22.3.2 6"
    "\\funref{format} produces formatted output by outputting the characters"
    "of \\param{control-string} and observing that a \\term{tilde}"
    "introduces a directive.  The character after the tilde, possibly preceded "
    "by prefix parameters and modifiers, specifies what kind of formatting "
    "is desired.  ")
   :PAR (:PARAM NIL "Control-string") " is composed of simple text ("
   (:TERM NIL "characters") ") and embedded directives. " :PAR
   (:COMMENT NIL "% 22.3.3 7") (:FUNREF NIL "format")
   " writes the simple text as is; each embedded directive specifies further text output that is to appear at the corresponding point within the simple text. Most directives use one or more elements of "
   (:PARAM NIL "args") " to create their output. " :PAR
   (:COMMENT NIL "% 22.3.3 9") "A directive consists of a " (:TERM NIL "tilde")
   ", optional prefix parameters separated by commas, optional "
   (:TERM NIL "colon") " and " (:TERM NIL "at-sign")
   " modifiers, and a single character indicating what kind of directive this is. "
   (:ISSUE NIL "FORMAT-ATSIGN-COLON")
   " There is no required ordering between the " (:TERM NIL "at-sign") " and "
   (:TERM NIL "colon") " modifier. " (:ENDISSUE NIL "FORMAT-ATSIGN-COLON")
   " The " (:TERM NIL "case")
   " of the directive character is ignored. Prefix parameters are notated as signed (sign is optional) decimal numbers, or as a "
   (:TERM NIL "single-quote") " followed by a character. For example, "
   (:TT NIL " 5,'0d") " can be used to print an " (:TERM NIL "integer")
   " in decimal radix in five columns with leading zeros, or "
   (:TT NIL " 5,'*d") " to get leading asterisks. " :PAR
   (:COMMENT NIL "% 22.3.2 10")
   "In place of a prefix parameter to a directive, " (:TT NIL "V") " (or "
   (:TT NIL "v") ") can be used. In this case, " (:FUNREF NIL "format")
   " takes an argument from " (:PARAM NIL "args")
   " as a parameter to the directive. The argument should be an "
   (:TERM NIL "integer") " or " (:TERM NIL "character") ". If the "
   (:PARAM NIL "arg") " used by a " (:TT NIL "V") " parameter is "
   (:MISC NIL "nil") ", the effect is as if the parameter had been omitted. "
   (:TT NIL "#")
   " can be used in place of a prefix parameter; it represents the number of "
   (:PARAM NIL "args")
   " remaining to be processed. When used within a recursive format, in the context of "
   (:TT NIL " ?") " or " (:TT NIL " {") ", the " (:TT NIL "#")
   " prefix parameter represents the number of " (:TERM NIL "format arguments")
   " remaining within the recursive call. " :PAR "Examples of "
   (:TERM NIL "format strings") ": " :PAR
   (:TABLE (:NAME ("Examples of format control strings"))
    (:ROW NIL (:CELL NIL (:TT NIL "\" S\""))
     (:CELL NIL " ;This is an S directive with no parameters or modifiers. "))
    (:ROW NIL (:CELL NIL (:TT NIL "\" 3,-4:@s\""))
     (:CELL NIL " ;This is an S directive with two parameters, " (:TT NIL "3")
      " and " (:TT NIL "-4") ", " (:BR NIL) " ; and both the "
      (:TERM NIL "colon") " and " (:TERM NIL "at-sign") " flags. "))
    (:ROW NIL (:CELL NIL (:TT NIL "\" ,+4S\""))
     (:CELL NIL " ;Here the first prefix parameter is omitted and takes "
      (:BR NIL) " ; on its default value, while the second parameter is "
      (:TT NIL "4") ". ")))
   " " :PAR (:FUNREF NIL "format") " sends the output to "
   (:PARAM NIL "destination") ". If " (:PARAM NIL "destination") " is "
   (:MISC NIL "nil") ", " (:FUNREF NIL "format") " creates and returns a "
   (:TERM NIL "string") " containing the output from "
   (:PARAM NIL "control-string") ". If " (:PARAM NIL "destination") " is "
   (:TERM NIL "non-nil") ", it must be a " (:TERM NIL "string") " with a "
   (:TERM NIL "fill pointer") ", a " (:TERM NIL "stream") ", or the symbol "
   (:MISC NIL "t") ". If " (:PARAM NIL "destination") " is a "
   (:TERM NIL "string") " with a " (:TERM NIL "fill pointer")
   ", the output is added to the end of the " (:TERM NIL "string") ". If "
   (:PARAM NIL "destination") " is a " (:TERM NIL "stream")
   ", the output is sent to that " (:TERM NIL "stream") ". If "
   (:PARAM NIL "destination") " is " (:MISC NIL "t") ", the output is sent to "
   (:TERM NIL "standard output") ". " :PAR
   (:COMMENT NIL "% 22.3.2 8 " "%(left out)") :PAR (:COMMENT NIL "% 22.3.2 15")
   "In the description of the directives that follows, the term "
   (:I NIL "arg") " in general refers to the next item of the set of "
   (:PARAM NIL "args")
   " to be processed. The word or phrase at the beginning of each description is a mnemonic for the directive. "
   (:ISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " (:FUNREF NIL "format")
   " directives do not bind any of the printer control variables ("
   (:VARREF NIL "*print-...*")
   ") except as specified in the following descriptions. Implementations may specify the binding of new, implementation-specific printer control variables for each "
   (:FUNREF NIL "format")
   " directive, but they may neither bind any standard printer control variables not specified in description of a "
   (:FUNREF NIL "format")
   " directive nor fail to bind any standard printer control variables as specified in the description. "
   (:ENDISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " :PAR
   (:COMMENT NIL
    " This section needs a lot of work on fonts.  Maybe all the syntax parts"
    " of the format directives should use \\param instead of \\i.  Or change the"
    " \\i{foo} to \\i{foo\\/} to fix kerning problems."
    " I decided to make a \\j{...} which is \\i{...\\/} instead."
    " It's not pretty but it's fast and I'm out of time. -kmp 30-Aug-93.")
   :PAR
   (:SUBSECTION (:TITLE ("FORMAT Basic Output"))
    (:SUBSUBSECTION (:TITLE ("Tilde C: Character"))
     (:IDXTEXT NIL "C (format directive)")
     (:IDXTEXT NIL "Tilde C (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 38   ") :PAR "The next " (:I NIL "arg")
     " should be a " (:TERM NIL "character")
     "; it is printed according to the modifier flags. " :PAR
     (:COMMENT NIL "% 22.3.2 39") (:ISSUE NIL "FORMAT-OP-C") " " (:TT NIL " C")
     " prints the " (:TERM NIL "character") " as if by using "
     (:FUNREF NIL "write-char") " if it is a " (:TERM NIL "simple character")
     ". " (:TERM NIL "Characters") " that are not " (:TERM NIL "simple")
     " are not necessarily printed as if by " (:FUNREF NIL "write-char")
     ", but are displayed in an " (:TERM NIL "implementation-defined")
     ", abbreviated format. For example, " :PAR
     (:CODE NIL " (format nil \"~C\" #\\A) → \"A\"
 (format nil \"~C\" #\\Space) → \" \"
")
     " " (:ENDISSUE NIL "FORMAT-OP-C") " " :PAR (:COMMENT NIL "% 22.3.2 40")
     (:TT NIL " :C") " is the same as " (:TT NIL " C") " for "
     (:TERM NIL "printing") " " (:TERM NIL "characters") ", but other "
     (:TERM NIL "characters")
     " are “spelled out.” The intent is that this is a “pretty” format for printing characters. For "
     (:TERM NIL "simple") " " (:TERM NIL "characters") " that are not "
     (:TERM NIL "printing") ", what is spelled out is the " (:TERM NIL "name")
     " of the " (:TERM NIL "character") " (see " (:FUNREF NIL "char-name")
     "). For " (:TERM NIL "characters") " that are not " (:TERM NIL "simple")
     " and not " (:TERM NIL "printing") ", what is spelled out is "
     (:TERM NIL "implementation-defined") ". For example, " :PAR
     (:CODE NIL " (format nil \"~:C\" #\\A) → \"A\"
 (format nil \"~:C\" #\\Space) → \"Space\"
;; This next example assumes an implementation-defined \"Control\" attribute.
 (format nil \"~:C\" #\\Control-Space)
→ \"Control-Space\"
OR→ \"c-Space\"
")
     " " :PAR (:COMMENT NIL "% 22.3.2 41  ") (:TT NIL " :@C") " prints what "
     (:TT NIL " :C") " would, and then if the " (:TERM NIL "character")
     " requires unusual shift keys on the keyboard to type it, this fact is mentioned. For example, "
     :PAR "  "
     (:CODE NIL " (format nil \"~:@C\" #\\Control-Partial) → \"Control-"
      (:MATH NIL (:MO NIL "∂")) " (Top-F)\"  
")
     "  " :PAR
     "This is the format used for telling the user about a key he is expected to type, in prompts, for instance. The precise output may depend not only on the implementation, but on the particular I/O devices in use. "
     :PAR (:COMMENT NIL "% 22.3.2 42 ") (:TT NIL " @C") " prints the "
     (:TERM NIL "character") " in a way that the " (:TERM NIL "Lisp reader")
     " can understand, using " (:TT NIL "#\\") " syntax. " :PAR
     (:ISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " (:TT NIL " @C") " binds "
     (:VARREF NIL "*print-escape*") " to " (:MISC NIL "t") ". "
     (:ENDISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde Percent: Newline"))
     (:IDXTEXT NIL "Percent (format directive)")
     (:IDXTEXT NIL "Tilde Percent (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 96") :PAR "This outputs a " (:TT NIL "#\\Newline")
     " character, thereby terminating the current output line and beginning a new one. "
     (:TT NIL " " (:I NIL "n") "%") " outputs " (:I NIL "n") " newlines. No "
     (:I NIL "arg") " is used. " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde Ampersand: Fresh-Line"))
     (:IDXTEXT NIL "Ampersand (format directive)")
     (:IDXTEXT NIL "Tilde Ampersand (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 97") :PAR
     "Unless it can be determined that the output stream is already at the beginning of a line, this outputs a newline. "
     (:TT NIL " " (:I NIL "n") "&") " calls " (:FUNREF NIL "fresh-line")
     " and then outputs " (:I NIL "n") "− 1 newlines. " (:TT NIL " 0&")
     " does nothing. " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde Vertical-Bar: Page"))
     (:IDXTEXT NIL "Vertical-Bar (format directive)")
     (:IDXTEXT NIL "Tilde Vertical-Bar (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 98") :PAR
     "This outputs a page separator character, if possible. "
     (:TT NIL " " (:I NIL "n") "|") " does this " (:I NIL "n") " times. " :PAR)
    :PAR (:COMMENT NIL "% 22.3.2 99") :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde Tilde: Tilde"))
     (:IDXTEXT NIL "Tilde (format directive)")
     (:IDXTEXT NIL "Tilde Tilde (format directive)") " " :PAR "This outputs a "
     (:TERM NIL "tilde") ". " (:TT NIL " " (:I NIL "n") " ") " outputs "
     (:I NIL "n") " tildes. " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("FORMAT Radix Control"))
    (:SUBSUBSECTION (:TITLE ("Tilde R: Radix"))
     (:IDXTEXT NIL "R (format directive)")
     (:IDXTEXT NIL "Tilde R (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 29") :PAR (:TT NIL " " (:I NIL "n") "R")
     " prints " (:I NIL "arg") " in radix " (:I NIL "n")
     ". The modifier flags and any remaining parameters are used as for the "
     (:TT NIL " D") " directive. " (:TT NIL " D") " is the same as "
     (:TT NIL " 10R") ". The full form is "
     (:TT NIL " " (:I NIL "radix") "," (:I NIL "mincol") "," (:I NIL "padchar")
      "," (:I NIL "commachar") "," (:I NIL "comma-interval") "R")
     ". " :PAR (:COMMENT NIL "% 22.3.2 30")
     "If no prefix parameters are given to " (:TT NIL " R")
     ", then a different interpretation is given. The argument should be an "
     (:TERM NIL "integer") ". For example, if " (:I NIL "arg") " is 4: " :PAR
     (:COMMENT NIL "% 22.3.2 31")
     (:LIST NIL
      (:ITEM NIL " " (:TT NIL " R") " prints " (:I NIL "arg")
       " as a cardinal English number: " (:TT NIL "four") ". " :PAR
       (:COMMENT NIL "% 22.3.2 32"))
      (:ITEM NIL " " (:TT NIL " :R") " prints " (:I NIL "arg")
       " as an ordinal English number: " (:TT NIL "fourth") ". " :PAR
       (:COMMENT NIL "% 22.3.2 33"))
      (:ITEM NIL " " (:TT NIL " @R") " prints " (:I NIL "arg")
       " as a Roman numeral: " (:TT NIL "IV") ". " :PAR
       (:COMMENT NIL "% 22.3.2 34"))
      (:ITEM NIL " " (:TT NIL " :@R") " prints " (:I NIL "arg")
       " as an old Roman numeral: " (:TT NIL "IIII") ". "))
     " " :PAR (:ISSUE NIL "FORMAT-COMMA-INTERVAL") " For example: " :PAR
     (:CODE NIL " (format nil \"~,,' ,4:B\" 13) → \"1101\"
 (format nil \"~,,' ,4:B\" 17) → \"1 0001\"
 (format nil \"~19,0,' ,4:B\" 3333) → \"0000 1101 0000 0101\"
 (format nil \"~3,,,' ,2:R\" 17) → \"1 22\"
 (format nil \"~,,'|,2:D\" #xFFFF) →  \"6|55|35\"
")
     " " (:ENDISSUE NIL "FORMAT-COMMA-INTERVAL") " " :PAR
     (:ISSUE NIL "FORMAT-PRETTY-PRINT:YES")
     " If and only if the first parameter, " (:I NIL "n") ", is supplied, "
     (:TT NIL " R") " binds " (:VARREF NIL "*print-escape*") " to "
     (:TERM NIL "false") ", " (:VARREF NIL "*print-radix*") " to "
     (:TERM NIL "false") ", " (:VARREF NIL "*print-base*") " to " (:I NIL "n")
     ", " (:ISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " and "
     (:VARREF NIL "*print-readably*") " to " (:TERM NIL "false") ". "
     (:ENDISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " " :PAR
     "If and only if no parameters are supplied, " (:TT NIL " R") " binds "
     (:VARREF NIL "*print-base*") " to " (:TT NIL "10") ". "
     (:ENDISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde D: Decimal"))
     (:IDXTEXT NIL "D (format directive)")
     (:IDXTEXT NIL "Tilde D (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 20") :PAR "An " (:I NIL "arg")
     ", which should be an " (:TERM NIL "integer")
     ", is printed in decimal radix. " (:TT NIL " D")
     " will never put a decimal point after the number. " :PAR
     (:COMMENT NIL "% 22.3.2 21") (:TT NIL " " (:I NIL "mincol") "D")
     " uses a column width of " (:I NIL "mincol")
     "; spaces are inserted on the left if the number requires fewer than "
     (:I NIL "mincol")
     " columns for its digits and sign. If the number doesn't fit in "
     (:I NIL "mincol") " columns, additional columns are used as needed. " :PAR
     (:COMMENT NIL "% 22.3.2 22")
     (:TT NIL " " (:I NIL "mincol") "," (:I NIL "padchar") "D") " uses "
     (:I NIL "padchar") " as the pad character instead of space. " :PAR
     (:COMMENT NIL "% 22.3.2 23") "If " (:I NIL "arg") " is not an "
     (:TERM NIL "integer") ", it is printed in " (:TT NIL " A")
     " format and decimal base. " :PAR (:COMMENT NIL "% 22.3.2 24") "The "
     (:TT NIL "@")
     " modifier causes the number's sign to be printed always; the default is to print it only if the number is negative. "
     (:ISSUE NIL "FORMAT-COMMA-INTERVAL") " The " (:TT NIL ":")
     " modifier causes commas to be printed between groups of digits; "
     (:I NIL "commachar")
     " may be used to change the character used as the comma. "
     (:I NIL "comma-interval") " must be an " (:TERM NIL "integer")
     " and defaults to 3. When the " (:TT NIL ":")
     " modifier is given to any of these directives, the " (:I NIL "commachar")
     " is printed between groups of " (:I NIL "comma-interval") " digits. "
     (:ENDISSUE NIL "FORMAT-COMMA-INTERVAL") " " :PAR
     "Thus the most general form of " (:TT NIL " D") " is "
     (:TT NIL " " (:I NIL "mincol") "," (:I NIL "padchar") ","
      (:I NIL "commachar") "," (:I NIL "comma-interval") "D")
     ". " :PAR (:ISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " (:TT NIL " D")
     " binds " (:VARREF NIL "*print-escape*") " to " (:TERM NIL "false") ", "
     (:VARREF NIL "*print-radix*") " to " (:TERM NIL "false") ", "
     (:VARREF NIL "*print-base*") " to " (:TT NIL "10") ", "
     (:ISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " and "
     (:VARREF NIL "*print-readably*") " to " (:TERM NIL "false") ". "
     (:ENDISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " "
     (:ENDISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde B: Binary"))
     (:IDXTEXT NIL "B (format directive)")
     (:IDXTEXT NIL "Tilde B (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 25") :PAR "This is just like " (:TT NIL " D")
     " but prints in binary radix (radix 2) instead of decimal. The full form is therefore "
     (:TT NIL " " (:I NIL "mincol") "," (:I NIL "padchar") ","
      (:I NIL "commachar") "," (:I NIL "comma-interval") "B")
     ". " :PAR (:ISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " (:TT NIL " B")
     " binds " (:VARREF NIL "*print-escape*") " to " (:TERM NIL "false") ", "
     (:VARREF NIL "*print-radix*") " to " (:TERM NIL "false") ", "
     (:VARREF NIL "*print-base*") " to " (:TT NIL "2") ", "
     (:ISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " and "
     (:VARREF NIL "*print-readably*") " to " (:TERM NIL "false") ". "
     (:ENDISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " "
     (:ENDISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde O: Octal"))
     (:IDXTEXT NIL "O (format directive)")
     (:IDXTEXT NIL "Tilde O (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 26") :PAR "This is just like " (:TT NIL " D")
     " but prints in octal radix (radix 8) instead of decimal. The full form is therefore "
     (:TT NIL " " (:I NIL "mincol") "," (:I NIL "padchar") ","
      (:I NIL "commachar") "," (:I NIL "comma-interval") "O")
     ". " :PAR (:ISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " (:TT NIL " O")
     " binds " (:VARREF NIL "*print-escape*") " to " (:TERM NIL "false") ", "
     (:VARREF NIL "*print-radix*") " to " (:TERM NIL "false") ", "
     (:VARREF NIL "*print-base*") " to " (:TT NIL "8") ", "
     (:ISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " and "
     (:VARREF NIL "*print-readably*") " to " (:TERM NIL "false") ". "
     (:ENDISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " "
     (:ENDISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde X: Hexadecimal"))
     (:IDXTEXT NIL "X (format directive)")
     (:IDXTEXT NIL "Tilde X (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 27") :PAR "This is just like " (:TT NIL " D")
     " but prints in hexadecimal radix (radix 16) instead of decimal. The full form is therefore "
     (:TT NIL " " (:I NIL "mincol") "," (:I NIL "padchar") ","
      (:I NIL "commachar") "," (:I NIL "comma-interval") "X")
     ". " :PAR (:ISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " (:TT NIL " X")
     " binds " (:VARREF NIL "*print-escape*") " to " (:TERM NIL "false") ", "
     (:VARREF NIL "*print-radix*") " to " (:TERM NIL "false") ", "
     (:VARREF NIL "*print-base*") " to " (:TT NIL "16") ", "
     (:ISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " and "
     (:VARREF NIL "*print-readably*") " to " (:TERM NIL "false") ". "
     (:ENDISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " "
     (:ENDISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("FORMAT Floating-Point Printers"))
    (:SUBSUBSECTION (:TITLE ("Tilde F: Fixed-Format Floating-Point"))
     (:IDXTEXT NIL "F (format directive)")
     (:IDXTEXT NIL "Tilde F (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 43") :PAR "The next " (:I NIL "arg")
     " is printed as a " (:TERM NIL "float") ". " :PAR
     (:COMMENT NIL "% 22.3.2 44") "The full form is "
     (:TT NIL " " (:I NIL "w") "," (:I NIL "d") "," (:I NIL "k") ","
      (:I NIL "overflowchar") "," (:I NIL "padchar") "F")
     ". The parameter " (:I NIL "w")
     " is the width of the field to be printed; " (:I NIL "d")
     " is the number of digits to print after the decimal point; " (:I NIL "k")
     " is a scale factor that defaults to zero. " :PAR
     (:COMMENT NIL "% 22.3.2 45") "Exactly " (:I NIL "w")
     " characters will be output. First, leading copies of the character "
     (:I NIL "padchar")
     " (which defaults to a space) are printed, if necessary, to pad the field on the left. If the "
     (:I NIL "arg") " is negative, then a minus sign is printed; if the "
     (:I NIL "arg")
     " is not negative, then a plus sign is printed if and only if the "
     (:TT NIL "@")
     " modifier was supplied. Then a sequence of digits, containing a single embedded decimal point, is printed; this represents the magnitude of the value of "
     (:I NIL "arg") " times "
     (:MATH NIL (:MSUP NIL (:MN NIL "10") (:MI (:FONT :I) "k")))
     ", rounded to " (:I NIL "d")
     " fractional digits. When rounding up and rounding down would produce printed values equidistant from the scaled value of "
     (:I NIL "arg")
     ", then the implementation is free to use either one. For example, printing the argument "
     (:TT NIL "6.375") " using the format " (:TT NIL " 4,2F")
     " may correctly produce either " (:TT NIL "6.37") " or " (:TT NIL "6.38")
     ". Leading zeros are not permitted, except that a single zero digit is output before the decimal point if the printed value is less than one, and this single zero digit is not output at all if "
     (:I NIL "w") "=" (:I NIL "d") "+1. " :PAR (:COMMENT NIL "% 22.3.2 46")
     "If it is impossible to print the value in the required format in a field of width "
     (:I NIL "w") ", then one of two actions is taken. If the parameter "
     (:I NIL "overflowchar") " is supplied, then " (:I NIL "w")
     " copies of that parameter are printed instead of the scaled value of "
     (:I NIL "arg") ". If the " (:I NIL "overflowchar")
     " parameter is omitted, then the scaled value is printed using more than "
     (:I NIL "w") " characters, as many more as may be needed. " :PAR
     (:COMMENT NIL "% 22.3.2 47") "If the " (:I NIL "w")
     " parameter is omitted, then the field is of variable width. In effect, a value is chosen for "
     (:I NIL "w")
     " in such a way that no leading pad characters need to be printed and exactly "
     (:I NIL "d")
     " characters will follow the decimal point. For example, the directive "
     (:TT NIL " ,2F")
     " will print exactly two digits after the decimal point and as many as necessary before the decimal point. "
     :PAR (:COMMENT NIL "% 22.3.2 48") "If the parameter " (:I NIL "d")
     " is omitted, then there is no constraint on the number of digits to appear after the decimal point. A value is chosen for "
     (:I NIL "d")
     " in such a way that as many digits as possible may be printed subject to the width constraint imposed by the parameter "
     (:I NIL "w")
     " and the constraint that no trailing zero digits may appear in the fraction, except that if the fraction to be printed is zero, then a single zero digit should appear after the decimal point if permitted by the width constraint. "
     :PAR (:COMMENT NIL "% 22.3.2 49") "If both " (:I NIL "w") " and "
     (:I NIL "d")
     " are omitted, then the effect is to print the value using ordinary free-format output; "
     (:FUNREF NIL "prin1")
     " uses this format for any number whose magnitude is either zero or between "
     (:MATH NIL
      (:MSUP NIL (:MN NIL "10") (:MROW NIL (:MO NIL "-") (:MN NIL "3"))))
     " (inclusive) and " (:MATH NIL (:MSUP NIL (:MN NIL "10") (:MN NIL "7")))
     " (exclusive). " :PAR (:COMMENT NIL "% 22.3.2 50") "If " (:I NIL "w")
     " is omitted, then if the magnitude of " (:I NIL "arg")
     " is so large (or, if " (:I NIL "d")
     " is also omitted, so small) that more than 100 digits would have to be printed, then an implementation is free, at its discretion, to print the number using exponential notation instead, as if by the directive "
     (:TT NIL " E") " (with all parameters to " (:TT NIL " E")
     " defaulted, not taking their values from the " (:TT NIL " F")
     " directive). " :PAR (:COMMENT NIL "% 22.3.2 51") "If " (:I NIL "arg")
     " is a " (:TERM NIL "rational") " number, then it is coerced to be a "
     (:TERM NIL "single float")
     " and then printed. Alternatively, an implementation is permitted to process a "
     (:TERM NIL "rational")
     " number by any other method that has essentially the same behavior but avoids loss of precision or overflow because of the coercion. If "
     (:I NIL "w") " and " (:I NIL "d")
     " are not supplied and the number has no exact decimal representation, for example "
     (:TT NIL "1/3")
     ", some precision cutoff must be chosen by the implementation since only a finite number of digits may be printed. "
     :PAR (:COMMENT NIL "% 22.3.2 52") "If " (:I NIL "arg") " is a "
     (:TERM NIL "complex") " number or some non-numeric " (:TERM NIL "object")
     ", then it is printed using the format directive "
     (:TT NIL " " (:I NIL "w") "D")
     ", thereby printing it in decimal radix and a minimum field width of "
     (:I NIL "w") ". " :PAR (:ISSUE NIL "FORMAT-PRETTY-PRINT:YES") " "
     (:TT NIL " F") " binds " (:VARREF NIL "*print-escape*") " to "
     (:TERM NIL "false") " " (:ISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " and "
     (:VARREF NIL "*print-readably*") " to " (:TERM NIL "false") ". "
     (:ENDISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " "
     (:ENDISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde E: Exponential Floating-Point"))
     (:IDXTEXT NIL "E (format directive)")
     (:IDXTEXT NIL "Tilde E (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 62") :PAR "The next " (:I NIL "arg")
     " is printed as a " (:TERM NIL "float") " in exponential notation. " :PAR
     (:COMMENT NIL "% 22.3.2 63") "The full form is "
     (:TT NIL " " (:I NIL "w") "," (:I NIL "d") "," (:I NIL "e") ","
      (:I NIL "k") "," (:I NIL "overflowchar") "," (:I NIL "padchar") ","
      (:I NIL "exponentchar") "E")
     ". The parameter " (:I NIL "w")
     " is the width of the field to be printed; " (:I NIL "d")
     " is the number of digits to print after the decimal point; " (:I NIL "e")
     " is the number of digits to use when printing the exponent; "
     (:I NIL "k") " is a scale factor that defaults to one (not zero). " :PAR
     (:COMMENT NIL "% 22.3.2 64") "Exactly " (:I NIL "w")
     " characters will be output. First, leading copies of the character "
     (:I NIL "padchar")
     " (which defaults to a space) are printed, if necessary, to pad the field on the left. If the "
     (:I NIL "arg") " is negative, then a minus sign is printed; if the "
     (:I NIL "arg")
     " is not negative, then a plus sign is printed if and only if the "
     (:TT NIL "@")
     " modifier was supplied. Then a sequence of digits containing a single embedded decimal point is printed. The form of this sequence of digits depends on the scale factor "
     (:I NIL "k") ". If " (:I NIL "k") " is zero, then " (:I NIL "d")
     " digits are printed after the decimal point, and a single zero digit appears before the decimal point if the total field width will permit it. If "
     (:I NIL "k") " is positive, then it must be strictly less than "
     (:I NIL "d") "+2; " (:I NIL "k")
     " significant digits are printed before the decimal point, and "
     (:I NIL "d") "− " (:I NIL "k")
     "+1 digits are printed after the decimal point. If " (:I NIL "k")
     " is negative, then it must be strictly greater than − " (:I NIL "d")
     "; a single zero digit appears before the decimal point if the total field width will permit it, and after the decimal point are printed first − "
     (:I NIL "k") " zeros and then " (:I NIL "d") "+" (:I NIL "k")
     " significant digits. The printed fraction must be properly rounded. When rounding up and rounding down would produce printed values equidistant from the scaled value of "
     (:I NIL "arg")
     ", then the implementation is free to use either one. For example, printing the argument "
     (:TT NIL "637.5") " using the format " (:TT NIL " 8,2E")
     " may correctly produce either " (:TT NIL "6.37E+2") " or "
     (:TT NIL "6.38E+2") ". " :PAR (:COMMENT NIL "% 22.3.2 65")
     "Following the digit sequence, the exponent is printed. First the character parameter "
     (:I NIL "exponentchar")
     " is printed; if this parameter is omitted, then the "
     (:TERM NIL "exponent marker") " that " (:FUNREF NIL "prin1")
     " would use is printed, as determined from the type of the "
     (:TERM NIL "float") " and the current value of "
     (:VARREF NIL "*read-default-float-format*")
     ". Next, either a plus sign or a minus sign is printed, followed by "
     (:I NIL "e")
     " digits representing the power of ten by which the printed fraction must be multiplied to properly represent the rounded value of "
     (:I NIL "arg") ". " :PAR (:COMMENT NIL "% 22.3.2 66")
     "If it is impossible to print the value in the required format in a field of width "
     (:I NIL "w") ", possibly because " (:I NIL "k")
     " is too large or too small or because the exponent cannot be printed in "
     (:I NIL "e")
     " character positions, then one of two actions is taken. If the parameter "
     (:I NIL "overflowchar") " is supplied, then " (:I NIL "w")
     " copies of that parameter are printed instead of the scaled value of "
     (:I NIL "arg") ". If the " (:I NIL "overflowchar")
     " parameter is omitted, then the scaled value is printed using more than "
     (:I NIL "w")
     " characters, as many more as may be needed; if the problem is that "
     (:I NIL "d") " is too small for the supplied " (:I NIL "k") " or that "
     (:I NIL "e") " is too small, then a larger value is used for "
     (:I NIL "d") " or " (:I NIL "e") " as may be needed. " :PAR
     (:COMMENT NIL "% 22.3.2 67") "If the " (:I NIL "w")
     " parameter is omitted, then the field is of variable width. In effect a value is chosen for "
     (:I NIL "w")
     " in such a way that no leading pad characters need to be printed. " :PAR
     (:COMMENT NIL "% 22.3.2 68") "If the parameter " (:I NIL "d")
     " is omitted, then there is no constraint on the number of digits to appear. A value is chosen for "
     (:I NIL "d")
     " in such a way that as many digits as possible may be printed subject to the width constraint imposed by the parameter "
     (:I NIL "w") ", the constraint of the scale factor " (:I NIL "k")
     ", and the constraint that no trailing zero digits may appear in the fraction, except that if the fraction to be printed is zero then a single zero digit should appear after the decimal point. "
     :PAR (:COMMENT NIL "% 22.3.2 69") "If the parameter " (:I NIL "e")
     " is omitted, then the exponent is printed using the smallest number of digits necessary to represent its value. "
     :PAR (:COMMENT NIL "% 22.3.2 70") "If all of " (:I NIL "w") ", "
     (:I NIL "d") ", and " (:I NIL "e")
     " are omitted, then the effect is to print the value using ordinary free-format exponential-notation output; "
     (:FUNREF NIL "prin1") " uses "
     (:ISSUE NIL "FORMAT-E-EXPONENT-SIGN:FORCE-SIGN") " a similar "
     (:ENDISSUE NIL "FORMAT-E-EXPONENT-SIGN:FORCE-SIGN")
     " format for any non-zero number whose magnitude is less than "
     (:MATH NIL
      (:MSUP NIL (:MN NIL "10") (:MROW NIL (:MO NIL "-") (:MN NIL "3"))))
     " or greater than or equal to "
     (:MATH NIL (:MSUP NIL (:MN NIL "10") (:MN NIL "7"))) ". "
     (:ISSUE NIL "FORMAT-E-EXPONENT-SIGN:FORCE-SIGN")
     " The only difference is that the " (:TT NIL " E")
     " directive always prints a plus or minus sign in front of the exponent, while "
     (:FUNREF NIL "prin1")
     " omits the plus sign if the exponent is non-negative. "
     (:ENDISSUE NIL "FORMAT-E-EXPONENT-SIGN:FORCE-SIGN") " " :PAR
     (:COMMENT NIL "% 22.3.2 71       ") "If " (:I NIL "arg") " is a "
     (:TERM NIL "rational") " number, then it is coerced to be a "
     (:TERM NIL "single float")
     " and then printed. Alternatively, an implementation is permitted to process a "
     (:TERM NIL "rational")
     " number by any other method that has essentially the same behavior but avoids loss of precision or overflow because of the coercion. If "
     (:I NIL "w") " and " (:I NIL "d")
     " are unsupplied and the number has no exact decimal representation, for example "
     (:TT NIL "1/3")
     ", some precision cutoff must be chosen by the implementation since only a finite number of digits may be printed. "
     :PAR (:COMMENT NIL "% 22.3.2 72") "If " (:I NIL "arg") " is a "
     (:TERM NIL "complex") " number or some non-numeric " (:TERM NIL "object")
     ", then it is printed using the format directive "
     (:TT NIL " " (:I NIL "w") "D")
     ", thereby printing it in decimal radix and a minimum field width of "
     (:I NIL "w") ". " :PAR (:ISSUE NIL "FORMAT-PRETTY-PRINT:YES") " "
     (:TT NIL " E") " binds " (:VARREF NIL "*print-escape*") " to "
     (:TERM NIL "false") " " (:ISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " and "
     (:VARREF NIL "*print-readably*") " to " (:TERM NIL "false") ". "
     (:ENDISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " "
     (:ENDISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde G: General Floating-Point"))
     (:IDXTEXT NIL "G (format directive)")
     (:IDXTEXT NIL "Tilde G (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 82") :PAR "The next " (:I NIL "arg")
     " is printed as a " (:TERM NIL "float")
     " in either fixed-format or exponential notation as appropriate. " :PAR
     (:COMMENT NIL "% 22.3.2 83") "The full form is "
     (:TT NIL " " (:I NIL "w") "," (:I NIL "d") "," (:I NIL "e") ","
      (:I NIL "k") "," (:I NIL "overflowchar") "," (:I NIL "padchar") ","
      (:I NIL "exponentchar") "G")
     ". The format in which to print " (:I NIL "arg")
     " depends on the magnitude (absolute value) of the " (:I NIL "arg")
     ". Let " (:I NIL "n") " be an integer such that "
     (:MATH NIL
      (:MSUP NIL (:MN NIL "10")
       (:MROW NIL (:MI (:FONT :I) "n") (:MO NIL "-") (:MN NIL "1"))))
     " " (:MATH NIL (:MO NIL "≤")) " |" (:I NIL "arg") "| < "
     (:MATH NIL (:MSUP NIL (:MN NIL "10") (:MI (:FONT :I) "n"))) ". Let "
     (:I NIL "ee") " equal " (:I NIL "e") "+2, or 4 if " (:I NIL "e")
     " is omitted. Let " (:I NIL "ww") " equal " (:I NIL "w") "− "
     (:I NIL "ee") ", or " (:MISC NIL "nil") " if " (:I NIL "w")
     " is omitted. If " (:I NIL "d") " is omitted, first let " (:I NIL "q")
     " be the number of digits needed to print " (:I NIL "arg")
     " with no loss of information and without leading or trailing zeros; then let "
     (:I NIL "d") " equal "
     (:TT NIL "(max " (:I NIL "q") " (min " (:I NIL "n") " 7))") ". Let "
     (:I NIL "dd") " equal " (:I NIL "d") "− " (:I NIL "n") ". " :PAR
     (:COMMENT NIL "% 22.3.2 84") "If 0 " (:MATH NIL (:MO NIL "≤")) " "
     (:I NIL "dd") " " (:MATH NIL (:MO NIL "≤")) " " (:I NIL "d") ", then "
     (:I NIL "arg") " is printed as if by the format directives " :PAR
     (:COMMENT NIL "!!! \",,\" ??? -kmp 12-May-91")
     (:TT NIL " " (:I NIL "ww") "," (:I NIL "dd") ",," (:I NIL "overflowchar")
      "," (:I NIL "padchar") "F " (:I NIL "ee") "@T")
     " " :PAR "Note that the scale factor " (:I NIL "k")
     " is not passed to the " (:TT NIL " F")
     " directive. For all other values of " (:I NIL "dd") ", " (:I NIL "arg")
     " is printed as if by the format directive " :PAR
     (:TT NIL " " (:I NIL "w") "," (:I NIL "d") "," (:I NIL "e") ","
      (:I NIL "k") "," (:I NIL "overflowchar") "," (:I NIL "padchar") ","
      (:I NIL "exponentchar") "E")
     " " :PAR (:COMMENT NIL "% 22.3.2 85               ") "In either case, an "
     (:TT NIL "@") " modifier is supplied to the " (:TT NIL " F") " or "
     (:TT NIL " E") " directive if and only if one was supplied to the "
     (:TT NIL " G") " directive. " :PAR (:ISSUE NIL "FORMAT-PRETTY-PRINT:YES")
     " " (:TT NIL " G") " binds " (:VARREF NIL "*print-escape*") " to "
     (:TERM NIL "false") " " (:ISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " and "
     (:VARREF NIL "*print-readably*") " to " (:TERM NIL "false") ". "
     (:ENDISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " "
     (:ENDISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde Dollarsign: Monetary Floating-Point"))
     (:IDXTEXT NIL "Dollarsign (format directive)")
     (:IDXTEXT NIL "Tilde Dollarsign (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 90") :PAR "The next " (:I NIL "arg")
     " is printed as a " (:TERM NIL "float") " in fixed-format notation. " :PAR
     (:COMMENT NIL "% 22.3.2 91") "The full form is "
     (:TT NIL " " (:I NIL "d") "," (:I NIL "n") "," (:I NIL "w") ","
      (:I NIL "padchar") "$")
     ". The parameter " (:I NIL "d")
     " is the number of digits to print after the decimal point (default value 2); "
     (:I NIL "n")
     " is the minimum number of digits to print before the decimal point (default value 1); "
     (:I NIL "w")
     " is the minimum total width of the field to be printed (default value 0). "
     :PAR (:COMMENT NIL "% 22.3.2 92")
     "First padding and the sign are output. If the " (:I NIL "arg")
     " is negative, then a minus sign is printed; if the " (:I NIL "arg")
     " is not negative, then a plus sign is printed if and only if the "
     (:TT NIL "@") " modifier was supplied. If the " (:TT NIL ":")
     " modifier is used, the sign appears before any padding, and otherwise after the padding. If "
     (:I NIL "w")
     " is supplied and the number of other characters to be output is less than "
     (:I NIL "w") ", then copies of " (:I NIL "padchar")
     " (which defaults to a space) are output to make the total field width equal "
     (:I NIL "w") ". Then " (:I NIL "n")
     " digits are printed for the integer part of " (:I NIL "arg")
     ", with leading zeros if necessary; then a decimal point; then "
     (:I NIL "d") " digits of fraction, properly rounded. " :PAR
     (:COMMENT NIL "% 22.3.2 93") "If the magnitude of " (:I NIL "arg")
     " is so large that more than " (:I NIL "m")
     " digits would have to be printed, where " (:I NIL "m")
     " is the larger of " (:I NIL "w")
     " and 100, then an implementation is free, at its discretion, to print the number using exponential notation instead, as if by the directive "
     (:TT NIL " " (:I NIL "w") "," (:I NIL "q") ",,,," (:I NIL "padchar") "E")
     ", where " (:I NIL "w") " and " (:I NIL "padchar")
     " are present or omitted according to whether they were present or omitted in the "
     (:TT NIL " $") " directive, and where " (:I NIL "q") "=" (:I NIL "d") "+"
     (:I NIL "n") "− 1, where " (:I NIL "d") " and " (:I NIL "n")
     " are the (possibly default) values given to the " (:TT NIL " $")
     " directive. " :PAR (:COMMENT NIL "% 22.3.2 94") "If " (:I NIL "arg")
     " is a " (:TERM NIL "rational") " number, then it is coerced to be a "
     (:TERM NIL "single float")
     " and then printed. Alternatively, an implementation is permitted to process a "
     (:TERM NIL "rational")
     " number by any other method that has essentially the same behavior but avoids loss of precision or overflow because of the coercion. "
     :PAR (:COMMENT NIL "% 22.3.2 95") "If " (:I NIL "arg") " is a "
     (:TERM NIL "complex") " number or some non-numeric " (:TERM NIL "object")
     ", then it is printed using the format directive "
     (:TT NIL " " (:I NIL "w") "D")
     ", thereby printing it in decimal radix and a minimum field width of "
     (:I NIL "w") ". " :PAR (:ISSUE NIL "FORMAT-PRETTY-PRINT:YES") " "
     (:TT NIL " $") " binds " (:VARREF NIL "*print-escape*") " to "
     (:TERM NIL "false") " " (:ISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " and "
     (:VARREF NIL "*print-readably*") " to " (:TERM NIL "false") ". "
     (:ENDISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " " :PAR
     (:ENDISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("FORMAT Printer Operations") :TAGS (:FORMAT-PRINTER-OPS)) " " :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde A: Aesthetic"))
     (:IDXTEXT NIL "A (format directive)")
     (:IDXTEXT NIL "Tilde A (format directive)") " " :PAR
     (:COMMENT NIL
      "% A originally stood for ASCII. This seems like a bad mnemonic in a portable standard."
      "% Replaced it with \"Aesthetic\". -kmp 30-Aug-93")
     :PAR (:COMMENT NIL "% 22.3.2 16") :PAR "An " (:I NIL "arg") ", any "
     (:TERM NIL "object") ", is printed without escape characters (as by "
     (:FUNREF NIL "princ") "). If " (:I NIL "arg") " is a "
     (:TERM NIL "string") ", its " (:TERM NIL "characters")
     " will be output verbatim. If " (:I NIL "arg") " is " (:MISC NIL "nil")
     " it will be printed as " (:MISC NIL "nil") "; the " (:TERM NIL "colon")
     " modifier (" (:TT NIL " :A") ") will cause an " (:I NIL "arg") " of "
     (:MISC NIL "nil") " to be printed as " (:TT NIL " ()") ", but if "
     (:I NIL "arg") " is a composite structure, such as a " (:TERM NIL "list")
     " or " (:TERM NIL "vector") ", any contained occurrences of "
     (:MISC NIL "nil") " will still be printed as " (:MISC NIL "nil") ". " :PAR
     (:COMMENT NIL "% 22.3.2 17") (:TT NIL " " (:I NIL "mincol") "A")
     " inserts spaces on the right, if necessary, to make the width at least "
     (:I NIL "mincol") " columns. The " (:TT NIL "@")
     " modifier causes the spaces to be inserted on the left rather than the right. "
     :PAR (:COMMENT NIL "% 22.3.2 18")
     (:TT NIL " " (:I NIL "mincol") "," (:I NIL "colinc") "," (:I NIL "minpad")
      "," (:I NIL "padchar") "A")
     " is the full form of " (:TT NIL " A")
     ", which allows control of the padding. The " (:TERM NIL "string")
     " is padded on the right (or on the left if the " (:TT NIL "@")
     " modifier is used) with at least " (:I NIL "minpad") " copies of "
     (:I NIL "padchar") "; padding characters are then inserted "
     (:I NIL "colinc")
     " characters at a time until the total width is at least "
     (:I NIL "mincol") ". The defaults are " (:TT NIL "0") " for "
     (:I NIL "mincol") " and " (:I NIL "minpad") ", " (:TT NIL "1") " for "
     (:I NIL "colinc") ", and the space character for " (:I NIL "padchar") ". "
     :PAR (:ISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " (:TT NIL " A") " binds "
     (:VARREF NIL "*print-escape*") " to " (:TERM NIL "false") ", "
     (:ISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " and "
     (:VARREF NIL "*print-readably*") " to " (:TERM NIL "false") ". "
     (:ENDISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " "
     (:ENDISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde S: Standard"))
     (:IDXTEXT NIL "S (format directive)")
     (:IDXTEXT NIL "Tilde S (format directive)") " " :PAR
     (:COMMENT NIL
      "% S originally stood for S-expression, a term which no longer has any meaning."
      "% Replaced it with \"Standard\", since this is the standard lisp representation."
      "% -kmp 30-Aug-93")
     :PAR (:COMMENT NIL "% 22.3.2 19") :PAR "This is just like " (:TT NIL " A")
     ", but " (:I NIL "arg") " is printed with escape characters (as by "
     (:FUNREF NIL "prin1") " rather than " (:TT NIL "princ")
     "). The output is therefore suitable for input to " (:FUNREF NIL "read")
     ". " (:TT NIL " S") " accepts all the arguments and modifiers that "
     (:TT NIL " A") " does. " :PAR (:ISSUE NIL "FORMAT-PRETTY-PRINT:YES") " "
     (:TT NIL " S") " binds " (:VARREF NIL "*print-escape*") " to "
     (:MISC NIL "t") ". " (:ENDISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " :PAR)
    :PAR (:ISSUE NIL "PRETTY-PRINT-INTERFACE") " "
    (:SUBSUBSECTION (:TITLE ("Tilde W: Write"))
     (:IDXTEXT NIL "W (format directive)")
     (:IDXTEXT NIL "Tilde W (format directive)") " " :PAR "An argument, any "
     (:TERM NIL "object")
     ", is printed obeying every printer control variable (as by "
     (:FUNREF NIL "write") "). In addition, " (:TT NIL " W")
     " interacts correctly with depth abbreviation, by not resetting the depth counter to zero. "
     (:TT NIL " W") " does not accept parameters. If given the "
     (:TERM NIL "colon") " modifier, " (:TT NIL " W") " binds "
     (:VARREF NIL "*print-pretty*") " to " (:TERM NIL "true") ". If given the "
     (:TERM NIL "at-sign") " modifier, " (:TT NIL " W") " binds "
     (:VARREF NIL "*print-level*") " and " (:VARREF NIL "*print-length*")
     " to " (:MISC NIL "nil") ". " :PAR (:TT NIL " W")
     " provides automatic support for the detection of circularity and sharing. If the "
     (:TERM NIL "value") " of " (:VARREF NIL "*print-circle*") " is not "
     (:MISC NIL "nil") " and " (:TT NIL " W")
     " is applied to an argument that is a circular (or shared) reference, an appropriate "
     (:TT NIL "#" (:PARAM NIL "n") "#")
     " marker is inserted in the output instead of printing the argument. "
     :PAR)
    (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("FORMAT Pretty Printer Operations"))
    (:ISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR
    "The following constructs provide access to the "
    (:TERM NIL "pretty printer") ": " :PAR
    (:SUBSUBSECTION
     (:TITLE ("Tilde Underscore: Conditional Newline") :TAGS
      (:TILDE-UNDERSCORE))
     " " (:IDXTEXT NIL "Underscore (format directive)")
     (:IDXTEXT NIL "Tilde Underscore (format directive)") " " :PAR
     "Without any modifiers, " (:TT NIL " _") " is the same as "
     (:TT NIL "(pprint-newline :linear)") ". " (:TT NIL " @_")
     " is the same as " (:TT NIL "(pprint-newline :miser)") ". "
     (:TT NIL " :_") " is the same as " (:TT NIL "(pprint-newline :fill)") ". "
     (:TT NIL " :@_") " is the same as "
     (:TT NIL "(pprint-newline :mandatory)") ". " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Tilde Less-Than-Sign: Logical Block") :TAGS
      (:TILDE-LESS-THAN-LOGICAL-BLOCK))
     " " (:IDXTEXT NIL "Less-Than-Sign (format directive)")
     (:IDXTEXT NIL "Tilde Less-Than-Sign (format directive)") " " :PAR
     (:TT NIL " <... :>") " " :PAR "If " (:TT NIL " :>")
     " is used to terminate a " (:TT NIL " <... >")
     ", the directive is equivalent to a call to "
     (:MACREF NIL "pprint-logical-block")
     ". The argument corresponding to the " (:TT NIL " <... :>")
     " directive is treated in the same way as the " (:TERM NIL "list")
     " argument to " (:MACREF NIL "pprint-logical-block")
     ", thereby providing automatic support for non-" (:TERM NIL "list")
     " arguments and the detection of circularity, sharing, and depth abbreviation. The portion of the "
     (:PARAM NIL "control-string") " nested within the " (:TT NIL " <... :>")
     " specifies the " (:KWD NIL "prefix") " (or " (:KWD NIL "per-line-prefix")
     "), " (:KWD NIL "suffix") ", and body of the "
     (:MACREF NIL "pprint-logical-block") ". " :PAR "The "
     (:PARAM NIL "control-string") " portion enclosed by " (:TT NIL " <... :>")
     " can be divided into segments "
     (:TT NIL " <" (:PARAM NIL "prefix") " ;" (:PARAM NIL "body") " ;"
      (:PARAM NIL "suffix") " :>")
     " by " (:TT NIL " ;")
     " directives. If the first section is terminated by " (:TT NIL " @;")
     ", it specifies a per-line prefix rather than a simple prefix. The "
     (:PARAM NIL "prefix") " and " (:PARAM NIL "suffix")
     " cannot contain format directives. An error is signaled if either the prefix or suffix fails to be a constant string or if the enclosed portion is divided into more than three segments. "
     :PAR "If the enclosed portion is divided into only two segments, the "
     (:PARAM NIL "suffix")
     " defaults to the null string. If the enclosed portion consists of only a single segment, both the "
     (:PARAM NIL "prefix") " and the " (:PARAM NIL "suffix")
     " default to the null string. If the " (:TERM NIL "colon")
     " modifier is used (" (:I NIL "i.e.") ",  " (:TT NIL " :<... :>")
     "), the " (:PARAM NIL "prefix") " and " (:PARAM NIL "suffix")
     " default to " (:TT NIL "\"(\"") " and " (:TT NIL "\")\"")
     " (respectively) instead of the null string. " :PAR
     "The body segment can be any arbitrary " (:TERM NIL "format string")
     ". This " (:TERM NIL "format string")
     " is applied to the elements of the list corresponding to the "
     (:TT NIL " <... :>")
     " directive as a whole. Elements are extracted from this list using "
     (:MACREF NIL "pprint-pop")
     ", thereby providing automatic support for malformed lists, and the detection of circularity, sharing, and length abbreviation. Within the body segment, "
     (:TT NIL " ^") " acts like " (:MACREF NIL "pprint-exit-if-list-exhausted")
     ". " :PAR (:TT NIL " <... :>") " supports a feature not supported by "
     (:MACREF NIL "pprint-logical-block") ". If " (:TT NIL " :@>")
     " is used to terminate the directive (" (:I NIL "i.e.") ",  "
     (:TT NIL " <... :@>")
     "), then a fill-style conditional newline is automatically inserted after each group of blanks immediately contained in the body (except for blanks after a  "
     (:ANG NIL "Newline")
     " directive). This makes it easy to achieve the equivalent of paragraph filling. "
     :PAR "If the " (:TERM NIL "at-sign") " modifier is used with "
     (:TT NIL " <... :>")
     ", the entire remaining argument list is passed to the directive as its argument. All of the remaining arguments are always consumed by "
     (:TT NIL " @<... :>") ", even if they are not all used by the "
     (:TERM NIL "format string")
     " nested in the directive. Other than the difference in its argument, "
     (:TT NIL " @<... :>") " is exactly the same as " (:TT NIL " <... :>")
     " except that circularity detection is not applied if "
     (:TT NIL " @<... :>") " is encountered at top level in a "
     (:TERM NIL "format string")
     ". This ensures that circularity detection is applied only to data lists, not to "
     (:TERM NIL "format argument") " " (:TERM NIL "lists") ". " :PAR
     (:TT NIL "\" . #" (:PARAM NIL "n") "#\"")
     " is printed if circularity or sharing has to be indicated for its argument as a whole. "
     :PAR "To a considerable extent, the basic form of the directive "
     (:TT NIL " <... >")
     " is incompatible with the dynamic control of the arrangement of output by "
     (:TT NIL " W") ", " (:TT NIL " _") ", " (:TT NIL " <... :>") ", "
     (:TT NIL " I") ", and " (:TT NIL " :T")
     ". As a result, an error is signaled if any of these directives is nested within "
     (:TT NIL " <... >") ". Beyond this, an error is also signaled if the "
     (:TT NIL " <... :;... >") " form of " (:TT NIL " <... >")
     " is used in the same " (:TERM NIL "format string") " with "
     (:TT NIL " W") ", " (:TT NIL " _") ", " (:TT NIL " <... :>") ", "
     (:TT NIL " I") ", or " (:TT NIL " :T") ". " :PAR "See also "
     (:SECREF NIL :TILDE-LESS-THAN-JUSTIFICATION) ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde I: Indent") :TAGS (:TILDE-I)) " "
     (:IDXTEXT NIL "I (format directive)")
     (:IDXTEXT NIL "Tilde I (format directive)") " " :PAR
     (:TT NIL " " (:PARAM NIL "n") "I") " is the same as "
     (:TT NIL "(pprint-indent :block n)") ". " :PAR
     (:TT NIL " " (:PARAM NIL "n") ":I") " is the same as "
     (:TT NIL "(pprint-indent :current n)") ". In both cases, "
     (:PARAM NIL "n") " defaults to zero, if it is omitted. " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde Slash: Call Function"))
     (:IDXTEXT NIL "Slash (format directive)")
     (:IDXTEXT NIL "Tilde Slash (format directive)") " " :PAR
     (:TT NIL " /" (:PARAM NIL "name") "/") " " :PAR
     "User defined functions can be called from within a format string by using the directive "
     (:TT NIL " /" (:PARAM NIL "name") "/") ". The " (:TERM NIL "colon")
     " modifier, the " (:TERM NIL "at-sign")
     " modifier, and arbitrarily many parameters can be specified with the "
     (:TT NIL " /" (:PARAM NIL "name") "/") " directive. " (:PARAM NIL "name")
     " can be any arbitrary string that does not contain a \"/\". All of the characters in "
     (:PARAM NIL "name") " are treated as if they were upper case. If "
     (:PARAM NIL "name") " contains a single " (:TERM NIL "colon") " ("
     (:TT NIL ":") ") or double " (:TERM NIL "colon") " (" (:TT NIL "::")
     "), then everything up to but not including the first " (:TT NIL "\":\"")
     " or " (:TT NIL "\"::\"") " is taken to be a " (:TERM NIL "string")
     " that names a " (:TERM NIL "package") ". Everything after the first "
     (:TT NIL "\":\"") " or " (:TT NIL "\"::\"") " (if any) is taken to be a "
     (:TERM NIL "string") " that names a " (:TT NIL "symbol")
     ". The function corresponding to a " (:TT NIL " /name/")
     " directive is obtained by looking up the " (:TERM NIL "symbol")
     " that has the indicated name in the indicated " (:TERM NIL "package")
     ". If " (:PARAM NIL "name") " does not contain a " (:TT NIL "\":\"")
     " or " (:TT NIL "\"::\"") ", "
     (:COMMENT NIL
      "then the whole \\param{name} string is looked up in \\thepackage{user}.")
     "then the whole " (:PARAM NIL "name") " string is looked up in the "
     (:PACKREF NIL "common-lisp-user") " " (:TERM NIL "package") ". " :PAR
     "When a " (:TT NIL " /name/")
     " directive is encountered, the indicated function is called with four or more arguments. The first four arguments are: the output stream, the "
     (:TERM NIL "format argument") " corresponding to the directive, a "
     (:TERM NIL "generalized boolean") " that is " (:TERM NIL "true")
     " if the " (:TERM NIL "colon") " modifier was used, and a "
     (:TERM NIL "generalized boolean") " that is " (:TERM NIL "true")
     " if the " (:TERM NIL "at-sign")
     " modifier was used. The remaining arguments consist of any parameters specified with the directive. The function should print the argument appropriately. Any values returned by the function are ignored. "
     :PAR "The three " (:TERM NIL "functions") " "
     (:FUNREF NIL "pprint-linear") ", " (:FUNREF NIL "pprint-fill") ", and "
     (:FUNREF NIL "pprint-tabular")
     " are specifically designed so that they can be called by "
     (:TT NIL " /.../") " (" (:I NIL "i.e.") ",  " (:TT NIL " /pprint-linear/")
     ", " (:TT NIL " /pprint-fill/") ", and " (:TT NIL " /pprint-tabular/")
     "). In particular they take " (:TERM NIL "colon") " and "
     (:TERM NIL "at-sign") " arguments. " :PAR
     (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("FORMAT Layout Control"))
    (:SUBSUBSECTION (:TITLE ("Tilde T: Tabulate"))
     (:IDXTEXT NIL "T (format directive)")
     (:IDXTEXT NIL "Tilde T (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 102       ") :PAR
     "This spaces over to a given column. "
     (:TT NIL " " (:I NIL "colnum") "," (:I NIL "colinc") "T")
     " will output sufficient spaces to move the cursor to column "
     (:I NIL "colnum") ". If the cursor is already at or beyond column "
     (:I NIL "colnum") ", it will output spaces to move it to column "
     (:I NIL "colnum") "+" (:I NIL "k") "*" (:I NIL "colinc")
     " for the smallest positive integer " (:I NIL "k") " possible, unless "
     (:I NIL "colinc")
     " is zero, in which case no spaces are output if the cursor is already at or beyond column "
     (:I NIL "colnum") ". " (:I NIL "colnum") " and " (:I NIL "colinc")
     " default to " (:TT NIL "1") ". " :PAR (:COMMENT NIL "% 22.3.2 103")
     "If for some reason the current absolute column position cannot be determined by direct inquiry, "
     (:FUNREF NIL "format")
     " may be able to deduce the current column position by noting that certain directives (such as "
     (:TT NIL " %") ", or " (:TT NIL " &") ", or " (:TT NIL " A")
     " with the argument being a string containing a newline) cause the column position to be reset to zero, and counting the number of characters emitted since that point. If that fails, "
     (:FUNREF NIL "format")
     " may attempt a similar deduction on the riskier assumption that the destination was at column zero when "
     (:FUNREF NIL "format")
     " was invoked. If even this heuristic fails or is implementationally inconvenient, at worst the "
     (:TT NIL " T") " operation will simply output two spaces. " :PAR
     (:COMMENT NIL "% 22.3.2 104              ") (:TT NIL " @T")
     " performs relative tabulation. "
     (:TT NIL " " (:I NIL "colrel") "," (:I NIL "colinc") "@T") " outputs "
     (:I NIL "colrel")
     " spaces and then outputs the smallest non-negative number of additional spaces necessary to move the cursor to a column that is a multiple of "
     (:I NIL "colinc") ". For example, the directive " (:TT NIL " 3,8@T")
     " outputs three spaces and then moves the cursor to a “standard multiple-of-eight tab stop” if not at one already. If the current output column cannot be determined, however, then "
     (:I NIL "colinc") " is ignored, and exactly " (:I NIL "colrel")
     " spaces are output. " :PAR "If the " (:TERM NIL "colon")
     " modifier is used with the " (:TT NIL " T")
     " directive, the tabbing computation is done relative to the horizontal position where the section immediately containing the directive begins, rather than with respect to a horizontal position of zero. The numerical parameters are both interpreted as being in units of "
     (:TERM NIL "ems") " and both default to " (:TT NIL "1") ". "
     (:TT NIL " " (:PARAM NIL "n") "," (:PARAM NIL "m") ":T")
     " is the same as "
     (:TT NIL "(pprint-tab :section " (:PARAM NIL "n") " " (:PARAM NIL "m")
      ")")
     ". " (:TT NIL " " (:PARAM NIL "n") "," (:PARAM NIL "m") ":@T")
     " is the same as "
     (:TT NIL "(pprint-tab :section-relative " (:PARAM NIL "n") " "
      (:PARAM NIL "m") ")")
     ". " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Tilde Less-Than-Sign: Justification") :TAGS
      (:TILDE-LESS-THAN-JUSTIFICATION))
     " " (:IDXTEXT NIL "Less-Than-Sign (format directive)")
     (:IDXTEXT NIL "Tilde Less-Than-Sign (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 136                           ")
     (:TT NIL " " (:I NIL "mincol") "," (:I NIL "colinc") "," (:I NIL "minpad")
      "," (:I NIL "padchar") "<" (:I NIL "str") " >")
     " " :PAR "This justifies the text produced by processing " (:I NIL "str")
     " within a field at least " (:I NIL "mincol") " columns wide. "
     (:I NIL "str") " may be divided up into segments with " (:TT NIL " ;")
     ", in which case the spacing is evenly divided between the text segments. "
     :PAR (:COMMENT NIL "% 22.3.2 137")
     "With no modifiers, the leftmost text segment is left justified in the field, and the rightmost text segment is right justified. If there is only one text element, as a special case, it is right justified. The "
     (:TT NIL ":")
     " modifier causes spacing to be introduced before the first text segment; the "
     (:TT NIL "@") " modifier causes spacing to be added after the last. The "
     (:I NIL "minpad") " parameter (default " (:TT NIL "0")
     ") is the minimum number of padding characters to be output between each segment. The padding character is supplied by "
     (:I NIL "padchar")
     ", which defaults to the space character. If the total width needed to satisfy these constraints is greater than "
     (:I NIL "mincol") ", then the width used is " (:I NIL "mincol") "+"
     (:I NIL "k") "*" (:I NIL "colinc")
     " for the smallest possible non-negative integer value " (:I NIL "k") ". "
     (:I NIL "colinc") " defaults to " (:TT NIL "1") ", and " (:I NIL "mincol")
     " defaults to " (:TT NIL "0") ". " :PAR (:COMMENT NIL "% 22.3.2 139")
     "Note that " (:I NIL "str") " may include " (:FUNREF NIL "format")
     " directives. All the clauses in " (:I NIL "str")
     " are processed in order; it is the resulting pieces of text that are justified. "
     :PAR (:COMMENT NIL "% 22.3.2 140      ") "The " (:TT NIL " ^ ")
     " directive may be used to terminate processing of the clauses prematurely, in which case only the completely processed clauses are justified. "
     :PAR (:COMMENT NIL "% 22.3.2 141                           ")
     "If the first clause of a " (:TT NIL " <") " is terminated with "
     (:TT NIL " :;") " instead of " (:TT NIL " ;")
     ", then it is used in a special way. All of the clauses are processed (subject to "
     (:TT NIL " ^ ")
     ", of course), but the first one is not used in performing the spacing and padding. When the padded result has been determined, then if it will fit on the current line of output, it is output, and the text for the first clause is discarded. If, however, the padded text will not fit on the current line, then the text segment for the first clause is output before the padded text. The first clause ought to contain a newline (such as a "
     (:TT NIL " %")
     " directive). The first clause is always processed, and so any arguments it refers to will be used; the decision is whether to use the resulting segment of text, not whether to process the first clause. If the "
     (:TT NIL " :;") " has a prefix parameter " (:I NIL "n")
     ", then the padded text must fit on the current line with " (:I NIL "n")
     " character positions to spare to avoid outputting the first clause's text. For example, the control string "
     :PAR
     (:CODE NIL " \"~%;; ~{ ~<~%;; ~1:; ~S~>~^ ,~} .~%\"
")
     " " :PAR
     "can be used to print a list of items separated by commas without breaking items over line boundaries, beginning each line with "
     (:TT NIL ";; ") ". The prefix parameter " (:TT NIL "1") " in "
     (:TT NIL " 1:;")
     " accounts for the width of the comma that will follow the justified item if it is not the last element in the list, or the period if it is. If "
     (:TT NIL " :;")
     " has a second prefix parameter, then it is used as the width of the line, thus overriding the natural line width of the output stream. To make the preceding example use a line width of 50, one would write "
     :PAR
     (:CODE NIL " \"~%;; ~{ ~<~%;; ~1,50:; ~S~>~^ ,~}  .~%\"
")
     " " (:COMMENT NIL "% 22.3.2 142")
     "If the second argument is not supplied, then " (:FUNREF NIL "format")
     " uses the line width of the " (:PARAM NIL "destination")
     " output stream. If this cannot be determined (for example, when producing a "
     (:TERM NIL "string") " result), then " (:FUNREF NIL "format") " uses "
     (:TT NIL "72") " as the line length. " :PAR "See also "
     (:SECREF NIL :TILDE-LESS-THAN-LOGICAL-BLOCK) ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde Greater-Than-Sign: End of Justification"))
     (:IDXTEXT NIL "Greater-Than-Sign (format directive)")
     (:IDXTEXT NIL "Tilde Greater-Than-Sign (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 143       ") :PAR (:TT NIL " >") " terminates a "
     (:TT NIL " <") ". The consequences of using it elsewhere are undefined. "
     :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("FORMAT Control-Flow Operations"))
    (:SUBSUBSECTION (:TITLE ("Tilde Asterisk: Go-To"))
     (:IDXTEXT NIL "Asterisk (format directive)")
     (:IDXTEXT NIL "Tilde Asterisk (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 105       ") :PAR "The next " (:I NIL "arg")
     " is ignored. " (:TT NIL " " (:I NIL "n") "*") " ignores the next "
     (:I NIL "n") " arguments. " :PAR (:COMMENT NIL "% 22.3.2 106   ")
     (:TT NIL " :*")
     " backs up in the list of arguments so that the argument last processed will be processed again. "
     (:TT NIL " " (:I NIL "n") ":*") " backs up " (:I NIL "n") " arguments. "
     :PAR (:COMMENT NIL "% 22.3.2 107                        ")
     "When within a " (:TT NIL " {")
     " construct (see below), the ignoring (in either direction) is relative to the list of arguments being processed by the iteration. "
     :PAR (:COMMENT NIL "% 22.3.2 108       ") (:TT NIL " " (:I NIL "n") "@*")
     " goes to the " (:I NIL "n") "th " (:I NIL "arg")
     ", where 0 means the first one; " (:I NIL "n") " defaults to 0, so "
     (:TT NIL " @*") " goes back to the first " (:I NIL "arg")
     ". Directives after a " (:TT NIL " " (:I NIL "n") "@*")
     " will take arguments in sequence beginning with the one gone to. When within a "
     (:TT NIL " {")
     " construct, the “goto” is relative to the list of arguments being processed by the iteration. "
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde Left-Bracket: Conditional Expression"))
     (:IDXTEXT NIL "Left-Bracket (format directive)")
     (:IDXTEXT NIL "Tilde Left-Bracket (format directive)") " " :PAR
     (:COMMENT NIL
      "% 22.3.2 121                                                 ")
     (:TT NIL " [" (:I NIL "str0") " ;" (:I NIL "str1") " ;" (:I NIL "...")
      " ;" (:I NIL "strn") " ]")
     " " :PAR "This is a set of control strings, called " (:I NIL "clauses")
     ", one of which is chosen and used. The clauses are separated by "
     (:TT NIL " ;") " and the construct is terminated by " (:TT NIL " ]")
     ". For example, " :PAR (:TT NIL "\" [Siamese ;Manx ;Persian ] Cat\"") " "
     :PAR "The " (:I NIL "arg")
     "th clause is selected, where the first clause is number 0. If a prefix parameter is given (as "
     (:TT NIL " " (:I NIL "n") "[")
     "), then the parameter is used instead of an argument. If " (:I NIL "arg")
     " is out of range then no clause is selected and no error is signaled. After the selected alternative has been processed, the control string continues after the "
     (:TT NIL " ]") ". " :PAR (:COMMENT NIL "% 22.3.2 122")
     (:TT NIL " [" (:I NIL "str0") " ;" (:I NIL "str1") " ;" (:I NIL "...")
      " ;" (:I NIL "strn") " :;" (:I NIL "default") " ]")
     " has a default case. If the " (:I NIL "last") " " (:TT NIL " ;")
     " used to separate clauses is " (:TT NIL " :;")
     " instead, then the last clause is an else clause that is performed if no other clause is selected. For example: "
     :PAR (:TT NIL "\" [Siamese ;Manx ;Persian :;Alley ] Cat\"") " " :PAR
     (:COMMENT NIL "!!! Deja vu. Is this repeated somewhere??? -kmp 11-Jun-91"
      "% 22.3.2 123")
     (:TT NIL " :[" (:PARAM NIL "alternative") " ;" (:PARAM NIL "consequent")
      " ]")
     " selects the " (:PARAM NIL "alternative") " control string if "
     (:I NIL "arg") " is " (:TERM NIL "false") ", and selects the "
     (:PARAM NIL "consequent") " control string otherwise. " :PAR
     (:COMMENT NIL "% 22.3.2 124")
     (:TT NIL " @[" (:PARAM NIL "consequent") " ]")
     " tests the argument. If it is " (:TERM NIL "true")
     ", then the argument is not used up by the " (:TT NIL " [")
     " command but remains as the next one to be processed, and the one clause "
     (:PARAM NIL "consequent") " is processed. If the " (:I NIL "arg") " is "
     (:TERM NIL "false")
     ", then the argument is used up, and the clause is not processed. The clause therefore should normally use exactly one argument, and may expect it to be "
     (:TERM NIL "non-nil") ". For example: " :PAR
     (:CODE NIL " (setq *print-level* nil *print-length* 5)
 (format nil
        \"~@[ print level = ~D~]~@[ print length = ~D~]\"
        *print-level* *print-length*)
→  \" print length = 5\"
")
     " " :PAR "Note also that " :PAR
     (:CODE NIL " (format " (:PARAM NIL "stream") " \"...~@["
      (:PARAM NIL "str") "~]...\" ...)
≡ (format "
      (:PARAM NIL "stream") " \"...~:[~;~:*" (:PARAM NIL "str") "~]...\" ...)
")
     " " :PAR (:COMMENT NIL "% 22.3.2 125") "The combination of "
     (:TT NIL " [") " and " (:TT NIL "#")
     " is useful, for example, for dealing with English conventions for printing lists: "
     :PAR
     (:CODE NIL " (setq foo \"Items:~#[ none~; ~S~; ~S and ~S~
           ~:;~@{~#[~; and~] ~S~^ ,~}~].\")
 (format nil foo) →  \"Items: none.\"
 (format nil foo 'foo) →  \"Items: FOO.\"
 (format nil foo 'foo 'bar) →  \"Items: FOO and BAR.\"
 (format nil foo 'foo 'bar 'baz) →  \"Items: FOO, BAR, and BAZ.\"
 (format nil foo 'foo 'bar 'baz 'quux) →  \"Items: FOO, BAR, BAZ, and QUUX.\"
")
     " " :PAR)
    :PAR
    (:SUBSUBSECTION
     (:TITLE ("Tilde Right-Bracket: End of Conditional Expression"))
     (:IDXTEXT NIL "Right-Bracket (format directive)")
     (:IDXTEXT NIL "Tilde Right-Bracket (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 127") :PAR (:TT NIL " ]") " terminates a "
     (:TT NIL " [") ". The consequences of using it elsewhere are undefined. "
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde Left-Brace: Iteration"))
     (:IDXTEXT NIL "Left-Brace (format directive)")
     (:IDXTEXT NIL "Tilde Left-Brace (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 128                                  ")
     (:TT NIL " {" (:I NIL "str") " }") " " :PAR
     "This is an iteration construct. The argument should be a "
     (:TERM NIL "list")
     ", which is used as a set of arguments as if for a recursive call to "
     (:FUNREF NIL "format") ". The " (:TERM NIL "string") " " (:I NIL "str")
     " is used repeatedly as the control string. Each iteration can absorb as many elements of the "
     (:TERM NIL "list") " as it likes as arguments; if " (:I NIL "str")
     " uses up two arguments by itself, then two elements of the "
     (:TERM NIL "list")
     " will get used up each time around the loop. If before any iteration step the "
     (:TERM NIL "list")
     " is empty, then the iteration is terminated. Also, if a prefix parameter "
     (:I NIL "n") " is given, then there will be at most " (:I NIL "n")
     " repetitions of processing of " (:I NIL "str") ". Finally, the "
     (:TT NIL " ^ ")
     " directive can be used to terminate the iteration prematurely. " :PAR
     (:COMMENT NIL "% 22.3.2 129") "For example: " :PAR
     (:CODE NIL " (format nil \"The winners are:~{ ~S~}.\" 
         '(fred harry jill)) 
→ \"The winners are: FRED HARRY JILL.\"                           
 (format nil \"Pairs:~{ <~S,~S>~}.\" 
         '(a 1 b 2 c 3))
→ \"Pairs: <A,1> <B,2> <C,3>.\"
")
     " " :PAR (:COMMENT NIL "% 22.3.2 130                                   ")
     (:TT NIL " :{ " (:I NIL "str") " } ")
     " is similar, but the argument should be a " (:TERM NIL "list")
     " of sublists. At each repetition step, one sublist is used as the set of arguments for processing "
     (:I NIL "str")
     "; on the next repetition, a new sublist is used, whether or not all of the last sublist had been processed. For example: "
     :PAR
     (:CODE NIL " (format nil \"Pairs:~:{ <~S,~S>~} .\" 
                 '((a 1) (b 2) (c 3)))
→ \"Pairs: <A,1> <B,2> <C,3>.\"
")
     " " :PAR (:COMMENT NIL "% 22.3.2 131              ")
     (:TT NIL " @{ " (:I NIL "str") " } ") " is similar to "
     (:TT NIL " { " (:I NIL "str") " } ")
     ", but instead of using one argument that is a list, all the remaining arguments are used as the list of arguments for the iteration. Example: "
     :PAR
     (:CODE NIL " (format nil \"Pairs:~@{ <~S,~S>~} .\" 'a 1 'b 2 'c 3)
→ \"Pairs: <A,1> <B,2> <C,3>.\"
")
     " If the iteration is terminated before all the remaining arguments are consumed, then any arguments not processed by the iteration remain to be processed by any directives following the iteration construct. "
     :PAR (:COMMENT NIL "% 22.3.2 132                                   ")
     (:TT NIL " :@{ " (:I NIL "str") " } ") " combines the features of "
     (:TT NIL " :{ " (:I NIL "str") " } ") " and "
     (:TT NIL " @{ " (:I NIL "str") " } ")
     ". All the remaining arguments are used, and each one must be a "
     (:TERM NIL "list") ". On each iteration, the next argument is used as a "
     (:TERM NIL "list") " of arguments to " (:I NIL "str") ". Example: " :PAR
     (:CODE NIL " (format nil \"Pairs:~:@{ <~S,~S>~} .\" 
              '(a 1) '(b 2) '(c 3)) 
→ \"Pairs: <A,1> <B,2> <C,3>.\"
")
     " "
     (:COMMENT NIL "% 22.3.2 133                                             ")
     "Terminating the repetition construct with " (:TT NIL " :} ")
     " instead of " (:TT NIL " } ") " forces " (:I NIL "str")
     " to be processed at least once, even if the initial list of arguments is null. However, this will not override an explicit prefix parameter of zero. "
     :PAR (:COMMENT NIL "% 22.3.2 134") "If " (:I NIL "str")
     " is empty, then an argument is used as " (:I NIL "str") ". It must be a "
     (:TERM NIL "format control")
     " and precede any arguments processed by the iteration. As an example, the following are equivalent: "
     :PAR
     (:CODE NIL "    (apply #'format stream string arguments)
 ≡ (format stream \"~1{~:}\" string arguments)
")
     " " :PAR "This will use " (:TT NIL "string")
     " as a formatting string. The " (:TT NIL " 1{ ")
     " says it will be processed at most once, and the " (:TT NIL " :} ")
     " says it will be processed at least once. Therefore it is processed exactly once, using "
     (:TT NIL "arguments")
     " as the arguments. This case may be handled more clearly by the "
     (:TT NIL " ?") " directive, but this general feature of " (:TT NIL " { ")
     " is more powerful than " (:TT NIL " ?") ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde Right-Brace: End of Iteration"))
     (:IDXTEXT NIL "Right-Brace (format directive)")
     (:IDXTEXT NIL "Tilde Right-Brace (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 135               ") :PAR (:TT NIL " }")
     " terminates a " (:TT NIL " {")
     ". The consequences of using it elsewhere are undefined. " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde Question-Mark: Recursive Processing"))
     (:IDXTEXT NIL "Question-Mark (format directive)")
     (:IDXTEXT NIL "Tilde Question-Mark (format directive)") " " :PAR
     (:COMMENT NIL
      "% Was \"Indirection\", now \"Recursive Processing\". -kmp 30-Aug-93")
     :PAR (:COMMENT NIL "% 22.3.2 109       ") :PAR "The next " (:I NIL "arg")
     " must be a " (:TERM NIL "format control") ", and the one after it a "
     (:TERM NIL "list") "; both are consumed by the " (:TT NIL " ?")
     " directive. The two are processed as a " (:PARAM NIL "control-string")
     ", with the elements of the " (:TERM NIL "list")
     " as the arguments. Once the recursive processing has been finished, the processing of the control string containing the "
     (:TT NIL " ?") " directive is resumed. Example: " :PAR
     (:CODE NIL
      " (format nil \"~? ~D\" \"<~A ~D>\" '(\"Foo\" 5) 7) → \"<Foo 5> 7\"
 (format nil \"~? ~D\" \"<~A ~D>\" '(\"Foo\" 5 14) 7) → \"<Foo 5> 7\"
")
     " Note that in the second example three arguments are supplied to the "
     (:TERM NIL "format string") " " (:TT NIL "\"< A  D>\"")
     ", but only two are processed and the third is therefore ignored. " :PAR
     (:COMMENT NIL "% 22.3.2 110    ") "With the " (:TT NIL "@")
     " modifier, only one " (:I NIL "arg") " is directly consumed. The "
     (:I NIL "arg") " must be a " (:TERM NIL "string")
     "; it is processed as part of the control string as if it had appeared in place of the "
     (:TT NIL " @?")
     " construct, and any directives in the recursively processed control string may consume arguments of the control string containing the "
     (:TT NIL " @?") " directive. Example: " :PAR
     (:CODE NIL
      " (format nil \"~@? ~D\" \"<~A ~D>\" \"Foo\" 5 7) → \"<Foo 5> 7\"
 (format nil \"~@? ~D\" \"<~A ~D>\" \"Foo\" 5 14 7) → \"<Foo 5> 14\"
")
     " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("FORMAT Miscellaneous Operations"))
    (:SUBSUBSECTION (:TITLE ("Tilde Left-Paren: Case Conversion"))
     (:IDXTEXT NIL "Left-Paren (format directive)")
     (:IDXTEXT NIL "Tilde Left-Paren (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 115             ")
     (:TT NIL " (" (:I NIL "str") " )") " " :PAR
     "The contained control string " (:I NIL "str")
     " is processed, and what it produces is subject to case conversion. " :PAR
     (:COMMENT NIL "% 22.3.2 116") "With no flags, every "
     (:TERM NIL "uppercase") " " (:TERM NIL "character")
     " is converted to the corresponding " (:TERM NIL "lowercase") " "
     (:TERM NIL "character") ". " :PAR (:COMMENT NIL "% 22.3.2 117   ")
     (:TT NIL " :(") " capitalizes all words, as if by "
     (:FUNREF NIL "string-capitalize") ". " :PAR
     (:COMMENT NIL "% 22.3.2 118    ") (:TT NIL " @(")
     " capitalizes just the first word and forces the rest to lower case. "
     :PAR (:COMMENT NIL "% 22.3.2 119               ") (:TT NIL " :@(")
     " converts every lowercase character to the corresponding uppercase character. "
     :PAR (:COMMENT NIL "% 22.3.2 120                    ") "In this example "
     (:TT NIL " @(") " is used to cause the first word produced by "
     (:TT NIL " @R") " to be capitalized: " :PAR
     (:CODE NIL " (format nil \"~@R ~(~@R~)\" 14 14) 
→ \"XIV xiv\"
 (defun f (n) (format nil \"~@(~R~) error~:P detected.\" n)) → F
 (f 0) → \"Zero errors detected.\"
 (f 1) → \"One error detected.\"
 (f 23) → \"Twenty-three errors detected.\"
")
     " " :PAR
     (:COMMENT NIL "% This next is from Pitman #36 (first public review):")
     "When case conversions appear nested, the outer conversion dominates, as illustrated in the following example: "
     :PAR
     (:CODE NIL " (format nil \"~@(how is ~:(BOB SMITH~)?~)\")
 → \"How is bob smith?\"
 NOT→ \"How is Bob Smith?\"
")
     " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde Right-Paren: End of Case Conversion"))
     (:IDXTEXT NIL "Right-Paren (format directive)")
     (:IDXTEXT NIL "Tilde Right-Paren (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 127") :PAR (:TT NIL " )") " terminates a "
     (:TT NIL " (") ". The consequences of using it elsewhere are undefined. "
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde P: Plural"))
     (:IDXTEXT NIL "P (format directive)")
     (:IDXTEXT NIL "Tilde P (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 35") :PAR "If " (:I NIL "arg") " is not "
     (:FUNREF NIL "eql") " to the integer " (:TT NIL "1") ", a lowercase "
     (:TT NIL "s") " is printed; if " (:I NIL "arg") " is " (:FUNREF NIL "eql")
     " to " (:TT NIL "1") ", nothing is printed. If " (:I NIL "arg")
     " is a floating-point " (:TT NIL "1.0") ", the " (:TT NIL "s")
     " is printed. " :PAR (:COMMENT NIL "% 22.3.2 36") (:TT NIL " :P")
     " does the same thing, after doing a " (:TT NIL " :*")
     " to back up one argument; that is, it prints a lowercase " (:TT NIL "s")
     " if the previous argument was not " (:TT NIL "1") ". " :PAR
     (:COMMENT NIL "% 22.3.2 37 ") (:TT NIL " @P") " prints " (:TT NIL "y")
     " if the argument is " (:TT NIL "1") ", or " (:TT NIL "ies")
     " if it is not. " (:TT NIL " :@P")
     " does the same thing, but backs up first. " :PAR
     (:CODE NIL " (format nil \"~D tr~:@P/~D win~:P\" 7 1) → \"7 tries/1 win\"
 (format nil \"~D tr~:@P/~D win~:P\" 1 0) → \"1 try/0 wins\"
 (format nil \"~D tr~:@P/~D win~:P\" 1 3) → \"1 try/3 wins\"
")
     " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("FORMAT Miscellaneous Pseudo-Operations"))
    (:SUBSUBSECTION (:TITLE ("Tilde Semicolon: Clause Separator"))
     (:IDXTEXT NIL "Semicolon (format directive)")
     (:IDXTEXT NIL "Tilde Semicolon (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 126") :PAR "This separates clauses in "
     (:TT NIL " [") " and " (:TT NIL " <")
     " constructs. The consequences of using it elsewhere are undefined. "
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde Circumflex: Escape Upward"))
     (:IDXTEXT NIL "Circumflex (format directive)")
     (:IDXTEXT NIL "Tilde Circumflex (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 144         ") (:TT NIL " ^ ") " " :PAR
     "This is an escape construct. If there are no more arguments remaining to be processed, then the immediately enclosing "
     (:TT NIL " { ") " or " (:TT NIL " <")
     " construct is terminated. If there is no such enclosing construct, then the entire formatting operation is terminated. In the "
     (:TT NIL " <")
     " case, the formatting is performed, but no more segments are processed before doing the justification. "
     (:TT NIL " ^ ") " may appear anywhere in a " (:TT NIL " { ")
     " construct. " :PAR
     (:CODE NIL " (setq donestr \"Done.~^ ~D warning~:P.~^ ~D error~:P.\")
→ \"Done.~^ ~D warning~:P.~^ ~D error~:P.\"
 (format nil donestr) → \"Done.\"
 (format nil donestr 3) → \"Done. 3 warnings.\"
 (format nil donestr 1 5) → \"Done. 1 warning. 5 errors.\"
")
     " " :PAR (:COMMENT NIL "% 22.3.2 145")
     "If a prefix parameter is given, then termination occurs if the parameter is zero. (Hence "
     (:TT NIL " ^") " is equivalent to " (:TT NIL " #^")
     ".) If two parameters are given, termination occurs if they are equal. "
     (:REVIEWER NIL "Barmar: Which equality predicate?")
     " If three parameters are given, termination occurs if the first is less than or equal to the second and the second is less than or equal to the third. Of course, this is useless if all the prefix parameters are constants; at least one of them should be a "
     (:TT NIL "#") " or a " (:TT NIL "V") " parameter. " :PAR
     (:COMMENT NIL
      "% 22.3.2 146                                              ")
     "If " (:TT NIL " ^") " is used within a " (:TT NIL " :{ ")
     " construct, then it terminates the current iteration step because in the standard case it tests for remaining arguments of the current step only; the next iteration step commences immediately. "
     (:TT NIL " :^") " is used to terminate the iteration process. "
     (:ISSUE NIL "FORMAT-COLON-UPARROW-SCOPE") " " (:TT NIL " :^")
     " may be used only if the command it would terminate is " (:TT NIL " :{ ")
     " or " (:TT NIL " :@{ ")
     ". The entire iteration process is terminated if and only if the sublist that is supplying the arguments for the current iteration step is the last sublist in the case of "
     (:TT NIL " :{ ") ", or the last " (:FUNREF NIL "format")
     " argument in the case of " (:TT NIL " :@{ ") ". " (:TT NIL " :^")
     " is not equivalent to " (:TT NIL " #:^")
     "; the latter terminates the entire iteration if and only if no arguments remain for the current iteration step. For example: "
     :PAR
     (:CODE NIL
      " (format nil \"~:{ ~@?~:^ ...~} \" '((\"a\") (\"b\"))) → \"a...b\"
")
     " " (:ENDISSUE NIL "FORMAT-COLON-UPARROW-SCOPE") " " :PAR
     (:COMMENT NIL "% 22.3.2 147     ") "If " (:TT NIL " ^")
     " appears within a control string being processed under the control of a "
     (:TT NIL " ?") " directive, but not within any " (:TT NIL " { ") " or "
     (:TT NIL " <")
     " construct within that string, then the string being processed will be terminated, thereby ending processing of the "
     (:TT NIL " ?")
     " directive. Processing then continues within the string containing the "
     (:TT NIL " ?") " directive at the point following that directive. " :PAR
     (:COMMENT NIL "% 22.3.2 148     ") "If " (:TT NIL " ^")
     " appears within a " (:TT NIL " [") " or " (:TT NIL " (")
     " construct, then all the commands up to the " (:TT NIL " ^")
     " are properly selected or case-converted, the " (:TT NIL " [") " or "
     (:TT NIL " (")
     " processing is terminated, and the outward search continues for a "
     (:TT NIL " { ") " or " (:TT NIL " <")
     " construct to be terminated. For example: " :PAR
     (:CODE NIL " (setq tellstr \"~@(~@[~R~]~^ ~A!~)\")
→ \"~@(~@[~R~]~^ ~A!~)\"
 (format nil tellstr 23) → \"Twenty-three!\"
 (format nil tellstr nil \"losers\") → \" Losers!\"
 (format nil tellstr 23 \"losers\") → \"Twenty-three losers!\"
")
     " " :PAR
     (:COMMENT NIL "% 22.3.2 149                                     ")
     "Following are examples of the use of " (:TT NIL " ^") " within a "
     (:TT NIL " <") " construct. " :PAR
     (:CODE NIL " (format nil \"~15<~S~;~^~S~;~^~S~>\" 'foo)
→  \"            FOO\"
 (format nil \"~15<~S~;~^~S~;~^~S~>\" 'foo 'bar)
→  \"FOO         BAR\"
 (format nil \"~15<~S~;~^~S~;~^~S~>\" 'foo 'bar 'baz)
→  \"FOO   BAR   BAZ\"
")
     " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Tilde Newline: Ignored Newline"))
     (:IDXTEXT NIL "Newline (format directive)")
     (:IDXTEXT NIL "Tilde Newline (format directive)") " " :PAR
     (:COMMENT NIL "% 22.3.2 100") :PAR (:TERM NIL "Tilde")
     " immediately followed by a " (:TERM NIL "newline") " ignores the "
     (:TERM NIL "newline") " and any following non-newline "
     (:TERM NIL "whitespace") (:SUB NIL "1") " characters. With a "
     (:TT NIL ":") ", the " (:TERM NIL "newline")
     " is ignored, but any following " (:TERM NIL "whitespace") (:SUB NIL "1")
     " is left in place. With an " (:TT NIL "@") ", the " (:TERM NIL "newline")
     " is left in place, but any following " (:TERM NIL "whitespace")
     (:SUB NIL "1") " is ignored. For example: " :PAR
     (:COMMENT NIL "% 22.3.2 101")
     (:CODE NIL
      " (defun type-clash-error (fn nargs argnum right-type wrong-type)
   (format *error-output*
           \"~&~S requires its ~:[~:R~;~*~]~ 
           argument to be of type ~S,~%but it was called ~
           with an argument of type ~S.~%\"
           fn (eql nargs 1) argnum right-type wrong-type))
 (type-clash-error 'aref nil 2 'integer 'vector)  prints:
AREF requires its second argument to be of type INTEGER,
but it was called with an argument of type VECTOR.
NIL
 (type-clash-error 'car 1 1 'list 'short-float)  prints:
CAR requires its argument to be of type LIST,
but it was called with an argument of type SHORT-FLOAT.
NIL
")
     " Note that in this example newlines appear in the output only as specified by the "
     (:TT NIL " &") " and " (:TT NIL " %")
     " directives; the actual newline characters in the control string are suppressed because each is preceded by a tilde. "
     :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Additional Information about FORMAT Operations"))
    (:SUBSUBSECTION (:TITLE ("Nesting of FORMAT Operations"))
     "The case-conversion, conditional, iteration, and justification constructs can contain other formatting constructs by bracketing them. These constructs must nest properly with respect to each other. For example, it is not legitimate to put the start of a case-conversion construct in each arm of a conditional and the end of the case-conversion construct outside the conditional: "
     :PAR
     (:CODE NIL " (format nil \"~:[abc~:@(def~;ghi~
:@(jkl~]mno~)\" x) ;Invalid!
")
     " This notation is invalid because the " (:TT NIL " [... ;... ]") " and "
     (:TT NIL " (... )") " constructs are not properly nested. " :PAR
     (:COMMENT NIL "% 22.3.2 114                                           ")
     "The processing indirection caused by the " (:TT NIL " ?")
     " directive is also a kind of nesting for the purposes of this rule of proper nesting. It is not permitted to start a bracketing construct within a string processed under control of a "
     (:TT NIL " ?") " directive and end the construct at some point after the "
     (:TT NIL " ?")
     " construct in the string containing that construct, or vice versa. For example, this situation is invalid: "
     :PAR
     (:CODE NIL " (format nil \"~@?ghi~)\" \"abc~@(def\") ;Invalid!
")
     " This notation is invalid because the " (:TT NIL " ?") " and "
     (:TT NIL " (... )") " constructs are not properly nested. " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Missing and Additional FORMAT Arguments"))
     "The consequences are undefined if no " (:PARAM NIL "arg")
     " remains for a directive requiring an argument. However, it is permissible for one or more "
     (:PARAM NIL "args") " to remain unprocessed by a directive; such "
     (:PARAM NIL "args") " are ignored. " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Additional FORMAT Parameters"))
     "The consequences are undefined if a format directive is given more parameters than it is described here as accepting. "
     :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Undefined FORMAT Modifier Combinations"))
     "The consequences are undefined if " (:TERM NIL "colon") " or "
     (:TERM NIL "at-sign")
     " modifiers are given to a directive in a combination not specifically described here as being meaningful. "
     :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Examples of FORMAT"))
    (:CODE NIL " (format nil \"foo\") → \"foo\"
 (setq x 5) → 5
 (format nil \"The answer is ~D.\" x) → \"The answer is 5.\"
 (format nil \"The answer is ~3D.\" x) → \"The answer is   5.\"
 (format nil \"The answer is ~3,'0D.\" x) → \"The answer is 005.\"
 (format nil \"The answer is ~:D.\" (expt 47 x))
→ \"The answer is 229,345,007.\"
 (setq y \"elephant\") → \"elephant\"
 (format nil \"Look at the ~A!\" y) → \"Look at the elephant!\"
 (setq n 3) → 3
 (format nil \"~D item~:P found.\" n) → \"3 items found.\"
 (format nil \"~R dog~:[s are~; is~] here.\" n (= n 1))
→ \"three dogs are here.\"
 (format nil \"~R dog~:*~[s are~; is~:;s are~] here.\" n)
→ \"three dogs are here.\"
 (format nil \"Here ~[are~;is~:;are~] ~:*~R pupp~:@P.\" n)
→ \"Here are three puppies.\"
")
    " " (:COMMENT NIL "% 22.3.2 53")
    (:CODE NIL " (defun foo (x)
   (format nil \"~6,2F|~6,2,1,'*F|~6,2,,'?F|~6F|~,2F|~F\"
           x x x x x x)) → FOO
 (foo 3.14159)  → \"  3.14| 31.42|  3.14|3.1416|3.14|3.14159\"
 (foo -3.14159) → \" -3.14|-31.42| -3.14|-3.142|-3.14|-3.14159\"
 (foo 100.0)    → \"100.00|******|100.00| 100.0|100.00|100.0\"
 (foo 1234.0)   → \"1234.00|******|??????|1234.0|1234.00|1234.0\"
 (foo 0.006)    → \"  0.01|  0.06|  0.01| 0.006|0.01|0.006\"
")
    " " (:COMMENT NIL "% 22.3.2 73")
    (:CODE NIL " (defun foo (x)  
    (format nil
           \"~9,2,1,,'*E|~10,3,2,2,'?,,'$E|~
            ~9,3,2,-2,'%@E|~9,2E\"
           x x x x))
 (foo 3.14159)  → \"  3.14E+0| 31.42$-01|+.003E+03|  3.14E+0\"
 (foo -3.14159) → \" -3.14E+0|-31.42$-01|-.003E+03| -3.14E+0\"
 (foo 1100.0)   → \"  1.10E+3| 11.00$+02|+.001E+06|  1.10E+3\"
 (foo 1100.0L0) → \"  1.10L+3| 11.00$+02|+.001L+06|  1.10L+3\"
 (foo 1.1E13)   → \"*********| 11.00$+12|+.001E+16| 1.10E+13\"
 (foo 1.1L120)  → \"*********|??????????|%%%%%%%%%|1.10L+120\"
 (foo 1.1L1200) → \"*********|??????????|%%%%%%%%%|1.10L+1200\"
")
    " As an example of the effects of varying the scale factor, the code " :PAR
    (:CODE NIL " (dotimes (k 13)
   (format t \"~%Scale factor ~2D: |~13,6,2,VE|\"
           (- k 5) (- k 5) 3.14159))
")
    " produces the following output: " :PAR
    (:CODE NIL "Scale factor -5: | 0.000003E+06|
Scale factor -4: | 0.000031E+05|
Scale factor -3: | 0.000314E+04|
Scale factor -2: | 0.003142E+03|
Scale factor -1: | 0.031416E+02|
Scale factor  0: | 0.314159E+01|
Scale factor  1: | 3.141590E+00|
Scale factor  2: | 31.41590E-01|
Scale factor  3: | 314.1590E-02|
Scale factor  4: | 3141.590E-03|
Scale factor  5: | 31415.90E-04|
Scale factor  6: | 314159.0E-05|
Scale factor  7: | 3141590.E-06|
")
    " " :PAR (:COMMENT NIL "% 22.3.2 86")
    (:CODE NIL " (defun foo (x)
   (format nil \"~9,2,1,,'*G|~9,3,2,3,'?,,'$G|~9,3,2,0,'%G|~9,2G\"
          x x x x))                                     
 (foo 0.0314159) → \"  3.14E-2|314.2$-04|0.314E-01|  3.14E-2\"
 (foo 0.314159)  → \"  0.31   |0.314    |0.314    | 0.31    \"
 (foo 3.14159)   → \"   3.1   | 3.14    | 3.14    |  3.1    \"
 (foo 31.4159)   → \"   31.   | 31.4    | 31.4    |  31.    \"
 (foo 314.159)   → \"  3.14E+2| 314.    | 314.    |  3.14E+2\"
 (foo 3141.59)   → \"  3.14E+3|314.2$+01|0.314E+04|  3.14E+3\"
 (foo 3141.59L0) → \"  3.14L+3|314.2$+01|0.314L+04|  3.14L+3\"
 (foo 3.14E12)   → \"*********|314.0$+10|0.314E+13| 3.14E+12\"
 (foo 3.14L120)  → \"*********|?????????|%%%%%%%%%|3.14L+120\"
 (foo 3.14L1200) → \"*********|?????????|%%%%%%%%%|3.14L+1200\"
")
    " " :PAR (:COMMENT NIL "% 22.3.2 138   ")
    (:CODE NIL " (format nil \"~10<foo~;bar~>\")   → \"foo    bar\"
 (format nil \"~10:<foo~;bar~>\")  → \"  foo  bar\"
 (format nil \"~10<foobar~>\")     → \"    foobar\"
 (format nil \"~10:<foobar~>\")    → \"    foobar\"
 (format nil \"~10:@<foo~;bar~>\") → \"  foo bar \"
 (format nil \"~10@<foobar~>\")    → \"foobar    \"
 (format nil \"~10:@<foobar~>\")   → \"  foobar  \"
")
    " " :PAR (:ISSUE NIL "PATHNAME-PRINT-READ:SHARPSIGN-P") " "
    (:CODE NIL "  (FORMAT NIL \"Written to ~A.\" #P\"foo.bin\")
  → \"Written to foo.bin.\"
")
    " " (:ENDISSUE NIL "PATHNAME-PRINT-READ:SHARPSIGN-P") " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Notes about FORMAT"))
    (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY")
    " Formatted output is performed not only by " (:FUNREF NIL "format")
    ", but by certain other functions that accept a "
    (:TERM NIL "format control") " the way " (:FUNREF NIL "format")
    " does. For example, error-signaling functions such as "
    (:FUNREF NIL "cerror") " accept " (:TERM NIL "format controls") ". "
    (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR
    "Note that the meaning of " (:MISC NIL "nil") " and " (:MISC NIL "t")
    " as destinations to " (:FUNREF NIL "format")
    " are different than those of " (:MISC NIL "nil") " and " (:MISC NIL "t")
    " as " (:TERM NIL "stream designators") ". " :PAR "The " (:TT NIL " ^")
    " should appear only at the beginning of a " (:TT NIL " <")
    " clause, because it aborts the entire clause in which it appears (as well as all following clauses). "
    :PAR))
  :PAR
  (:DICTIONARY NIL :PAR
   (:COMMENT NIL " Pretty Printer Concepts" " Printer" "  Printer Variables")
   :PAR " " :PAR " " :PAR
   (:COMMENT NIL "-------------------- Printer --------------------") :PAR
   (:COMMENT NIL "%% ========== COPY-PPRINT-DISPATCH") :PAR
   (:COM (:NAME "copy-pprint-dispatch" :FTYPE "Function")
    (:ISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "copy-pprint-dispatch")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " table")
      (:VALUES NIL "new-table"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "table") "—a "
     (:TERM NIL "pprint dispatch table") ", or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "new-table") "—a " (:TERM NIL "fresh") " "
     (:TERM NIL "pprint dispatch table") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "Creates and returns a copy of the specified " (:PARAM NIL "table")
     ", or of the " (:TERM NIL "value") " of "
     (:VARREF NIL "*print-pprint-dispatch*") " if no " (:PARAM NIL "table")
     " is specified, or of the initial " (:TERM NIL "value") " of "
     (:VARREF NIL "*print-pprint-dispatch*") " if " (:MISC NIL "nil")
     " is specified. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR
     (:COMMENT NIL "% Sandra thinks this is excessive."
      "Creates a \\term{pprint dispatch table}.")
     :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "table") " is not a "
     (:TERM NIL "pprint dispatch table") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== FORMATTER")
   (:COM (:NAME "formatter" :FTYPE "Macro")
    (:ISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "formatter")
      (:ARGLIST NIL "control-string") (:VALUES NIL "function"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "control-string") "—a " (:TERM NIL "format string")
     "; not evaluated. " :PAR (:PARAM NIL "function") "—a "
     (:TERM NIL "function") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns a " (:TERM NIL "function")
     " which has behavior equivalent to: " :PAR
     (:CODE NIL "  #'(lambda (*standard-output* &rest arguments)
      (apply #'format t "
      (:I NIL "control-string") " arguments)
      "
      (:I NIL "arguments-tail") ")
")
     " " :PAR "where " (:I NIL "arguments-tail") " is either the tail of "
     (:I NIL "arguments") " which has as its " (:TERM NIL "car")
     " the argument that would be processed next if there were more format directives in the "
     (:PARAM NIL "control-string") ", or else " (:MISC NIL "nil")
     " if no more " (:I NIL "arguments")
     " follow the most recently processed argument. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:COMMENT NIL
      "This doesn't look like valid syntax to me.  --sjl 16 mar 92" "\\code"
      "((formatter \"~&~A~A\") *standard-output* 'a 'b 'c)" "\\OUT AB"
      "\\EV (C)")
     (:CODE NIL "(funcall (formatter \"~&~A~A\") *standard-output* 'a 'b 'c)
⊳ AB
→ (C)

(format t (formatter \"~&~A~A\") 'a 'b 'c)
⊳ AB
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR
     (:COMMENT NIL "% Sandra thinks this is excessive."
      "Might create a \\term{closure} at run time.")
     :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Might signal an error (at macro expansion time or at run time) if the argument is not a valid "
     (:TERM NIL "format string") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "format") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PPRINT-DISPATCH") :PAR
   (:COM (:NAME "pprint-dispatch" :FTYPE "Function")
    (:ISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "pprint-dispatch")
      (:ARGLIST NIL "object " (:KEYWORD NIL " &optional") " table")
      (:VALUES NIL "function, found-p"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR
     (:COMMENT NIL "!!! pprint dispatch table designator?? -kmp 16-Oct-91")
     (:PARAM NIL "table") "—a " (:TERM NIL "pprint dispatch table") ", or "
     (:MISC NIL "nil") ". The default is the " (:TERM NIL "value") " of "
     (:VARREF NIL "*print-pprint-dispatch*") ". " :PAR
     (:COMMENT NIL
      " It wasn't obvious if this should be a \"function\" or \"function designator\"."
      " I asked x3j13 with issue PPRINT-DISPATCH-RETURN-VALUE, but rather than vote"
      " on it, they just told me to use my discretion.  Which is basically the same"
      " as if they had approved the issue.  \"function designator\" it is. -kmp 11-Feb-92")
     (:PARAM NIL "function") "—a " (:TERM NIL "function designator") ". " :PAR
     (:PARAM NIL "found-p") "—a " (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "Retrieves the highest priority function in " (:PARAM NIL "table")
     " that is associated with a " (:TERM NIL "type specifier")
     " that matches " (:PARAM NIL "object")
     ". The function is chosen by finding all of the "
     (:TERM NIL "type specifiers") " in " (:PARAM NIL "table")
     " that match the " (:PARAM NIL "object")
     " and selecting the highest priority function associated with any of these "
     (:TERM NIL "type specifiers")
     ". If there is more than one highest priority function, an arbitrary choice is made. If no "
     (:TERM NIL "type specifiers") " match the " (:PARAM NIL "object")
     ", a function is returned that prints " (:PARAM NIL "object") " "
     (:ISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " "
     (:COMMENT NIL "with \\varref{*print-pretty*} bound to \\nil.") "using "
     (:FUNREF NIL "print-object") ". "
     (:ENDISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " " :PAR "The "
     (:TERM NIL "secondary value") ", " (:PARAM NIL "found-p") ", is "
     (:TERM NIL "true") " if a matching " (:TERM NIL "type specifier")
     " was found in " (:PARAM NIL "table") ", or " (:TERM NIL "false")
     " otherwise. " :PAR "If " (:PARAM NIL "table") " is " (:MISC NIL "nil")
     ", retrieval is done in the "
     (:COMMENT NIL "initial value of \\varref{*print-pprint-dispatch*}.")
     (:TERM NIL "initial pprint dispatch table") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The state of the "
     (:PARAM NIL "table") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:TERM NIL "table") " is neither a "
     (:TERM NIL "pprint dispatch table") " nor " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL "(let ((*print-pretty* t))
  (write object :stream s))
≡ (funcall (pprint-dispatch object) s object)
")
     " " :PAR (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PPRINT-EXIT-IF-LIST-EXHAUSTED")
   (:COM (:NAME "pprint-exit-if-list-exhausted" :FTYPE "Local Macro")
    (:ISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "pprint-exit-if-list-exhausted")
      (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments")))
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values" :NONE T) " " :PAR)
    (:PART (:NAME "Description") " " :PAR "Tests whether or not the "
     (:PARAM NIL "list") " passed to the "
     (:TERM NIL "lexically current logical block") " has been exhausted; see "
     (:SECREF NIL :DYNAMIC-CONTROL-OF-OUTPUT) ". If this " (:PARAM NIL "list")
     " has been reduced to " (:MISC NIL "nil") ", "
     (:FUNREF NIL "pprint-exit-if-list-exhausted")
     " terminates the execution of the "
     (:TERM NIL "lexically current logical block")
     " except for the printing of the suffix. Otherwise "
     (:FUNREF NIL "pprint-exit-if-list-exhausted") " returns "
     (:MISC NIL "nil") ". " :PAR
     (:ISSUE NIL "LEXICAL-CONSTRUCT-GLOBAL-DEFINITION:UNDEFINED")
     " Whether or not " (:MACREF NIL "pprint-exit-if-list-exhausted") " is "
     (:TERM NIL "fbound") " in the " (:TERM NIL "global environment") " is "
     (:TERM NIL "implementation-dependent")
     "; however, the restrictions on redefinition and " (:TERM NIL "shadowing")
     " of " (:MACREF NIL "pprint-exit-if-list-exhausted")
     " are the same as for " (:TERM NIL "symbols") " in the "
     (:PACKREF NIL "common-lisp") " " (:TERM NIL "package") " which are "
     (:TERM NIL "fbound") " in the " (:TERM NIL "global environment")
     ". The consequences of attempting to use "
     (:MACREF NIL "pprint-exit-if-list-exhausted") " outside of "
     (:MACREF NIL "pprint-logical-block") " are undefined. "
     (:ENDISSUE NIL "LEXICAL-CONSTRUCT-GLOBAL-DEFINITION:UNDEFINED") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "An error is signaled (at macro expansion time or at run time) if "
     (:FUNREF NIL "pprint-exit-if-list-exhausted")
     " is used anywhere other than " (:COMMENT NIL "syntactically nested")
     "lexically within a call on " (:MACREF NIL "pprint-logical-block") ". "
     (:COMMENT NIL
      " It is undefined what happens if \\funref{pprint-if-list-exhausted} is executed outside"
      " of the dynamic extent of this \\funref{pprint-logical-block}.")
     "Also, the consequences of executing "
     (:MACREF NIL "pprint-exit-if-list-exhausted")
     " outside of the dynamic extent of the "
     (:MACREF NIL "pprint-logical-block")
     " which lexically contains it are undefined. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "pprint-logical-block")
     ", " (:FUNREF NIL "pprint-pop") ". " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== PPRINT-FILL" "%% ========== PPRINT-LINEAR"
    "%% ========== PPRINT-TABULAR")
   :PAR
   (:COM (:NAME "pprint-fill, pprint-linear, pprint-tabular" :FTYPE "Function")
    (:ISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "pprint-fill")
      (:ARGLIST NIL "stream object " (:KEYWORD NIL " &optional")
       " colon-p at-sign-p")
      (:VALUES NIL (:MISC NIL "nil")))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "pprint-linear")
      (:ARGLIST NIL "stream object " (:KEYWORD NIL " &optional")
       " colon-p at-sign-p")
      (:VALUES NIL (:MISC NIL "nil")))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "pprint-tabular")
      (:ARGLIST NIL "stream object " (:KEYWORD NIL " &optional")
       " colon-p at-sign-p tabsize")
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "stream") "—an "
     (:TERM NIL "output") " " (:TERM NIL "stream designator") ". " :PAR
     (:PARAM NIL "object") "—an " (:TERM NIL "object") ". " :PAR
     (:PARAM NIL "colon-p") "—a " (:TERM NIL "generalized boolean")
     ". The default is " (:TERM NIL "true") ". " :PAR (:PARAM NIL "at-sign-p")
     "—a " (:TERM NIL "generalized boolean") ". The default is "
     (:TERM NIL "implementation-dependent") ". " :PAR (:PARAM NIL "tabsize")
     "—a non-negative " (:TERM NIL "integer") ". The default is "
     (:TT NIL "16") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The functions "
     (:FUNREF NIL "pprint-fill") ", " (:FUNREF NIL "pprint-linear") ", and "
     (:FUNREF NIL "pprint-tabular") " specify particular ways of "
     (:TERM NIL "pretty printing") " a " (:TERM NIL "list") " to "
     (:PARAM NIL "stream")
     ". Each function prints parentheses around the output if and only if "
     (:PARAM NIL "colon-p") " is " (:TERM NIL "true")
     ". Each function ignores its " (:PARAM NIL "at-sign-p")
     " argument. (Both arguments are included even though only one is needed so that these functions can be used via "
     (:TT NIL "~/.../") " and as " (:FUNREF NIL "set-pprint-dispatch")
     " functions, as well as directly.) Each function handles abbreviation and the detection of circularity and sharing correctly, and uses "
     (:FUNREF NIL "write") " to print " (:PARAM NIL "object") " when it is a "
     (:TERM NIL "non-list") ". "
     (:COMMENT NIL
      " KMP: The pretty printer proposal as adopted was ambiguous "
      "  in the preceding sentence.  I tried to resolve the ambiguity"
      "  by changing the argument name and doing some rewording."
      "  Dick Waters should double-check this interpretation."
      " Waters: Is ok.")
     :PAR (:ISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " If "
     (:PARAM NIL "object") " is a " (:TERM NIL "list") " and if the "
     (:TERM NIL "value") " of " (:VARREF NIL "*print-pretty*") " is "
     (:TERM NIL "false") ", each of these functions prints "
     (:PARAM NIL "object") " using a minimum of " (:TERM NIL "whitespace")
     ", as described in " (:SECREF NIL :PRINTING-LISTS-AND-CONSES)
     ". Otherwise (if " (:PARAM NIL "object") " is a " (:TERM NIL "list")
     " and if the " (:TERM NIL "value") " of " (:VARREF NIL "*print-pretty*")
     " is " (:TERM NIL "true") "): " :PAR
     (:LIST NIL
      (:ITEM NIL " The " (:TERM NIL "function") " "
       (:FUNREF NIL "pprint-linear") " prints a " (:TERM NIL "list")
       " either all on one line, or with each " (:TERM NIL "element")
       " on a separate line. " :PAR)
      (:ITEM NIL " The " (:TERM NIL "function") " " (:FUNREF NIL "pprint-fill")
       " prints a " (:TERM NIL "list") " with as many " (:TERM NIL "elements")
       " as possible on each line. " :PAR)
      (:ITEM NIL " The " (:TERM NIL "function") " "
       (:FUNREF NIL "pprint-tabular") " is the same as "
       (:FUNREF NIL "pprint-fill") " except that it prints the "
       (:TERM NIL "elements") " so that they line up in columns. The "
       (:PARAM NIL "tabsize") " specifies the column spacing in "
       (:TERM NIL "ems") ", "
       (:COMMENT NIL " KMP: Is this (1) the minimum intercolumn spacing, or "
        "  (2) the total spacing from the left edge of one column "
        "      to the left edge of the next?" " Waters: (2)")
       "which is the total spacing from the leading edge of one column to the leading edge of the next. "))
     " " :PAR (:ENDISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     "Evaluating the following with a line length of " (:TT NIL "25")
     " produces the output shown. " :PAR
     (:CODE NIL "(progn (princ \"Roads \") 
       (pprint-tabular *standard-output* '(elm main maple center) nil nil 8))
Roads ELM     MAIN
      MAPLE   CENTER
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "Performs output to the indicated "
     (:TERM NIL "stream") ". " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "The cursor position on the indicated " (:TERM NIL "stream")
     ", if it can be determined. " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "pprint-tabular") " could be defined as follows: " :PAR
     (:CODE NIL
      "(defun pprint-tabular (s list &optional (colon-p t) at-sign-p (tabsize nil))
  (declare (ignore at-sign-p))
  (when (null tabsize) (setq tabsize 16))
  (pprint-logical-block (s list :prefix (if colon-p \"(\" \"\")
                                :suffix (if colon-p \")\" \"\"))
    (pprint-exit-if-list-exhausted)
    (loop (write (pprint-pop) :stream s)
          (pprint-exit-if-list-exhausted)
          (write-char #\\Space s)
          (pprint-tab :section-relative 0 tabsize s)
          (pprint-newline :fill s))))
")
     " " :PAR
     "Note that it would have been inconvenient to specify this function using "
     (:FUNREF NIL "format") ", because of the need to pass its "
     (:PARAM NIL "tabsize") " argument through to a " (:TT NIL "~:T")
     " format directive nested within an iteration over a list. " :PAR
     (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PPRINT-INDENT") :PAR
   (:COM (:NAME "pprint-indent" :FTYPE "Function")
    (:ISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "pprint-indent")
      (:ARGLIST NIL "relative-to n " (:KEYWORD NIL " &optional") " stream")
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "relative-to")
     "—either " (:KWD NIL "block") " or " (:KWD NIL "current") ". " :PAR
     (:PARAM NIL "n") "—a " (:TERM NIL "real") ". " :PAR (:PARAM NIL "stream")
     "—an " (:TERM NIL "output") " " (:TERM NIL "stream designator")
     ". The default is " (:TERM NIL "standard output") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "pprint-indent")
     " specifies the indentation to use in a logical block on "
     (:TERM NIL "stream") ". " (:ISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY")
     " If " (:PARAM NIL "stream") " is a " (:TERM NIL "pretty printing stream")
     " and the " (:TERM NIL "value") " of " (:VARREF NIL "*print-pretty*")
     " is " (:TERM NIL "true") ", " (:FUNREF NIL "pprint-indent")
     " sets the indentation in the innermost dynamically enclosing logical block; otherwise, "
     (:FUNREF NIL "pprint-indent") " has no effect. "
     (:ENDISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " " :PAR
     (:PARAM NIL "N") " specifies the indentation in " (:TERM NIL "ems")
     ". If " (:PARAM NIL "relative-to") " is " (:KWD NIL "block")
     ", the indentation is set to the horizontal position of the first character in the "
     (:TERM NIL "dynamically current logical block") " plus " (:PARAM NIL "n")
     " " (:TERM NIL "ems") ". If " (:PARAM NIL "relative-to") " is "
     (:KWD NIL "current")
     ", the indentation is set to the current output position plus "
     (:PARAM NIL "n") " " (:TERM NIL "ems")
     ". (For robustness in the face of variable-width fonts, it is advisable to use "
     (:KWD NIL "current") " with an " (:PARAM NIL "n")
     " of zero whenever possible.) " :PAR (:PARAM NIL "N")
     " can be negative; however, the total indentation cannot be moved left of the beginning of the line or left of the end of the rightmost per-line prefix—an attempt to move beyond one of these limits is treated "
     (:COMMENT NIL " KMP: How?" "     (1) Is an error signaled, "
      "  or (2) or do we just min out at 0?" " Waters: (2).")
     "the same as an attempt to move to that limit. Changes in indentation caused by "
     (:PARAM NIL "pprint-indent")
     " do not take effect until after the next line break. In addition, in miser mode all calls to "
     (:FUNREF NIL "pprint-indent")
     " are ignored, forcing the lines corresponding to the logical block to line up under the first character in the block. "
     :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "An error is signaled if "
     (:PARAM NIL "relative-to") " is any " (:TERM NIL "object") " other than "
     (:KWD NIL "block") " or " (:KWD NIL "current") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :TILDE-I) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PPRINT-LOGICAL-BLOCK") :PAR
   (:COM (:NAME "pprint-logical-block" :FTYPE "Macro")
    (:ISSUE NIL "DECLS-AND-DOC") " " :PAR (:ISSUE NIL "PRETTY-PRINT-INTERFACE")
    " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "pprint-logical-block")
      (:ARGLIST NIL
       (:PAREN NIL "stream-symbol object " (:KEYWORD NIL " &key")
        " prefix per-line-prefix suffix")
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "declaration"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "stream-symbol")
     "—a " (:TERM NIL "stream variable designator") ". " :PAR
     (:PARAM NIL "object") "—an " (:TERM NIL "object") "; evaluated. " :PAR
     (:KWD NIL "prefix") "—a " (:TERM NIL "string")
     "; evaluated. Complicated defaulting behavior; see below. " :PAR
     (:KWD NIL "per-line-prefix") "—a " (:TERM NIL "string")
     "; evaluated. Complicated defaulting behavior; see below. " :PAR
     (:KWD NIL "suffix") "—a " (:TERM NIL "string")
     "; evaluated. The default is the " (:TERM NIL "null") " "
     (:TERM NIL "string") ". " :PAR (:PARAM NIL "declaration") "—a "
     (:MISC NIL "declare") " " (:TERM NIL "expression") "; not evaluated. "
     :PAR (:PARAM NIL "forms") "—an " (:TERM NIL "implicit progn") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "Causes printing to be grouped into a logical block. " :PAR
     "The logical block is printed to the " (:TERM NIL "stream")
     " that is the " (:TERM NIL "value") " of the " (:TERM NIL "variable")
     " denoted by " (:PARAM NIL "stream-symbol")
     ". During the execution of the " (:TERM NIL "forms") ", that "
     (:TERM NIL "variable") " is " (:TERM NIL "bound") " to a "
     (:TERM NIL "pretty printing stream")
     " that supports decisions about the arrangement of output and then forwards the output to the destination stream. "
     (:ISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " "
     (:COMMENT NIL
      " If, during that context, \\varref{*print-pretty*} becomes bound to \\nil, "
      " the stream ceases to behave as a \\term{pretty printing stream}.")
     (:ENDISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY")
     " All the standard printing functions (" (:I NIL "e.g.") ",  "
     (:FUNREF NIL "write") ", " (:FUNREF NIL "princ") ", and "
     (:FUNREF NIL "terpri") ") can be used to print output to the "
     (:TERM NIL "pretty printing stream")
     ". All and only the output sent to this "
     (:TERM NIL "pretty printing stream")
     " is treated as being in the logical block. " :PAR "The "
     (:PARAM NIL "prefix")
     " specifies a prefix to be printed before the beginning of the logical block. The "
     (:PARAM NIL "per-line-prefix")
     " specifies a prefix that is printed before the block and at the beginning of each new line in the block. The "
     (:KWD NIL "prefix") " and " (:KWD NIL "per-line-prefix") " "
     (:TERM NIL "arguments") " are mutually exclusive. If neither "
     (:KWD NIL "prefix") " nor " (:KWD NIL "per-line-prefix")
     " is specified, a " (:PARAM NIL "prefix") " of the " (:TERM NIL "null")
     " " (:TERM NIL "string") " is assumed. " :PAR "The " (:PARAM NIL "suffix")
     " specifies a suffix that is printed just after the logical block. " :PAR
     "The " (:PARAM NIL "object") " is " (:COMMENT NIL "interpreted as ")
     "normally a " (:TERM NIL "list") " that the body " (:PARAM NIL "forms")
     " are responsible for printing. If " (:PARAM NIL "object") " is not a "
     (:TERM NIL "list") ", it is printed using " (:FUNREF NIL "write")
     ". (This makes it easier to write printing functions that are robust in the face of malformed arguments.) If "
     (:VARREF NIL "*print-circle*") " "
     (:COMMENT NIL "%There's no such var. -kmp 14-Jan-91"
      "(and possibly \\varref{*print-shared*}) ")
     "is " (:TERM NIL "non-nil") " and " (:PARAM NIL "object")
     " is a circular (or shared) reference to a " (:TERM NIL "cons")
     ", then an appropriate “" (:TT NIL "#" (:I NIL "n") "#")
     "” marker is printed. (This makes it easy to write printing functions that provide full support for circularity and sharing abbreviation.) If "
     (:VARREF NIL "*print-level*") " is not " (:MISC NIL "nil")
     " and the logical block is at a dynamic nesting depth of greater than "
     (:VARREF NIL "*print-level*") " in logical blocks, “" (:TT NIL "#")
     "” is printed. (This makes easy to write printing functions that provide full support for depth abbreviation.) "
     :PAR
     "If either of the three conditions above occurs, the indicated output is printed on "
     (:PARAM NIL "stream-symbol") " and the body " (:PARAM NIL "forms")
     " are skipped along with the printing of the " (:KWD NIL "prefix") " and "
     (:KWD NIL "suffix") ". (If the body " (:PARAM NIL "forms")
     " are not to be responsible for printing a list, then the first two tests above can be turned off by supplying "
     (:MISC NIL "nil") " for the " (:PARAM NIL "object") " argument.) " :PAR
     "In addition to the " (:PARAM NIL "object") " argument of "
     (:MACREF NIL "pprint-logical-block")
     ", the arguments of the standard printing functions (such as "
     (:FUNREF NIL "write") ", " (:FUNREF NIL "print") ", "
     (:FUNREF NIL "prin1") ", and " (:FUNREF NIL "pprint")
     ", as well as the arguments of the standard "
     (:TERM NIL "format directives") " such as " (:TT NIL "~A") ", "
     (:TT NIL "~S") ", (and " (:TT NIL "~W")
     ") are all checked (when necessary) for circularity and sharing. However, such checking is not applied to the arguments of the functions "
     (:FUNREF NIL "write-line") ", " (:FUNREF NIL "write-string") ", and "
     (:FUNREF NIL "write-char") " or to the literal text output by "
     (:FUNREF NIL "format")
     ". A consequence of this is that you must use one of the latter functions if you want to print some literal text in the output that is not supposed to be checked for circularity or sharing. "
     (:COMMENT NIL " (See the examples below.)") :PAR "The body "
     (:PARAM NIL "forms") " of a " (:MACREF NIL "pprint-logical-block") " "
     (:TERM NIL "form")
     " must not perform any side-effects on the surrounding environment; for example, no "
     (:TERM NIL "variables") " must be assigned which have not been "
     (:TERM NIL "bound") " within its scope. "
     (:COMMENT NIL " (See notes below for rationale.)") :PAR
     (:ISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " The "
     (:MACREF NIL "pprint-logical-block") " " (:TERM NIL "macro")
     " may be used regardless of the " (:TERM NIL "value") " of "
     (:VARREF NIL "*print-pretty*") ". "
     (:ENDISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*print-circle*") ", "
     (:VARREF NIL "*print-level*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error")
     " is signaled if any of the " (:KWD NIL "suffix") ", " (:KWD NIL "prefix")
     ", or " (:KWD NIL "per-line-prefix")
     " is supplied but does not evaluate to a " (:TERM NIL "string") ". " :PAR
     "An error is signaled if " (:KWD NIL "prefix") " and "
     (:KWD NIL "per-line-prefix") " are both used. " :PAR
     (:MACREF NIL "pprint-logical-block") " and the "
     (:TERM NIL "pretty printing stream") " it creates have "
     (:TERM NIL "dynamic extent")
     ". The consequences are undefined if, outside of this extent, output is attempted to the "
     (:TERM NIL "pretty printing stream") " it creates. " :PAR
     "It is also unspecified what happens if, within this extent, any output is sent directly to the underlying destination stream. "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "pprint-pop") ", "
     (:MACREF NIL "pprint-exit-if-list-exhausted") ", "
     (:SECREF NIL :TILDE-LESS-THAN-LOGICAL-BLOCK) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:ISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY")
     " One reason for using the " (:MACREF NIL "pprint-logical-block") " "
     (:TERM NIL "macro") " when the " (:TERM NIL "value") " of "
     (:VARREF NIL "*print-pretty*") " is " (:MISC NIL "nil")
     " would be to allow it to perform checking for "
     (:TERM NIL "dotted lists") ", as well as (in conjunction with "
     (:MACREF NIL "pprint-pop") ") checking for " (:VARREF NIL "*print-level*")
     " or " (:VARREF NIL "*print-length*") " being exceeded. "
     (:ENDISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " " :PAR
     "Detection of circularity and sharing is supported by the "
     (:TERM NIL "pretty printer")
     " by in essence performing requested output twice. On the first pass, circularities and sharing are detected and the actual outputting of characters is suppressed. On the second pass, the appropriate “"
     (:TT NIL "#" (:PARAM NIL "n") "=") "” and “"
     (:TT NIL "#" (:PARAM NIL "n") "#")
     "” markers are inserted and characters are output. This is why the restriction on side-effects is necessary. Obeying this restriction is facilitated by using "
     (:MACREF NIL "pprint-pop") ", instead of an ordinary " (:MACREF NIL "pop")
     " when traversing a list being printed by the body " (:PARAM NIL "forms")
     " of the " (:MACREF NIL "pprint-logical-block") " " (:TERM NIL "form")
     ".) " :PAR (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR
     (:ENDISSUE NIL "DECLS-AND-DOC") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PPRINT-NEWLINE") :PAR
   (:COM (:NAME "pprint-newline" :FTYPE "Function")
    (:ISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "pprint-newline")
      (:ARGLIST NIL "kind " (:KEYWORD NIL " &optional") " stream")
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "kind")
     "—one of " (:KWD NIL "linear") ", " (:KWD NIL "fill") ", "
     (:KWD NIL "miser") ", or " (:KWD NIL "mandatory") ". " :PAR
     (:PARAM NIL "stream") "—a " (:TERM NIL "stream designator")
     ". The default is " (:TERM NIL "standard output") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL
      "% This follows from being a stream designator. -kmp 27-Aug-93"
      " \\param{Stream} defaults to \\term{standard output}."
      " If it is \\nil, \\term{standard output} is used instead."
      " If it is \\t, \\term{terminal I/O} is used instead.")
     :PAR (:ISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " If "
     (:PARAM NIL "stream") " is a " (:TERM NIL "pretty printing stream")
     " and the " (:TERM NIL "value") " of " (:VARREF NIL "*print-pretty*")
     " is " (:TERM NIL "true")
     ", a line break is inserted in the output when the appropriate condition below is satisfied; otherwise, "
     (:FUNREF NIL "pprint-newline") " has no effect. "
     (:ENDISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " " :PAR
     (:PARAM NIL "Kind") " specifies the style of conditional newline. This "
     (:TERM NIL "parameter") " is treated as follows: " :PAR
     (:LIST NIL
      (:ITEM NIL (:KWD NIL "linear") " " :PAR
       "This specifies a “linear-style” " (:TERM NIL "conditional newline") "."
       (:IDXTEXT NIL "linear-style conditional newline")
       " A line break is inserted if and only if the immediately containing "
       (:TERM NIL "section")
       " cannot be printed on one line. The effect of this is that line breaks are either inserted at every linear-style conditional newline in a logical block or at none of them. "
       :PAR)
      (:ITEM NIL (:KWD NIL "miser") " " :PAR "This specifies a “miser-style” "
       (:TERM NIL "conditional newline") "."
       (:IDXTEXT NIL "miser-style conditional newline")
       " A line break is inserted if and only if the immediately containing "
       (:TERM NIL "section")
       " cannot be printed on one line and miser style is in effect in the immediately containing logical block. The effect of this is that miser-style conditional newlines act like linear-style conditional newlines, but only when miser style is in effect. Miser style is in effect for a logical block if and only if the starting position of the logical block is less than or equal to "
       (:VARREF NIL "*print-miser-width*") " " (:TERM NIL "ems")
       " from the right margin. " :PAR)
      (:ITEM NIL (:KWD NIL "fill") " " :PAR "This specifies a “fill-style” "
       (:TERM NIL "conditional newline") "."
       (:IDXTEXT NIL "fill-style conditional newline")
       " A line break is inserted if and only if either (a) the following "
       (:TERM NIL "section")
       " cannot be printed on the end of the current line, (b) the preceding "
       (:TERM NIL "section")
       " was not printed on a single line, or (c) the immediately containing "
       (:TERM NIL "section")
       " cannot be printed on one line and miser style is in effect in the immediately containing logical block. If a logical block is broken up into a number of subsections by fill-style conditional newlines, the basic effect is that the logical block is printed with as many subsections as possible on each line. However, if miser style is in effect, fill-style conditional newlines act like linear-style conditional newlines. "
       :PAR)
      (:ITEM NIL (:KWD NIL "mandatory") " " :PAR
       "This specifies a “mandatory-style” " (:TERM NIL "conditional newline")
       "." (:IDXTEXT NIL "mandatory-style conditional newline")
       " A line break is always inserted. This implies that none of the containing "
       (:TERM NIL "sections")
       " can be printed on a single line and will therefore trigger the insertion of line breaks at linear-style conditional newlines in these "
       (:TERM NIL "sections") ". " :PAR))
     " " :PAR
     "When a line break is inserted by any type of conditional newline, any blanks that immediately precede the conditional newline are omitted from the output and indentation is introduced at the beginning of the next line. By default, the indentation causes the following line to begin in the same horizontal position as the first character in the immediately containing logical block. (The indentation can be changed via "
     (:FUNREF NIL "pprint-indent") ".) " :PAR
     "There are a variety of ways unconditional newlines can be introduced into the output ("
     (:I NIL "i.e.") ",  via " (:FUNREF NIL "terpri")
     " or by printing a string containing a newline character). As with mandatory conditional newlines, this prevents any of the containing "
     (:TERM NIL "sections")
     " from being printed on one line. In general, when an unconditional newline is encountered, it is printed out without suppression of the preceding blanks and without any indentation following it. However, if a per-line prefix has been specified (see "
     (:MACREF NIL "pprint-logical-block")
     "), this prefix will always be printed no matter how a newline originates. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR "See "
     (:SECREF NIL :PRETTY-PRINTER-EXAMPLES) ". " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "Output to " (:PARAM NIL "stream")
     ". " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*print-pretty*") ", "
     (:VARREF NIL "*print-miser-width*")
     ". The presence of containing logical blocks. The placement of newlines and conditional newlines. "
     :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "type-error") " is signaled if "
     (:PARAM NIL "kind") " is not one of " (:KWD NIL "linear") ", "
     (:KWD NIL "fill") ", " (:KWD NIL "miser") ", or " (:KWD NIL "mandatory")
     ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :TILDE-UNDERSCORE) ", "
     (:SECREF NIL :PRETTY-PRINTER-EXAMPLES) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PPRINT-POP") :PAR
   (:COM (:NAME "pprint-pop" :FTYPE "Local Macro")
    (:ISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "pprint-pop")
      (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments")))
      (:VALUES NIL "object"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "element") " of the " (:TERM NIL "list")
     " being printed in the " (:TERM NIL "lexically current logical block")
     ", or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Pops one " (:TERM NIL "element")
     " from the " (:TERM NIL "list") " being printed in the "
     (:TERM NIL "lexically current logical block") ", obeying "
     (:VARREF NIL "*print-length*") " and " (:VARREF NIL "*print-circle*")
     " as described below. " :PAR "Each time " (:MACREF NIL "pprint-pop")
     " is called, it pops the next value off the " (:TERM NIL "list")
     " passed to the " (:TERM NIL "lexically current logical block")
     " and returns it. However, before doing this, it performs three tests: "
     :PAR
     (:LIST NIL
      (:ITEM NIL " If the remaining `list' is not a " (:TERM NIL "list") ", “"
       (:TT NIL ". ") "”" (:IDXTERM NIL "dot")
       " is printed followed by the remaining `list.' (This makes it easier to write printing functions that are robust in the face of malformed arguments.) "
       :PAR)
      (:ITEM NIL " If " (:VARREF NIL "*print-length*") " is "
       (:TERM NIL "non-nil") ", and " (:MACREF NIL "pprint-pop")
       " has already been called " (:VARREF NIL "*print-length*")
       " times within the immediately containing logical block, “"
       (:TT NIL "...") "”" (:IDXTEXT NIL "Dot Dot Dot") (:IDXCODE NIL "...")
       " is printed. (This makes it easy to write printing functions that properly handle "
       (:VARREF NIL "*print-length*") ".) " :PAR)
      (:ITEM NIL " If " (:VARREF NIL "*print-circle*") " is "
       (:TERM NIL "non-nil")
       ", and the remaining list is a circular (or shared) reference, then “"
       (:TT NIL ". ") "” is printed followed by an appropriate “"
       (:TT NIL "#" (:I NIL "n") "#") "”"
       (:IDXTEXT NIL "Sharpsign Sharpsign (reader macro)")
       " marker. (This catches instances of " (:TERM NIL "cdr")
       " circularity and sharing in lists.) "))
     " " :PAR
     "If either of the three conditions above occurs, the indicated output is printed on the "
     (:TERM NIL "pretty printing stream")
     " created by the immediately containing "
     (:MACREF NIL "pprint-logical-block")
     " and the execution of the immediately containing "
     (:MACREF NIL "pprint-logical-block")
     " is terminated except for the printing of the suffix. " :PAR
     (:COMMENT NIL "KMP: I find this next paragraph fairly undecipherable.")
     "If " (:MACREF NIL "pprint-logical-block")
     " is given a `list' argument of " (:MISC NIL "nil")
     "—because it is not processing a list—" (:MACREF NIL "pprint-pop")
     " can still be used to obtain support for " (:VARREF NIL "*print-length*")
     ". In this situation, the first and third tests above are disabled and "
     (:MACREF NIL "pprint-pop") " always returns " (:MISC NIL "nil") ". See "
     (:SECREF NIL :PRETTY-PRINTER-EXAMPLES) "—specifically, the "
     (:FUNREF NIL "pprint-vector") " example. " :PAR
     (:ISSUE NIL "LEXICAL-CONSTRUCT-GLOBAL-DEFINITION:UNDEFINED")
     " Whether or not " (:MACREF NIL "pprint-pop") " is " (:TERM NIL "fbound")
     " in the " (:TERM NIL "global environment") " is "
     (:TERM NIL "implementation-dependent")
     "; however, the restrictions on redefinition and " (:TERM NIL "shadowing")
     " of " (:MACREF NIL "pprint-pop") " are the same as for "
     (:TERM NIL "symbols") " in the " (:PACKREF NIL "common-lisp") " "
     (:TERM NIL "package") " which are " (:TERM NIL "fbound") " in the "
     (:TERM NIL "global environment")
     ". The consequences of attempting to use " (:MACREF NIL "pprint-pop")
     " outside of " (:MACREF NIL "pprint-logical-block") " are undefined. "
     (:ENDISSUE NIL "LEXICAL-CONSTRUCT-GLOBAL-DEFINITION:UNDEFINED") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "Might cause output "
     (:COMMENT NIL "This next info supplied by Waters. -kmp 16-Oct-91")
     "to the " (:TERM NIL "pretty printing stream")
     " associated with the lexically current logical block. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*print-length*") ", "
     (:VARREF NIL "*print-circle*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "An error is signaled (either at macro expansion time or at run time) if a usage of "
     (:MACREF NIL "pprint-pop")
     " occurs where there is no lexically containing "
     (:MACREF NIL "pprint-logical-block") " " (:TERM NIL "form") ". " :PAR
     "The consequences are undefined if " (:MACREF NIL "pprint-pop")
     " is executed outside of the " (:TERM NIL "dynamic extent") " of this "
     (:MACREF NIL "pprint-logical-block") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:MACREF NIL "pprint-exit-if-list-exhausted") ", "
     (:MACREF NIL "pprint-logical-block") ". " :PAR)
    (:PART (:NAME "Notes") " " :PAR "It is frequently a good idea to call "
     (:MACREF NIL "pprint-exit-if-list-exhausted") " before calling "
     (:MACREF NIL "pprint-pop") ". " :PAR
     (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PPRINT-TAB") :PAR
   (:COM (:NAME "pprint-tab" :FTYPE "Function")
    (:ISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "pprint-tab")
      (:ARGLIST NIL "kind colnum colinc " (:KEYWORD NIL " &optional")
       " stream")
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "kind")
     "—one of " (:KWD NIL "line") ", " (:KWD NIL "section") ", "
     (:KWD NIL "line-relative") ", or " (:KWD NIL "section-relative") ". " :PAR
     (:PARAM NIL "colnum") "—a non-negative " (:TERM NIL "integer") ". " :PAR
     (:PARAM NIL "colinc") "—a non-negative " (:TERM NIL "integer") ". " :PAR
     (:PARAM NIL "stream") "—an " (:TERM NIL "output") " "
     (:TERM NIL "stream designator") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Specifies tabbing to "
     (:PARAM NIL "stream") " as performed by the standard " (:TT NIL "~T")
     " format directive. " (:ISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY")
     " If " (:PARAM NIL "stream") " is a " (:TERM NIL "pretty printing stream")
     " and the " (:TERM NIL "value") " of " (:VARREF NIL "*print-pretty*")
     " is " (:TERM NIL "true") ", "
     (:ENDISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY")
     " tabbing is performed; otherwise, " (:FUNREF NIL "pprint-tab")
     " has no effect. " :PAR "The arguments " (:PARAM NIL "colnum") " and "
     (:PARAM NIL "colinc") " correspond to the two " (:PARAM NIL "parameters")
     " to " (:TT NIL "~T") " and are in terms of " (:TERM NIL "ems") ". The "
     (:PARAM NIL "kind")
     " argument specifies the style of tabbing. It must be one of "
     (:KWD NIL "line") " (tab as by " (:TT NIL "~T") "), " (:KWD NIL "section")
     " (tab as by " (:TT NIL "~:T")
     ", but measuring horizontal positions relative to the start of the dynamically enclosing section), "
     (:KWD NIL "line-relative") " (tab as by " (:TT NIL "~@T") "), or "
     (:KWD NIL "section-relative") " (tab as by " (:TT NIL "~:@T")
     ", but measuring horizontal positions relative to the start of the dynamically enclosing section). "
     :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "An error is signaled if "
     (:PARAM NIL "kind") " is not one of " (:KWD NIL "line") ", "
     (:KWD NIL "section") ", " (:KWD NIL "line-relative") ", or "
     (:KWD NIL "section-relative") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "pprint-logical-block") " "
     :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PRINT-OBJECT")
   (:COM (:NAME "print-object" :FTYPE "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "generic-function") (:NAMES NIL "print-object")
      (:ARGLIST NIL "object stream") (:VALUES NIL "object"))
     " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "print-object")
      (:ARGLIST NIL (:PAREN NIL (:PARAM NIL "object") " standard-object") " "
       (:PARAM NIL "stream")))
     " " (:ISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
     (:DEF (:KIND "method") (:NAMES NIL "print-object")
      (:ARGLIST NIL (:PAREN NIL (:PARAM NIL "object") " structure-object") " "
       (:PARAM NIL "stream")))
     " " (:ENDISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
     :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "stream") "—a "
     (:TERM NIL "stream") ". "
     (:COMMENT NIL "% KMP: It should not be necessary to say this."
      " it cannot be the \\term{symbols} \\t\\ or \\nil. ")
     :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "generic function")
     " " (:FUNREF NIL "print-object") " writes the printed representation of "
     (:PARAM NIL "object") " to " (:PARAM NIL "stream") ". The "
     (:TERM NIL "function") " " (:FUNREF NIL "print-object")
     " is called by the " (:TERM NIL "Lisp printer")
     "; it should not be called by the user. " :PAR
     (:ISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93")
     " Each implementation is required to provide a " (:TERM NIL "method")
     " on the " (:TERM NIL "class") " " (:TYPEREF NIL "standard-object")
     " and on the " (:TERM NIL "class") " " (:TYPEREF NIL "structure-object")
     ". In addition, each " (:TERM NIL "implementation") " must provide "
     (:TERM NIL "methods") " on enough other " (:TERM NIL "classes")
     " so as to ensure that there is always an applicable "
     (:TERM NIL "method") ". Implementations are free to add "
     (:TERM NIL "methods") " for other " (:TERM NIL "classes")
     ". Users may write " (:TERM NIL "methods") " for "
     (:FUNREF NIL "print-object") " for their own " (:TERM NIL "classes")
     " if they do not wish to inherit an "
     (:TERM NIL "implementation-dependent") " " (:TERM NIL "method") ". " :PAR
     "The " (:TERM NIL "method") " on the " (:TERM NIL "class") " "
     (:TYPEREF NIL "structure-object") " prints the object in the default "
     (:TT NIL "#S") " notation; see " (:SECREF NIL :PRINTING-STRUCTURES) ". "
     (:ENDISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " " :PAR
     (:COMMENT NIL "\\term{Methods} on \\funref{print-object} must "
      "obey the print control special variables."
      "The specific details are the following:")
     :PAR (:TERM NIL "Methods") " on " (:FUNREF NIL "print-object")
     " are responsible for implementing their part of the semantics of the "
     (:TERM NIL "printer control variables") ", as follows: " :PAR
     (:LIST NIL
      (:ITEM NIL (:VARREF NIL "*print-readably*") " " :PAR "All methods for "
       (:FUNREF NIL "print-object") " must obey "
       (:VARREF NIL "*print-readably*")
       ". This includes both user-defined methods and "
       (:TERM NIL "implementation-defined") " methods. Readable printing of "
       (:TERM NIL "structures") " and " (:TERM NIL "standard objects")
       " is controlled by their " (:FUNREF NIL "print-object")
       " method, not by their " (:FUNREF NIL "make-load-form") " "
       (:TERM NIL "method") ". " (:TERM NIL "Similarity") " for these "
       (:TERM NIL "objects")
       " is application dependent and hence is defined to be whatever these "
       (:TERM NIL "methods") " do; see " (:SECREF NIL :SIMILARITY) ". " :PAR
       (:ENDISSUE NIL "DATA-IO:ADD-SUPPORT") " " :PAR)
      (:ITEM NIL (:VARREF NIL "*print-escape*") " " :PAR "Each "
       (:TERM NIL "method") " must implement " (:VARREF NIL "*print-escape*")
       ". " :PAR)
      (:ITEM NIL (:VARREF NIL "*print-pretty*") " " :PAR
       (:ISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " "
       (:COMMENT NIL
        " The \\varref{*print-pretty*} control variable can be ignored"
        " by most \\term{methods} other than the one for \\term{lists}.")
       "The " (:TERM NIL "method")
       " may wish to perform specialized line breaking or other output conditional on the "
       (:TERM NIL "value") " of " (:VARREF NIL "*print-pretty*")
       ". For further information, see (for example) the " (:TERM NIL "macro")
       " " (:FUNREF NIL "pprint-fill") ". See also "
       (:SECREF NIL :PPRINT-DISPATCH-TABLES) " and "
       (:SECREF NIL :PRETTY-PRINTER-EXAMPLES) ". "
       (:ENDISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " " :PAR)
      (:ITEM NIL (:VARREF NIL "*print-length*") " " :PAR (:TERM NIL "Methods")
       " that produce output of indefinite length must obey "
       (:VARREF NIL "*print-length*") ". "
       (:ISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " "
       (:COMMENT NIL ", but most \\term{methods} other than the one for "
        "\\term{lists} can ignore it.")
       "For further information, see (for example) the " (:TERM NIL "macros")
       " " (:MACREF NIL "pprint-logical-block") " and "
       (:MACREF NIL "pprint-pop") ". See also "
       (:SECREF NIL :PPRINT-DISPATCH-TABLES) " and "
       (:SECREF NIL :PRETTY-PRINTER-EXAMPLES) ". "
       (:ENDISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " " :PAR)
      (:ITEM NIL (:VARREF NIL "*print-level*") " " :PAR
       "The printer takes care of " (:VARREF NIL "*print-level*")
       " automatically, provided that each " (:TERM NIL "method")
       " handles exactly one level of structure and calls "
       (:FUNREF NIL "write") " (or an equivalent " (:TERM NIL "function")
       ") recursively if there are more structural levels. The printer's decision of whether an "
       (:TERM NIL "object")
       " has components (and therefore should not be printed when the printing depth is not less than "
       (:VARREF NIL "*print-level*") ") is "
       (:TERM NIL "implementation-dependent") ". In some implementations its "
       (:FUNREF NIL "print-object") " " (:TERM NIL "method")
       " is not called; in others the " (:TERM NIL "method")
       " is called, and the determination that the " (:TERM NIL "object")
       " has components is based on what it tries to write to the "
       (:PARAM NIL "stream") ". " :PAR)
      (:ITEM NIL (:VARREF NIL "*print-circle*") " " :PAR
       (:ISSUE NIL "PRINT-CIRCLE-STRUCTURE:USER-FUNCTIONS-WORK") " When the "
       (:TERM NIL "value") " of " (:VARREF NIL "*print-circle*") " is "
       (:TERM NIL "true") ", a user-defined "
       (:ISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
       (:COMMENT NIL "print function") (:FUNREF NIL "print-object") " "
       (:TERM NIL "method") " "
       (:ENDISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93")
       " can print " (:TERM NIL "objects") " to the supplied "
       (:TERM NIL "stream") " using " (:FUNREF NIL "write") ", "
       (:FUNREF NIL "prin1") ", " (:FUNREF NIL "princ") ", or "
       (:FUNREF NIL "format")
       " and expect circularities to be detected and printed using the "
       (:TT NIL "#" (:I NIL "n") "#") " syntax. If a user-defined "
       (:ISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
       (:COMMENT NIL "print function") (:FUNREF NIL "print-object") " "
       (:TERM NIL "method") " "
       (:ENDISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93")
       " prints to a " (:TERM NIL "stream")
       " other than the one that was supplied, then circularity detection starts over for that "
       (:TERM NIL "stream") ". See " (:VARREF NIL "*print-circle*") ". "
       (:ENDISSUE NIL "PRINT-CIRCLE-STRUCTURE:USER-FUNCTIONS-WORK") " " :PAR)
      (:ITEM NIL (:VARREF NIL "*print-base*") ", "
       (:VARREF NIL "*print-radix*") ", " (:VARREF NIL "*print-case*") ", "
       (:VARREF NIL "*print-gensym*") ", and " (:VARREF NIL "*print-array*")
       " " :PAR "These " (:TERM NIL "printer control variables")
       " apply to specific types of " (:TERM NIL "objects")
       " and are handled by the " (:TERM NIL "methods") " for those "
       (:TERM NIL "objects") ". " :PAR))
     " " :PAR "If these rules are not obeyed, the results are undefined. " :PAR
     (:COMMENT NIL "!!! What is the motivation for this?")
     "In general, the printer and the " (:FUNREF NIL "print-object")
     " methods should not rebind the print control variables as they operate recursively through the structure, but this is "
     (:TERM NIL "implementation-dependent") ". " :PAR
     "In some implementations the " (:PARAM NIL "stream")
     " argument passed to a " (:FUNREF NIL "print-object") " "
     (:TERM NIL "method") " is not the original " (:TERM NIL "stream")
     ", but is an intermediate " (:TERM NIL "stream")
     " that implements part of the printer. " (:TERM NIL "methods")
     " should therefore not depend on the identity of this "
     (:TERM NIL "stream") ". " :PAR
     (:COMMENT NIL "All of the existing printing functions (\\funref{write}, "
      "\\funref{prin1}, \\funref{print}, \\funref{princ}, \\funref{pprint},"
      "\\funref{write-to-string}, \\funref{prin1-to-string}, "
      "\\funref{princ-to-string}, the \\formatOp{S} and \\formatOp{A}"
      "format operations, and the \\formatOp{B}, \\formatOp{D},"
      "\\formatOp{E}, \\formatOp{F}, \\formatOp{G}, \\formatOp{\\$},"
      "\\formatOp{O}, \\formatOp{R}, and \\formatOp{X}"
      "format operations when they encounter a non-numeric"
      "value) are required to be changed to go through the \\funref{print-object}"
      "generic function.  Each implementation is required to"
      "replace its former implementation of printing with one or more"
      "\\funref{print-object} methods.  " "% Flushed per X3J13. -kmp 05-Oct-93"
      " Exactly which \\term{classes} have \\term{methods} for \\funref{print-object} "
      " is not specified; it would be valid for an implementation to have one"
      " default \\term{method} that is inherited by all system-defined \\term{classes}.")
     :PAR (:COMMENT NIL "% Per X3J13. -kmp 05-Oct-93"))
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "pprint-fill") ", "
     (:MACREF NIL "pprint-logical-block") ", " (:MACREF NIL "pprint-pop") ", "
     (:FUNREF NIL "write") ", " (:VARREF NIL "*print-readably*") ", "
     (:VARREF NIL "*print-escape*") ", " (:VARREF NIL "*print-pretty*") ", "
     (:VARREF NIL "*print-length*") ", " (:SECREF NIL :DEFAULT-PRINT-OBJ-METHS)
     ", " (:ISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
     (:SECREF NIL :PRINTING-STRUCTURES) ", "
     (:ENDISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
     (:SECREF NIL :PPRINT-DISPATCH-TABLES) ", "
     (:SECREF NIL :PRETTY-PRINTER-EXAMPLES) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PRINT-UNREADABLE-OBJECT")
   (:COM (:NAME "print-unreadable-object" :FTYPE "Macro")
    (:ISSUE NIL "DATA-IO:ADD-SUPPORT") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "print-unreadable-object")
      (:ARGLIST NIL
       (:PAREN NIL "object stream " (:KEYWORD NIL " &key") " type identity")
       " " (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") "; evaluated. " :PAR (:PARAM NIL "stream") "—"
     (:COMMENT NIL
      "% Changed per Barrett #8 (first public review) -kmp 14-May-93"
      " the \\term{name} of a \\term{lexical variable} or \\term{dynamic variable},"
      " 		 the \\term{value} of which is a \\term{stream}; "
      " 		 used both unevaluated and evaluated.")
     "a " (:TERM NIL "stream designator") "; evaluated. " :PAR
     (:PARAM NIL "type") "—a " (:TERM NIL "generalized boolean")
     "; evaluated. " :PAR (:PARAM NIL "identity") "—a "
     (:TERM NIL "generalized boolean") "; evaluated. " :PAR
     (:PARAM NIL "forms") "—an " (:TERM NIL "implicit progn") ". "
     (:COMMENT NIL
      "!!! it is evaluated. also used unevaluated to determine if any forms were present. hmmm...")
     :PAR)
    (:PART (:NAME "Description") " " :PAR
     "Outputs a printed representation of " (:PARAM NIL "object") " on "
     (:PARAM NIL "stream") ", beginning with “" (:TT NIL "#<")
     "” and ending with “" (:TT NIL ">") "”. Everything output to "
     (:PARAM NIL "stream") " by the body " (:PARAM NIL "forms")
     " is enclosed in the angle brackets. If " (:PARAM NIL "type") " is "
     (:TERM NIL "true") ", the output from " (:PARAM NIL "forms")
     " is preceded by a brief description of the " (:PARAM NIL "object") "'s "
     (:TERM NIL "type") " and a space character. If " (:PARAM NIL "identity")
     " is " (:TERM NIL "true") ", the output from " (:PARAM NIL "forms")
     " is followed by a space character and a representation of the "
     (:PARAM NIL "object") "'s identity, typically a storage address. " :PAR
     "If either " (:PARAM NIL "type") " or " (:PARAM NIL "identity")
     " is not supplied, its value is " (:TERM NIL "false")
     ". It is valid to omit the body " (:PARAM NIL "forms") ". If "
     (:PARAM NIL "type") " and " (:PARAM NIL "identity")
     " are both true and there are no body " (:PARAM NIL "forms")
     ", only one space character separates the type and the identity. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     ";; Note that in this example, the precise form of the output ;; is "
     (:TERM NIL "implementation-dependent") ". " :PAR
     (:CODE NIL " (defmethod print-object ((obj airplane) stream)
   (print-unreadable-object (obj stream :type t :identity t)
     (princ (tail-number obj) stream)))

 (prin1-to-string my-airplane)
→ \"#<Airplane NW0773 36000123135>\"
OR→ \"#<FAA:AIRPLANE NW0773 17>\"
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If "
     (:VARREF NIL "*print-readably*") " is " (:TERM NIL "true") ", "
     (:MACREF NIL "print-unreadable-object") " signals an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "print-not-readable")
     " without printing anything. " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "DATA-IO:ADD-SUPPORT") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SET-PPRINT-DISPATCH")
   (:COM (:NAME "set-pprint-dispatch" :FTYPE "Function")
    (:ISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "set-pprint-dispatch")
      (:ARGLIST NIL "type-specifier function " (:KEYWORD NIL " &optional")
       " priority table")
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "type-specifier") "—a " (:TERM NIL "type specifier") ". "
     (:COMMENT NIL " %This is now a valid type specifier! -kmp 30-Apr-91"
      " 		         or a list of the form "
      " 			  \\f{(cons \\param{type-specifier} \\param{type-specifier})}"
      " 			 or {\\tt (cons \\param{type-specifier})}."
      "    \\editornote{KMP: Can the type-specifier in a cons specifier also be a "
      " 		    usage of CONS?  Why don't we extend the CONS type specifier"
      " 		    rather than make this special case?}")
     :PAR (:PARAM NIL "function") "—a " (:TERM NIL "function") ", a "
     (:TERM NIL "function name") ", or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "priority") "—a " (:TERM NIL "real") ". The default is "
     (:TT NIL "0") ". " :PAR (:PARAM NIL "table") "—a "
     (:TERM NIL "pprint dispatch table") ". The default is the "
     (:TERM NIL "value") " of " (:VARREF NIL "*print-pprint-dispatch*") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR "Installs an entry into the "
     (:TERM NIL "pprint dispatch table") " which is " (:PARAM NIL "table") ". "
     :PAR (:PARAM NIL "Type-specifier") " "
     (:COMMENT NIL "% already said above. -kmp"
      "must be a valid \\term{type specifier} and")
     "is the " (:TERM NIL "key") " of the entry. The first action of "
     (:FUNREF NIL "set-pprint-dispatch")
     " is to remove any pre-existing entry associated with "
     (:PARAM NIL "type-specifier")
     ". This guarantees that there will never be two entries associated with the same "
     (:TERM NIL "type specifier") " in a given "
     (:TERM NIL "pprint dispatch table") ". Equality of "
     (:TERM NIL "type specifiers") " is tested by " (:FUNREF NIL "equal") ". "
     :PAR "Two values are associated with each " (:TERM NIL "type specifier")
     " in a " (:TERM NIL "pprint dispatch table") ": a "
     (:PARAM NIL "function") " and a " (:PARAM NIL "priority") ". The "
     (:PARAM NIL "function") " must accept two arguments: the "
     (:TERM NIL "stream") " to which output is sent and the "
     (:TERM NIL "object") " to be printed. The " (:PARAM NIL "function")
     " should " (:TERM NIL "pretty print") " the " (:TERM NIL "object")
     " to the " (:PARAM NIL "stream") ". The " (:PARAM NIL "function")
     " can assume that object satisfies the " (:TERM NIL "type") " given by "
     (:PARAM NIL "type-specifier") ". The " (:PARAM NIL "function")
     " must obey " (:VARREF NIL "*print-readably*") ". "
     (:COMMENT NIL "(see issue DATA-IO)") "Any values returned by the "
     (:PARAM NIL "function") " are ignored. " :PAR (:PARAM NIL "Priority")
     " is a priority to resolve conflicts when an object matches more than one entry. "
     :PAR "It is permissible for " (:PARAM NIL "function") " to be "
     (:MISC NIL "nil") ". In this situation, there will be no "
     (:PARAM NIL "type-specifier") " entry in " (:PARAM NIL "table") " after "
     (:FUNREF NIL "set-pprint-dispatch") " returns. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "An error is signaled if "
     (:PARAM NIL "priority") " is not a " (:TERM NIL "real") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "Since "
     (:TERM NIL "pprint dispatch tables")
     " are often used to control the pretty printing of Lisp code, it is common for the "
     (:PARAM NIL "type-specifier") " to be an " (:TERM NIL "expression")
     " of the form " :PAR
     (:CODE NIL " (cons " (:PARAM NIL "car-type") " " (:PARAM NIL "cdr-type") ")
")
     " " :PAR
     "This signifies that the corresponding object must be a cons cell whose "
     (:TERM NIL "car") " matches the " (:TERM NIL "type specifier") " "
     (:PARAM NIL "car-type") " and whose " (:TERM NIL "cdr") " matches the "
     (:TERM NIL "type specifier") " " (:PARAM NIL "cdr-type") ". The "
     (:PARAM NIL "cdr-type") " can be omitted in which case it defaults to "
     (:MISC NIL "t") ". " :PAR
     (:COMMENT NIL "% I don't think this note had any content. -kmp 13-Jan-91"
      " ----------------------------------------------------------------------"
      " "
      " Implementation note:  The restriction above is very useful to users"
      " without actually limiting what Common Lisp implementors can do.  It is"
      " possible for implementors to set up any kind of pretty printing they"
      " desire using the range of priorities available to them." " "
      " ----------------------------------------------------------------------")
     :PAR (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== PRIN1" "%% ========== PRINC"
    "%% ========== PRINT" "%% ========== PPRINT" "%% ========== WRITE")
   (:COM (:NAME "write, prin1, print, pprint, princ" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR (:COMMENT NIL "% 22.3.1 5")
     (:DEF (:KIND "function") (:NAMES NIL "write")
      (:ARGLIST NIL (:PARAM NIL "object") " " (:KEYWORD NIL " &key")
       " array base case circle escape gensym length level lines miser-width pprint-dispatch pretty radix readably right-margin stream")
      (:VALUES NIL "object"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "prin1")
      (:ARGLIST NIL "object " (:KEYWORD NIL " &optional") " output-stream")
      (:VALUES NIL "object"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "princ")
      (:ARGLIST NIL "object " (:KEYWORD NIL " &optional") " output-stream")
      (:VALUES NIL "object"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "print")
      (:ARGLIST NIL "object " (:KEYWORD NIL " &optional") " output-stream")
      (:VALUES NIL "object"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "pprint")
      (:ARGLIST NIL "object " (:KEYWORD NIL " &optional") " output-stream")
      (:VALUES NIL (:ANG NIL "no " (:TERM NIL "values"))))
     " " :PAR
     (:COMMENT NIL "% 22.3.1 1                                " "% 22.3.1 3"))
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "output-stream") "—an "
     (:TERM NIL "output") " " (:TERM NIL "stream designator")
     ". The default is " (:TERM NIL "standard output") ". " :PAR
     (:PARAM NIL "array") "—a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "base") "—a " (:TERM NIL "radix") ". " :PAR
     (:PARAM NIL "case") "—a " (:TERM NIL "symbol") " of " (:TERM NIL "type")
     " " (:TT NIL "(member :upcase :downcase :capitalize)") ". " :PAR
     (:PARAM NIL "circle") "—a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "escape") "—a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "gensym") "—a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "length") "—a non-negative " (:TERM NIL "integer") ", or "
     (:MISC NIL "nil") ". " :PAR (:PARAM NIL "level") "—a non-negative "
     (:TERM NIL "integer") ", or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "lines") "—a non-negative " (:TERM NIL "integer") ", or "
     (:MISC NIL "nil") ". " :PAR (:PARAM NIL "miser-width") "—a non-negative "
     (:TERM NIL "integer") ", or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "pprint-dispatch") "—a " (:TERM NIL "pprint dispatch table")
     ". " :PAR (:PARAM NIL "pretty") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR (:PARAM NIL "radix") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR (:PARAM NIL "readably") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR (:PARAM NIL "right-margin") "—a non-negative "
     (:TERM NIL "integer") ", or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "stream") "—an " (:TERM NIL "output") " "
     (:TERM NIL "stream designator") ". The default is "
     (:TERM NIL "standard output") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "write") ", "
     (:FUNREF NIL "prin1") ", " (:FUNREF NIL "princ") ", "
     (:FUNREF NIL "print") ", and " (:FUNREF NIL "pprint")
     " write the printed representation of " (:PARAM NIL "object") " to "
     (:PARAM NIL "output-stream") ". " :PAR
     (:COMMENT NIL "!!! Does WRITE actually bind all the vars?? -kmp 8-May-91")
     (:FUNREF NIL "write") " is the general entry point to the "
     (:TERM NIL "Lisp printer") ". For each explicitly supplied "
     (:TERM NIL "keyword parameter") " named in " (:NEXTFIGURE NIL)
     ", the corresponding " (:TERM NIL "printer control variable")
     " is dynamically bound to its " (:TERM NIL "value")
     " while printing goes on; for each " (:TERM NIL "keyword parameter")
     " in " (:NEXTFIGURE NIL)
     " that is not explicitly supplied, the value of the corresponding "
     (:TERM NIL "printer control variable")
     " is the same as it was at the time " (:FUNREF NIL "write")
     " was invoked. Once the appropriate " (:TERM NIL "bindings") " are "
     (:TERM NIL "established") ", the " (:TERM NIL "object")
     " is output by the " (:TERM NIL "Lisp printer") ". " :PAR
     (:TABLE (:NAME ("Argument correspondences for the WRITE function."))
      (:ROW NIL (:CELL NIL "Parameter")
       (:CELL NIL "Corresponding Dynamic Variable"))
      (:ROW NIL (:CELL NIL (:PARAM NIL "array"))
       (:CELL NIL (:VARREF NIL "*print-array*")))
      (:ROW NIL (:CELL NIL (:PARAM NIL "base"))
       (:CELL NIL (:VARREF NIL "*print-base*")))
      (:ROW NIL (:CELL NIL (:PARAM NIL "case"))
       (:CELL NIL (:VARREF NIL "*print-case*")))
      (:ROW NIL (:CELL NIL (:PARAM NIL "circle"))
       (:CELL NIL (:VARREF NIL "*print-circle*")))
      (:ROW NIL (:CELL NIL (:PARAM NIL "escape"))
       (:CELL NIL (:VARREF NIL "*print-escape*")))
      (:ROW NIL (:CELL NIL (:PARAM NIL "gensym"))
       (:CELL NIL (:VARREF NIL "*print-gensym*")))
      (:ROW NIL (:CELL NIL (:PARAM NIL "length"))
       (:CELL NIL (:VARREF NIL "*print-length*")))
      (:ROW NIL (:CELL NIL (:PARAM NIL "level"))
       (:CELL NIL (:VARREF NIL "*print-level*")))
      (:ROW NIL (:CELL NIL (:PARAM NIL "lines"))
       (:CELL NIL (:VARREF NIL "*print-lines*")))
      (:ROW NIL (:CELL NIL (:PARAM NIL "miser-width"))
       (:CELL NIL (:VARREF NIL "*print-miser-width*")))
      (:ROW NIL (:CELL NIL (:PARAM NIL "pprint-dispatch"))
       (:CELL NIL (:VARREF NIL "*print-pprint-dispatch*")))
      (:ROW NIL (:CELL NIL (:PARAM NIL "pretty"))
       (:CELL NIL (:VARREF NIL "*print-pretty*")))
      (:ROW NIL (:CELL NIL (:PARAM NIL "radix"))
       (:CELL NIL (:VARREF NIL "*print-radix*")))
      (:ROW NIL (:CELL NIL (:PARAM NIL "readably"))
       (:CELL NIL (:VARREF NIL "*print-readably*")))
      (:ROW NIL (:CELL NIL (:PARAM NIL "right-margin"))
       (:CELL NIL (:VARREF NIL "*print-right-margin*"))))
     " " :PAR (:ISSUE NIL "PRETTY-PRINT-INTERFACE") " " (:FUNREF NIL "prin1")
     ", " (:FUNREF NIL "princ") ", " (:FUNREF NIL "print") ", and "
     (:FUNREF NIL "pprint") " implicitly " (:TERM NIL "bind")
     " certain print parameters to particular values. The remaining parameter values are taken from "
     (:VARREF NIL "*print-array*") ", " (:VARREF NIL "*print-base*") ", "
     (:VARREF NIL "*print-case*") ", " (:VARREF NIL "*print-circle*") ", "
     (:VARREF NIL "*print-escape*") ", " (:VARREF NIL "*print-gensym*") ", "
     (:VARREF NIL "*print-length*") ", " (:VARREF NIL "*print-level*") ", "
     (:VARREF NIL "*print-lines*") ", " (:VARREF NIL "*print-miser-width*")
     ", " (:VARREF NIL "*print-pprint-dispatch*") ", "
     (:VARREF NIL "*print-pretty*") ", " (:VARREF NIL "*print-radix*") ", and "
     (:VARREF NIL "*print-right-margin*") ". "
     (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR (:FUNREF NIL "prin1")
     " produces output suitable for input to " (:FUNREF NIL "read")
     ". It binds " (:VARREF NIL "*print-escape*") " to " (:TERM NIL "true")
     ". "
     (:COMMENT NIL "% 2.5.2 3" "% 2.5.3 2"
      " I don't think this belongs here.  --sjl 16 Mar 92"
      "\\funref{prin1} prints any \\term{string}"
      "or \\term{bit vector}, not just a simple one, but \\funref{read} will "
      "always construct a \\term{simple string} or \\term{simple bit vector} "
      "when it reads the appropriate syntax.")
     :PAR (:COMMENT NIL "% 22.3.1 8") (:FUNREF NIL "princ") " is just like "
     (:FUNREF NIL "prin1") " except that the output has no "
     (:TERM NIL "escape") " " (:TERM NIL "characters") ". It binds "
     (:VARREF NIL "*print-escape*") " to " (:TERM NIL "false") " "
     (:ISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " and "
     (:VARREF NIL "*print-readably*") " to " (:TERM NIL "false") ". "
     (:ENDISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " "
     (:COMMENT NIL " I don't think this belongs here.  --sjl 16 Mar 92"
      "A \\term{symbol} is printed as the characters of its \\term{name};"
      "a \\term{string} is printed without surrounding \\term{double-quotes};"
      "and there might be differences for other \\term{types} as well.  ")
     "The general rule is that output from " (:FUNREF NIL "princ")
     " is intended to look good to people, while output from "
     (:FUNREF NIL "prin1") " is intended to be acceptable to "
     (:FUNREF NIL "read") ". "
     (:COMMENT NIL " I don't think this belongs here.  --sjl 16 Mar 92"
      "\\issue{PRINC-CHARACTER}" "For \\term{characters}," "\\code"
      " (princ character output-stream) \\EQ (write-char character output-stream)"
      "\\endcode" "\\endissue{PRINC-CHARACTER}")
     :PAR (:COMMENT NIL "% 22.3.1 6") (:FUNREF NIL "print") " is just like "
     (:FUNREF NIL "prin1") " except that the printed representation of "
     (:PARAM NIL "object")
     " is preceded by a newline and followed by a space. " :PAR
     (:COMMENT NIL "% 22.3.1 7") (:FUNREF NIL "pprint") " is just like "
     (:FUNREF NIL "print") " except that the trailing space is omitted and "
     (:PARAM NIL "object") " is printed with the "
     (:VARREF NIL "*print-pretty*") " flag " (:TERM NIL "non-nil")
     " to produce pretty output. " :PAR (:PARAM NIL "Output-stream")
     " specifies the " (:TERM NIL "stream") " to which output is to be sent. "
     :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*standard-output*")
     ", " (:VARREF NIL "*terminal-io*") ", " (:VARREF NIL "*print-escape*")
     ", " (:VARREF NIL "*print-radix*") ", " (:VARREF NIL "*print-base*") ", "
     (:VARREF NIL "*print-circle*") ", " (:VARREF NIL "*print-pretty*") ", "
     (:VARREF NIL "*print-level*") ", " (:VARREF NIL "*print-length*") ", "
     (:VARREF NIL "*print-case*") ", " (:VARREF NIL "*print-gensym*") ", "
     (:VARREF NIL "*print-array*") ", "
     (:VARREF NIL "*read-default-float-format*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "readtable-case") ", "
     (:SECREF NIL :FORMAT-PRINTER-OPS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The " (:TERM NIL "functions") " "
     (:FUNREF NIL "prin1") " and " (:FUNREF NIL "print") " do not bind "
     (:VARREF NIL "*print-readably*") ". " :PAR
     (:CODE NIL " (prin1 object output-stream)
≡ (write object :stream output-stream :escape t)
")
     " " :PAR (:ISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " "
     (:CODE NIL " (princ object output-stream)
≡ (write object stream output-stream :escape nil :readably nil)
")
     " " (:ENDISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " " :PAR
     (:CODE NIL " (print object output-stream)
≡ (progn (terpri output-stream)
           (write object :stream output-stream
                         :escape t)
           (write-char #\\space output-stream))
")
     " " :PAR
     (:CODE NIL " (pprint object output-stream)
≡ (write object :stream output-stream :escape t :pretty t)
")
     " "))
   " " :PAR
   (:COMMENT NIL "%% ========== PRIN1-TO-STRING"
    "%% ========== PRINC-TO-STRING" "%% ========== WRITE-TO-STRING")
   (:COM
    (:NAME "write-to-string, prin1-to-string, princ-to-string" :FTYPE
     "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "write-to-string")
      (:ARGLIST NIL "object " (:KEYWORD NIL " &key")
       " array base case circle escape gensym length level lines miser-width pprint-dispatch pretty radix readably right-margin ")
      (:VALUES NIL "string"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "prin1-to-string")
      (:ARGLIST NIL "object") (:VALUES NIL "string"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "princ-to-string")
      (:ARGLIST NIL "object") (:VALUES NIL "string"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "array") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "base") "—a "
     (:TERM NIL "radix") ". " :PAR (:PARAM NIL "case") "—a "
     (:TERM NIL "symbol") " of " (:TERM NIL "type") " "
     (:TT NIL "(member :upcase :downcase :capitalize)") ". " :PAR
     (:PARAM NIL "circle") "—a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "escape") "—a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "gensym") "—a " (:TERM NIL "generalized boolean") ". " :PAR
     (:PARAM NIL "length") "—a non-negative " (:TERM NIL "integer") ", or "
     (:MISC NIL "nil") ". " :PAR (:PARAM NIL "level") "—a non-negative "
     (:TERM NIL "integer") ", or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "lines") "—a non-negative " (:TERM NIL "integer") ", or "
     (:MISC NIL "nil") ". " :PAR (:PARAM NIL "miser-width") "—a non-negative "
     (:TERM NIL "integer") ", or " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "pprint-dispatch") "—a " (:TERM NIL "pprint dispatch table")
     ". " :PAR (:PARAM NIL "pretty") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR (:PARAM NIL "radix") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR (:PARAM NIL "readably") "—a " (:TERM NIL "generalized boolean")
     ". " :PAR (:PARAM NIL "right-margin") "—a non-negative "
     (:TERM NIL "integer") ", or " (:MISC NIL "nil") ". " :PAR " " :PAR
     (:PARAM NIL "string") "—a " (:TERM NIL "string") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "write-to-string") ", "
     (:FUNREF NIL "prin1-to-string") ", and " (:FUNREF NIL "princ-to-string")
     " are used to create a " (:TERM NIL "string")
     " consisting of the printed representation of " (:PARAM NIL "object") ". "
     (:COMMENT NIL "% 22.3.1 11") (:PARAM NIL "Object")
     " is effectively printed as if by " (:FUNREF NIL "write") ", "
     (:FUNREF NIL "prin1") ", or " (:FUNREF NIL "princ")
     ", respectively, and the " (:TERM NIL "characters")
     " that would be output are made into a " (:TERM NIL "string") ". " :PAR
     (:FUNREF NIL "write-to-string")
     " is the general output function. It has the ability to specify all the parameters applicable to the printing of "
     (:PARAM NIL "object") ". " :PAR (:FUNREF NIL "prin1-to-string")
     " acts like " (:FUNREF NIL "write-to-string") " with "
     (:TT NIL ":escape t")
     ", that is, escape characters are written where appropriate. " :PAR
     (:FUNREF NIL "princ-to-string") " acts like "
     (:FUNREF NIL "write-to-string") " with "
     (:ISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " "
     (:TT NIL ":escape nil :readably nil") ". "
     (:ENDISSUE NIL "PRINC-READABLY:X3J13-DEC-91") " Thus no "
     (:TERM NIL "escape") " " (:TERM NIL "characters") " are written. " :PAR
     "All other keywords that would be specified to "
     (:FUNREF NIL "write-to-string") " are default values when "
     (:FUNREF NIL "prin1-to-string") " or " (:FUNREF NIL "princ-to-string")
     " is invoked. " :PAR
     "The meanings and defaults for the keyword arguments to "
     (:FUNREF NIL "write-to-string") " are the same as those for "
     (:FUNREF NIL "write") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (prin1-to-string \"abc\") → \"\\\"abc\\\"\"
 (princ-to-string \"abc\") → \"abc\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*print-escape*") ", "
     (:VARREF NIL "*print-radix*") ", " (:VARREF NIL "*print-base*") ", "
     (:VARREF NIL "*print-circle*") ", " (:VARREF NIL "*print-pretty*") ", "
     (:VARREF NIL "*print-level*") ", " (:VARREF NIL "*print-length*") ", "
     (:VARREF NIL "*print-case*") ", " (:VARREF NIL "*print-gensym*") ", "
     (:VARREF NIL "*print-array*") ", "
     (:VARREF NIL "*read-default-float-format*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T)
     (:COMMENT NIL "!!! Not likely.") :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "write") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (write-to-string " (:PARAM NIL "object") " "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "key") " " (:PARAM NIL "argument"))) ")
≡ (with-output-to-string (#1=#:string-stream) 
     (write object :stream #1# "
      (:STAR NIL (:CURLY NIL (:PARAM NIL "key") " " (:PARAM NIL "argument")))
      "))

 (princ-to-string "
      (:PARAM NIL "object") ")
≡ (with-output-to-string (string-stream)
     (princ "
      (:PARAM NIL "object") " string-stream))

 (prin1-to-string "
      (:PARAM NIL "object") ")
≡ (with-output-to-string (string-stream)
     (prin1 "
      (:PARAM NIL "object") " string-stream))
")
     " "))
   " " :PAR
   (:COMMENT NIL "-------------------- Printer Variables --------------------")
   :PAR (:COMMENT NIL "%% ========== *PRINT-ARRAY*")
   (:COM (:NAME "*print-array*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.1.6 55") :PAR
     "Controls the format in which " (:TERM NIL "arrays")
     " are printed. If it is " (:TERM NIL "false") ", the contents of "
     (:TERM NIL "arrays") " other than " (:TERM NIL "strings")
     " are never printed. Instead, " (:TERM NIL "arrays")
     " are printed in a concise form using " (:TT NIL "#<")
     " that gives enough information for the user to be able to identify the "
     (:TERM NIL "array") ", but does not include the entire "
     (:TERM NIL "array") " contents. If it is " (:TERM NIL "true") ", non-"
     (:TERM NIL "string") " " (:TERM NIL "arrays") " are printed using "
     (:TT NIL "#(...)") ", " (:TT NIL "#*") ", or " (:TT NIL "#nA") " syntax. "
     :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The " (:TERM NIL "implementation")
     ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :SHARPSIGN-LEFT-PAREN) ", "
     (:SECREF NIL :SHARPSIGN-LEFT-ANGLE) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== *PRINT-BASE*" "%% ========== *PRINT-RADIX*")
   (:COM (:NAME "*print-base*, *print-radix*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR (:VARREF NIL "*print-base*") "—a "
     (:TERM NIL "radix") ". " (:VARREF NIL "*print-radix*") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR "The initial " (:TERM NIL "value")
     " of " (:VARREF NIL "*print-base*") " is " (:TT NIL "10") ". "
     (:COMMENT NIL "%It's implied. -kmp 12-Jan-91" " (decimal radix).")
     "The initial " (:TERM NIL "value") " of " (:VARREF NIL "*print-radix*")
     " is " (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:VARREF NIL "*print-base*") " and "
     (:VARREF NIL "*print-radix*") " control the printing of "
     (:TERM NIL "rationals") ". The " (:TERM NIL "value") " of "
     (:VARREF NIL "*print-base*") " is called the "
     (:NEWTERM NIL "current output base") ". " :PAR
     (:COMMENT NIL "% 22.1.6 44") "The " (:TERM NIL "value") " of "
     (:VARREF NIL "*print-base*") " is the " (:TERM NIL "radix")
     " in which the printer will print " (:TERM NIL "rationals")
     ". For radices above " (:TT NIL "10")
     ", letters of the alphabet are used to represent digits above "
     (:TT NIL "9") ". " :PAR (:COMMENT NIL "% 22.1.6 46") "If the "
     (:TERM NIL "value") " of " (:VARREF NIL "*print-radix*") " is "
     (:TERM NIL "true")
     ", the printer will print a radix specifier to indicate the "
     (:TERM NIL "radix") " in which it is printing a " (:TERM NIL "rational")
     " number. The radix specifier is always printed using lowercase letters. If "
     (:VARREF NIL "*print-base*") " is " (:TT NIL "2") ", " (:TT NIL "8")
     ", or " (:TT NIL "16") ", then the radix specifier used is "
     (:TT NIL "#b") ", " (:TT NIL "#o") ", or " (:TT NIL "#x")
     ", respectively. For " (:TERM NIL "integers")
     ", base ten is indicated by a trailing decimal point instead of a leading radix specifier; for "
     (:TERM NIL "ratios") ", " (:TT NIL "#10r") " is used. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (let ((*print-base* 24.) (*print-radix* t)) 
   (print 23.))
⊳ #24rN
→ 23
 (setq *print-base* 10) → 10
 (setq *print-radix* nil) → NIL                                          
 (dotimes (i 35)
    (let ((*print-base* (+ i 2)))           ;print the decimal number 40 
      (write 40)                            ;in each base from 2 to 36
      (if (zerop (mod i 10)) (terpri) (format t \" \"))))
⊳ 101000
⊳ 1111 220 130 104 55 50 44 40 37 34
⊳ 31 2C 2A 28 26 24 22 20 1J 1I
⊳ 1H 1G 1F 1E 1D 1C 1B 1A 19 18
⊳ 17 16 15 14 
→ NIL
 (dolist (pb '(2 3 8 10 16))               
    (let ((*print-radix* t)                 ;print the integer 10 and 
          (*print-base* pb))                ;the ratio 1/10 in bases 2, 
     (format t \"~&~S  ~S~%\" 10 1/10)))        ;3, 8, 10, 16
⊳ #b1010  #b1/1010
⊳ #3r101  #3r1/101
⊳ #o12  #o1/12
⊳ 10.  #10r1/10
⊳ #xA  #x1/A
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "Might be " (:TERM NIL "bound")
     " by " (:FUNREF NIL "format") ", and " (:FUNREF NIL "write") ", "
     (:FUNREF NIL "write-to-string") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "format") ", "
     (:FUNREF NIL "write") ", " (:FUNREF NIL "write-to-string") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *PRINT-CASE*")
   (:COM (:NAME "*print-case*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "One of the " (:TERM NIL "symbols")
     " " (:KWD NIL "upcase") ", " (:KWD NIL "downcase") ", or "
     (:KWD NIL "capitalize") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR "The " (:TERM NIL "symbol") " "
     (:KWD NIL "upcase") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.1.6 47") "The "
     (:TERM NIL "value") " of " (:VARREF NIL "*print-case*")
     " controls the case (upper, lower, or mixed) in which to print any uppercase characters in the names of "
     (:TERM NIL "symbols") " when vertical-bar syntax is not used. " :PAR
     (:ISSUE NIL
      "PRINT-CASE-PRINT-ESCAPE-INTERACTION:VERTICAL-BAR-RULE-NO-UPCASE")
     " " (:ISSUE NIL "JUN90-TRIVIAL-ISSUES:3") " " (:VARREF NIL "*print-case*")
     " has an effect at all times when the " (:TERM NIL "value") " of "
     (:VARREF NIL "*print-escape*") " is " (:TERM NIL "false") ". "
     (:VARREF NIL "*print-case*") " also has an effect when the "
     (:TERM NIL "value") " of " (:VARREF NIL "*print-escape*") " is "
     (:TERM NIL "true") " unless inside an escape context (" (:I NIL "i.e.")
     ",  unless between " (:TERM NIL "vertical-bars") " or after a "
     (:TERM NIL "slash") "). " (:ISSUE NIL "PRINT-CASE-BEHAVIOR:CLARIFY") " "
     (:COMMENT NIL " Under no circumstance is"
      " any character that is lowercase in the internal representation ever presented"
      " as uppercase due to \\varref{*print-case*}.")
     (:ENDISSUE NIL "PRINT-CASE-BEHAVIOR:CLARIFY") " "
     (:ENDISSUE NIL "JUN90-TRIVIAL-ISSUES:3") " "
     (:ENDISSUE NIL
      "PRINT-CASE-PRINT-ESCAPE-INTERACTION:VERTICAL-BAR-RULE-NO-UPCASE")
     " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun test-print-case ()
   (dolist (*print-case* '(:upcase :downcase :capitalize))
     (format t \"~&~S ~S~%\" 'this-and-that '|And-something-elSE|)))
→ TEST-PC
;; Although the choice of which characters to escape is specified by
;; *PRINT-CASE*, the choice of how to escape those characters 
;; (i.e., whether single escapes or multiple escapes are used)
;; is implementation-dependent.  The examples here show two of the
;; many valid ways in which escaping might appear.
 (test-print-case) ;Implementation A
⊳ THIS-AND-THAT |And-something-elSE|
⊳ this-and-that a\\n\\d-\\s\\o\\m\\e\\t\\h\\i\\n\\g-\\e\\lse
⊳ This-And-That A\\n\\d-\\s\\o\\m\\e\\t\\h\\i\\n\\g-\\e\\lse
→ NIL
 (test-print-case) ;Implementation B
⊳ THIS-AND-THAT |And-something-elSE|
⊳ this-and-that a|nd-something-el|se
⊳ This-And-That A|nd-something-el|se
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "write") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL "!!! Does issue READ-CASE-SENSITIVITY affect any of this?")
     :PAR (:FUNREF NIL "read")
     " normally converts lowercase characters appearing in "
     (:TERM NIL "symbols")
     " to corresponding uppercase characters, so that internally print names normally contain only uppercase characters. "
     :PAR (:COMMENT NIL "% 22.1.6 48") "If " (:VARREF NIL "*print-escape*")
     " is " (:TERM NIL "true") ", lowercase characters in the "
     (:TERM NIL "name") " of a " (:TERM NIL "symbol")
     " are always printed in lowercase, and are preceded by a single escape character or enclosed by multiple escape characters; uppercase characters in the "
     (:TERM NIL "name") " of a " (:TERM NIL "symbol")
     " are printed in upper case, in lower case, or in mixed case so as to capitalize words, according to the value of "
     (:VARREF NIL "*print-case*")
     ". The convention for what constitutes a “word” is the same as for "
     (:FUNREF NIL "string-capitalize") ". "))
   " " :PAR (:COMMENT NIL "%% ========== *PRINT-CIRCLE*")
   (:COM (:NAME "*print-circle*" :FTYPE "Variable")
    (:ISSUE NIL "PRINT-CIRCLE-SHARED:RESPECT-PRINT-CIRCLE") " " :PAR
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.1.6 42")
     "Controls the attempt to detect circularity and sharing in an "
     (:TERM NIL "object") " being printed. " :PAR "If " (:TERM NIL "false")
     ", the printing process merely proceeds by recursive descent without attempting to detect circularity and sharing. "
     :PAR (:COMMENT NIL "% 22.1.6 43") "If " (:TERM NIL "true")
     ", the printer will endeavor to detect cycles and sharing in the structure to be printed, and to use "
     (:TT NIL "#" (:I NIL "n") "=") " and " (:TT NIL "#" (:I NIL "n") "#")
     " syntax to indicate the circularities or shared components. " :PAR
     (:ISSUE NIL "PRINT-CIRCLE-STRUCTURE:USER-FUNCTIONS-WORK") " If "
     (:TERM NIL "true") ", a user-defined "
     (:ISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
     (:COMMENT NIL "print function") (:FUNREF NIL "print-object") " "
     (:TERM NIL "method") " "
     (:ENDISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93")
     " can print " (:TERM NIL "objects") " to the supplied "
     (:TERM NIL "stream") " using " (:FUNREF NIL "write") ", "
     (:FUNREF NIL "prin1") ", " (:FUNREF NIL "princ") ", or "
     (:FUNREF NIL "format")
     " and expect circularities and sharing to be detected and printed using the "
     (:TT NIL "#" (:I NIL "n") "#") " syntax. "
     (:ISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
     (:COMMENT NIL
      "This applies to \\term{methods} on \\funref{print-object} in addition to"
      "\\kwd{print-function} options.")
     (:ENDISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93")
     " If a user-defined "
     (:ISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93") " "
     (:COMMENT NIL "print function") (:FUNREF NIL "print-object") " "
     (:TERM NIL "method") " "
     (:ENDISSUE NIL "DEFSTRUCT-PRINT-FUNCTION-AGAIN:X3J13-MAR-93")
     " prints to a " (:TERM NIL "stream")
     " other than the one that was supplied, then circularity detection starts over for that "
     (:TERM NIL "stream") ". "
     (:ENDISSUE NIL "PRINT-CIRCLE-STRUCTURE:USER-FUNCTIONS-WORK") " " :PAR
     "Note that implementations should not use " (:TT NIL "#" (:I NIL "n") "#")
     " notation when the " (:TERM NIL "Lisp reader")
     " would automatically assure sharing without it (" (:I NIL "e.g.")
     ",  as happens with " (:TERM NIL "interned") " " (:TERM NIL "symbols")
     "). " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (let ((a (list 1 2 3)))
   (setf (cdddr a) a)
   (let ((*print-circle* t))
     (write a)
     :done))
⊳ #1=(1 2 3 . #1#)
→ :DONE
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "write") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "An attempt to print a circular structure with "
     (:VARREF NIL "*print-circle*") " set to " (:MISC NIL "nil")
     " may lead to looping behavior and failure to terminate. " :PAR
     (:ENDISSUE NIL "PRINT-CIRCLE-SHARED:RESPECT-PRINT-CIRCLE") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *PRINT-ESCAPE*")
   (:COM (:NAME "*print-escape*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR (:COMMENT NIL "% 22.1.6 38")
     (:TERM NIL "true") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.1.6 35") "If "
     (:TERM NIL "false") ", escape characters and "
     (:TERM NIL "package prefixes")
     " are not output when an expression is printed. " :PAR
     (:COMMENT NIL "% 22.1.6 36") "If " (:TERM NIL "true")
     ", an attempt is made to print an " (:TERM NIL "expression")
     " in such a way that it can be read again to produce an "
     (:FUNREF NIL "equal") " " (:TERM NIL "expression")
     ". (This is only a guideline; not a requirement. See "
     (:VARREF NIL "*print-readably*") ".) " :PAR
     "For more specific details of how the " (:TERM NIL "value") " of "
     (:VARREF NIL "*print-escape*") " affects the printing of certain "
     (:TERM NIL "types") ", see " (:SECREF NIL :DEFAULT-PRINT-OBJ-METHS) ". "
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (let ((*print-escape* t)) (write #\\a))
⊳ #\\a
→ #\\a
 (let ((*print-escape* nil)) (write #\\a))
⊳ a
→ #\\a
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:FUNREF NIL "princ") ", "
     (:FUNREF NIL "prin1") ", " (:FUNREF NIL "format") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "write") ", "
     (:FUNREF NIL "readtable-case") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "princ") " effectively binds "
     (:VARREF NIL "*print-escape*") " to " (:TERM NIL "false") ". "
     (:FUNREF NIL "prin1") " effectively binds " (:VARREF NIL "*print-escape*")
     " to " (:TERM NIL "true") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *PRINT-GENSYM*")
   (:COM (:NAME "*print-gensym*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR (:TERM NIL "true") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.1.6 49")
     "Controls whether the prefix “" (:TT NIL "#:") "” is printed before "
     (:TERM NIL "apparently uninterned") " " (:TERM NIL "symbols")
     ". The prefix is printed before such " (:TERM NIL "symbols")
     " if and only if the " (:TERM NIL "value") " of "
     (:VARREF NIL "*print-gensym*") " is " (:TERM NIL "true") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (let ((*print-gensym* nil))
   (print (gensym)))
⊳ G6040 
→ #:G6040
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "write") ", "
     (:VARREF NIL "*print-escape*") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== *PRINT-LEVEL*" "%% ========== *PRINT-LENGTH*")
   (:COM (:NAME "*print-level*, *print-length*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "a non-negative "
     (:TERM NIL "integer") ", or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.1.6 50")
     (:VARREF NIL "*print-level*") " controls how many levels deep a nested "
     (:TERM NIL "object") " will print. If it is " (:TERM NIL "false")
     ", then no control is exercised. Otherwise, it is an "
     (:TERM NIL "integer") " indicating the maximum level to be printed. An "
     (:TERM NIL "object") " to be printed is at level " (:TT NIL "0")
     "; its components (as of a " (:TERM NIL "list") " or "
     (:TERM NIL "vector") ") are at level " (:TT NIL "1") "; and so on. If an "
     (:TERM NIL "object")
     " to be recursively printed has components and is at a level equal to or greater than the "
     (:TERM NIL "value") " of " (:VARREF NIL "*print-level*") ", then the "
     (:TERM NIL "object") " is printed as “" (:TT NIL "#") "”. " :PAR
     (:COMMENT NIL "% 22.1.6 51") (:VARREF NIL "*print-length*")
     " controls how many elements at a given level are printed. If it is "
     (:TERM NIL "false")
     ", there is no limit to the number of components printed. Otherwise, it is an "
     (:TERM NIL "integer") " indicating the maximum number of "
     (:TERM NIL "elements") " of an " (:TERM NIL "object")
     " to be printed. If exceeded, the printer will print “" (:TT NIL "...")
     "” in place of the other " (:TERM NIL "elements") ". In the case of a "
     (:TERM NIL "dotted list") ", if the " (:TERM NIL "list")
     " contains exactly as many " (:TERM NIL "elements") " as the "
     (:TERM NIL "value") " of " (:VARREF NIL "*print-length*")
     ", the terminating " (:TERM NIL "atom")
     " is printed rather than printing “" (:TT NIL "...") "” " :PAR
     (:COMMENT NIL "% 22.1.6 52") (:VARREF NIL "*print-level*") " and "
     (:VARREF NIL "*print-length*") " affect the printing of an any "
     (:TERM NIL "object")
     " printed with a list-like syntax. They do not affect the printing of "
     (:TERM NIL "symbols") ", " (:TERM NIL "strings") ", and "
     (:TERM NIL "bit vectors") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR (:COMMENT NIL "% 22.1.6 54") " "
     (:CODE NIL " (setq a '(1 (2 (3 (4 (5 (6))))))) → (1 (2 (3 (4 (5 (6))))))
 (dotimes (i 8) 
   (let ((*print-level* i)) 
     (format t \"~&~D -- ~S~%\" i a)))
⊳ 0 -- #
⊳ 1 -- (1 #)
⊳ 2 -- (1 (2 #))
⊳ 3 -- (1 (2 (3 #)))
⊳ 4 -- (1 (2 (3 (4 #))))
⊳ 5 -- (1 (2 (3 (4 (5 #)))))
⊳ 6 -- (1 (2 (3 (4 (5 (6))))))
⊳ 7 -- (1 (2 (3 (4 (5 (6))))))
→ NIL

 (setq a '(1 2 3 4 5 6)) → (1 2 3 4 5 6)
 (dotimes (i 7) 
   (let ((*print-length* i)) 
     (format t \"~&~D -- ~S~%\" i a))) 
⊳ 0 -- (...)
⊳ 1 -- (1 ...)
⊳ 2 -- (1 2 ...)
⊳ 3 -- (1 2 3 ...)
⊳ 4 -- (1 2 3 4 ...)
⊳ 5 -- (1 2 3 4 5 6)
⊳ 6 -- (1 2 3 4 5 6)
→ NIL

(dolist (level-length '((0 1) (1 1) (1 2) (1 3) (1 4) 
                        (2 1) (2 2) (2 3) (3 2) (3 3) (3 4)))
 (let ((*print-level*  (first  level-length))
       (*print-length* (second level-length)))
   (format t \"~&~D ~D -- ~S~%\"
           *print-level* *print-length* 
           '(if (member x y) (+ (car x) 3) '(foo . #(a b c d \"Baz\"))))))
⊳ 0 1 -- #
⊳ 1 1 -- (IF ...)
⊳ 1 2 -- (IF # ...)
⊳ 1 3 -- (IF # # ...)
⊳ 1 4 -- (IF # # #)
⊳ 2 1 -- (IF ...)
⊳ 2 2 -- (IF (MEMBER X ...) ...)
⊳ 2 3 -- (IF (MEMBER X Y) (+ # 3) ...)
⊳ 3 2 -- (IF (MEMBER X ...) ...)
⊳ 3 3 -- (IF (MEMBER X Y) (+ (CAR X) 3) ...)
⊳ 3 4 -- (IF (MEMBER X Y) (+ (CAR X) 3) '(FOO . #(A B C D ...)))
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "write") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL " KMP:"
      "   There has been some debate about how strictly these abbreviation guidelines"
      "   should be applied."
      "      (write '(1 2 3) :length 1) prints (1 ...)   or (1 2 3)?"
      "      (write '(1 2 3) :length 2) prints (1 2 ...) or (1 2 3)?"
      " Barmar:"
      "   While I've always secretly wished that these limits were defined such"
      "   that they would be ignored when the length of the thing being replaced"
      "   with \"...\"  or \"#\" is less than or equal to the replacement text, I"
      "   don't seriously believe there's really a need for implementation"
      "   flexibility.  This is a fairly straightforward piece of the language."
      " Dick:"
      "   As the original author of GPRINT, I am probably partly responsible for"
      "   the behavior you see.  I deliberately tried to do better than the"
      "   default length and depth processing did.  I was however copying what"
      "   the standard Lispm software did at the time."
      "   Nevertheless, I agree with the point of view that there is no reason"
      "   to make this complicated.  Let's just have a simple abbreviation"
      "   algorithm and hold everybody to it.  It is not worth being more"
      "   creative than that.")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *PRINT-LINES*")
   (:COM (:NAME "*print-lines*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "a non-negative "
     (:TERM NIL "integer") ", or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "When the " (:TERM NIL "value")
     " of " (:VARREF NIL "*print-lines*") " is other than " (:MISC NIL "nil")
     ", it is a limit on the number of output lines produced when something is pretty printed. If an attempt is made to go beyond that many lines, “"
     (:TT NIL "..") "”" (:IDXTEXT NIL "Dot Dot") (:IDXCODE NIL "..")
     " is printed at the end of the last line followed by all of the suffixes (closing delimiters) that are pending to be printed. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (let ((*print-right-margin* 25) (*print-lines* 3))
   (pprint '(progn (setq a 1 b 2 c 3 d 4))))
⊳ (PROGN (SETQ A 1
⊳              B 2
⊳              C 3 ..))
→ "
      (:ANG NIL "no " (:TERM NIL "values")) "
")
     " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The “" (:TT NIL "..")
     "” notation is intentionally different than the “" (:TT NIL "...")
     "” notation used for level abbreviation, so that the two different situations can be visually distinguished. "
     :PAR "This notation is used to increase the likelihood that the "
     (:TERM NIL "Lisp reader")
     " will signal an error if an attempt is later made to read the abbreviated output. Note however that if the truncation occurs in a "
     (:TERM NIL "string") ", as in "
     (:TT NIL "\"This string has been trunc..\"")
     ", the problem situation cannot be detected later and no such error will be signaled. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *PRINT-MISER-WIDTH*")
   (:COM (:NAME "*print-miser-width*" :FTYPE "Variable")
    (:ISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR
    (:PART (:NAME "Value Type") " " :PAR "a non-negative "
     (:TERM NIL "integer") ", or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR
     (:TERM NIL "implementation-dependent") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "If it is not " (:MISC NIL "nil")
     ", the " (:TERM NIL "pretty printer")
     " switches to a compact style of output (called miser style) whenever the width available for printing a substructure is less than or equal to this many "
     (:TERM NIL "ems") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *PRINT-PPRINT-DISPATCH*")
   (:COM (:NAME "*print-pprint-dispatch*" :FTYPE "Variable")
    (:ISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR
    (:PART (:NAME "Value Type") " " :PAR "a "
     (:TERM NIL "pprint dispatch table") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR
     (:TERM NIL "implementation-dependent")
     ", but the initial entries all use a special class of priorities that have the property that they are less than every priority that can be specified using "
     (:FUNREF NIL "set-pprint-dispatch")
     ", so that the initial contents of any entry can be overridden. " :PAR)
    (:PART (:NAME "Description") " " :PAR "The "
     (:TERM NIL "pprint dispatch table") " which currently controls the "
     (:TERM NIL "pretty printer") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:VARREF NIL "*print-pretty*") ", "
     (:SECREF NIL :PPRINT-DISPATCH-TABLES) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The intent is that the initial "
     (:TERM NIL "value") " of this " (:TERM NIL "variable")
     " should cause `traditional' " (:TERM NIL "pretty printing") " of "
     (:TERM NIL "code") ". " (:COMMENT NIL " Added on advice of Dick Waters:")
     "In general, however, you can put a value in "
     (:VARREF NIL "*print-pprint-dispatch*")
     " that makes pretty-printed output look exactly like non-pretty-printed output. "
     (:ISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " "
     (:COMMENT NIL
      " Setting \\varref{*print-pretty*} to \\term{true} means having \\varref{*print-pprint-dispatch*}"
      " control printing---nothing more, and nothing less.")
     "Setting " (:VARREF NIL "*print-pretty*") " to " (:TERM NIL "true")
     " just causes the functions contained in the "
     (:TERM NIL "current pprint dispatch table")
     " to have priority over normal " (:FUNREF NIL "print-object")
     " methods; it has no magic way of enforcing that those functions actually produce pretty output. For details, see "
     (:SECREF NIL :PPRINT-DISPATCH-TABLES) ". "
     (:ENDISSUE NIL "GENERALIZE-PRETTY-PRINTER:UNIFY") " "
     (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *PRINT-PRETTY*")
   (:COM (:NAME "*print-pretty*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR (:COMMENT NIL "% 22.1.6 41")
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Controls whether the "
     (:TERM NIL "Lisp printer") " calls the " (:TERM NIL "pretty printer") ". "
     :PAR (:COMMENT NIL "% 22.1.6 39") "If it is " (:TERM NIL "false") ", the "
     (:TERM NIL "pretty printer") " is not used and "
     (:ISSUE NIL "PRINTER-WHITESPACE:JUST-ONE-SPACE") " a minimum "
     (:COMMENT NIL "only a small amount ")
     (:ENDISSUE NIL "PRINTER-WHITESPACE:JUST-ONE-SPACE") " of "
     (:TERM NIL "whitespace") (:SUB NIL "1")
     " is output when printing an expression. " :PAR
     (:COMMENT NIL "% 22.1.6 40") "If it is " (:TERM NIL "true") ", the "
     (:TERM NIL "pretty printer") " is used, and the "
     (:TERM NIL "Lisp printer") " will endeavor to insert extra "
     (:TERM NIL "whitespace") (:SUB NIL "1") " where appropriate to make "
     (:TERM NIL "expressions") " more readable. " :PAR
     (:VARREF NIL "*print-pretty*") " has an effect even when the "
     (:TERM NIL "value") " of " (:VARREF NIL "*print-escape*") " is "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR (:ISSUE NIL "FORMAT-PRETTY-PRINT:YES")
     " "
     (:CODE NIL " (setq *print-pretty* 'nil) → NIL
 (progn (write '(let ((a 1) (b 2) (c 3)) (+ a b c))) nil)
⊳ (LET ((A 1) (B 2) (C 3)) (+ A B C))
→ NIL
 (let ((*print-pretty* t))
   (progn (write '(let ((a 1) (b 2) (c 3)) (+ a b c))) nil))
⊳ (LET ((A 1)
⊳       (B 2)
⊳       (C 3))
⊳   (+ A B C))
→ NIL
;; Note that the first two expressions printed by this next form
;; differ from the second two only in whether escape characters are printed.
;; In all four cases, extra whitespace is inserted by the pretty printer.
 (flet ((test (x)
          (let ((*print-pretty* t))
            (print x)
            (format t \"~%~S \" x)
            (terpri) (princ x) (princ \" \")
            (format t \"~%~A \" x))))
  (test '#'(lambda () (list \"a\" #"
      (:B NIL " 'c #'d))))
⊳ #'(LAMBDA ()
⊳     (LIST \"a\" #")
      (:B NIL " 'C #'D))
⊳ #'(LAMBDA ()
⊳     (LIST \"a\" #")
      (:B NIL " 'C #'D))
⊳ #'(LAMBDA ()
⊳     (LIST a b 'C #'D)) 
⊳ #'(LAMBDA ()
⊳     (LIST a b 'C #'D))
→ NIL
"))
     " " (:ENDISSUE NIL "FORMAT-PRETTY-PRINT:YES") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "write") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *PRINT-READABLY*")
   (:COM (:NAME "*print-readably*" :FTYPE "Variable")
    (:ISSUE NIL "DATA-IO:ADD-SUPPORT") " " :PAR
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR (:COMMENT NIL "% 22.1.6 38")
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.1.6 36") "If "
     (:VARREF NIL "*print-readably*") " is " (:TERM NIL "true")
     ", some special rules for printing " (:TERM NIL "objects")
     " go into effect. Specifically, printing any " (:TERM NIL "object") " "
     (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1")))
     " produces a printed representation that, when seen by the "
     (:TERM NIL "Lisp reader") " "
     (:COMMENT NIL
      "% This additional restriction added in response to Loosemore #14, first public review")
     "while the " (:TERM NIL "standard readtable")
     " is in effect, will produce an " (:TERM NIL "object") " "
     (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "2"))) " that is "
     (:TERM NIL "similar") " to "
     (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1")))
     ". The printed representation produced might or might not be the same as the printed representation produced when "
     (:VARREF NIL "*print-readably*") " is " (:TERM NIL "false") ". "
     (:COMMENT NIL
      " If printing a readable printed representation of an \\term{object} is not possible,")
     "If printing an " (:TERM NIL "object") " " (:TERM NIL "readably")
     " is not possible, an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "print-not-readable")
     " is signaled rather than using a syntax (" (:I NIL "e.g.") ",  the “"
     (:TT NIL "#<") "” syntax) that would not be readable by the same "
     (:TERM NIL "implementation") ". If the " (:TERM NIL "value")
     " of some other " (:TERM NIL "printer control variable")
     " is such that these requirements would be violated, the "
     (:TERM NIL "value") " of that other " (:TERM NIL "variable")
     " is ignored. " :PAR (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " "
     (:COMMENT NIL "%!!! Glag.  I can't believe we voted this in."
      "%    I want (and *print-readably* *print-escape*) implies ...!"
      "%    Grumbling mail sent to X3J13." "%    -kmp 22-Aug-93")
     "Specifically, if " (:VARREF NIL "*print-readably*") " is "
     (:TERM NIL "true") ", printing proceeds as if "
     (:VARREF NIL "*print-escape*") ", " (:VARREF NIL "*print-array*") ", and "
     (:VARREF NIL "*print-gensym*") " were also " (:TERM NIL "true")
     ", and as if " (:VARREF NIL "*print-length*") ", "
     (:VARREF NIL "*print-level*") ", and " (:VARREF NIL "*print-lines*")
     " were " (:TERM NIL "false") ". "
     (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " " :PAR "If "
     (:VARREF NIL "*print-readably*") " is " (:TERM NIL "false")
     ", the normal rules for printing and the normal interpretations of other "
     (:TERM NIL "printer control variables") " are in effect. " :PAR
     "Individual " (:TERM NIL "methods") " for " (:FUNREF NIL "print-object")
     ", including user-defined " (:TERM NIL "methods")
     ", are responsible for implementing these requirements. " :PAR "If "
     (:VARREF NIL "*read-eval*") " is " (:TERM NIL "false") " and "
     (:VARREF NIL "*print-readably*") " is " (:TERM NIL "true")
     ", any such method that would output a reference to the “" (:TT NIL "#.")
     "” " (:TERM NIL "reader macro")
     " will either output something else or will signal an error (as described above). "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (let ((x (list \"a\" '\\a (gensym) '((a (b (c))) d e f g)))
       (*print-escape* nil)
       (*print-gensym* nil)
       (*print-level* 3)
       (*print-length* 3))
   (write x)
   (let ((*print-readably* t))
     (terpri)
     (write x)
     :done))
⊳ (a a G4581 ((A #) D E ...))
⊳ (\"a\" |a| #:G4581 ((A (B (C))) D E F G))
→ :DONE

;; This is setup code is shared between the examples
;; of three hypothetical implementations which follow.
 (setq table (make-hash-table)) → #<HASH-TABLE EQL 0/120 32005763> 
 (setf (gethash table 1) 'one) → ONE
 (setf (gethash table 2) 'two) → TWO

;; Implementation A
 (let ((*print-readably* t)) (print table))
 Error: Can't print #<HASH-TABLE EQL 0/120 32005763> readably.

;; Implementation B
;; No standardized #S notation for hash tables is defined, 
;; but there might be an implementation-defined notation.
 (let ((*print-readably* t)) (print table))
⊳ #S(HASH-TABLE :TEST EQL :SIZE 120 :CONTENTS (1 ONE 2 TWO))
→ #<HASH-TABLE EQL 0/120 32005763>

;; Implementation C
;; Note that #. notation can only be used if *READ-EVAL* is true.
;; If *READ-EVAL* were false, this same implementation might have to
;; signal an error unless it had yet another printing strategy to fall
;; back on.
 (let ((*print-readably* t)) (print table))
⊳ #.(LET ((HASH-TABLE (MAKE-HASH-TABLE)))
⊳     (SETF (GETHASH 1 HASH-TABLE) ONE)
⊳     (SETF (GETHASH 2 HASH-TABLE) TWO)
⊳     HASH-TABLE)
→ #<HASH-TABLE EQL 0/120 32005763>
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "write") ", "
     (:MACREF NIL "print-unreadable-object") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The rules for “" (:TERM NIL "similarity")
     "” imply that " (:TT NIL "#A") " or " (:TT NIL "#(") " "
     (:COMMENT NIL " )") "syntax cannot be used for " (:TERM NIL "arrays")
     " of " (:TERM NIL "element type") " other than " (:TYPEREF NIL "t")
     ". An implementation will have to use another syntax or signal an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "print-not-readable") ". " :PAR
     (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " "
     (:COMMENT NIL
      " The printing of interned \\term{symbols}, of \\term{strings}, "
      " and of \\term{bit vectors} is not affected by \\varref{*print-readably*}.")
     (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " " :PAR
     (:ENDISSUE NIL "DATA-IO:ADD-SUPPORT") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *PRINT-RIGHT-MARGIN*") :PAR
   (:COM (:NAME "*print-right-margin*" :FTYPE "Variable")
    (:ISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR
    (:PART (:NAME "Value Type") " " :PAR "a non-negative "
     (:TERM NIL "integer") ", or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "If it is " (:TERM NIL "non-nil")
     ", it specifies the right margin (as " (:TERM NIL "integer") " number of "
     (:TERM NIL "ems") ") to use when the " (:TERM NIL "pretty printer")
     " is making layout decisions. " :PAR "If it is " (:MISC NIL "nil")
     ", the right margin is taken to be the maximum line length such that output can be displayed without wraparound or truncation. If this cannot be determined, an "
     (:TERM NIL "implementation-dependent") " value is used. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "This measure is in units of "
     (:TERM NIL "ems") " in order to be compatible with "
     (:TERM NIL "implementation-defined")
     " variable-width fonts while still not requiring the language to provide support for fonts. "
     :PAR (:ENDISSUE NIL "PRETTY-PRINT-INTERFACE") " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Printer Errors --------------------")
   :PAR (:COMMENT NIL "%% ========== PRINT-NOT-READABLE")
   (:COM (:NAME "print-not-readable" :FTYPE "Condition Type")
    (:ISSUE NIL "DATA-IO:ADD-SUPPORT") " "
    (:PART (:NAME "Class Precedence List") " "
     (:TYPEREF NIL "print-not-readable") ", " (:TYPEREF NIL "error") ", "
     (:TYPEREF NIL "serious-condition") ", " (:TYPEREF NIL "condition") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "print-not-readable")
     " consists of error conditions that occur during output while "
     (:VARREF NIL "*print-readably*") " is " (:TERM NIL "true")
     ", as a result of attempting to write a printed representation with the "
     (:TERM NIL "Lisp printer")
     " that would not be correctly read back with the "
     (:TERM NIL "Lisp reader")
     ". The object which could not be printed is initialized by the "
     (:KWD NIL "object") " initialization argument to "
     (:FUNREF NIL "make-condition") ", and is " (:TERM NIL "accessed")
     " by the " (:TERM NIL "function") " "
     (:FUNREF NIL "print-not-readable-object") ". "
     (:ENDISSUE NIL "DATA-IO:ADD-SUPPORT") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:FUNREF NIL "print-not-readable-object") " " :PAR))
   :PAR (:COMMENT NIL "%% ========== PRINT-NOT-READABLE-OBJECT")
   (:COM (:NAME "print-not-readable-object" :FTYPE "Function")
    (:ISSUE NIL "DATA-IO:ADD-SUPPORT") " "
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "print-not-readable-object")
      (:ARGLIST NIL "condition") (:VALUES NIL "object"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "condition")
     "—a " (:TERM NIL "condition") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "print-not-readable") ". " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns the " (:TERM NIL "object")
     " that could not be printed readably in the situation represented by "
     (:PARAM NIL "condition") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:TYPEREF NIL "print-not-readable") ", "
     (:SECREF NIL :CONDITIONS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL "% Should not be needed."
      "It is an error to use \\macref{setf} with \\funref{print-not-readable-object}. ")
     :PAR (:ENDISSUE NIL "DATA-IO:ADD-SUPPORT") " "))
   " " :PAR (:COMMENT NIL "%% ========== FORMAT")
   (:COM (:NAME "format" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "format")
      (:ARGLIST NIL "destination control-string " (:KEYWORD NIL " &rest")
       " args")
      (:VALUES NIL "result"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "destination")
     "—" (:MISC NIL "nil") ", " (:MISC NIL "t") ", a " (:TERM NIL "stream")
     ", or a " (:TERM NIL "string") " with a " (:TERM NIL "fill pointer") ". "
     :PAR (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " "
     (:PARAM NIL "control-string") "—a " (:TERM NIL "format control") ". "
     (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR
     (:PARAM NIL "args") "—" (:TERM NIL "format arguments") " for "
     (:PARAM NIL "control-string") ". " :PAR (:PARAM NIL "result") "—if "
     (:PARAM NIL "destination") " is " (:TERM NIL "non-nil") ", then "
     (:MISC NIL "nil") "; otherwise, a " (:TERM NIL "string") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.3.2 6")
     (:FUNREF NIL "format")
     " produces formatted output by outputting the characters of "
     (:PARAM NIL "control-string") " and observing that a " (:TERM NIL "tilde")
     " introduces a directive. The character after the tilde, possibly preceded by prefix parameters and modifiers, specifies what kind of formatting is desired. Most directives use one or more elements of "
     (:PARAM NIL "args") " to create their output. " :PAR "If "
     (:PARAM NIL "destination") " is a " (:TERM NIL "string") ", a "
     (:TERM NIL "stream") ", or " (:MISC NIL "t") ", then the "
     (:PARAM NIL "result") " is " (:MISC NIL "nil") ". Otherwise, the "
     (:PARAM NIL "result") " is a " (:TERM NIL "string")
     " containing the `output.' " :PAR (:COMMENT NIL "% 22.3.1 21")
     (:FUNREF NIL "format")
     " is useful for producing nicely formatted text, producing good-looking messages, and so on. "
     (:FUNREF NIL "format") " can generate and return a " (:TERM NIL "string")
     " or output to " (:PARAM NIL "destination") ". " :PAR
     "For details on how the " (:PARAM NIL "control-string")
     " is interpreted, see " (:SECREF NIL :FORMATTED-OUTPUT) ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*standard-output*")
     ", " (:VARREF NIL "*print-escape*") ", " (:VARREF NIL "*print-radix*")
     ", " (:VARREF NIL "*print-base*") ", " (:VARREF NIL "*print-circle*") ", "
     (:VARREF NIL "*print-pretty*") ", " (:VARREF NIL "*print-level*") ", "
     (:VARREF NIL "*print-length*") ", " (:VARREF NIL "*print-case*") ", "
     (:VARREF NIL "*print-gensym*") ", " (:VARREF NIL "*print-array*") ". "
     :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "STRING-OUTPUT-STREAM-BASHING:UNDEFINED") " If "
     (:PARAM NIL "destination") " is a " (:TERM NIL "string") " with a "
     (:TERM NIL "fill pointer")
     ", the consequences are undefined if destructive modifications are performed directly on the "
     (:TERM NIL "string") " during the " (:TERM NIL "dynamic extent")
     " of the call. " (:ENDISSUE NIL "STRING-OUTPUT-STREAM-BASHING:UNDEFINED")
     " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "write") ", "
     (:SECREF NIL :IMPLEMENTATION-DEFINED-SCRIPTS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " ")
  " " :PAR)
 (:CHAPTER
  (:NUM "23" :TITLE ("Reader") :NUMTAG :CHAP-TWENTY-THREE :NAMETAG :READER)
  (:SECTION (:TITLE ("Reader Concepts") :TAGS (:READER-CONCEPTS)) " " :PAR
   (:SUBSECTION (:TITLE ("Dynamic Control of the Lisp Reader"))
    "Various aspects of the " (:TERM NIL "Lisp reader")
    " can be controlled dynamically. See " (:SECREF NIL :READTABLES) " and "
    (:SECREF NIL :READER-VARS) ". " :PAR)
   :PAR
   (:SUBSECTION
    (:TITLE ("Effect of Readtable Case on the Lisp Reader") :TAGS
     (:READTABLE-CASE-READ-EFFECT))
    " " :PAR "The " (:TERM NIL "readtable case") " of the "
    (:TERM NIL "current readtable") " affects the " (:TERM NIL "Lisp reader")
    " in the following ways: " :PAR
    (:LIST NIL
     (:ITEM NIL (:KWD NIL "upcase") " " :PAR "When the "
      (:TERM NIL "readtable case") " is " (:KWD NIL "upcase")
      ", unescaped constituent " (:TERM NIL "characters") " are converted to "
      (:TERM NIL "uppercase") ", as specified in "
      (:SECREF NIL :READER-ALGORITHM) ". " :PAR)
     (:ITEM NIL (:KWD NIL "downcase") " " :PAR "When the "
      (:TERM NIL "readtable case") " is " (:KWD NIL "downcase")
      ", unescaped constituent " (:TERM NIL "characters") " are converted to "
      (:TERM NIL "lowercase") ". " :PAR)
     (:ITEM NIL (:KWD NIL "preserve") " " :PAR "When the "
      (:TERM NIL "readtable case") " is " (:KWD NIL "preserve")
      ", the case of all " (:TERM NIL "characters") " remains unchanged. "
      :PAR)
     (:ITEM NIL (:KWD NIL "invert") " " :PAR "When the "
      (:TERM NIL "readtable case") " is " (:KWD NIL "invert")
      ", then if all of the unescaped letters in the extended token are of the same "
      (:TERM NIL "case")
      ", those (unescaped) letters are converted to the opposite "
      (:TERM NIL "case") ". " :PAR))
    " " :PAR
    (:SUBSUBSECTION
     (:TITLE ("Examples of Effect of Readtable Case on the Lisp Reader") :TAGS
      (:READTABLE-CASE-READ-EXAMPLES))
     " " :PAR
     (:CODE NIL " (defun test-readtable-case-reading ()
   (let ((*readtable* (copy-readtable nil)))
     (format t \"READTABLE-CASE  Input   Symbol-name~
              ~%-----------------------------------~
              ~%\")
     (dolist (readtable-case '(:upcase :downcase :preserve :invert))
       (setf (readtable-case *readtable*) readtable-case)
       (dolist (input '(\"ZEBRA\" \"Zebra\" \"zebra\"))
         (format t \"~&:~A~16T~A~24T~A\"
                 (string-upcase readtable-case)
                 input
                 (symbol-name (read-from-string input)))))))
")
     " " :PAR "The output from " (:TT NIL "(test-readtable-case-reading)")
     " should be as follows: " :PAR
     (:CODE NIL " READTABLE-CASE     Input Symbol-name
 -------------------------------------
    :UPCASE         ZEBRA   ZEBRA
    :UPCASE         Zebra   ZEBRA
    :UPCASE         zebra   ZEBRA
    :DOWNCASE       ZEBRA   zebra
    :DOWNCASE       Zebra   zebra
    :DOWNCASE       zebra   zebra
    :PRESERVE       ZEBRA   ZEBRA
    :PRESERVE       Zebra   Zebra
    :PRESERVE       zebra   zebra
    :INVERT         ZEBRA   zebra
    :INVERT         Zebra   Zebra
    :INVERT         zebra   ZEBRA
")
     " " :PAR)
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Argument Conventions of Some Reader Functions"))
    (:SUBSUBSECTION (:TITLE ("The EOF-ERROR-P argument"))
     (:PARAM NIL "Eof-error-p")
     " in input function calls controls what happens if input is from a file (or any other input source that has a definite end) and the end of the file is reached. If "
     (:PARAM NIL "eof-error-p") " is " (:TERM NIL "true")
     " (the default), an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "end-of-file") " is signaled at end of file. If it is "
     (:TERM NIL "false")
     ", then no error is signaled, and instead the function returns "
     (:PARAM NIL "eof-value") ". " :PAR "Functions such as "
     (:FUNREF NIL "read") " that read the representation of an "
     (:TERM NIL "object")
     " rather than a single character always signals an error, regardless of "
     (:PARAM NIL "eof-error-p")
     ", if the file ends in the middle of an object representation. For example, if a file does not contain enough right parentheses to balance the left parentheses in it, "
     (:FUNREF NIL "read") " signals an error. If a file ends in a "
     (:TERM NIL "symbol") " or a " (:TERM NIL "number")
     " immediately followed by end-of-file, " (:FUNREF NIL "read")
     " reads the " (:TERM NIL "symbol") " or " (:TERM NIL "number")
     " successfully and when called again will "
     (:COMMENT NIL "%Barmar thought this wasn't needed:"
      " see the end-of-file and" " only then")
     "act according to " (:PARAM NIL "eof-error-p") ". Similarly, the "
     (:TERM NIL "function") " " (:FUNREF NIL "read-line")
     " successfully reads the last line of a file even if that line is terminated by end-of-file rather than the newline character. Ignorable text, such as lines containing only "
     (:TERM NIL "whitespace") (:SUB NIL "2")
     " or comments, are not considered to begin an " (:TERM NIL "object")
     "; if " (:FUNREF NIL "read") " begins to read an "
     (:TERM NIL "expression")
     " but sees only such ignorable text, it does not consider the file to end in the middle of an "
     (:TERM NIL "object") ". Thus an " (:PARAM NIL "eof-error-p")
     " argument controls what happens when the file ends between "
     (:TERM NIL "objects") ". " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("The RECURSIVE-P argument")) "If "
     (:PARAM NIL "recursive-p") " is supplied and not " (:MISC NIL "nil")
     ", it specifies that this function call is not an outermost call to "
     (:FUNREF NIL "read") " but an embedded call, typically from a "
     (:TERM NIL "reader macro function")
     ". It is important to distinguish such recursive calls for three reasons. "
     :PAR (:COMMENT NIL "% 22.2.1 5")
     (:LIST NIL
      (:ITEM NIL
       "1. An outermost call establishes the context within which the "
       (:TT NIL "#" (:PARAM NIL "n") "=") " and "
       (:TT NIL "#" (:PARAM NIL "n") "#")
       " syntax is scoped. Consider, for example, the expression " :PAR
       (:CODE NIL " (cons '#3=(p q r) '(x y . #3#))
")
       " If the " (:TERM NIL "single-quote") " " (:TERM NIL "reader macro")
       " were defined in this way: " :PAR
       (:CODE NIL " (set-macro-character #\\'       ;incorrect
    #'(lambda (stream char)
         (declare (ignore char))
         (list 'quote (read stream))))
")
       " " :PAR
       (:COMMENT NIL
        " then the expression could not be read properly, because there would be no way"
        " to know when \\funref{read} is called recursively by the first"
        " occurrence of \\f{'} that the label \\f{\\#3=} would be referred to"
        " later in the containing expression."
        " There would be no way to know because \\funref{read}"
        " could not determine that it was called by a \\term{reader macro function}"
        " rather than from an outermost form." "% per JonL:")
       "then each call to the " (:TERM NIL "single-quote") " "
       (:TERM NIL "reader macro function")
       " would establish independent contexts for the scope of "
       (:FUNREF NIL "read")
       " information, including the scope of identifications between markers like “"
       (:TT NIL "#3=") "” and “" (:TT NIL "#3#")
       "”. However, for this expression, the scope was clearly intended to be determined by the outer set of parentheses, so such a definition would be incorrect. The correct way to define the "
       (:TERM NIL "single-quote") " " (:TERM NIL "reader macro") " uses "
       (:PARAM NIL "recursive-p") ": " :PAR
       (:CODE NIL " (set-macro-character #\\'       ;correct
    #'(lambda (stream char)
         (declare (ignore char))
         (list 'quote (read stream t nil t))))
")
       " " :PAR (:COMMENT NIL "% 22.2.1 6"))
      (:ITEM NIL
       "2. A recursive call does not alter whether the reading process is to preserve "
       (:TERM NIL "whitespace") (:SUB NIL "2")
       " or not (as determined by whether the outermost call was to "
       (:FUNREF NIL "read") " or " (:FUNREF NIL "read-preserving-whitespace")
       "). Suppose again that " (:TERM NIL "single-quote") " "
       (:COMMENT NIL " had the first, incorrect, \\term{reader macro}"
        " definition shown above." "% per JonL:")
       "were to be defined as shown above in the incorrect definition. Then a call to "
       (:FUNREF NIL "read-preserving-whitespace") " that read the expression "
       (:TT NIL "'foo" (:ANG NIL "Space"))
       " would fail to preserve the space character following the symbol "
       (:TT NIL "foo") " because the " (:TERM NIL "single-quote") " "
       (:TERM NIL "reader macro function") " calls " (:FUNREF NIL "read")
       ", not " (:FUNREF NIL "read-preserving-whitespace")
       ", to read the following expression (in this case " (:TT NIL "foo")
       "). The correct definition, which passes the value " (:TERM NIL "true")
       " for " (:PARAM NIL "recursive-p") " to " (:FUNREF NIL "read")
       ", allows the outermost call to determine whether "
       (:TERM NIL "whitespace") (:SUB NIL "2") " is preserved. " :PAR
       (:COMMENT NIL "% 22.2.1 8"))
      (:ITEM NIL "3. When end-of-file is encountered and the "
       (:PARAM NIL "eof-error-p") " argument is not " (:MISC NIL "nil")
       ", the kind of error that is signaled may depend on the value of "
       (:PARAM NIL "recursive-p") ". If " (:PARAM NIL "recursive-p") " is "
       (:TERM NIL "true")
       ", then the end-of-file is deemed to have occurred within the middle of a printed representation; if "
       (:PARAM NIL "recursive-p") " is " (:TERM NIL "false")
       ", then the end-of-file may be deemed to have occurred between "
       (:TERM NIL "objects") " rather than within the middle of one. " :PAR))
     " " :PAR)
    :PAR))
  :PAR
  (:DICTIONARY NIL :PAR (:COMMENT NIL " Reader" "  Reader Variables") :PAR
   (:COMMENT NIL "-------------------- Readtable Type --------------------")
   :PAR (:COMMENT NIL "% 2.7.0 1" "% 22.1.5 2")
   (:COM (:NAME "readtable" :FTYPE "System Class")
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "readtable") ", "
     (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "A " (:TERM NIL "readtable") " maps "
     (:TERM NIL "characters") " into " (:TERM NIL "syntax types") " for the "
     (:TERM NIL "Lisp reader") "; see " (:CHAPREF NIL :SYNTAX) ". A "
     (:TERM NIL "readtable") " also contains associations between "
     (:TERM NIL "macro characters") " and their "
     (:TERM NIL "reader macro functions")
     ", and records information about the case conversion rules to be used by the "
     (:TERM NIL "Lisp reader") " when parsing " (:TERM NIL "symbols") ". " :PAR
     (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " "
     (:COMMENT NIL "% 22.1.5 3"
      "It is not required that an implementation have characters with non-zero"
      "\\param{bits} and \\param{font} \\term{attributes}"
      "syntax descriptions in the \\term{readtable}.  "
      "!!! The following replacement still isn't unambiguous."
      "    Mail sent to Quinquevirate asking for advice." "    -kmp 25-May-91")
     "Each " (:TERM NIL "simple") " " (:TERM NIL "character")
     " must be representable in the " (:TERM NIL "readtable") ". It is "
     (:TERM NIL "implementation-defined") " whether " (:TERM NIL "non-simple")
     " " (:TERM NIL "characters") " can have syntax descriptions in the "
     (:TERM NIL "readtable") ". " (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1")
     " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :READTABLES) ", "
     (:SECREF NIL :PRINTING-OTHER-OBJECTS) " " :PAR))
   :PAR (:COMMENT NIL "-------------------- Reader --------------------") :PAR
   (:COMMENT NIL "%% ========== COPY-READTABLE")
   (:COM (:NAME "copy-readtable" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "copy-readtable")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " from-readtable to-readtable")
      (:VALUES NIL "readtable"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "from-readtable") "—a " (:TERM NIL "readtable designator")
     ". The default is the " (:TERM NIL "current readtable") ". " :PAR
     (:PARAM NIL "to-readtable") "—a " (:TERM NIL "readtable") " or "
     (:MISC NIL "nil") ". The default is " (:MISC NIL "nil") ". " :PAR
     (:PARAM NIL "readtable") "—the " (:PARAM NIL "to-readtable") " if it is "
     (:TERM NIL "non-nil") ", or else a " (:TERM NIL "fresh") " "
     (:TERM NIL "readtable") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.1.5 6")
     (:FUNREF NIL "copy-readtable") " copies " (:PARAM NIL "from-readtable")
     ". " :PAR (:COMMENT NIL "% 22.1.5 7") "If " (:PARAM NIL "to-readtable")
     " is " (:MISC NIL "nil") ", a new " (:TERM NIL "readtable")
     " is created and returned. Otherwise the " (:TERM NIL "readtable")
     " specified by " (:PARAM NIL "to-readtable") " is modified and returned. "
     :PAR (:ISSUE NIL "READ-CASE-SENSITIVITY:READTABLE-KEYWORDS") " "
     (:FUNREF NIL "copy-readtable") " copies the setting of "
     (:FUNREF NIL "readtable-case") ". "
     (:ENDISSUE NIL "READ-CASE-SENSITIVITY:READTABLE-KEYWORDS") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:COMMENT NIL
      "!!! This is an awful example, and relatively unsafe to just try blindly.")
     (:CODE NIL " (setq zvar 123) → 123
 (set-syntax-from-char #\\z #\\' (setq table2 (copy-readtable))) → T
 zvar → 123
 (copy-readtable table2 *readtable*) → #<READTABLE 614000277>
 zvar → VAR
 (setq *readtable* (copy-readtable)) → #<READTABLE 46210223>
 zvar → VAR
 (setq *readtable* (copy-readtable nil)) → #<READTABLE 46302670>
 zvar → 123
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:TYPEREF NIL "readtable") ", "
     (:VARREF NIL "*readtable*") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL "(setq *readtable* (copy-readtable nil))
")
     " restores the input syntax to standard " (:RM NIL " Common Lisp")
     " syntax, even if the " (:TERM NIL "initial readtable")
     " has been clobbered (assuming it is not so badly clobbered that you cannot type in the above expression). "
     :PAR "On the other hand, " :PAR
     (:CODE NIL "(setq *readtable* (copy-readtable))
")
     " replaces the current " (:TERM NIL "readtable")
     " with a copy of itself. This is useful if you want to save a copy of a readtable for later use, protected from alteration in the meantime. It is also useful if you want to locally bind the readtable to a copy of itself, as in: "
     :PAR
     (:CODE NIL "(let ((*readtable* (copy-readtable))) ...)
")
     " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MAKE-DISPATCH-MACRO-CHARACTER")
   (:COM (:NAME "make-dispatch-macro-character" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "make-dispatch-macro-character")
      (:ARGLIST NIL "char " (:KEYWORD NIL " &optional")
       " non-terminating-p readtable")
      (:VALUES NIL (:MISC NIL "t")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " " (:PARAM NIL "char")
     "—a " (:TERM NIL "character") ". "
     (:ENDISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " " :PAR
     (:PARAM NIL "non-terminating-p") "—a " (:TERM NIL "generalized boolean")
     ". The default is " (:TERM NIL "false") ". " :PAR (:PARAM NIL "readtable")
     "—a " (:TERM NIL "readtable") ". The default is the "
     (:TERM NIL "current readtable") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.1.5 19")
     (:FUNREF NIL "make-dispatch-macro-character") " makes "
     (:PARAM NIL "char") " be a " (:TERM NIL "dispatching macro character")
     " in " (:PARAM NIL "readtable") ". " :PAR "Initially, every "
     (:TERM NIL "character") " in the dispatch table associated with the "
     (:PARAM NIL "char")
     " has an associated function that signals an error of " (:TERM NIL "type")
     " " (:TYPEREF NIL "reader-error") ". " :PAR "If "
     (:PARAM NIL "non-terminating-p") " is " (:TERM NIL "true") ", the "
     (:TERM NIL "dispatching macro character") " is made a "
     (:TERM NIL "non-terminating") " " (:TERM NIL "macro character") "; if "
     (:PARAM NIL "non-terminating-p") " is " (:TERM NIL "false") ", the "
     (:TERM NIL "dispatching macro character") " is made a "
     (:TERM NIL "terminating") " " (:TERM NIL "macro character") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (get-macro-character #\\{) → NIL, " (:TERM NIL "false") "
 (make-dispatch-macro-character #\\{) → T
 (not (get-macro-character #\\{)) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR
     (:COMMENT NIL "% Sandra thinks this is excessive."
      " A \\term{pprint dispatch table} is created and initialized.")
     :PAR "The " (:PARAM NIL "readtable") " is altered. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:VARREF NIL "*readtable*") ", "
     (:FUNREF NIL "set-dispatch-macro-character") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== READ"
    "%% ========== READ-PRESERVING-WHITESPACE")
   (:COM (:NAME "read, read-preserving-whitespace" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "read")
      (:ARGLIST NIL (:KEYWORD NIL " &optional")
       " input-stream eof-error-p eof-value recursive-p")
      (:VALUES NIL "object"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "read-preserving-whitespace")
      (:ARGLIST NIL (:KEYWORD NIL " &optional")
       " input-stream eof-error-p eof-value recursive-p")
      (:VALUES NIL "object"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "input-stream")
     "—an " (:TERM NIL "input") " " (:TERM NIL "stream designator") ". " :PAR
     (:PARAM NIL "eof-error-p") "—a " (:TERM NIL "generalized boolean")
     ". The default is " (:TERM NIL "true") ". " :PAR
     (:ISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " "
     (:PARAM NIL "eof-value") "—an " (:TERM NIL "object") ". "
     (:ENDISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " The default is "
     (:MISC NIL "nil") ". " :PAR (:PARAM NIL "recursive-p") "—a "
     (:TERM NIL "generalized boolean") ". The default is " (:TERM NIL "false")
     ". " :PAR (:PARAM NIL "object") "—an " (:TERM NIL "object")
     " (parsed by the " (:TERM NIL "Lisp reader") ") or the "
     (:PARAM NIL "eof-value") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.2.1 9  ")
     (:FUNREF NIL "read") " parses the printed representation of an "
     (:TERM NIL "object") " from " (:PARAM NIL "input-stream")
     " and builds such an " (:TERM NIL "object") ". " :PAR
     (:COMMENT NIL "% 22.2.1 14") (:FUNREF NIL "read-preserving-whitespace")
     " is like " (:FUNREF NIL "read") " but preserves any "
     (:TERM NIL "whitespace") (:SUB NIL "2") " " (:TERM NIL "character")
     " that delimits the printed representation of the " (:TERM NIL "object")
     ". "
     (:COMMENT NIL "% 22.2.1 17                                          ")
     (:FUNREF NIL "read-preserving-whitespace") " is exactly like "
     (:FUNREF NIL "read") " when the " (:PARAM NIL "recursive-p") " "
     (:TERM NIL "argument") " to " (:FUNREF NIL "read-preserving-whitespace")
     " is " (:TERM NIL "true") ". " :PAR
     (:COMMENT NIL "% 22.2.1 10" "% 22.2.1 13") "When "
     (:VARREF NIL "*read-suppress*") " is " (:TERM NIL "false") ", "
     (:FUNREF NIL "read") " throws away the delimiting "
     (:TERM NIL "character")
     " required by certain printed representations if it is a "
     (:TERM NIL "whitespace") (:SUB NIL "2") " " (:TERM NIL "character")
     "; but " (:FUNREF NIL "read") " preserves the character (using "
     (:FUNREF NIL "unread-char")
     ") if it is syntactically meaningful, because it could be the start of the next expression. "
     (:COMMENT NIL
      "% Already said in discussion of Double-Quote -kmp 25-Jan-92"
      " %% 2.5.2 3" " \\funref{read} always constructs"
      " a \\term{simple string} when it reads the \\term{double-quote} syntax."
      "% Moved to discussion of Double-Quote -kmp 25-Jan-92"
      " \\issue{CHARACTER-PROPOSAL:2-1-1}"
      "   It is \\term{implementation-dependent} which \\term{attributes} are removed"
      "   from characters within \\term{double-quotes}."
      " \\endissue{CHARACTER-PROPOSAL:2-1-1}"
      "% Already said in discussion of #* -kmp 25-Jan-92" "% 2.5.3 2"
      " \\funref{read} always constructs a \\term{simple bit vector} "
      " when it reads the \\f{\\#*} syntax.")
     :PAR "If a file ends in a " (:TERM NIL "symbol") " or a "
     (:TERM NIL "number") " immediately followed by an "
     (:TERM NIL "end of file") (:SUB NIL "1") ", " (:FUNREF NIL "read")
     " reads the " (:TERM NIL "symbol") " or " (:TERM NIL "number")
     " successfully; when called again, it sees the " (:TERM NIL "end of file")
     (:SUB NIL "1") " and only then acts according to "
     (:PARAM NIL "eof-error-p")
     ". If a file contains ignorable text at the end, such as blank lines and comments, "
     (:FUNREF NIL "read") " does not consider it to end in the middle of an "
     (:TERM NIL "object") ". "
     (:COMMENT NIL
      " Moved to the discussion of tokenizing symbols. -kmp 25-Jan-92"
      " \\issue{CHARACTER-PROPOSAL:2-1-1}"
      " It is \\term{implementation-dependent} which"
      "   \\term{attributes} are removed from \\term{symbol} names."
      " \\endissue{CHARACTER-PROPOSAL:2-1-1}")
     :PAR "If " (:PARAM NIL "recursive-p") " is " (:TERM NIL "true")
     ", the call to " (:FUNREF NIL "read")
     " is expected to be made from within some function that itself has been called from "
     (:FUNREF NIL "read")
     " or from a similar input function, rather than from the top level. " :PAR
     (:COMMENT NIL "% 22.2.1 9") "Both functions return the "
     (:TERM NIL "object") " read from " (:PARAM NIL "input-stream") ". "
     (:PARAM NIL "Eof-value") " is returned if " (:PARAM NIL "eof-error-p")
     " is " (:TERM NIL "false")
     " and end of file is reached before the beginning of an "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:COMMENT NIL "!!! This example needs work.")
     (:CODE NIL " (read)
⊳ "
      (:IN NIL "'a") "
→ (QUOTE A)
 (with-input-from-string (is \" \") (read is nil 'the-end)) → THE-END
 (defun skip-then-read-char (s c n)
    (if (char= c #\\{) (read s t nil t) (read-preserving-whitespace s))
    (read-char-no-hang s)) → SKIP-THEN-READ-CHAR
 (let ((*readtable* (copy-readtable nil)))
    (set-dispatch-macro-character #\\# #\\{ #'skip-then-read-char)
    (set-dispatch-macro-character #\\# #\\} #'skip-then-read-char)
    (with-input-from-string (is \"#{123 x #}123 y\")
      (format t \"~S ~S\" (read is) (read is)))) → #\\x, #\\Space, NIL
")
     " " :PAR (:COMMENT NIL "% 22.2.1 15") "As an example, consider this "
     (:TERM NIL "reader macro") " definition: " :PAR
     (:COMMENT NIL "JonL thinks this is easier to read if LOOP is used."
      "  (defun slash-reader (stream char)" "    (declare (ignore char))"
      "    (do ((path (list (read-preserving-whitespace stream t nil t))"
      "               (cons (progn (read-char stream t nil t)"
      "                            (read-preserving-whitespace"
      "                              stream t nil t))"
      "                     path)))"
      "        ((not (eql (peek-char nil stream nil nil t) #\\\\/))"
      "         (cons 'path (nreverse path)))))                          ")
     :PAR
     (:CODE NIL " (defun slash-reader (stream char)
   (declare (ignore char))
   `(path . ,(loop for dir = (read-preserving-whitespace stream t nil t)
                   then (progn (read-char stream t nil t)
                               (read-preserving-whitespace stream t nil t))
                   collect dir
                   while (eql (peek-char nil stream nil nil t) #\\/))))
 (set-macro-character #\\/ #'slash-reader)
")
     " " :PAR (:COMMENT NIL "% 22.2.1 16") "Consider now calling "
     (:FUNREF NIL "read") " on this expression: " :PAR
     (:CODE NIL " (zyedh /usr/games/zork /usr/games/boggle)
")
     " The " (:TT NIL "/") " macro reads objects separated by more "
     (:TT NIL "/") " characters; thus " (:TT NIL "/usr/games/zork")
     " is intended to read as " (:TT NIL "(path usr games zork)")
     ". The entire example expression should therefore be read as " :PAR
     (:CODE NIL " (zyedh (path usr games zork) (path usr games boggle))
")
     " However, if " (:FUNREF NIL "read") " had been used instead of "
     (:FUNREF NIL "read-preserving-whitespace")
     ", then after the reading of the symbol " (:TT NIL "zork")
     ", the following space would be discarded; the next call to "
     (:FUNREF NIL "peek-char") " would see the following " (:TT NIL "/")
     ", and the loop would continue, producing this interpretation: " :PAR
     (:CODE NIL " (zyedh (path usr games zork usr games boggle))
")
     " There are times when " (:TERM NIL "whitespace") (:SUB NIL "2")
     " should be discarded. If a command interpreter takes single-character commands, but occasionally reads an "
     (:TERM NIL "object") " then if the " (:TERM NIL "whitespace")
     (:SUB NIL "2") " after a " (:TERM NIL "symbol")
     " is not discarded it might be interpreted as a command some time later after the "
     (:TERM NIL "symbol") " had been read. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*standard-input*") ", "
     (:VARREF NIL "*terminal-io*") ", " (:VARREF NIL "*readtable*") ", "
     (:VARREF NIL "*read-default-float-format*") ", "
     (:VARREF NIL "*read-base*") ", " (:VARREF NIL "*read-suppress*") ", "
     (:VARREF NIL "*package*") ", " (:VARREF NIL "*read-eval*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL "% 22.2.1 3") (:FUNREF NIL "read") " signals an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "end-of-file") ", regardless of "
     (:PARAM NIL "eof-error-p") ", if the file ends in the middle of an "
     (:TERM NIL "object")
     " representation. For example, if a file does not contain enough right parentheses to balance the left parentheses in it, "
     (:FUNREF NIL "read") " signals an error. This is detected when "
     (:FUNREF NIL "read") " or " (:FUNREF NIL "read-preserving-whitespace")
     " is called with " (:PARAM NIL "recursive-p") " and "
     (:PARAM NIL "eof-error-p") " " (:TERM NIL "non-nil")
     ", and end-of-file is reached before the beginning of an "
     (:TERM NIL "object") ". " :PAR "If " (:PARAM NIL "eof-error-p") " is "
     (:TERM NIL "true") ", an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "end-of-file") " is signaled at the end of file. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "peek-char") ", "
     (:FUNREF NIL "read-char") ", " (:FUNREF NIL "unread-char") ", "
     (:FUNREF NIL "read-from-string") ", " (:FUNREF NIL "read-delimited-list")
     ", " (:FUNREF NIL "parse-integer") ", " (:CHAPREF NIL :SYNTAX) ", "
     (:CHAPREF NIL :READER-CONCEPTS) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL "% Sandra: Just cross-reference \"Reader Concepts\"."
      " \\param{Recursive-p} should be true if the call to \\funref{read} is"
      " from within some function that itself"
      " has been called from \\funref{read} or from a similar input function, rather"
      " than from the top level.  For"
      " instance, a reader macro function that has to read from the input stream"
      " beyond the \\term{macro character} should specify \\param{recursive-p} as true.  The"
      " reasons for this are as follows.  First of all, the scoping of the"
      " notations \\f{\\#\\i{n}=} and \\f{\\#\\i{n}\\#} occurs within a"
      " top-level call, so calls to \\funref{read} "
      " from reader macro functions must"
      " specify \\param{recursive-p} as true to ensure that these notations are"
      " interpreted correctly.  Second, for white space to be preserved correctly"
      " by low-level calls to \\funref{read}  occurring within a call to "
      " \\funref{read-preserving-whitespace}, \\param{recursive-p} must be true."
      " Otherwise a low-level call to \\funref{read} does not know that it needs to"
      " preserve white space for the higher-level call."
      " Third, this is necessary to distinguish end-of-file within an \\term{object}"
      " from end-of-file between \\term{objects}.")))
   " " :PAR (:COMMENT NIL "%% ========== READ-DELIMITED-LIST")
   (:COM (:NAME "read-delimited-list" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "read-delimited-list")
      (:ARGLIST NIL "char " (:KEYWORD NIL " &optional")
       " input-stream recursive-p")
      (:VALUES NIL "list"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "char") "—a "
     (:TERM NIL "character") ". " :PAR (:PARAM NIL "input-stream") "—an "
     (:TERM NIL "input") " " (:TERM NIL "stream designator")
     ". The default is " (:TERM NIL "standard input") ". " :PAR
     (:PARAM NIL "recursive-p") "—a " (:TERM NIL "generalized boolean")
     ". The default is " (:TERM NIL "false") ". " :PAR (:PARAM NIL "list")
     "—a " (:TERM NIL "list") " of the " (:TERM NIL "objects") " read. " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.2.1 18")
     (:FUNREF NIL "read-delimited-list") " reads " (:TERM NIL "objects")
     " from " (:PARAM NIL "input-stream") " until the next character after an "
     (:TERM NIL "object") "'s representation (ignoring "
     (:TERM NIL "whitespace") (:SUB NIL "2") " characters and comments) is "
     (:PARAM NIL "char") ". " :PAR (:COMMENT NIL "% 22.2.1 19")
     (:FUNREF NIL "read-delimited-list")
     " looks ahead at each step for the next non-" (:TERM NIL "whitespace")
     (:SUB NIL "2") " " (:TERM NIL "character") " and peeks at it as if with "
     (:FUNREF NIL "peek-char") ". If it is " (:PARAM NIL "char") ", then the "
     (:TERM NIL "character") " is consumed and the " (:TERM NIL "list") " of "
     (:TERM NIL "objects") " is returned. If it is a "
     (:TERM NIL "constituent") " or " (:TERM NIL "escape") " "
     (:TERM NIL "character") ", then " (:FUNREF NIL "read")
     " is used to read an " (:TERM NIL "object")
     ", which is added to the end of the " (:TERM NIL "list") ". If it is a "
     (:TERM NIL "macro character") ", its " (:TERM NIL "reader macro function")
     " is called; if the function returns a " (:TERM NIL "value") ", that "
     (:TERM NIL "value") " is added to the " (:TERM NIL "list")
     ". The peek-ahead process is then repeated. " :PAR "If "
     (:PARAM NIL "recursive-p") " is " (:TERM NIL "true")
     ", this call is expected to be embedded in a higher-level call to "
     (:FUNREF NIL "read") " or a similar function. " :PAR
     (:COMMENT NIL "% 22.2.1 25")
     "It is an error to reach end-of-file during the operation of "
     (:FUNREF NIL "read-delimited-list") ". " :PAR
     "The consequences are undefined if " (:PARAM NIL "char") " has a "
     (:TERM NIL "syntax type") " of " (:TERM NIL "whitespace") (:SUB NIL "2")
     " in the " (:TERM NIL "current readtable") ". " :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (read-delimited-list #\\]) 1 2 3 4 5 6 ]
→ (1 2 3 4 5 6)
")
     " " (:COMMENT NIL "% 22.2.1 22") "Suppose you wanted "
     (:TT NIL "#{" (:I NIL "a") " " (:I NIL "b") " " (:I NIL "c") " "
      (:MATH NIL (:MO NIL "…")) " " (:I NIL "z") "}")
     " to read as a list of all pairs of the elements " (:I NIL "a") ", "
     (:I NIL "b") ", " (:I NIL "c") ", " (:MATH NIL (:MO NIL "…")) ", "
     (:I NIL "z") ", for example. " :PAR
     (:CODE NIL " #{p q z a}  reads as  ((p q) (p z) (p a) (q z) (q a) (z a))
")
     " This can be done by specifying a macro-character definition for "
     (:TT NIL "#{") " that does two things: reads in all the items up to the "
     (:TT NIL "}") ", and constructs the pairs. "
     (:FUNREF NIL "read-delimited-list") " performs the first task. " :PAR
     (:COMMENT NIL " (")
     (:CODE NIL " (defun |#{-reader| (stream char arg)
   (declare (ignore char arg))
   (mapcon #'(lambda (x)
              (mapcar #'(lambda (y) (list (car x) y)) (cdr x)))
          (read-delimited-list #\\} stream t))) → |#{-reader|

 (set-dispatch-macro-character #\\# #\\{ #'|#{-reader|) → T 
 (set-macro-character #\\} (get-macro-character #\\) "
      (:MISC NIL "nil") "))
")
     " Note that " (:TERM NIL "true") " is supplied for the "
     (:PARAM NIL "recursive-p") " argument. " :PAR (:COMMENT NIL "% 22.2.1 23")
     "It is necessary here to give a definition to the character "
     (:TT NIL "}")
     " as well to prevent it from being a constituent. If the line " :PAR
     (:COMMENT NIL " (")
     (:CODE NIL " (set-macro-character #\\} (get-macro-character #\\) "
      (:MISC NIL "nil") "))
")
     " shown above were not included, then the " (:TT NIL "}") " in " :PAR
     (:CODE NIL " #{ p q z a}
")
     " would be considered a constituent character, part of the symbol named "
     (:TT NIL "a}") ". This could be corrected by putting a space before the "
     (:TT NIL "}") ", but it is better to call "
     (:FUNREF NIL "set-macro-character") ". " :PAR (:COMMENT NIL "% 22.2.1 24")
     "Giving " (:TT NIL "}") " the same " (:COMMENT NIL " (")
     "definition as the standard definition of the character " (:TT NIL ")")
     " has the twin benefit of making it terminate tokens for use with "
     (:FUNREF NIL "read-delimited-list")
     " and also making it invalid for use in any other context. Attempting to read a stray "
     (:TT NIL "}") " will signal an error. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*standard-input*") ", "
     (:VARREF NIL "*readtable*") ", " (:VARREF NIL "*terminal-io*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "read") ", "
     (:FUNREF NIL "peek-char") ", " (:FUNREF NIL "read-char") ", "
     (:FUNREF NIL "unread-char") ". " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 22.2.1 20")
     (:FUNREF NIL "read-delimited-list")
     " is intended for use in implementing " (:TERM NIL "reader macros")
     ". Usually it is desirable for " (:PARAM NIL "char") " to be a "
     (:TERM NIL "terminating") " " (:TERM NIL "macro character")
     " so that it can be used to delimit tokens; however, "
     (:FUNREF NIL "read-delimited-list")
     " makes no attempt to alter the syntax specified for " (:PARAM NIL "char")
     " by the current readtable. The caller must make any necessary changes to the readtable syntax explicitly. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== READ-FROM-STRING")
   (:COM (:NAME "read-from-string" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "read-from-string")
      (:ARGLIST NIL "string " (:KEYWORD NIL " &optional")
       " eof-error-p eof-value " (:KEYWORD NIL " &key")
       " start end preserve-whitespace")
      (:VALUES NIL "object, position"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "string") "—a "
     (:TERM NIL "string") ". " :PAR (:PARAM NIL "eof-error-p") "—a "
     (:TERM NIL "generalized boolean") ". The default is " (:TERM NIL "true")
     ". " :PAR (:ISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " "
     (:PARAM NIL "eof-value") "—an " (:TERM NIL "object") ". "
     (:ENDISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " The default is "
     (:MISC NIL "nil") ". " :PAR (:ISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " "
     (:ISSUE NIL "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:PARAM NIL "start") ", " (:PARAM NIL "end") "—"
     (:TERM NIL "bounding index designators") " of " (:PARAM NIL "string")
     ". The defaults for " (:PARAM NIL "start") " and " (:PARAM NIL "end")
     " are " (:TT NIL "0") " and " (:MISC NIL "nil") ", respectively. "
     (:ENDISSUE NIL
      "RANGE-OF-START-AND-END-PARAMETERS:INTEGER-AND-INTEGER-NIL")
     " " (:ENDISSUE NIL "SUBSEQ-OUT-OF-BOUNDS") " " :PAR
     (:PARAM NIL "preserve-whitespace") "—a " (:TERM NIL "generalized boolean")
     ". The default is " (:TERM NIL "false") ". " :PAR (:PARAM NIL "object")
     "—an " (:TERM NIL "object") " (parsed by the " (:TERM NIL "Lisp reader")
     ") or the " (:PARAM NIL "eof-value") ". " :PAR (:PARAM NIL "position")
     "—an " (:TERM NIL "integer")
     " greater than or equal to zero, and less than or equal to one more than the "
     (:TERM NIL "length") " of the " (:PARAM NIL "string") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.2.1 40")
     "Parses the printed representation of an " (:TERM NIL "object")
     " from the subsequence of " (:PARAM NIL "string") " "
     (:TERM NIL "bounded") " by " (:PARAM NIL "start") " and "
     (:PARAM NIL "end") ", as if " (:FUNREF NIL "read")
     " had been called on an " (:TERM NIL "input") " " (:TERM NIL "stream")
     " containing those same " (:TERM NIL "characters") ". " :PAR
     (:COMMENT NIL " This seems unnecessary/redundant to me." " %% 22.2.1 39"
      " The characters of \\param{string} are given successively to the \\term{Lisp reader},"
      " and the \\term{object} is built by the reader.")
     :PAR (:COMMENT NIL "% 22.2.1 41") "If " (:PARAM NIL "preserve-whitespace")
     " is " (:TERM NIL "true") ", the operation will preserve "
     (:TERM NIL "whitespace") (:SUB NIL "2") " as "
     (:FUNREF NIL "read-preserving-whitespace") " would do. " :PAR
     (:COMMENT NIL "% 22.2.1 43") "If an " (:TERM NIL "object")
     " is successfully parsed, the " (:TERM NIL "primary value") ", "
     (:PARAM NIL "object") ", is the " (:TERM NIL "object")
     " that was parsed. If " (:PARAM NIL "eof-error-p") " is "
     (:TERM NIL "false") " and if the end of the " (:PARAM NIL "substring")
     " is reached, " (:PARAM NIL "eof-value") " is returned. " :PAR "The "
     (:TERM NIL "secondary value") ", " (:PARAM NIL "position")
     ", is the index of the first " (:TERM NIL "character") " in the "
     (:TERM NIL "bounded") " " (:PARAM NIL "string") " that was not read. The "
     (:PARAM NIL "position") " may depend upon the value of "
     (:PARAM NIL "preserve-whitespace") ". "
     (:COMMENT NIL
      " Amazing.  CLtL really says this.  I wonder why. -kmp 23-Jan-92")
     "If the entire " (:PARAM NIL "string") " was read, the "
     (:PARAM NIL "position") " returned is either the " (:PARAM NIL "length")
     " of the " (:PARAM NIL "string") " or one greater than the "
     (:PARAM NIL "length") " of the " (:PARAM NIL "string") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR (:COMMENT NIL "% 22.2.1 44")
     (:CODE NIL " (read-from-string \" 1 3 5\" t nil :start 2) → 3, 5
 (read-from-string \"(a b c)\") → (A B C), 7
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL "% 22.2.1 42")
     "If the end of the supplied substring occurs before an "
     (:TERM NIL "object") " can be read, an error is signaled if "
     (:PARAM NIL "eof-error-p") " is " (:TERM NIL "true")
     ". An error is signaled if the end of the " (:PARAM NIL "substring")
     " occurs in the middle of an incomplete " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "read") ", "
     (:FUNREF NIL "read-preserving-whitespace") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL
      " Moon and Sandra seemed to believe this was the motivation."
      " I felt we should record the fact. -kmp 24-Jan-92")
     "The reason that " (:PARAM NIL "position") " is allowed to be beyond the "
     (:TERM NIL "length") " of the " (:PARAM NIL "string")
     " is to permit (but not require) the " (:TERM NIL "implementation")
     " to work by simulating the effect of a trailing delimiter at the end of the "
     (:TERM NIL "bounded") " " (:PARAM NIL "string") ". When "
     (:PARAM NIL "preserve-whitespace") " is " (:TERM NIL "true") ", the "
     (:PARAM NIL "position") " might count the simulated delimiter. " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== READTABLE-CASE")
   (:COM (:NAME "readtable-case" :FTYPE "Accessor")
    (:ISSUE NIL "READ-CASE-SENSITIVITY:READTABLE-KEYWORDS") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "readtable-case")
      (:ARGLIST NIL "readtable") (:VALUES NIL "mode"))
     " " :PAR
     (:COMMENT NIL " Fixed broken syntax.  --sjl 16 Mar 92"
      "\\Defsetf readtable-case {readtable mode} {mode}")
     (:DEF (:KIND "setf") (:NAMES NIL "readtable-case")
      (:ARGLIST NIL "readtable") (:NEW-VALUE NIL "mode"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "readtable")
     "—a " (:TERM NIL "readtable") ". " :PAR (:PARAM NIL "mode") "—a "
     (:TERM NIL "case sensitivity mode") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:TERM NIL "Accesses") " the "
     (:TERM NIL "readtable case") " of " (:PARAM NIL "readtable")
     ", which affects the way in which the " (:TERM NIL "Lisp Reader")
     " reads " (:TERM NIL "symbols") " and the way in which the "
     (:TERM NIL "Lisp Printer") " writes " (:TERM NIL "symbols") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR "See "
     (:SECREF NIL :READTABLE-CASE-READ-EXAMPLES) " and "
     (:SECREF NIL :READTABLE-CASE-PRINT-EXAMPLES) ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "readtable") " is not a "
     (:TERM NIL "readtable") ". Should signal an error of " (:TERM NIL "type")
     " " (:TYPEREF NIL "type-error") " if " (:PARAM NIL "mode") " is not a "
     (:TERM NIL "case sensitivity mode") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:VARREF NIL "*readtable*") ", "
     (:VARREF NIL "*print-escape*") ", " (:SECREF NIL :READER-ALGORITHM) ", "
     (:SECREF NIL :READTABLE-CASE-READ-EFFECT) ", "
     (:SECREF NIL :READTABLE-CASE-PRINT-EFFECT) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:FUNREF NIL "copy-readtable")
     " copies the " (:TERM NIL "readtable case") " of the "
     (:PARAM NIL "readtable") ". " :PAR
     (:ENDISSUE NIL "READ-CASE-SENSITIVITY:READTABLE-KEYWORDS") " "))
   " " :PAR (:COMMENT NIL "%% ========== READTABLEP")
   (:COM (:NAME "readtablep" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "readtablep") (:ARGLIST NIL "object")
      (:VALUES NIL "generalized-boolean"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.1.5 8")
     "Returns " (:TERM NIL "true") " if " (:PARAM NIL "object") " is of "
     (:TERM NIL "type") " " (:TYPEREF NIL "readtable") "; otherwise, returns "
     (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (readtablep *readtable*) → " (:TERM NIL "true") "
 (readtablep (copy-readtable)) → "
      (:TERM NIL "true") "
 (readtablep '*readtable*) → "
      (:TERM NIL "false") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " (readtablep " (:PARAM NIL "object") ") ≡ (typep "
      (:PARAM NIL "object") " 'readtable) 
")
     " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== GET-DISPATCH-MACRO-CHARACTER"
    "%% ========== SET-DISPATCH-MACRO-CHARACTER")
   (:COM
    (:NAME "set-dispatch-macro-character, get-dispatch-macro-character" :FTYPE
     "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:COMMENT NIL "% 22.1.5 24"
      "!!! Name this function1 argument something better. -kmp 15-Oct-91")
     (:DEF (:KIND "function") (:NAMES NIL "get-dispatch-macro-character")
      (:ARGLIST NIL "disp-char sub-char " (:KEYWORD NIL " &optional")
       " readtable")
      (:VALUES NIL "function"))
     " " :PAR (:COMMENT NIL "% 22.1.5 23")
     (:DEF (:KIND "function") (:NAMES NIL "set-dispatch-macro-character")
      (:ARGLIST NIL "disp-char sub-char new-function "
       (:KEYWORD NIL " &optional") " readtable")
      (:VALUES NIL (:MISC NIL "t")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "disp-char")
     "—a " (:TERM NIL "character") ". " :PAR (:PARAM NIL "sub-char") "—a "
     (:TERM NIL "character") ". " :PAR
     (:ISSUE NIL "GET-MACRO-CHARACTER-READTABLE:NIL-STANDARD") " "
     (:PARAM NIL "readtable") "—a " (:TERM NIL "readtable designator") ". "
     (:ENDISSUE NIL "GET-MACRO-CHARACTER-READTABLE:NIL-STANDARD")
     " The default is the " (:TERM NIL "current readtable") ". " :PAR
     (:PARAM NIL "function") "—a " (:TERM NIL "function designator") " or "
     (:MISC NIL "nil") ". " :PAR
     (:COMMENT NIL
      "I made this a function designator.  See reasoning for get-macro-character. -kmp 20-Sep-91")
     (:PARAM NIL "new-function") "—a " (:TERM NIL "function designator") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:FUNREF NIL "set-dispatch-macro-character") " causes "
     (:PARAM NIL "new-function") " to be called when " (:PARAM NIL "disp-char")
     " followed by " (:PARAM NIL "sub-char") " is read. "
     (:COMMENT NIL "% 22.1.5 22") "If " (:PARAM NIL "sub-char")
     " is a lowercase letter, it is converted to its uppercase equivalent. It is an error if "
     (:PARAM NIL "sub-char") " is one of the ten decimal digits. " :PAR
     (:FUNREF NIL "set-dispatch-macro-character") " installs a "
     (:PARAM NIL "new-function") " to be called when a particular "
     (:TERM NIL "dispatching macro character") " pair is read. "
     (:PARAM NIL "New-function")
     " is installed as the dispatch function to be called when "
     (:PARAM NIL "readtable") " is in use and when " (:PARAM NIL "disp-char")
     " is followed by " (:PARAM NIL "sub-char") ". " :PAR
     (:COMMENT NIL "% This information is now available elsewhere." " "
      " %!!! current input stream?  this means the stream on which the char was seen."
      " %    be more specific so people don't think this is standard input or something"
      " %    weird like that."
      " The three arguments to \\param{new-function} are the current input \\term{stream},"
      " \\param{sub-char}, and"
      "  the \\term{integer} whose decimal representation appeared between"
      "    \\param{disp-char} and \\param{sub-char},"
      "   or \\nil\\ if no decimal integer appeared there; .")
     "For more information about how the " (:PARAM NIL "new-function")
     " is invoked, see " (:SECREF NIL :MACRO-CHARS) ". " :PAR
     (:FUNREF NIL "get-dispatch-macro-character")
     " retrieves the dispatch function associated with "
     (:PARAM NIL "disp-char") " and " (:PARAM NIL "sub-char") " in "
     (:PARAM NIL "readtable") ". " :PAR
     (:FUNREF NIL "get-dispatch-macro-character")
     " returns the macro-character function for " (:PARAM NIL "sub-char")
     " under " (:PARAM NIL "disp-char") ", or " (:MISC NIL "nil")
     " if there is no function associated with " (:PARAM NIL "sub-char")
     ". If " (:PARAM NIL "sub-char") " is a decimal digit, "
     (:FUNREF NIL "get-dispatch-macro-character") " returns " (:MISC NIL "nil")
     ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:COMMENT NIL
      "!!! The use of (values) here is really questionable! -kmp 1-May-91")
     (:CODE NIL " (get-dispatch-macro-character #\\# #\\{) → NIL
 (set-dispatch-macro-character #\\# #\\{        ;dispatch on #{
    #'(lambda(s c n)
        (let ((list (read s nil (values) t)))  ;list is object after #n{
          (when (consp list)                   ;return nth element of list
            (unless (and n (< 0 n (length list))) (setq n 0))
            (setq list (nth n list)))
         list))) → T
 #{(1 2 3 4) → 1
 #3{(0 1 2 3) → 3
 #{123 → 123
")
     " " (:COMMENT NIL "% 22.1.5 27") "If it is desired that "
     (:TT NIL "#$" (:I NIL "foo")) " : as if it were "
     (:TT NIL "(dollars " (:I NIL "foo") ")") ". " :PAR
     (:CODE NIL "(defun |#$-reader| (stream subchar arg)
   (declare (ignore subchar arg))
   (list 'dollars (read stream t nil t))) → |#$-reader|
 (set-dispatch-macro-character #\\# #\\$ #'|#$-reader|) → T
")
     " "
     (:COMMENT NIL "\\code"
      " (get-dispatch-macro-character #\\\\# #\\\\\\{) \\EV NIL "
      " (unless (get-dispatch-macro-character #\\\\# #\\\\x)"
      "      (warn \"Hexadecimal input (#x<ddd>) is disabled\")) \\EV NIL "
      " (let ((previous-fun (get-dispatch-macro-character #\\\\# #\\\\\\{)))"
      "      (when previous-fun"
      "        (set-dispatch-macro-character #\\\\# #\\\\\\{"
      "          #'(lambda (stream char arg)"
      "               (setq stream *debug-io*)"
      "               (when *debug-macro-chars*"
      "                  (format *trace-output* "
      "                         \"~&Occurrence of ~C~C on stream ~S\""
      "                                         #\\\\# #\\\\\\{ stream))"
      "              (list (funcall previous-fun stream char)))))) \\EV NIL "
      "\\endcode")
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :MACRO-CHARS) " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:PARAM NIL "readtable")
     " is modified. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*readtable*") ". "
     :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL "% 22.1.5 26")
     "For either function, an error is signaled if " (:PARAM NIL "disp-char")
     " is not a " (:TERM NIL "dispatching macro character") " in "
     (:PARAM NIL "readtable") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:VARREF NIL "*readtable*") " " :PAR)
    (:PART (:NAME "Notes") " It is necessary to use "
     (:FUNREF NIL "make-dispatch-macro-character")
     " to set up the dispatch character before specifying its sub-characters. "))
   " " :PAR
   (:COMMENT NIL "%% ========== GET-MACRO-CHARACTER"
    "%% ========== SET-MACRO-CHARACTER")
   (:COM (:NAME "set-macro-character, get-macro-character" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR (:COMMENT NIL "% 22.1.5 13")
     (:DEF (:KIND "function") (:NAMES NIL "get-macro-character")
      (:ARGLIST NIL "char " (:KEYWORD NIL " &optional") " readtable")
      (:VALUES NIL "function, non-terminating-p"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "set-macro-character")
      (:ARGLIST NIL "char new-function " (:KEYWORD NIL " &optional")
       " non-terminating-p readtable")
      (:VALUES NIL (:MISC NIL "t")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "char") "—a "
     (:TERM NIL "character") ". " :PAR (:PARAM NIL "non-terminating-p") "—a "
     (:TERM NIL "generalized boolean") ". The default is " (:TERM NIL "false")
     ". " :PAR (:ISSUE NIL "GET-MACRO-CHARACTER-READTABLE:NIL-STANDARD") " "
     (:PARAM NIL "readtable") "—a " (:TERM NIL "readtable designator") ". "
     (:ENDISSUE NIL "GET-MACRO-CHARACTER-READTABLE:NIL-STANDARD")
     " The default is the " (:TERM NIL "current readtable") ". " :PAR
     (:PARAM NIL "function") "—" (:MISC NIL "nil") ", or a "
     (:TERM NIL "designator") " for a " (:TERM NIL "function") " of two "
     (:TERM NIL "arguments") ". " :PAR (:PARAM NIL "new-function") "—a "
     (:TERM NIL "function designator") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "%function or function designator? -kmp 29-Apr-91"
      "%I made it be a function designator since this is consistent with the CLtL "
      "%treatment of symbols as functions, and since some implementation might consider"
      "%it a feature to carry around the name instead of the definition, so the user"
      "%could redefine the function and have his new definition take automatically."
      "% -kmp 20-Sep-91")
     :PAR (:FUNREF NIL "get-macro-character") " returns as its "
     (:TERM NIL "primary value") ", " (:PARAM NIL "function") ", the "
     (:TERM NIL "reader macro function") " associated with "
     (:PARAM NIL "char") " in " (:PARAM NIL "readtable") " (if any), or else "
     (:MISC NIL "nil") " if " (:PARAM NIL "char") " is not a "
     (:TERM NIL "macro character") " in " (:PARAM NIL "readtable") ". The "
     (:TERM NIL "secondary value") ", " (:PARAM NIL "non-terminating-p")
     ", is " (:TERM NIL "true") " if " (:PARAM NIL "char") " is a "
     (:TERM NIL "non-terminating") " " (:TERM NIL "macro character")
     "; otherwise, it is " (:TERM NIL "false") ". " :PAR
     (:FUNREF NIL "set-macro-character") " causes " (:PARAM NIL "char")
     " to be a " (:TERM NIL "macro character") " associated with the "
     (:TERM NIL "reader macro function") " " (:PARAM NIL "new-function")
     " (or the " (:TERM NIL "designator") " for " (:PARAM NIL "new-function")
     ") in " (:PARAM NIL "readtable") ". If " (:PARAM NIL "non-terminating-p")
     " is " (:TERM NIL "true") ", " (:PARAM NIL "char") " becomes a "
     (:TERM NIL "non-terminating") " " (:TERM NIL "macro character")
     "; otherwise it becomes a " (:TERM NIL "terminating") " "
     (:TERM NIL "macro character") ". " :PAR
     (:COMMENT NIL
      "% This information can be gotten from the Reader Algorithm. -kmp 23-Jan-92"
      " In the simplest case, \\param{new-function} may return an \\term{object}."
      " This \\term{object} is taken to be that whose printed representation"
      " was \\param{char} and any following characters read by \\param{new-function}."
      " %% 22.1.5 15"
      " \\param{New-function} may choose instead to return zero values."
      " In this case, \\param{char} and whatever it may have read"
      " contribute nothing to the \\term{object} being read." " %% 22.1.5 16"
      " \\param{New-function} should not have any side effects other than on the"
      " \\term{stream};"
      " because of backtracking and restarting of the \\funref{read} operation,"
      " front ends (such as editors and"
      " rubout handlers) to the reader may cause"
      " \\param{new-function} to be called repeatedly during the"
      " reading of a single expression in which \\param{char} only appears once.")
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (get-macro-character #\\{) → NIL, " (:TERM NIL "false") "
 (not (get-macro-character #\\;)) → "
      (:TERM NIL "false") "
")
     " " :PAR "The following is a possible definition for the "
     (:TERM NIL "single-quote") " " (:TERM NIL "reader macro") " in "
     (:TERM NIL "standard syntax") ": " :PAR
     (:CODE NIL " (defun single-quote-reader (stream char)
   (declare (ignore char))
   (list 'quote (read stream t nil t))) → SINGLE-QUOTE-READER
 (set-macro-character #\\' #'single-quote-reader) → T
")
     " " :PAR "Here " (:TT NIL "single-quote-reader") " reads an "
     (:TERM NIL "object") " following the " (:TERM NIL "single-quote")
     " and returns a " (:TERM NIL "list") " of " (:SPECREF NIL "quote")
     " and that " (:TERM NIL "object") ". The " (:PARAM NIL "char")
     " argument is ignored. " :PAR
     "The following is a possible definition for the " (:TERM NIL "semicolon")
     " " (:TERM NIL "reader macro") " in " (:TERM NIL "standard syntax") ": "
     :PAR
     (:CODE NIL " (defun semicolon-reader (stream char)
   (declare (ignore char))
   ;; First swallow the rest of the current input line.
   ;; End-of-file is acceptable for terminating the comment.
   (do () ((char= (read-char stream nil #\\Newline t) #\\Newline)))
   ;; Return zero values.
   (values)) → SEMICOLON-READER
 (set-macro-character #\\; #'semicolon-reader) → T
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:PARAM NIL "readtable")
     " is modified. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:VARREF NIL "*readtable*") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL
      "% Sandra thinks this is useless.  Enough is said in the argument info"
      "% above for people to figure it out.  (I agree.) -kmp 23-Jan-92"
      " \\issue{GET-MACRO-CHARACTER-READTABLE:NIL-STANDARD}"
      " \\f{(get-macro-character \\i{char} nil)} " " " " is equivalent to " " "
      " \\f{(get-macro-character \\i{char} (copy-readtable))}, " " "
      " but without \\term{consing}."
      " \\endissue{GET-MACRO-CHARACTER-READTABLE:NIL-STANDARD}")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SET-SYNTAX-FROM-CHAR")
   (:COM (:NAME "set-syntax-from-char" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "RETURN-VALUES-UNSPECIFIED:SPECIFY") " "
     (:DEF (:KIND "function") (:NAMES NIL "set-syntax-from-char")
      (:ARGLIST NIL "to-char from-char " (:KEYWORD NIL " &optional")
       " to-readtable from-readtable")
      (:VALUES NIL (:MISC NIL "t")))
     " " (:ENDISSUE NIL "RETURN-VALUES-UNSPECIFIED:SPECIFY") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " " (:PARAM NIL "to-char")
     "—a " (:TERM NIL "character") ". " :PAR (:PARAM NIL "from-char") "—a "
     (:TERM NIL "character") ". "
     (:ENDISSUE NIL "ARGUMENTS-UNDERSPECIFIED:SPECIFY") " " :PAR
     (:PARAM NIL "to-readtable") "—a " (:TERM NIL "readtable")
     ". The default is the " (:TERM NIL "current readtable") ". " :PAR
     (:PARAM NIL "from-readtable") "—a " (:TERM NIL "readtable designator")
     ". The default is the " (:TERM NIL "standard readtable") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.1.5 9")
     (:FUNREF NIL "set-syntax-from-char") " makes the syntax of "
     (:PARAM NIL "to-char") " in " (:PARAM NIL "to-readtable")
     " be the same as the syntax of " (:PARAM NIL "from-char") " in "
     (:PARAM NIL "from-readtable") ". " :PAR (:COMMENT NIL "% 22.1.5 10")
     (:FUNREF NIL "set-syntax-from-char") " copies the "
     (:TERM NIL "syntax types") " of " (:PARAM NIL "from-char") ". If "
     (:PARAM NIL "from-char") " is a " (:TERM NIL "macro character") ", its "
     (:TERM NIL "reader macro function")
     " is copied also. If the character is a "
     (:TERM NIL "dispatching macro character")
     ", its entire dispatch table of " (:TERM NIL "reader macro functions")
     " is copied. The " (:TERM NIL "constituent traits") " of "
     (:PARAM NIL "from-char") " are not copied. " :PAR
     (:COMMENT NIL "% 22.1.5 12")
     "A macro definition from a character such as " (:TT NIL "\"")
     " can be copied to another character; the standard definition for "
     (:TT NIL "\"")
     " looks for another character that is the same as the character that invoked it. The definition of "
     (:TT NIL "(") " can not be meaningfully copied to " (:TT NIL "{")
     ", on the other hand. The result is that " (:TERM NIL "lists")
     " are of the form " (:TT NIL "{a b c)") ", not " (:TT NIL "{a b c}")
     ", because the definition always looks for a closing parenthesis, not a closing brace. "
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (set-syntax-from-char #\\7 #\\;) → T
 123579 → 1235
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "The " (:PARAM NIL "to-readtable")
     " is modified. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The existing values in the "
     (:PARAM NIL "from-readtable") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "set-macro-character") ", "
     (:FUNREF NIL "make-dispatch-macro-character") ", "
     (:SECREF NIL :CHARACTER-SYNTAX-TYPES) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "The " (:TERM NIL "constituent traits")
     " of a " (:TERM NIL "character")
     " are “hard wired” into the parser for extended " (:TERM NIL "tokens")
     ". For example, if the definition of " (:TT NIL "S") " is copied to "
     (:TT NIL "*") ", then " (:TT NIL "*") " will become a "
     (:TERM NIL "constituent") " that is " (:TERM NIL "alphabetic")
     (:SUB NIL "2") " but that cannot be used as a " (:TERM NIL "short float")
     " " (:TERM NIL "exponent marker") ". For further information, see "
     (:SECREF NIL :CONSTITUENT-TRAITS) ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== WITH-STANDARD-IO-SYNTAX")
   (:COM (:NAME "with-standard-io-syntax" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "with-standard-io-syntax")
      (:ARGLIST NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "forms") "—an "
     (:TERM NIL "implicit progn") ". " :PAR (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " returned by the " (:TERM NIL "forms") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     "Within the dynamic extent of the body of " (:PARAM NIL "forms")
     ", all reader/printer control variables, including any "
     (:TERM NIL "implementation-defined")
     " ones not specified by this standard, are bound to values that produce standard read/print behavior. The values for the variables specified by this standard are listed in "
     (:NEXTFIGURE NIL) ". " :PAR
     (:REVIEWER NIL
      "Barrett: *print-pprint-dispatch* should probably be mentioned here, too.")
     (:COMMENT NIL "!!!"
      "  We've opened issue WITH-STANDARD-IO-SYNTAX-INCOMPLETE to clarify this. -kmp 1-Sep-91"
      " I added *print-lines*, *print-miser-width*, *print-pprint-dispatch*, and"
      " *print-right-margin* to this table.  --sjl 16 Mar 1992")
     :PAR
     (:TABLE (:NAME ("Values of standard control variables"))
      (:ROW NIL (:CELL NIL "Variable") (:CELL NIL "Value"))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*package*"))
       (:CELL NIL "The " (:PACKREF NIL "cl-user") (:TERM NIL "package")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*print-array*"))
       (:CELL NIL (:MISC NIL "t")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*print-base*"))
       (:CELL NIL (:TT NIL "10")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*print-case*"))
       (:CELL NIL (:KWD NIL "upcase")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*print-circle*"))
       (:CELL NIL (:MISC NIL "nil")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*print-escape*"))
       (:CELL NIL (:MISC NIL "t")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*print-gensym*"))
       (:CELL NIL (:MISC NIL "t")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*print-length*"))
       (:CELL NIL (:MISC NIL "nil")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*print-level*"))
       (:CELL NIL (:MISC NIL "nil")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*print-lines*"))
       (:CELL NIL (:MISC NIL "nil")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*print-miser-width*"))
       (:CELL NIL (:MISC NIL "nil")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*print-pprint-dispatch*"))
       (:CELL NIL " The " (:TERM NIL "standard pprint dispatch table")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*print-pretty*"))
       (:CELL NIL (:MISC NIL "nil")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*print-radix*"))
       (:CELL NIL (:MISC NIL "nil")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*print-readably*"))
       (:CELL NIL (:MISC NIL "t")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*print-right-margin*"))
       (:CELL NIL (:MISC NIL "nil")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*read-base*"))
       (:CELL NIL (:TT NIL "10")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*read-default-float-format*"))
       (:CELL NIL (:TYPEREF NIL "single-float")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*read-eval*"))
       (:CELL NIL (:MISC NIL "t")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*read-suppress*"))
       (:CELL NIL (:MISC NIL "nil")))
      (:ROW NIL (:CELL NIL (:VARREF NIL "*readtable*"))
       (:CELL NIL " The " (:TERM NIL "standard readtable"))))
     " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (with-open-file (file pathname :direction :output)
   (with-standard-io-syntax
     (print data file)))

;;; ... Later, in another Lisp:

 (with-open-file (file pathname :direction :input)
   (with-standard-io-syntax
     (setq data (read file))))
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Reader Variables --------------------")
   :PAR (:COMMENT NIL "%% ========== *READ-BASE*")
   (:COM (:NAME "*read-base*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "radix") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR (:TT NIL "10") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.1.2 21")
     "Controls the interpretation of tokens by " (:FUNREF NIL "read")
     " as being " (:TERM NIL "integers") " or " (:TERM NIL "ratios") ". " :PAR
     "The " (:TERM NIL "value") " of " (:VARREF NIL "*read-base*")
     ", called the " (:NEWTERM NIL "current input base")
     ", is the radix in which " (:TERM NIL "integers") " and "
     (:TERM NIL "ratios") " are to be read by the " (:TERM NIL "Lisp reader")
     ". The parsing of other numeric " (:TERM NIL "types") " (" (:I NIL "e.g.")
     ",  " (:TERM NIL "floats") ") is not affected by this option. " :PAR
     "The effect of " (:VARREF NIL "*read-base*")
     " on the reading of any particular " (:TERM NIL "rational")
     " number can be locally overridden by explicit use of the " (:TT NIL "#O")
     ", " (:TT NIL "#X") ", " (:TT NIL "#B") ", or "
     (:TT NIL " #" (:I NIL "n") "R") " syntax or by a trailing decimal point. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (dotimes (i 6)
   (let ((*read-base* (+ 10. i)))
     (let ((object (read-from-string \"(\\\\DAD DAD |BEE| BEE 123. 123)\")))
       (print (list *read-base* object)))))
⊳ (10 (DAD DAD BEE BEE 123 123))
⊳ (11 (DAD DAD BEE BEE 123 146))
⊳ (12 (DAD DAD BEE BEE 123 171))
⊳ (13 (DAD DAD BEE BEE 123 198))
⊳ (14 (DAD 2701 BEE BEE 123 227))
⊳ (15 (DAD 3088 BEE 2699 123 258))
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 22.1.2 22")
     "Altering the input radix can be useful when reading data files in special formats. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *READ-DEFAULT-FLOAT-FORMAT*")
   (:COM (:NAME "*read-default-float-format*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR (:COMMENT NIL "% 22.2.1 11")
     "one of the " (:TERM NIL "atomic type specifiers") " "
     (:TYPEREF NIL "short-float") ", " (:TYPEREF NIL "single-float") ", "
     (:TYPEREF NIL "double-float") ", or " (:TYPEREF NIL "long-float")
     ", or else some other " (:TERM NIL "type specifier") " defined by the "
     (:TERM NIL "implementation") " to be acceptable. " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR "The " (:TERM NIL "symbol") " "
     (:TYPEREF NIL "single-float") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.2.1 12")
     "Controls the floating-point format that is to be used when reading a floating-point number that has no "
     (:TERM NIL "exponent marker") " or that has " (:TT NIL "e") " or "
     (:TT NIL "E") " for an " (:TERM NIL "exponent marker") ". Other "
     (:TERM NIL "exponent markers")
     " explicitly prescribe the floating-point format to be used. " :PAR
     "The printer uses " (:VARREF NIL "*read-default-float-format*")
     " to guide the choice of " (:TERM NIL "exponent markers")
     " when printing floating-point numbers. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (let ((*read-default-float-format* 'double-float))
   (read-from-string \"(1.0 1.0e0 1.0s0 1.0f0 1.0d0 1.0L0)\"))
→ (1.0   1.0   1.0   1.0 1.0   1.0)   ;Implementation has float format F.
→ (1.0   1.0   1.0s0 1.0 1.0   1.0)   ;Implementation has float formats S and F.
→ (1.0d0 1.0d0 1.0   1.0 1.0d0 1.0d0) ;Implementation has float formats F and D.
→ (1.0d0 1.0d0 1.0s0 1.0 1.0d0 1.0d0) ;Implementation has float formats S, F, D.
→ (1.0d0 1.0d0 1.0   1.0 1.0d0 1.0L0) ;Implementation has float formats F, D, L.
→ (1.0d0 1.0d0 1.0s0 1.0 1.0d0 1.0L0) ;Implementation has formats S, F, D, L.
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *READ-EVAL*")
   (:COM (:NAME "*read-eval*" :FTYPE "Variable")
    (:ISSUE NIL "DATA-IO:ADD-SUPPORT") " " :PAR
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR (:TERM NIL "true") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "If it is " (:TERM NIL "true")
     ", the " (:TT NIL "#.") " " (:TERM NIL "reader macro")
     " has its normal effect. Otherwise, that " (:TERM NIL "reader macro")
     " signals an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "reader-error") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:VARREF NIL "*print-readably*") " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR "If " (:VARREF NIL "*read-eval*") " is "
     (:TERM NIL "false") " and " (:VARREF NIL "*print-readably*") " is "
     (:TERM NIL "true") ", any " (:TERM NIL "method") " for "
     (:FUNREF NIL "print-object") " that would output a reference to the "
     (:TT NIL "#.") " " (:TERM NIL "reader macro")
     " either outputs something different or signals an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "print-not-readable") ". " :PAR
     (:ENDISSUE NIL "DATA-IO:ADD-SUPPORT") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *READ-SUPPRESS*")
   (:COM (:NAME "*read-suppress*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR (:TERM NIL "false") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.1.2 25")
     "This variable is intended primarily to support the operation of the read-time conditional notations "
     (:TT NIL "#+") " and " (:TT NIL "#-") ". It is important for the "
     (:TERM NIL "reader macros")
     " which implement these notations to be able to skip over the printed representation of an "
     (:TERM NIL "expression")
     " despite the possibility that the syntax of the skipped "
     (:TERM NIL "expression")
     " may not be entirely valid for the current implementation, since "
     (:TT NIL "#+") " and " (:TT NIL "#-")
     " exist in order to allow the same program to be shared among several "
     (:RM NIL " Lisp") " implementations (including dialects other than "
     (:RM NIL " Common Lisp") ") despite small incompatibilities of syntax. "
     :PAR (:COMMENT NIL "% 22.1.2 24" "% 22.1.2 26") "If it is "
     (:TERM NIL "false") ", the " (:TERM NIL "Lisp reader")
     " operates normally. " :PAR
     (:ISSUE NIL "READ-SUPPRESS-CONFUSING:GENERALIZE") " "
     (:COMMENT NIL
      " Otherwise, many of the normal operations of the \\term{Lisp reader}"
      " are suppressed; specifically:" " " " %% 22.1.2 27" " \\beginlist"
      " \\itemitem{Extended tokens}" " "
      " An extended token is discarded and treated as if it were \\nil;"
      " that is, reading an extended token when \\varref{*read-suppress*} is \\term{true} returns \\nil."
      " " " %% 22.1.2 28" " \\itemitem{\\f{\\#}}" " "
      " Any standard \\f{\\#} \\term{dispatching macro character} notation"
      " that requires, permits, or disallows an infix numerical argument,"
      " such as \\f{\\#\\i{n}R}, does not enforce any constraint on the presence,"
      " absence, or value of such an argument." " " " %% 22.1.2 29"
      " \\itemitem{\\tt \\#\\\\}" " "
      " The \\f{\\#\\\\} notation parses as \\nil."
      " It does not signal an error even if an unknown character name is seen."
      " " " %% 22.1.2 30" " \\itemitem{\\tt \\#B, \\#O, \\#X, \\#R}" " "
      " Each of the \\f{\\#B}, \\f{\\#O}, \\f{\\#X}, and \\f{\\#R} notations "
      " scans over a following token and produces the value \\nil."
      " None of these notations signals an error "
      " even if the token does not have the syntax of a rational number." " "
      " %% 22.1.2 31" " \\itemitem{\\f{\\#*}}" " "
      " \\issue{SHARP-STAR-DELIMITER:NORMAL-DELIMITER}"
      " The \\f{\\#*} notation scans a (possibly null) token until a normal delimiter appears"
      " and produces the value \\nil.  It does not signal an error even if the token"
      " contains characters other of the characters \\f{0} and \\f{1}, or is of the wrong length."
      " \\endissue{SHARP-STAR-DELIMITER:NORMAL-DELIMITER}" " " " %% 22.1.2 32"
      " \\issue{SHARP-COMMA-CONFUSION:REMOVE}"
      " \\itemitem{\\tt \\#.}                                        " " "
      " The \\f{\\#.} notation reads the following \\term{object} in "
      " suppressed mode but does not evaluate it."
      " The \\term{object} is discarded and \\nil\\ is produced."
      " \\endissue{SHARP-COMMA-CONFUSION:REMOVE}" " " " %% 22.1.2 33"
      " \\itemitem{\\tt \\#A, \\#C, \\#S, \\#:}" " "
      " Each of the \\f{\\#A}, \\f{\\#C}, \\f{\\#S}, and \\f{\\#:} notations reads the following"
      " \\term{object} in suppressed mode but does not interpret it in any way;"
      " it need not even be a \\term{list} in the case of \\f{\\#C} or \\f{\\#S}, or a "
      " \\term{symbol} in the case of \\f{\\#:}.  The \\term{object} is "
      " discarded and \\nil\\ is produced.")
     :PAR "If the " (:TERM NIL "value") " of " (:VARREF NIL "*read-suppress*")
     " is " (:TERM NIL "true") ", " (:FUNREF NIL "read") ", "
     (:FUNREF NIL "read-preserving-whitespace") ", "
     (:FUNREF NIL "read-delimited-list") ", and "
     (:FUNREF NIL "read-from-string") " all return a "
     (:TERM NIL "primary value") " of " (:MISC NIL "nil")
     " when they complete successfully; however, they continue to parse the representation of an "
     (:TERM NIL "object") " in the normal way, in order to skip over the "
     (:TERM NIL "object") ", and continue to indicate "
     (:TERM NIL "end of file")
     " in the normal way. Except as noted below, any "
     (:TERM NIL "standardized") " " (:TERM NIL "reader macro") (:SUB NIL "2")
     " that is defined to " (:TERM NIL "read") (:SUB NIL "2") " a following "
     (:TERM NIL "object") " or " (:TERM NIL "token")
     " will do so, but not signal an error if the " (:TERM NIL "object")
     " read is not of an appropriate type or syntax. The "
     (:TERM NIL "standard syntax") " and its associated "
     (:TERM NIL "reader macros") " will not construct any new "
     (:TERM NIL "objects") " (" (:I NIL "e.g.")
     ",  when reading the representation of a " (:TERM NIL "symbol") ", no "
     (:TERM NIL "symbol") " will be constructed or interned). " :PAR
     (:COMMENT NIL "% 22.1.2 27")
     (:LIST NIL
      (:ITEM NIL "Extended tokens " :PAR
       "All extended tokens are completely uninterpreted. Errors such as those that might otherwise be signaled due to detection of invalid "
       (:TERM NIL "potential numbers") ", invalid patterns of "
       (:TERM NIL "package markers") ", and invalid uses of the "
       (:TERM NIL "dot") " character are suppressed. " :PAR)
      (:ITEM NIL "Dispatching macro characters (including "
       (:TERM NIL "sharpsign") ") " :PAR
       (:TERM NIL "Dispatching macro characters")
       " continue to parse an infix numerical argument, and invoke the dispatch function. The "
       (:TERM NIL "standardized") " " (:TERM NIL "sharpsign") " "
       (:TERM NIL "reader macros")
       " do not enforce any constraints on either the presence of or the value of the numerical argument. "
       :PAR (:ENDISSUE NIL "READ-SUPPRESS-CONFUSING:GENERALIZE") " " :PAR
       (:COMMENT NIL "% 22.1.2 34"))
      (:ITEM NIL (:TT NIL " #=") " " :PAR "The " (:TT NIL "#=")
       " notation is totally ignored. It does not read a following "
       (:TERM NIL "object") ". It produces no " (:TERM NIL "object")
       ", but is treated as " (:TERM NIL "whitespace") (:SUB NIL "2") ". " :PAR
       (:COMMENT NIL "% 22.1.2 35"))
      (:ITEM NIL (:TT NIL " ##") " " :PAR "The " (:TT NIL "##")
       " notation always produces " (:MISC NIL "nil") ". "))
     " " :PAR "No matter what the " (:TERM NIL "value") " of "
     (:VARREF NIL "*read-suppress*")
     ", parentheses still continue to delimit and construct "
     (:TERM NIL "lists") "; the " (:TT NIL "#(")
     " notation continues to delimit " (:TERM NIL "vectors") "; and comments, "
     (:TERM NIL "strings") ", and the " (:TERM NIL "single-quote") " and "
     (:TERM NIL "backquote")
     " notations continue to be interpreted properly. Such situations as "
     (:TT NIL "')") ", " (:TT NIL "#<") ", " (:COMMENT NIL " (") (:TT NIL "#)")
     ", and " (:TT NIL "#" (:ANG NIL "Space")) " continue to signal errors. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:ISSUE NIL "READ-SUPPRESS-CONFUSING:GENERALIZE") " "
     (:COMMENT NIL " \\code" "  (let ((*read-suppress* t))"
      "    (dotimes (i 4)" "      (format t \"~&input here> \")"
      "      (format t \"~&parsed as: ~S~%\" (read))))"
      " \\OUT input here> 101" " \\OUT parsed as: NIL"
      " \\OUT input here> (#\\\\a :test)" " \\OUT parsed as: (NIL NIL)"
      " \\OUT input here> '(\"xyz\" #(a b c))"
      " \\OUT parsed as: (QUOTE (\"xyz\" #(NIL NIL NIL)))"
      " \\OUT input here> (list 1 2 '3)"
      " \\OUT parsed as: (NIL NIL NIL (QUOTE NIL))" " \\EV NIL" " \\endcode")
     (:CODE NIL " (let ((*read-suppress* t))
   (mapcar #'read-from-string
           '(\"#(foo bar baz)\" \"#P(:type :lisp)\" \"#c1.2\"
             \"#.(PRINT 'FOO)\" \"#3AHELLO\" \"#S(INTEGER)\"
             \"#*ABC\" \"#\\GARBAGE\" \"#RALPHA\" \"#3R444\")))
→ (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)
")
     " " (:ENDISSUE NIL "READ-SUPPRESS-CONFUSING:GENERALIZE") " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "read") ", "
     (:CHAPREF NIL :SYNTAX) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:ISSUE NIL "READ-SUPPRESS-CONFUSING:GENERALIZE") " "
     (:TERM NIL "Programmers") " and " (:TERM NIL "implementations")
     " that define additional " (:TERM NIL "macro characters")
     " are strongly encouraged to make them respect "
     (:VARREF NIL "*read-suppress*") " just as " (:TERM NIL "standardized") " "
     (:TERM NIL "macro characters") " do. That is, when the "
     (:TERM NIL "value") " of " (:VARREF NIL "*read-suppress*") " is "
     (:TERM NIL "true")
     ", they should ignore type errors when reading a following "
     (:TERM NIL "object") " and the " (:TERM NIL "functions")
     " that implement " (:TERM NIL "dispatching macro characters")
     " should tolerate " (:MISC NIL "nil") " as their infix "
     (:TERM NIL "parameter")
     " value even if a numeric value would ordinarily be required. "
     (:ENDISSUE NIL "READ-SUPPRESS-CONFUSING:GENERALIZE") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *READTABLE*")
   (:COM (:NAME "*readtable*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "readtable") ". "
     :PAR)
    (:PART (:NAME "Initial Value") " " :PAR "A " (:TERM NIL "readtable")
     " that conforms to the description of " (:RM NIL " Common Lisp")
     " syntax in " (:CHAPREF NIL :SYNTAX) ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 22.1.5 4") "The "
     (:TERM NIL "value") " of " (:VARREF NIL "*readtable*") " is called the "
     (:TERM NIL "current readtable")
     ". It controls the parsing behavior of the " (:TERM NIL "Lisp reader")
     ", and can also influence the " (:TERM NIL "Lisp printer") " ("
     (:I NIL "e.g.") ",  see the " (:TERM NIL "function") " "
     (:FUNREF NIL "readtable-case") "). " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:COMMENT NIL "!!! This example needs work.")
     (:CODE NIL " (readtablep *readtable*) → " (:TERM NIL "true") "
 (setq zvar 123) → 123
 (set-syntax-from-char #\\z #\\' (setq table2 (copy-readtable))) → T
 zvar → 123
 (setq *readtable* table2) → #<READTABLE>
 zvar → VAR
 (setq *readtable* (copy-readtable nil)) → #<READTABLE>
 zvar → 123
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:FUNREF NIL "compile-file") ", "
     (:FUNREF NIL "load") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "compile-file") ", "
     (:FUNREF NIL "load") ", " (:TYPEREF NIL "readtable") ", "
     (:SECREF NIL :CURRENT-READTABLE) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== READER-ERROR")
   (:COM (:NAME "reader-error" :FTYPE "Condition Type")
    (:ISSUE NIL "PARSE-ERROR-STREAM:SPLIT-TYPES") " " :PAR
    (:PART (:NAME "Class Precedence List") " " (:TYPEREF NIL "reader-error")
     ", " (:TYPEREF NIL "parse-error") ", " (:TYPEREF NIL "stream-error") ", "
     (:TYPEREF NIL "error") ", " (:TYPEREF NIL "serious-condition") ", "
     (:TYPEREF NIL "condition") ", " (:TYPEREF NIL "t") " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "type") " "
     (:TYPEREF NIL "reader-error")
     " consists of error conditions that are related to tokenization and parsing done by the "
     (:TERM NIL "Lisp reader") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "read") ", "
     (:FUNREF NIL "stream-error-stream") ", " (:SECREF NIL :READER-CONCEPTS)
     " " :PAR (:ENDISSUE NIL "PARSE-ERROR-STREAM:SPLIT-TYPES") " " :PAR)))
  " " :PAR)
 (:CHAPTER
  (:NUM "24" :TITLE ("System Construction") :NUMTAG :CHAP-TWENTY-FOUR :NAMETAG
   :SYSTEM-CONSTRUCTION)
  (:SECTION (:TITLE ("System Construction Concepts")) :PAR
   (:SUBSECTION (:TITLE ("Loading")) "To " (:FUNREF NIL "load") " a "
    (:TERM NIL "file") " is to treat its contents as " (:TERM NIL "code")
    " and " (:TERM NIL "execute") " that " (:TERM NIL "code") ". The "
    (:TERM NIL "file") " may contain " (:NEWTERM NIL "source code") " or "
    (:NEWTERM NIL "compiled code") ". " :PAR "A " (:TERM NIL "file")
    " containing " (:TERM NIL "source code") " is called a "
    (:NEWTERM NIL "source file") ". " (:TERM NIL "Loading") " a "
    (:TERM NIL "source file") " is accomplished essentially by sequentially "
    (:TERM NIL "reading") (:SUB NIL "2") " the " (:TERM NIL "forms")
    " in the file, " (:TERM NIL "evaluating") " each immediately after it is "
    (:TERM NIL "read") ". " :PAR (:COMMENT NIL "% 23.4.0 2") "A "
    (:TERM NIL "file") " containing " (:TERM NIL "compiled code")
    " is called a " (:NEWTERM NIL "compiled file") ". " (:TERM NIL "Loading")
    " a " (:TERM NIL "compiled file") " is similar to " (:TERM NIL "loading")
    " a " (:TERM NIL "source file") ", except that the " (:TERM NIL "file")
    " does not contain text but rather an "
    (:TERM NIL "implementation-dependent") " representation of pre-digested "
    (:TERM NIL "expressions") " created by the " (:TERM NIL "compiler")
    ". Often, a " (:TERM NIL "compiled file") " can be " (:TERM NIL "loaded")
    " more quickly than a " (:TERM NIL "source file") ". See "
    (:SECREF NIL :COMPILATION) ". " :PAR "The way in which a "
    (:TERM NIL "source file") " is distinguished from a "
    (:TERM NIL "compiled file") " is " (:TERM NIL "implementation-dependent")
    ". " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Features") :TAGS (:FEATURES)) " " :PAR "A "
    (:NEWTERM NIL "feature") " is an aspect or attribute of "
    (:RM NIL " Common Lisp") ", of the " (:TERM NIL "implementation")
    ", or of the " (:TERM NIL "environment") ". A " (:TERM NIL "feature")
    " is identified by a " (:TERM NIL "symbol") ". " :PAR "A "
    (:TERM NIL "feature") " is said to be " (:NEWTERM NIL "present") " in a "
    (:TERM NIL "Lisp image") " if and only if the " (:TERM NIL "symbol")
    " naming it is an " (:TERM NIL "element") " of the " (:TERM NIL "list")
    " held by the " (:TERM NIL "variable") " " (:VARREF NIL "*features*")
    ", which is called the " (:NEWTERM NIL "features list") ". " :PAR
    (:SUBSUBSECTION
     (:TITLE ("Feature Expressions") :TAGS (:FEATURE-EXPRESSIONS)) " " :PAR
     "Boolean combinations of " (:TERM NIL "features") ", called "
     (:NEWTERM (:IDX "feature expression") "feature expressions")
     ", are used by the " (:TT NIL "#+") " and " (:TT NIL "#-") " "
     (:TERM NIL "reader macros") " in order to direct conditional "
     (:TERM NIL "reading") " of " (:TERM NIL "expressions") " by the "
     (:TERM NIL "Lisp reader") ". " :PAR "The rules for interpreting a "
     (:TERM NIL "feature expression") " are as follows: " :PAR
     (:LIST NIL
      (:ITEM NIL (:TERM NIL "feature") " " :PAR "If a " (:TERM NIL "symbol")
       " naming a " (:TERM NIL "feature") " is used as a "
       (:TERM NIL "feature expression") ", the "
       (:TERM NIL "feature expression") " succeeds if that "
       (:TERM NIL "feature") " is " (:TERM NIL "present")
       "; otherwise it fails. " :PAR)
      (:ITEM NIL (:TT NIL "(not " (:PARAM NIL "feature-conditional") ")") " "
       :PAR "A " (:MISC NIL "not") " " (:TERM NIL "feature expression")
       " succeeds if its argument " (:PARAM NIL "feature-conditional")
       " fails; otherwise, it succeeds. " :PAR)
      (:ITEM NIL
       (:TT NIL "(and "
        (:STAR NIL (:CURLY NIL (:PARAM NIL "feature-conditional"))) ")")
       " " :PAR "An " (:MISC NIL "and") " " (:TERM NIL "feature expression")
       " succeeds if all of its argument " (:PARAM NIL "feature-conditionals")
       " succeed; otherwise, it fails. " :PAR)
      (:ITEM NIL
       (:TT NIL "(or "
        (:STAR NIL (:CURLY NIL (:PARAM NIL "feature-conditional"))) ")")
       " " :PAR "An " (:MISC NIL "or") " " (:TERM NIL "feature expression")
       " succeeds if any of its argument " (:PARAM NIL "feature-conditionals")
       " succeed; otherwise, it fails. " :PAR))
     " " :PAR
     (:SUBSUBSUBSECTION
      (:TITLE ("Examples of Feature Expressions") :TAGS
       (:FEATURE-EXP-EXAMPLES))
      " " (:COMMENT NIL "% 22.1.4 40") "For example, suppose that in "
      (:TERM NIL "implementation") " A, the " (:TERM NIL "features") " "
      (:TT NIL "spice") " and " (:TT NIL "perq") " are " (:TERM NIL "present")
      ", but the " (:TERM NIL "feature") " " (:TT NIL "lispm") " is not "
      (:TERM NIL "present") "; in " (:TERM NIL "implementation")
      " B, the feature " (:TT NIL "lispm") " is " (:TERM NIL "present")
      ", but the " (:TERM NIL "features") " " (:TT NIL "spice") " and "
      (:TT NIL "perq") " are not " (:TERM NIL "present") "; and in "
      (:TERM NIL "implementation") " C, none of the features "
      (:TT NIL "spice") ", " (:TT NIL "lispm") ", or " (:TT NIL "perq") " are "
      (:TERM NIL "present") ". " (:NEXTFIGURE (:CAPS T)) " shows some sample "
      (:TERM NIL "expressions") ", and how they would be " (:TERM NIL "read")
      (:SUB NIL "2") " in these " (:TERM NIL "implementations") ". " :PAR
      (:TABLE (:NAME ("Features examples"))
       (:ROW NIL
        (:CELL (:SPAN 2)
         (:TT NIL "(cons #+spice \"Spice\" #-spice \"Lispm\" x)")))
       (:ROW (:GAP 2)
        (:CELL NIL "   in " (:TERM NIL "implementation") " A "
         (:MATH NIL (:MO NIL "…")))
        (:CELL NIL (:TT NIL "(CONS \"Spice\" X)")))
       (:ROW NIL
        (:CELL NIL "   in " (:TERM NIL "implementation") " B "
         (:MATH NIL (:MO NIL "…")))
        (:CELL NIL (:TT NIL "(CONS \"Lispm\" X)")))
       (:ROW NIL
        (:CELL NIL "   in " (:TERM NIL "implementation") " C "
         (:MATH NIL (:MO NIL "…")))
        (:CELL NIL (:TT NIL "(CONS \"Lispm\" X)")))
       (:ROW (:GAP 5)
        (:CELL (:SPAN 2)
         (:TT NIL "(cons #+spice \"Spice\" #+LispM \"Lispm\" x)")))
       (:ROW (:GAP 2)
        (:CELL NIL "   in " (:TERM NIL "implementation") " A "
         (:MATH NIL (:MO NIL "…")))
        (:CELL NIL (:TT NIL "(CONS \"Spice\" X)")))
       (:ROW NIL
        (:CELL NIL "   in " (:TERM NIL "implementation") " B "
         (:MATH NIL (:MO NIL "…")))
        (:CELL NIL (:TT NIL "(CONS \"Lispm\" X)")))
       (:ROW NIL
        (:CELL NIL "   in " (:TERM NIL "implementation") " C "
         (:MATH NIL (:MO NIL "…")))
        (:CELL NIL (:TT NIL "(CONS X)")))
       (:ROW (:GAP 5)
        (:CELL (:SPAN 2)
         (:TT NIL "(setq a '(1 2 #+perq 43 #+(not perq) 27))")))
       (:ROW (:GAP 2)
        (:CELL NIL "   in " (:TERM NIL "implementation") " A "
         (:MATH NIL (:MO NIL "…")))
        (:CELL NIL (:TT NIL "(SETQ A '(1 2 43))")))
       (:ROW NIL
        (:CELL NIL "   in " (:TERM NIL "implementation") " B "
         (:MATH NIL (:MO NIL "…")))
        (:CELL NIL (:TT NIL "(SETQ A '(1 2 27))")))
       (:ROW NIL
        (:CELL NIL "   in " (:TERM NIL "implementation") " C "
         (:MATH NIL (:MO NIL "…")))
        (:CELL NIL (:TT NIL "(SETQ A '(1 2 27))")))
       (:ROW (:GAP 5)
        (:CELL (:SPAN 2)
         (:TT NIL "(let ((a 3) #+(or spice lispm) (b 3)) (foo a))")))
       (:ROW (:GAP 2)
        (:CELL NIL "   in " (:TERM NIL "implementation") " A "
         (:MATH NIL (:MO NIL "…")))
        (:CELL NIL (:TT NIL "(LET ((A 3) (B 3)) (FOO A))")))
       (:ROW NIL
        (:CELL NIL "   in " (:TERM NIL "implementation") " B "
         (:MATH NIL (:MO NIL "…")))
        (:CELL NIL (:TT NIL "(LET ((A 3) (B 3)) (FOO A))")))
       (:ROW NIL
        (:CELL NIL "   in " (:TERM NIL "implementation") " C "
         (:MATH NIL (:MO NIL "…")))
        (:CELL NIL (:TT NIL "(LET ((A 3)) (FOO A))")))
       (:ROW (:GAP 5)
        (:CELL (:SPAN 2)
         (:TT NIL
          "(cons #+Lispm \"#+Spice\" #+Spice \"foo\" #-(or Lispm Spice) 7 x)")))
       (:ROW (:GAP 2)
        (:CELL NIL "   in " (:TERM NIL "implementation") " A "
         (:MATH NIL (:MO NIL "…")))
        (:CELL NIL (:TT NIL "(CONS \"foo\" X)")))
       (:ROW NIL
        (:CELL NIL "   in " (:TERM NIL "implementation") " B "
         (:MATH NIL (:MO NIL "…")))
        (:CELL NIL (:TT NIL "(CONS \"#+Spice\" X)")))
       (:ROW NIL
        (:CELL NIL "   in " (:TERM NIL "implementation") " C "
         (:MATH NIL (:MO NIL "…")))
        (:CELL NIL (:TT NIL "(CONS 7 X)"))))
      " ")
     :PAR)
    :PAR))
  :PAR
  (:DICTIONARY NIL :PAR
   (:COMMENT NIL " System Construction" "  System Construction Variables") :PAR
   (:COMMENT NIL
    "-------------------- System Construction --------------------")
   :PAR (:COMMENT NIL "%% ========== COMPILE-FILE")
   (:COM (:NAME "compile-file" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "EXTERNAL-FORMAT-FOR-EVERY-FILE-CONNECTION:MINIMUM") " "
     (:DEF (:KIND "function") (:NAMES NIL "compile-file")
      (:ARGLIST NIL "input-file " (:KEYWORD NIL " &key")
       " output-file verbose print external-format")
      (:VALUES NIL "output-truename, warnings-p, failure-p"))
     " " (:ENDISSUE NIL "EXTERNAL-FORMAT-FOR-EVERY-FILE-CONNECTION:MINIMUM")
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "input-file")
     "—a " (:TERM NIL "pathname designator")
     ". (Default fillers for unspecified components are taken from "
     (:VARREF NIL "*default-pathname-defaults*") ".) " :PAR
     (:PARAM NIL "output-file") "—a " (:TERM NIL "pathname designator")
     ". The default is " (:TERM NIL "implementation-defined") ". " :PAR
     (:ISSUE NIL "COMPILER-VERBOSITY:LIKE-LOAD") " " (:PARAM NIL "verbose")
     "—a " (:TERM NIL "generalized boolean") ". The default is the "
     (:TERM NIL "value") " of " (:VARREF NIL "*compile-verbose*") ". " :PAR
     (:PARAM NIL "print") "—a " (:TERM NIL "generalized boolean")
     ". The default is the " (:TERM NIL "value") " of "
     (:VARREF NIL "*compile-print*") ". "
     (:ENDISSUE NIL "COMPILER-VERBOSITY:LIKE-LOAD") " " :PAR
     (:ISSUE NIL "COMPILER-DIAGNOSTICS:USE-HANDLER") " " :PAR
     (:ISSUE NIL "EXTERNAL-FORMAT-FOR-EVERY-FILE-CONNECTION:MINIMUM") " "
     (:PARAM NIL "external-format") "—an "
     (:TERM NIL "external file format designator") ". The default is "
     (:KWD NIL "default") ". "
     (:ENDISSUE NIL "EXTERNAL-FORMAT-FOR-EVERY-FILE-CONNECTION:MINIMUM") " "
     :PAR (:PARAM NIL "output-truename") "—a " (:TERM NIL "pathname") " (the "
     (:FUNREF NIL "truename") " of the output " (:TERM NIL "file") "), or "
     (:MISC NIL "nil") ". " :PAR (:PARAM NIL "warnings-p") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR (:PARAM NIL "failure-p") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR
     (:ENDISSUE NIL "COMPILER-DIAGNOSTICS:USE-HANDLER") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 25.1.0 7")
     (:FUNREF NIL "compile-file")
     " transforms the contents of the file specified by "
     (:PARAM NIL "input-file") " into " (:TERM NIL "implementation-dependent")
     " binary data which are placed in the file specified by "
     (:PARAM NIL "output-file") ". " :PAR "The " (:TERM NIL "file")
     " to which " (:PARAM NIL "input-file") " refers should be a "
     (:TERM NIL "source file") ". " (:COMMENT NIL "% 25.1.0 8")
     (:PARAM NIL "output-file") " can be used to specify an output "
     (:TERM NIL "pathname") "; "
     (:ISSUE NIL "COMPILE-FILE-OUTPUT-FILE-DEFAULTS:INPUT-FILE") " the actual "
     (:TERM NIL "pathname") " of the " (:TERM NIL "compiled file") " to which "
     (:TERM NIL "compiled code")
     " will be output is computed as if by calling "
     (:FUNREF NIL "compile-file-pathname") ". "
     (:ENDISSUE NIL "COMPILE-FILE-OUTPUT-FILE-DEFAULTS:INPUT-FILE") " " :PAR
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " If " (:PARAM NIL "input-file")
     " or " (:PARAM NIL "output-file") " is a " (:TERM NIL "logical pathname")
     ", it is translated into a " (:TERM NIL "physical pathname")
     " as if by calling " (:FUNREF NIL "translate-logical-pathname") ". "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR
     (:COMMENT NIL
      " !!! This leading semicolon stuff is stupid. -kmp 25-Jan-92")
     (:ISSUE NIL "COMPILER-VERBOSITY:LIKE-LOAD") " "
     (:ISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " If "
     (:PARAM NIL "verbose") " is " (:TERM NIL "true") ", "
     (:COMMENT NIL
      " \\funref{compile-file} prints a message with a leading \\term{semicolon} (a comment)"
      " to \\term{standard output} indicating what file is being compiled ")
     (:FUNREF NIL "compile-file")
     " prints a message in the form of a comment (" (:I NIL "i.e.")
     ",  with a leading " (:TERM NIL "semicolon") ") to "
     (:TERM NIL "standard output") " indicating what " (:TERM NIL "file")
     " is being " (:TERM NIL "compiled") " and other useful information. If "
     (:PARAM NIL "verbose") " is " (:TERM NIL "false") ", "
     (:FUNREF NIL "compile-file") " does not print "
     (:COMMENT NIL "the informational message.") "this information. "
     (:ENDISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " " :PAR
     "If " (:PARAM NIL "print") " is " (:TERM NIL "true")
     ", information about " (:TERM NIL "top level forms")
     " in the file being compiled is printed to " (:TERM NIL "standard output")
     ". Exactly what is printed is " (:TERM NIL "implementation-dependent")
     ", but nevertheless some information is printed. If " (:PARAM NIL "print")
     " is " (:MISC NIL "nil") ", no information is printed. "
     (:ENDISSUE NIL "COMPILER-VERBOSITY:LIKE-LOAD") " " :PAR
     (:ISSUE NIL "EXTERNAL-FORMAT-FOR-EVERY-FILE-CONNECTION:MINIMUM") " The "
     (:PARAM NIL "external-format") " specifies the "
     (:TERM NIL "external file format") " to be used when opening the "
     (:TERM NIL "file") "; see the " (:TERM NIL "function") " "
     (:FUNREF NIL "open") ". " (:FUNREF NIL "compile-file") " and "
     (:FUNREF NIL "load") " must cooperate in such a way that the resulting "
     (:TERM NIL "compiled file") " can be " (:TERM NIL "loaded")
     " without specifying an " (:TERM NIL "external file format")
     " anew; see the " (:TERM NIL "function") " " (:FUNREF NIL "load") ". "
     (:ENDISSUE NIL "EXTERNAL-FORMAT-FOR-EVERY-FILE-CONNECTION:MINIMUM") " "
     :PAR
     (:COMMENT NIL
      "\\funref{compile-file} uses \\funref{read} to read \\term{forms}"
      "from the input file.")
     (:ISSUE NIL "COMPILE-FILE-PACKAGE") " " (:ISSUE NIL "IN-SYNTAX:MINIMAL")
     " " (:FUNREF NIL "compile-file") " binds " (:VARREF NIL "*readtable*")
     " and " (:VARREF NIL "*package*")
     " to the values they held before processing the file. "
     (:ENDISSUE NIL "IN-SYNTAX:MINIMAL") " "
     (:ENDISSUE NIL "COMPILE-FILE-PACKAGE") " " :PAR
     (:COMMENT NIL "!!! Can this be said more compactly or not at all?")
     (:ISSUE NIL "LOAD-TRUENAME:NEW-PATHNAME-VARIABLES") " "
     (:VARREF NIL "*compile-file-truename*") " is bound by "
     (:FUNREF NIL "compile-file") " to hold the " (:TERM NIL "truename")
     " of the " (:TERM NIL "pathname") " of the file being compiled. "
     (:ENDISSUE NIL "LOAD-TRUENAME:NEW-PATHNAME-VARIABLES") " " :PAR
     (:ISSUE NIL "LOAD-TRUENAME:NEW-PATHNAME-VARIABLES") " "
     (:VARREF NIL "*compile-file-pathname*") " is bound by "
     (:FUNREF NIL "compile-file") " to hold a " (:TERM NIL "pathname")
     " denoted by the first argument to " (:FUNREF NIL "compile-file")
     ", merged against the defaults; that is, "
     (:TT NIL "(pathname (merge-pathnames " (:PARAM NIL "input-file") "))")
     ". " (:ENDISSUE NIL "LOAD-TRUENAME:NEW-PATHNAME-VARIABLES") " " :PAR
     "The compiled " (:TERM NIL "functions") " contained in the "
     (:TERM NIL "compiled file") " become available for use when the "
     (:TERM NIL "compiled file") " is " (:TERM NIL "loaded") " into Lisp. "
     (:ISSUE NIL "COMPILED-FUNCTION-REQUIREMENTS:TIGHTEN")
     " Any function definition that is processed by the compiler, including "
     (:TT NIL "#'(lambda ...)")
     " forms and local function definitions made by " (:SPECREF NIL "flet")
     ", " (:SPECREF NIL "labels") " and " (:MACREF NIL "defun")
     " forms, result in an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "compiled-function") ". "
     (:ENDISSUE NIL "COMPILED-FUNCTION-REQUIREMENTS:TIGHTEN") " " :PAR
     (:ISSUE NIL "COMPILER-DIAGNOSTICS:USE-HANDLER") " The "
     (:TERM NIL "primary value") " returned by " (:FUNREF NIL "compile-file")
     ", " (:PARAM NIL "output-truename") ", is the " (:FUNREF NIL "truename")
     " of the output file, or " (:MISC NIL "nil")
     " if the file could not be created. " :PAR
     (:COMMENT NIL
      " I replaced the language that was here with a copy of what is already said"
      " for COMPILE.  --sjl 7 Mar 92")
     "The " (:TERM NIL "secondary value") ", " (:PARAM NIL "warnings-p")
     ", is " (:TERM NIL "false") " "
     (:COMMENT NIL " clarify ``compiler diagnostics''  --sjl 7 Mar 92"
      "if no compiler diagnostics were issued, and \\term{true} otherwise.")
     "if no " (:TERM NIL "conditions") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") " or " (:TYPEREF NIL "warning")
     " were detected by the compiler, and " (:TERM NIL "true") " otherwise. "
     :PAR "The " (:TERM NIL "tertiary value") ", " (:PARAM NIL "failure-p")
     ", is " (:TERM NIL "false") " "
     (:COMMENT NIL " clarify ``compiler diagnostics''  --sjl 7 Mar 92"
      "if no compiler diagnostics other than \\term{style warnings} were issued."
      "A value of \\term{true} indicates that there were serious compiler diagnostics"
      "issued, or that other \\term{conditions} \\oftype{error} or \\typeref{warning}"
      "(but not \\oftype{style-warning}) were signaled during compilation.")
     "if no " (:TERM NIL "conditions") " of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") " or " (:TYPEREF NIL "warning") " (other than "
     (:TYPEREF NIL "style-warning") ") were detected by the compiler, and "
     (:TERM NIL "true") " otherwise. "
     (:ENDISSUE NIL "COMPILER-DIAGNOSTICS:USE-HANDLER") " " :PAR
     "For general information about how " (:TERM NIL "files")
     " are processed by the " (:TERM NIL "file compiler") ", see "
     (:SECREF NIL :FILE-COMPILATION) ". " :PAR
     (:COMMENT NIL " This is said below now.  --sjl 7 Mar 92"
      "For a description of signaling and handling of errors by the \\term{file compiler},"
      "\\seesection\\FileCompilerExceptions.")
     :PAR (:ISSUE NIL "LOAD-OBJECTS:MAKE-LOAD-FORM") " " (:TERM NIL "Programs")
     " to be compiled by the " (:TERM NIL "file compiler")
     " must only contain " (:TERM NIL "externalizable objects")
     "; for details on such " (:TERM NIL "objects") ", see "
     (:SECREF NIL :LITERALS-IN-COMPILED-FILES)
     ". For information on how to extend the set of "
     (:TERM NIL "externalizable objects") ", see the " (:TERM NIL "function")
     " " (:FUNREF NIL "make-load-form") " and "
     (:SECREF NIL :CALLING-MAKE-LOAD-FORM) ". "
     (:ENDISSUE NIL "LOAD-OBJECTS:MAKE-LOAD-FORM") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " (:ISSUE NIL "COMPILER-WARNING-STREAM") " "
     (:VARREF NIL "*error-output*") ", "
     (:ENDISSUE NIL "COMPILER-WARNING-STREAM") " "
     (:ISSUE NIL "COMPILER-VERBOSITY:LIKE-LOAD") " "
     (:VARREF NIL "*standard-output*") ", " (:VARREF NIL "*compile-verbose*")
     ", " (:VARREF NIL "*compile-print*") " "
     (:ENDISSUE NIL "COMPILER-VERBOSITY:LIKE-LOAD") " " :PAR
     "The computer's file system. ")
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL
      " The following information is mostly redundant with info in the chapter 3"
      " concept section, and contains some inconsistencies.  Better to just"
      " put in a cross-reference.  --sjl 4 mar 92"
      " \\issue{COMPILER-DIAGNOSTICS:USE-HANDLER}"
      " The following list considers only "
      " those conditions signaled by, not within,  the compiler." "  "
      " An error \\oftype{error} might be signaled by the compiler in situations"
      " where the compilation cannot proceed without intervention."
      " Examples include file open errors and syntax errors." "  "
      " A condition \\oftype{warning} \\editornote{KMP: I guess we should"
      " add ``correctable by muffle-warning''.}  might be signaled by the compiler in "
      "         situations where this standard explicitly states that a warning must,"
      "         should, or might be signaled."
      " Also, an error \\oftype{warning} might be signaled "
      " by the compiler in situations where the compiler can determine "
      "         that a situation with undefined consequences or that would cause"
      "         an error to be signaled would result at runtime."
      "         Examples include" " 	    violation of type declarations,"
      " 	    \\term{assigning} or \\term{binding} a \\term{constant variable},"
      " 	    calling "
      " a built-in Lisp function with the wrong number of arguments"
      " 	        or malformed keyword argument lists,"
      " 	    referencing a variable declared \\declref{ignore}, and"
      " 	    the usage of unrecognized declaration specifiers." "  "
      " The compiler is permitted to signal errors \\oftype{style-warning}"
      " about matters of programming style. Although \\term{style warnings} might "
      " be signaled in these situations, no implementation is required to signal them."
      " However, if an implementation does choose to signal an condition about matters of"
      " programming style, that condition is \\oftype{style-warning} and is signaled "
      " by a call to \\funref{warn}."
      " Examples include redefinition of a \\term{function} with a different argument list,"
      " calling a \\term{function} with the wrong number of arguments,"
      " \\term{accessing} unreferenced local variables not declared \\declref{ignore}, and"
      " usage of declaration specifiers described in this standard but ignored by "
      " the compiler." "  " " \\endissue{COMPILER-DIAGNOSTICS:USE-HANDLER}")
     :PAR
     "For information about errors detected during the compilation process, see "
     (:SECREF NIL :FILE-COMPILER-EXCEPTIONS) ". " :PAR
     (:ISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error")
     " might be signaled if "
     (:TT NIL " (wild-pathname-p " (:PARAM NIL "input-file") ")")
     " returns true. " (:ENDISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR")
     " If either the attempt to open the " (:TERM NIL "source file")
     " for input or the attempt to open the " (:TERM NIL "compiled file")
     " for output fails, an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "file-error") " is signaled. "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:FUNREF NIL "compile") ", " (:MISC NIL "declare") ", "
     (:SPECREF NIL "eval-when") ", " (:TYPEREF NIL "pathname") ", "
     (:TYPEREF NIL "logical-pathname") ", " (:SECREF NIL :FILE-SYSTEM-CONCEPTS)
     ", " (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
     (:COMMENT NIL " \\issue{PATHNAME-LOGICAL:ADD}"
      " Whether \\funref{compile-file} recognizes \\term{logical pathname} \\term{namestrings}"
      " (as opposed to \\term{logical pathname} \\term{objects})"
      " is \\term{implementation-defined}."
      " \\endissue{PATHNAME-LOGICAL:ADD}")
     (:ENDISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== COMPILE-FILE-PATHNAME")
   (:COM (:NAME "compile-file-pathname" :FTYPE "Function")
    (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "COMPILE-FILE-PATHNAME-ARGUMENTS:MAKE-CONSISTENT") " "
     (:DEF (:KIND "function") (:NAMES NIL "compile-file-pathname")
      (:ARGLIST NIL "input-file " (:KEYWORD NIL " &key") " output-file "
       (:KEYWORD NIL " &allow-other-keys"))
      (:VALUES NIL "pathname"))
     " " (:ENDISSUE NIL "COMPILE-FILE-PATHNAME-ARGUMENTS:MAKE-CONSISTENT") " "
     :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "input-file")
     "—a " (:TERM NIL "pathname designator")
     ". (Default fillers for unspecified components are taken from "
     (:VARREF NIL "*default-pathname-defaults*") ".) " :PAR
     (:PARAM NIL "output-file") "—a " (:TERM NIL "pathname designator")
     ". The default is " (:TERM NIL "implementation-defined") ". " :PAR
     (:PARAM NIL "pathname") "—a " (:TERM NIL "pathname") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "Returns the " (:TERM NIL "pathname")
     " that " (:FUNREF NIL "compile-file")
     " would write into, if given the same arguments. " :PAR
     (:ISSUE NIL "COMPILE-FILE-OUTPUT-FILE-DEFAULTS:INPUT-FILE")
     " The defaults for the " (:PARAM NIL "output-file") " are taken from the "
     (:TERM NIL "pathname") " that results from merging the "
     (:PARAM NIL "input-file") " with the " (:TERM NIL "value") " of "
     (:VARREF NIL "*default-pathname-defaults*")
     ", except that the type component should default to the appropriate "
     (:TERM NIL "implementation-defined") " default type for "
     (:TERM NIL "compiled files") ". "
     (:ENDISSUE NIL "COMPILE-FILE-OUTPUT-FILE-DEFAULTS:INPUT-FILE") " " :PAR
     "If " (:PARAM NIL "input-file") " is a " (:TERM NIL "logical pathname")
     " and " (:PARAM NIL "output-file") " is unsupplied, the result is a "
     (:TERM NIL "logical pathname") ". " (:ISSUE NIL "PATHNAME-LOGICAL:ADD")
     " If " (:PARAM NIL "input-file") " is a " (:TERM NIL "logical pathname")
     ", it is translated into a physical pathname as if by calling "
     (:FUNREF NIL "translate-logical-pathname") ". "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " If "
     (:PARAM NIL "input-file") " is a " (:TERM NIL "stream") ", the "
     (:TERM NIL "stream") " can be either open or closed. "
     (:FUNREF NIL "compile-file-pathname") " returns the same "
     (:TERM NIL "pathname")
     " after a file is closed as it did when the file was open. "
     (:ENDISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " "
     (:ISSUE NIL "PATHNAME-STREAM") " It is an error if "
     (:PARAM NIL "input-file") " is a " (:TERM NIL "stream")
     " that is created with " (:FUNREF NIL "make-two-way-stream") ", "
     (:FUNREF NIL "make-echo-stream") ", "
     (:FUNREF NIL "make-broadcast-stream") ", "
     (:FUNREF NIL "make-concatenated-stream") ", "
     (:FUNREF NIL "make-string-input-stream") ", "
     (:FUNREF NIL "make-string-output-stream") ". "
     (:ENDISSUE NIL "PATHNAME-STREAM") " " :PAR
     "If an implementation supports additional keyword arguments to "
     (:FUNREF NIL "compile-file") ", " (:FUNREF NIL "compile-file-pathname")
     " must accept the same arguments. " :PAR)
    (:PART (:NAME "Examples") " " :PAR "See "
     (:FUNREF NIL "logical-pathname-translations") ". " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error")
     " might be signaled if either " (:PARAM NIL "input-file") " or "
     (:PARAM NIL "output-file") " is " (:TERM NIL "wild") ". "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:FUNREF NIL "compile-file") ", " (:TYPEREF NIL "pathname") ", "
     (:TYPEREF NIL "logical-pathname") ", " (:SECREF NIL :FILE-SYSTEM-CONCEPTS)
     ", " (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
     (:COMMENT NIL " \\issue{PATHNAME-LOGICAL:ADD}"
      " Whether \\funref{compile-file-pathname} recognizes \\term{logical pathname} \\term{namestrings}"
      " (as opposed to \\term{logical pathname} \\term{objects})"
      " is \\term{implementation-defined}."
      " \\endissue{PATHNAME-LOGICAL:ADD}")
     (:ENDISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
     :PAR (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== LOAD")
   (:COM (:NAME "load" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "EXTERNAL-FORMAT-FOR-EVERY-FILE-CONNECTION:MINIMUM") " "
     (:DEF (:KIND "function") (:NAMES NIL "load")
      (:ARGLIST NIL "filespec " (:KEYWORD NIL " &key")
       " verbose print if-does-not-exist external-format")
      (:VALUES NIL "generalized-boolean"))
     " " (:ENDISSUE NIL "EXTERNAL-FORMAT-FOR-EVERY-FILE-CONNECTION:MINIMUM")
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL "!!! Need to think about \"file designator\" here.")
     (:PARAM NIL "filespec") "—a " (:TERM NIL "stream") ", or a "
     (:TERM NIL "pathname designator") ". "
     (:COMMENT NIL "% 23.4.0 4             ") "The default is taken from "
     (:VARREF NIL "*default-pathname-defaults*") ". " :PAR
     (:PARAM NIL "verbose") "—a " (:TERM NIL "generalized boolean")
     ". The default is the " (:TERM NIL "value") " of "
     (:VARREF NIL "*load-verbose*") ". " :PAR (:PARAM NIL "print") "—a "
     (:TERM NIL "generalized boolean") ". The default is the "
     (:TERM NIL "value") " of " (:VARREF NIL "*load-print*") ". " :PAR
     (:COMMENT NIL "!!! Looks mighty strange to me! -kmp 26-Jun-93")
     (:PARAM NIL "if-does-not-exist") "—a " (:TERM NIL "generalized boolean")
     ". The default is " (:TERM NIL "true") ". " :PAR
     (:ISSUE NIL "EXTERNAL-FORMAT-FOR-EVERY-FILE-CONNECTION:MINIMUM") " "
     (:PARAM NIL "external-format") "—an "
     (:TERM NIL "external file format designator") ". The default is "
     (:KWD NIL "default") ". "
     (:ENDISSUE NIL "EXTERNAL-FORMAT-FOR-EVERY-FILE-CONNECTION:MINIMUM") " "
     :PAR (:PARAM NIL "generalized-boolean") "—a "
     (:TERM NIL "generalized boolean") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 23.4.0 3")
     (:FUNREF NIL "load") " " (:TERM NIL "loads") " the " (:TERM NIL "file")
     " named by " (:PARAM NIL "filespec") " into the " (:RM NIL " Lisp")
     " environment. " :PAR "The manner in which a " (:TERM NIL "source file")
     " is distinguished from a " (:TERM NIL "compiled file") " is "
     (:TERM NIL "implementation-dependent") ". "
     (:COMMENT NIL
      " If it is not possible to distinguish between a character file and a "
      " compiled file by \\param{filespec},")
     "If the file specification is not complete and both a "
     (:TERM NIL "source file") " and a " (:TERM NIL "compiled file")
     " exist which might match, then which of those files "
     (:FUNREF NIL "load") " selects is " (:TERM NIL "implementation-dependent")
     ". " :PAR "If " (:PARAM NIL "filespec") " is a " (:TERM NIL "stream") ", "
     (:FUNREF NIL "load") " determines what kind of " (:TERM NIL "stream")
     " it is and loads directly from the " (:TERM NIL "stream") ". "
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " If " (:PARAM NIL "filespec")
     " is a " (:TERM NIL "logical pathname") ", it is translated into a "
     (:TERM NIL "physical pathname") " as if by calling "
     (:FUNREF NIL "translate-logical-pathname") ". "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR
     (:ISSUE NIL "EVAL-TOP-LEVEL:LOAD-LIKE-COMPILE-FILE") " "
     (:COMMENT NIL "% Per X3J13 -kmp 5-Oct-93"
      " \\funref{load} evaluates each \\term{form} it encounters in the file"
      " named by \\param{filespec}.")
     (:FUNREF NIL "load") " sequentially executes each " (:TERM NIL "form")
     " it encounters in the " (:TERM NIL "file") " named by "
     (:PARAM NIL "filespec") ". If the " (:TERM NIL "file") " is a "
     (:TERM NIL "source file") " and the " (:TERM NIL "implementation")
     " chooses to perform " (:TERM NIL "implicit compilation") ", "
     (:FUNREF NIL "load") " must recognize " (:TERM NIL "top level forms")
     " as described in " (:SECREF NIL :TOP-LEVEL-FORMS)
     " and arrange for each " (:TERM NIL "top level form")
     " to be executed before beginning " (:TERM NIL "implicit compilation")
     " of the next. (Note, however, that processing of "
     (:SPECREF NIL "eval-when") " " (:TERM NIL "forms") " by "
     (:FUNREF NIL "load") " is controlled by the " (:KWD NIL "execute")
     " situation.) " (:ENDISSUE NIL "EVAL-TOP-LEVEL:LOAD-LIKE-COMPILE-FILE")
     " " :PAR (:ISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " "
     (:COMMENT NIL " If \\param{verbose} is \\term{true},"
      " \\funref{load} prints a message "
      " %% KMP: This semicolon thing is environment stuff and not proper here."
      " %%  No portable program can rely on it, so it's stupid to require it."
      " %with a leading \\term{semicolon} (a comment)"
      " to \\term{standard output} indicating what file is being loaded "
      " and other useful information."
      " %% Changed into a `suggestion' in response to gripe above. -kmp 7-Feb-92"
      " % I disagree with this change; CLtL doesn't say ``maybe''.  Also look"
      " % at the corresponding parameter for COMPILE-FILE.  --sjl 4 Mar 92"
      " %Such information might be preceded by a leading \\term{semicolon} (\\eg as in a comment)."
      " Such information is preceded by a leading \\term{semicolon} (\\eg as in a comment).")
     "If " (:PARAM NIL "verbose") " is " (:TERM NIL "true") ", "
     (:FUNREF NIL "load") " prints a message in the form of a comment ("
     (:I NIL "i.e.") ",  with a leading " (:TERM NIL "semicolon") ") to "
     (:TERM NIL "standard output") " indicating what " (:TERM NIL "file")
     " is being " (:TERM NIL "loaded") " and other useful information. "
     (:ENDISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " "
     (:COMMENT NIL "% 23.4.0 5") "If " (:PARAM NIL "verbose") " is "
     (:TERM NIL "false") ", " (:FUNREF NIL "load")
     " does not print this information. " :PAR
     (:COMMENT NIL
      "% Barmar and I puzzled over this for a while and decided that it was best not to"
      "% be overly constraining to implementations, since absolute conformance is hard to"
      "% do in general if you're too strict. We softened the wording just slightly."
      "% -kmp 7-Feb-92")
     "If " (:PARAM NIL "print") " is " (:TERM NIL "true") ", "
     (:FUNREF NIL "load") " incrementally prints information to "
     (:TERM NIL "standard output") " showing the progress of the "
     (:TERM NIL "loading") " process. For a " (:TERM NIL "source file")
     ", this information might mean printing the " (:TERM NIL "values") " "
     (:TERM NIL "yielded") " by each " (:TERM NIL "form") " in the "
     (:TERM NIL "file") " as soon as those " (:TERM NIL "values")
     " are returned. For a " (:TERM NIL "compiled file")
     ", what is printed might not reflect precisely the contents of the "
     (:TERM NIL "source file")
     ", but some information is generally printed. If " (:PARAM NIL "print")
     " is " (:TERM NIL "false") ", " (:FUNREF NIL "load")
     " does not print this information. " :PAR
     (:COMMENT NIL "% 23.4.0 6" "% 23.4.0 7") "If the file named by "
     (:PARAM NIL "filespec") " is successfully loaded, " (:FUNREF NIL "load")
     " returns " (:TERM NIL "true") ". "
     (:COMMENT NIL
      "%!!! Removed for now because Sandra's comment below make it clear"
      "%    that this is confusing and wrong. -kmp 3-Dec-91"
      "otherwise, \\nil\\ is returned or an error is "
      "signaled, depending upon the value of \\param{if-does-not-exist}.")
     :PAR
     (:REVIEWER NIL
      "Loosemore: What happens if the file cannot be loaded for some reason other than that it doesn't exist?")
     " " (:EDITORNOTE NIL "KMP: i.e., can it return NIL? must it?") " " :PAR
     "If the file does not exist, the specific action taken depends on "
     (:PARAM NIL "if-does-not-exist") ": if it is " (:MISC NIL "nil") ", "
     (:FUNREF NIL "load") " returns " (:MISC NIL "nil") "; otherwise, "
     (:FUNREF NIL "load") " signals an error. " :PAR
     (:ISSUE NIL "EXTERNAL-FORMAT-FOR-EVERY-FILE-CONNECTION:MINIMUM") " The "
     (:PARAM NIL "external-format") " specifies the "
     (:TERM NIL "external file format") " to be used when opening the "
     (:TERM NIL "file") " (see the " (:TERM NIL "function") " "
     (:FUNREF NIL "open") "), except that when the " (:TERM NIL "file")
     " named by " (:PARAM NIL "filespec") " is a " (:TERM NIL "compiled file")
     ", the " (:PARAM NIL "external-format") " is ignored. "
     (:FUNREF NIL "compile-file") " and " (:FUNREF NIL "load")
     " cooperate in an " (:TERM NIL "implementation-dependent")
     " way to assure the preservation of the " (:TERM NIL "similarity") " of "
     (:TERM NIL "characters") " referred to in the " (:TERM NIL "source file")
     " at the time the " (:TERM NIL "source file") " was processed by the "
     (:TERM NIL "file compiler") " under a given "
     (:TERM NIL "external file format") ", regardless of the value of "
     (:PARAM NIL "external-format") " at the time the "
     (:TERM NIL "compiled file") " is " (:TERM NIL "loaded") ". "
     (:ENDISSUE NIL "EXTERNAL-FORMAT-FOR-EVERY-FILE-CONNECTION:MINIMUM") " "
     :PAR (:COMMENT NIL "% 11.2.0 7") (:ISSUE NIL "IN-SYNTAX:MINIMAL") " "
     (:FUNREF NIL "load") " binds " (:VARREF NIL "*readtable*") " and "
     (:VARREF NIL "*package*") " to the values they held before "
     (:TERM NIL "loading") " the file. " (:ENDISSUE NIL "IN-SYNTAX:MINIMAL")
     " " :PAR (:ISSUE NIL "LOAD-TRUENAME:NEW-PATHNAME-VARIABLES") " "
     (:VARREF NIL "*load-truename*") " is " (:TERM NIL "bound") " by "
     (:FUNREF NIL "load") " to hold the " (:TERM NIL "truename") " of the "
     (:TERM NIL "pathname") " of the file being " (:TERM NIL "loaded") ". "
     :PAR (:VARREF NIL "*load-pathname*") " is " (:TERM NIL "bound") " by "
     (:FUNREF NIL "load") " to hold a " (:TERM NIL "pathname")
     " that represents " (:PARAM NIL "filespec")
     " merged against the defaults. That is, "
     (:TT NIL " (pathname (merge-pathnames " (:PARAM NIL "filespec") "))") ". "
     (:ENDISSUE NIL "LOAD-TRUENAME:NEW-PATHNAME-VARIABLES") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL ";Establish a data file...
 (with-open-file (str \"data.in\" :direction :output :if-exists :error)
   (print 1 str) (print '(setq a 888) str) t)
→ T
 (load \"data.in\") → "
      (:TERM NIL "true") "
 a → 888
 (load (setq p (merge-pathnames \"data.in\")) :verbose t)
; Loading contents of file /fred/data.in
; Finished loading /fred/data.in
→ "
      (:TERM NIL "true") "
 (load p :print t) 
; Loading contents of file /fred/data.in
;  1
;  888
; Finished loading /fred/data.in
→ "
      (:TERM NIL "true") "
")
     " " :PAR " " (:ISSUE NIL "LOAD-TRUENAME:NEW-PATHNAME-VARIABLES") " "
     (:CODE NIL " ;----[Begin file SETUP]----
 (in-package \"MY-STUFF\")
 (defmacro compile-truename () `',*compile-file-truename*)
 (defvar *my-compile-truename* (compile-truename) \"Just for debugging.\")
 (defvar *my-load-pathname* *load-pathname*)
 (defun load-my-system ()
   (dolist (module-name '(\"FOO\" \"BAR\" \"BAZ\"))
     (load (merge-pathnames module-name *my-load-pathname*))))
 ;----[End of file SETUP]----

 
 (load \"SETUP\")
 (load-my-system)
")
     " " (:ENDISSUE NIL "LOAD-TRUENAME:NEW-PATHNAME-VARIABLES") " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "The implementation, and the host computer's file system. " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "If "
     (:KWD NIL "if-does-not-exist") " is supplied and is " (:TERM NIL "true")
     ", or is not supplied, " (:FUNREF NIL "load") " signals an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error")
     " if the file named by " (:PARAM NIL "filespec") " does not exist, "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:COMMENT NIL "% Additional constraint per x3j13 (05-Oct-93) -kmp")
     "or if the " (:TERM NIL "file system")
     " cannot perform the requested operation. "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR
     (:ISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error")
     " might be signaled if "
     (:TT NIL "(wild-pathname-p " (:PARAM NIL "filespec") ")") " returns "
     (:TERM NIL "true") ". " (:ENDISSUE NIL "PATHNAME-WILD:NEW-FUNCTIONS") " "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:FUNREF NIL "error") ", " (:FUNREF NIL "merge-pathnames") ", "
     (:VARREF NIL "*load-verbose*") ", "
     (:VARREF NIL "*default-pathname-defaults*") ", " (:TYPEREF NIL "pathname")
     ", " (:TYPEREF NIL "logical-pathname") ", "
     (:SECREF NIL :FILE-SYSTEM-CONCEPTS) ", "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
     (:COMMENT NIL " \\issue{PATHNAME-LOGICAL:ADD}"
      " Whether \\funref{load} recognizes \\term{logical pathname} \\term{namestrings}"
      " (as opposed to \\term{logical pathname} \\term{objects})"
      " is \\term{implementation-defined}."
      " \\endissue{PATHNAME-LOGICAL:ADD}")
     (:ENDISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== WITH-COMPILATION-UNIT")
   (:COM (:NAME "with-compilation-unit" :FTYPE "Macro")
    (:ISSUE NIL "WITH-COMPILATION-UNIT:NEW-MACRO") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "with-compilation-unit")
      (:ARGLIST NIL (:PAREN NIL (:INTERLEAVE NIL (:DOWN NIL "option"))) " "
       (:STAR NIL (:CURLY NIL (:PARAM NIL "form"))))
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR (:BNF (:NAME "option") (:KWD NIL "override") " override") " "
     :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "override")
     "—a " (:TERM NIL "generalized boolean") "; evaluated. The default is "
     (:MISC NIL "nil") ". " :PAR (:PARAM NIL "forms") "—an "
     (:TERM NIL "implicit progn") ". " :PAR (:PARAM NIL "results") "—the "
     (:TERM NIL "values") " returned by the " (:TERM NIL "forms") ". " :PAR
     (:COMMENT NIL "!!! This description needs work. -kmp 29-Jul-91"))
    (:PART (:NAME "Description") " " :PAR "Executes " (:PARAM NIL "forms")
     " from left to right. Within the " (:TERM NIL "dynamic environment")
     " of " (:MACREF NIL "with-compilation-unit")
     ", actions deferred by the compiler until the end of compilation will be deferred until the end of the outermost call to "
     (:MACREF NIL "with-compilation-unit") ". " :PAR "The set of "
     (:TERM NIL "options")
     " permitted may be extended by the implementation, but the only "
     (:TERM NIL "standardized") " keyword is " (:KWD NIL "override") ". " :PAR
     "If nested dynamically only the outer call to "
     (:MACREF NIL "with-compilation-unit")
     " has any effect unless the value associated with " (:KWD NIL "override")
     " is " (:TERM NIL "true")
     ", in which case warnings are deferred only to the end of the innermost call for which "
     (:PARAM NIL "override") " is " (:TERM NIL "true") ". " :PAR
     (:COMMENT NIL
      " This was incorrectly transcribed from the cleanup issue.  --sjl 4 mar 92 "
      "The functions \\funref{compile} and \\term{compile-file}")
     "The function " (:FUNREF NIL "compile-file") " provides the effect of "
     :PAR
     (:CODE NIL " (with-compilation-unit (:override nil) ...)
")
     " around its " (:TERM NIL "code") ". " :PAR "Any "
     (:TERM NIL "implementation-dependent")
     " extensions can only be provided as the result of an explicit programmer request by use of an "
     (:TERM NIL "implementation-dependent") " keyword. "
     (:TERM NIL "Implementations")
     " are forbidden from attaching additional meaning to a use of this macro which involves either no keywords or just the keyword "
     (:KWD NIL "override") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR "If an " (:TERM NIL "implementation")
     " would normally defer certain kinds of warnings, such as warnings about undefined functions, to the end of a compilation unit (such as a "
     (:TERM NIL "file")
     "), the following example shows how to cause those warnings to be deferred to the end of the compilation of several files. "
     :PAR
     (:CODE NIL " (defun compile-files (&rest files)
   (with-compilation-unit ()
     (mapcar #'(lambda (file) (compile-file file)) files)))

 (compile-files \"A\" \"B\" \"C\")
")
     " " :PAR
     "Note however that if the implementation does not normally defer any warnings, use of "
     (:MACREF NIL "with-compilation-unit") " might not have any effect. " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "compile") ", "
     (:FUNREF NIL "compile-file") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "WITH-COMPILATION-UNIT:NEW-MACRO") " " :PAR))
   " " :PAR
   (:COMMENT NIL
    "-------------------- System Construction Variables --------------------")
   :PAR (:COMMENT NIL "%% ========== *FEATURES*")
   (:COM (:NAME "*features*" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "proper list") ". "
     :PAR)
    (:PART (:NAME "Initial Value") " " :PAR
     (:COMMENT NIL
      "A \\term{list}, the specific \\term{elements} of which are")
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 25.4.2 12") "The "
     (:TERM NIL "value") " of " (:VARREF NIL "*features*") " is called the "
     (:TERM NIL "features list") ". It is a " (:TERM NIL "list") " of "
     (:TERM NIL "symbols") ", called " (:TERM NIL "features")
     ", that correspond to some aspect of the " (:TERM NIL "implementation")
     " or " (:TERM NIL "environment") ". " :PAR "Most " (:TERM NIL "features")
     " have " (:TERM NIL "implementation-dependent")
     " meanings; The following meanings have been assigned to feature names: "
     :PAR (:ISSUE NIL "COMMON-FEATURES:SPECIFY") " "
     (:ISSUE NIL "SHARPSIGN-PLUS-MINUS-PACKAGE:KEYWORD") " "
     (:LIST NIL
      (:ITEM NIL (:KWD NIL "cltl1") " " :PAR "If present, indicates that the "
       (:PACKREF NIL "lisp") " " (:TERM NIL "package") " "
       (:TERM NIL "purports to conform") " to the 1984 specification "
       (:BIB
        (:URL "https://www.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html" :ISBN
         "1-55558-041-6")
        "Common Lisp: The Language")
       ". It is possible, but not required, for a "
       (:TERM NIL "conforming implementation")
       " to have this feature because this specification specifies that its "
       (:TERM NIL "symbols") " are to be in the " (:PACKREF NIL "common-lisp")
       " " (:TERM NIL "package") ", not the " (:PACKREF NIL "lisp")
       " package. " :PAR)
      (:ITEM NIL (:KWD NIL "cltl2") " " :PAR
       "If present, indicates that the implementation "
       (:TERM NIL "purports to conform") " to "
       (:BIB
        (:URL "https://www.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html" :ISBN
         "1-55558-041-6")
        "Common Lisp: The Language, Second Edition")
       ". This feature must not be present in any "
       (:TERM NIL "conforming implementation")
       ", since conformance to that document is not compatible with conformance to this specification. The name, however, is reserved by this specification in order to help programs distinguish implementations which conform to that document from implementations which conform to this specification. "
       :PAR)
      (:ITEM NIL (:KWD NIL "ieee-floating-point") " " :PAR
       "If present, indicates that the implementation "
       (:TERM NIL "purports to conform") " to the requirements of "
       (:BIB (:DOI "10.1109/IEEESTD.1985.82928" :ISBN "0-7381-1165-1")
        "IEEE Standard for Binary Floating-Point Arithmetic")
       ". " :PAR)
      (:ITEM NIL (:KWD NIL "x3j13") " " :PAR
       "If present, indicates that the implementation conforms to some particular working draft of this specification, or to some subset of features that approximates a belief about what this specification might turn out to contain. A "
       (:TERM NIL "conforming implementation")
       " might or might not contain such a feature. (This feature is intended primarily as a stopgap in order to provide implementors something to use prior to the availability of a draft standard, in order to discourage them from introducing the "
       (:KWD NIL "draft-ansi-cl") " and " (:KWD NIL "ansi-cl") " "
       (:TERM NIL "features") " prematurely.) " :PAR)
      (:ITEM NIL (:KWD NIL "draft-ansi-cl") " " :PAR
       "If present, indicates that the " (:TERM NIL "implementation") " "
       (:TERM NIL "purports to conform")
       " to the first full draft of this specification, which went to public review in 1992. A "
       (:TERM NIL "conforming implementation") " which has the "
       (:KWD NIL "draft-ansi-cl-2") " or " (:KWD NIL "ansi-cl") " "
       (:TERM NIL "feature") " is not permitted to retain the "
       (:KWD NIL "draft-ansi-cl") " " (:TERM NIL "feature")
       " since incompatible changes were made subsequent to the first draft. "
       :PAR)
      (:ITEM NIL (:KWD NIL "draft-ansi-cl-2") " " :PAR
       "If present, indicates that a second full draft of this specification has gone to public review, and that the "
       (:TERM NIL "implementation") " " (:TERM NIL "purports to conform")
       " to that specification. (If additional public review drafts are produced, this keyword will continue to refer to the second draft, and additional keywords will be added to identify conformance with such later drafts. As such, the meaning of this keyword can be relied upon not to change over time.) A "
       (:TERM NIL "conforming implementation") " which has the "
       (:KWD NIL "ansi-cl") " " (:TERM NIL "feature")
       " is only permitted to retain the " (:KWD NIL "draft-ansi-cl") " "
       (:TERM NIL "feature")
       " if the finally approved standard is not incompatible with the draft standard. "
       :PAR)
      (:ITEM NIL (:KWD NIL "ansi-cl") " " :PAR
       "If present, indicates that this specification has been adopted by ANSI as an official standard, and that the "
       (:TERM NIL "implementation") " " (:TERM NIL "purports to conform") ". "
       :PAR)
      (:ITEM NIL (:KWD NIL "common-lisp") " " :PAR
       "This feature must appear in " (:VARREF NIL "*features*")
       " for any implementation that has one or more of the features "
       (:KWD NIL "x3j13") ", " (:KWD NIL "draft-ansi-cl") ", or "
       (:KWD NIL "ansi-cl")
       ". It is intended that it should also appear in implementations which have the features "
       (:KWD NIL "cltl1") " or " (:KWD NIL "cltl2")
       ", but this specification cannot force such behavior. The intent is that this feature should identify the language family named “Common Lisp,” rather than some specific dialect within that family. "
       :PAR))
     " " (:ENDISSUE NIL "SHARPSIGN-PLUS-MINUS-PACKAGE:KEYWORD") " "
     (:ENDISSUE NIL "COMMON-FEATURES:SPECIFY") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:SECREF NIL :READ-TIME-CONDITIONALS)
     ", " (:SECREF NIL :STANDARD-MACRO-CHARS) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 25.4.2 13") "The "
     (:TERM NIL "value") " of " (:VARREF NIL "*features*") " is used by the "
     (:TT NIL "#+") " and " (:TT NIL "#-") " reader syntax. " :PAR
     (:ISSUE NIL "SHARPSIGN-PLUS-MINUS-PACKAGE:KEYWORD") " "
     (:TERM NIL "Symbols") " in the " (:TERM NIL "features list")
     " may be in any " (:TERM NIL "package")
     ", but in practice they are generally in the " (:PACKREF NIL "keyword")
     " " (:TERM NIL "package") ". This is because " (:PACKREF NIL "keyword")
     " is the " (:TERM NIL "package") " used by default when "
     (:TERM NIL "reading") (:SUB NIL "2") " " (:TERM NIL "feature expressions")
     " in the " (:TT NIL "#+") " and " (:TT NIL "#-") " "
     (:TERM NIL "reader macros") ". " (:TERM NIL "Code")
     " that needs to name a " (:TERM NIL "feature") (:SUB NIL "2") " in a "
     (:TERM NIL "package") " " (:MATH NIL (:MI NIL "P")) " (other than "
     (:PACKREF NIL "keyword") ") can do so by making explicit use of a "
     (:TERM NIL "package prefix") " for " (:MATH NIL (:MI NIL "P"))
     ", but note that such " (:TERM NIL "code") " must also assure that the "
     (:TERM NIL "package") " " (:MATH NIL (:MI NIL "P"))
     " exists in order for the " (:TERM NIL "feature expression") " to be "
     (:TERM NIL "read") (:SUB NIL "2") "—even in cases where the "
     (:TERM NIL "feature expression") " is expected to fail. "
     (:ENDISSUE NIL "SHARPSIGN-PLUS-MINUS-PACKAGE:KEYWORD") " " :PAR
     "It is generally considered wise for an " (:TERM NIL "implementation")
     " to include one or more " (:TERM NIL "features")
     " identifying the specific " (:TERM NIL "implementation")
     ", so that conditional expressions can be written which distinguish idiosyncrasies of one "
     (:TERM NIL "implementation")
     " from those of another. Since features are normally "
     (:TERM NIL "symbols") " in the " (:PACKREF NIL "keyword") " "
     (:TERM NIL "package")
     " where name collisions might easily result, and since no uniquely defined mechanism is designated for deciding who has the right to use which "
     (:TERM NIL "symbol")
     " for what reason, a conservative strategy is to prefer names derived from one's own company or product name, since those names are often trademarked and are hence less likely to be used unwittingly by another "
     (:TERM NIL "implementation") ". " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== *COMPILE-FILE-PATHNAME*"
    "%% ========== *COMPILE-FILE-TRUENAME*")
   (:COM
    (:NAME "*compile-file-pathname*, *compile-file-truename*" :FTYPE
     "Variable")
    (:ISSUE NIL "LOAD-TRUENAME:NEW-PATHNAME-VARIABLES") " " :PAR
    (:PART (:NAME "Value Type") " " :PAR "The " (:TERM NIL "value") " of "
     (:VARREF NIL "*compile-file-pathname*") " must always be a "
     (:TERM NIL "pathname") " or " (:MISC NIL "nil") ". The "
     (:TERM NIL "value") " of " (:VARREF NIL "*compile-file-truename*")
     " must always be a " (:TERM NIL "physical pathname") " or "
     (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "During a call to "
     (:FUNREF NIL "compile-file") ", " (:VARREF NIL "*compile-file-pathname*")
     " is " (:TERM NIL "bound") " to the " (:TERM NIL "pathname")
     " denoted by the first argument to " (:FUNREF NIL "compile-file")
     ", merged against the defaults; that is, it is " (:TERM NIL "bound")
     " to "
     (:TT NIL "(pathname (merge-pathnames " (:PARAM NIL "input-file") "))")
     ". During the same time interval, "
     (:VARREF NIL "*compile-file-truename*") " is " (:TERM NIL "bound")
     " to the " (:TERM NIL "truename") " of the " (:TERM NIL "file") " being "
     (:TERM NIL "compiled") ". " :PAR "At other times, the "
     (:TERM NIL "value") " of these " (:TERM NIL "variables") " is "
     (:MISC NIL "nil") ". " :PAR "If a " (:TERM NIL "break loop")
     " is entered while " (:FUNREF NIL "compile-file") " is ongoing, it is "
     (:TERM NIL "implementation-dependent") " whether these "
     (:TERM NIL "variables") " retain the " (:TERM NIL "values")
     " they had just prior to entering the " (:TERM NIL "break loop")
     " or whether they are " (:TERM NIL "bound") " to " (:MISC NIL "nil") ". "
     :PAR "The consequences are unspecified if an attempt is made to "
     (:TERM NIL "assign") " or " (:TERM NIL "bind") " either of these "
     (:TERM NIL "variables") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The " (:TERM NIL "file system") ". "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "compile-file") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL "% This contradicts the \"unspecified\" above."
      " Except in the unusual situation of trying to simulate a facility similar to"
      " \\funref{compile-file}, programs are not expected to \\term{assign} or \\term{bind}"
      " this variable.")
     :PAR (:ENDISSUE NIL "LOAD-TRUENAME:NEW-PATHNAME-VARIABLES") " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== *LOAD-PATHNAME*"
    "%% ========== *LOAD-TRUENAME*")
   (:COM (:NAME "*load-pathname*, *load-truename*" :FTYPE "Variable")
    (:ISSUE NIL "LOAD-TRUENAME:NEW-PATHNAME-VARIABLES") " " :PAR
    (:PART (:NAME "Value Type") " " :PAR "The " (:TERM NIL "value") " of "
     (:VARREF NIL "*load-pathname*") " must always be a "
     (:TERM NIL "pathname") " or " (:MISC NIL "nil") ". The "
     (:TERM NIL "value") " of " (:VARREF NIL "*load-truename*")
     " must always be a " (:TERM NIL "physical pathname") " or "
     (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "During a call to "
     (:FUNREF NIL "load") ", " (:VARREF NIL "*load-pathname*") " is "
     (:TERM NIL "bound") " to the " (:TERM NIL "pathname")
     " denoted by the first argument to " (:FUNREF NIL "load")
     ", merged against the defaults; that is, it is " (:TERM NIL "bound")
     " to "
     (:TT NIL "(pathname (merge-pathnames " (:PARAM NIL "filespec") "))")
     ". During the same time interval, " (:VARREF NIL "*load-truename*") " is "
     (:TERM NIL "bound") " to the " (:TERM NIL "truename") " of the "
     (:TERM NIL "file") " being loaded. " :PAR "At other times, the "
     (:TERM NIL "value") " of these " (:TERM NIL "variables") " is "
     (:MISC NIL "nil") ". " :PAR "If a " (:TERM NIL "break loop")
     " is entered while " (:FUNREF NIL "load") " is ongoing, it is "
     (:TERM NIL "implementation-dependent") " whether these "
     (:TERM NIL "variables") " retain the " (:TERM NIL "values")
     " they had just prior to entering the " (:TERM NIL "break loop")
     " or whether they are " (:TERM NIL "bound") " to " (:MISC NIL "nil") ". "
     :PAR "The consequences are unspecified if an attempt is made to "
     (:TERM NIL "assign") " or " (:TERM NIL "bind") " either of these "
     (:TERM NIL "variables") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The " (:TERM NIL "file system") ". "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "load") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "LOAD-TRUENAME:NEW-PATHNAME-VARIABLES") " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== *COMPILE-PRINT*"
    "%% ========== *COMPILE-VERBOSE*")
   (:COM (:NAME "*compile-print*, *compile-verbose*" :FTYPE "Variable")
    (:ISSUE NIL "COMPILER-VERBOSITY:LIKE-LOAD") " " :PAR
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "value") " of "
     (:VARREF NIL "*compile-print*") " is the default value of the "
     (:KWD NIL "print") " " (:TERM NIL "argument") " to "
     (:FUNREF NIL "compile-file") ". The " (:TERM NIL "value") " of "
     (:VARREF NIL "*compile-verbose*") " is the default value of the "
     (:KWD NIL "verbose") " " (:TERM NIL "argument") " to "
     (:FUNREF NIL "compile-file") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "compile-file") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "COMPILER-VERBOSITY:LIKE-LOAD") " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== *LOAD-PRINT*" "%% ========== *LOAD-VERBOSE*")
   (:COM (:NAME "*load-print*, *load-verbose*" :FTYPE "Variable")
    (:ISSUE NIL "COMPILER-VERBOSITY:LIKE-LOAD") " " :PAR
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "generalized boolean")
     ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR "The initial " (:TERM NIL "value")
     " of " (:VARREF NIL "*load-print*") " is " (:TERM NIL "false")
     ". The initial " (:TERM NIL "value") " of " (:VARREF NIL "*load-verbose*")
     " is " (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "value") " of "
     (:VARREF NIL "*load-print*") " is the default value of the "
     (:KWD NIL "print") " " (:TERM NIL "argument") " to " (:FUNREF NIL "load")
     ". " (:COMMENT NIL "% 23.4.0 8") "The " (:TERM NIL "value") " of "
     (:VARREF NIL "*load-verbose*") " is the default value of the "
     (:KWD NIL "verbose") " " (:TERM NIL "argument") " to "
     (:FUNREF NIL "load") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR
     (:COMMENT NIL "The \\term{implementation}.") :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "load") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ENDISSUE NIL "COMPILER-VERBOSITY:LIKE-LOAD") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== *MODULES*")
   (:COM (:NAME "*modules*" :FTYPE "Variable")
    (:ISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-AGAIN:X3J13-DEC-91") " " :PAR
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "list") " of "
     (:TERM NIL "strings") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 11.8.0 2") :PAR
     "The " (:TERM NIL "value") " of " (:VARREF NIL "*modules*")
     " is a list of names of the modules that have been loaded into the current "
     (:TERM NIL "Lisp image") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:FUNREF NIL "provide") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "provide") ", "
     (:FUNREF NIL "require") " " :PAR
     (:COMMENT NIL " deprecation note was missing --sjl 4 Mar 92"))
    (:PART (:NAME "Notes") " " :PAR "The variable " (:VARREF NIL "*modules*")
     " is deprecated. " :PAR
     (:ENDISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-AGAIN:X3J13-DEC-91") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== PROVIDE" "%% ========== REQUIRE")
   (:COM (:NAME "provide, require" :FTYPE "Function")
    (:ISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-AGAIN:X3J13-DEC-91") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "provide")
      (:ARGLIST NIL "module-name")
      (:VALUES NIL (:TERM NIL "implementation-dependent")))
     " " (:ISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-YET-AGAIN:RESTORE-ARGUMENT")
     " "
     (:COMMENT NIL
      "% \"pathname\" => \"pathname list\" per X3J13. -kmp 05-Oct-93")
     (:DEF (:KIND "function") (:NAMES NIL "require")
      (:ARGLIST NIL "module-name " (:KEYWORD NIL " &optional")
       " pathname-list")
      (:VALUES NIL (:TERM NIL "implementation-dependent")))
     " " (:ENDISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-YET-AGAIN:RESTORE-ARGUMENT")
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:COMMENT NIL "KMP: Maybe should be \"module name designator\"? "
      "     Oh well. This is the only use, so leave it for now.")
     (:PARAM NIL "module-name") "—a " (:TERM NIL "string designator") ". " :PAR
     (:ISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-YET-AGAIN:RESTORE-ARGUMENT") " "
     (:PARAM NIL "pathname-list") "—" (:MISC NIL "nil") ", or a "
     (:TERM NIL "designator") " for a " (:TERM NIL "non-empty") " "
     (:TERM NIL "list") " of " (:TERM NIL "pathname designators")
     ". The default is " (:MISC NIL "nil") ". "
     (:ENDISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-YET-AGAIN:RESTORE-ARGUMENT") " "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 11.8.0 4")
     (:FUNREF NIL "provide") " adds the " (:PARAM NIL "module-name") " to the "
     (:TERM NIL "list") " held by " (:VARREF NIL "*modules*")
     ", if such a name is not already present. " :PAR
     (:COMMENT NIL "% 11.8.0 5") (:FUNREF NIL "require")
     " tests for the presence of the " (:PARAM NIL "module-name") " in the "
     (:TERM NIL "list") " held by " (:VARREF NIL "*modules*")
     ". If it is present, " (:FUNREF NIL "require") " immediately returns. "
     (:ISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-YET-AGAIN:RESTORE-ARGUMENT")
     " Otherwise, an attempt is made to load an appropriate set of "
     (:TERM NIL "files") " as follows: The " (:PARAM NIL "pathname-list")
     " argument, if " (:TERM NIL "non-nil") ", specifies a list of "
     (:TERM NIL "pathnames")
     " to be loaded in order, from left to right. If the "
     (:PARAM NIL "pathname-list") " is " (:MISC NIL "nil") ", an "
     (:TERM NIL "implementation-dependent")
     " mechanism will be invoked in an attempt to load the module named "
     (:PARAM NIL "module-name")
     "; if no such module can be loaded, an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "error") " is signaled. "
     (:ENDISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-YET-AGAIN:RESTORE-ARGUMENT") " "
     :PAR "Both functions use " (:FUNREF NIL "string=")
     " to test for the presence of a " (:PARAM NIL "module-name") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:ISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-YET-AGAIN:RESTORE-ARGUMENT") " "
     (:COMMENT NIL " %% 11.8.0 6 (CLtL Table 11-1: An Initialization File)" " "
      " \\code" "  ;;;; New and improved lisp init file for I. Newton" " "
      "  ;;; Set up the CL-USER package the way I like it."
      "  (require \"CALCULUS\")     ; I use CALCULUS a lot. Load it."
      "  (use-package \"CALCULUS\") ; Get easy access to exported symbols." " "
      "  (require \"NEWTONIAN-MECHANICS\") ;Ditto for NEWTONIAN-MECHANICS"
      "  (use-package \"NEWTONIAN-MECHANICS\")" " "
      "  ;;; Ignore that Relativity stuff until they've got it debugged better."
      "  ;(require \"RELATIVITY\")" " "
      "  ;;; These are worth loading, but I'll use qualified names, such"
      "  ;;; as PHLOGISTON:MAKE-FIRE-BOTTLE, to get any symbols I might need."
      "  (require \"PHLOGISTON\")" "  (require \"ALCHEMY\")" " "
      "  (provide \"NEWTON-PERSONAL-PREFERENCES\")" " \\endcode")
     :PAR
     (:CODE NIL ";;; This illustrates a nonportable use of REQUIRE, because it
;;; depends on the implementation-dependent file-loading mechanism.

(require \"CALCULUS\")

;;; This use of REQUIRE is nonportable because of the literal 
;;; physical pathname.  

(require \"CALCULUS\" \"/usr/lib/lisp/calculus\")

;;; One form of portable usage involves supplying a logical pathname,
;;; with appropriate translations defined elsewhere.

(require \"CALCULUS\" \"lib:calculus\")

;;; Another form of portable usage involves using a variable or
;;; table lookup function to determine the pathname, which again
;;; must be initialized elsewhere.

(require \"CALCULUS\" *calculus-module-pathname*)
")
     " " (:ENDISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-YET-AGAIN:RESTORE-ARGUMENT")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR (:FUNREF NIL "provide") " modifies "
     (:VARREF NIL "*modules*") ". " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The specific action taken by "
     (:FUNREF NIL "require") " is affected by calls to "
     (:FUNREF NIL "provide") " (or, in general, any changes to the "
     (:TERM NIL "value") " of " (:VARREF NIL "*modules*") "). " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "module-name") " is not a "
     (:TERM NIL "string designator") ". " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " If "
     (:FUNREF NIL "require")
     " fails to perform the requested operation due to a problem while interacting with the "
     (:TERM NIL "file system") ", an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "file-error") " is signaled. "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error")
     " might be signaled if any " (:TERM NIL "pathname") " in "
     (:PARAM NIL "pathname-list") " is a " (:TERM NIL "designator") " for a "
     (:TERM NIL "wild") " " (:TERM NIL "pathname") ". "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:VARREF NIL "*modules*") ", "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL " deprecation note was missing --sjl 4 Mar 92")
     "The functions " (:FUNREF NIL "provide") " and " (:FUNREF NIL "require")
     " are deprecated. " :PAR (:COMMENT NIL "% 11.8.0 3")
     "If a module consists of a single " (:TERM NIL "package")
     ", it is customary for the package and module names to be the same. " :PAR
     (:ENDISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-AGAIN:X3J13-DEC-91") " " :PAR))
   " ")
  " " :PAR)
 (:CHAPTER
  (:NUM "25" :TITLE ("Environment") :NUMTAG :CHAP-TWENTY-FIVE :NAMETAG
   :ENVIRONMENT)
  (:SECTION (:TITLE ("The External Environment"))
   (:COMMENT NIL "% Interface with the Programming Environment") :PAR
   (:SUBSECTION (:TITLE ("Top level loop") :TAGS (:TOP-LEVEL-LOOP)) " "
    (:COMMENT NIL "% 20.2.0 1") "The top level loop is the "
    (:RM NIL " Common Lisp")
    " mechanism by which the user normally interacts with the "
    (:RM NIL " Common Lisp")
    " system. This loop is sometimes referred to as the "
    (:TERM NIL "Lisp read-eval-print loop")
    " because it typically consists of an endless loop that reads an expression, evaluates it and prints the results. "
    :PAR (:COMMENT NIL "% 20.2.0 2")
    "The top level loop is not completely specified; thus the user interface is "
    (:TERM NIL "implementation-defined") ". "
    (:COMMENT NIL "% 20.2.0 3" "% Moon deleted the following sentence"
     "The top level loop "
     "traps all attempts to \\term{throw} and recovers from them.")
    "The top level loop prints all values resulting from the evaluation of a "
    (:TERM NIL "form") ". " (:COMMENT NIL "% 20.2.0 4") (:NEXTFIGURE (:CAPS T))
    " lists variables that are maintained by the "
    (:TERM NIL "Lisp read-eval-print loop") ". " :PAR
    (:TABLE (:NAME ("Variables maintained by the Read-Eval-Print Loop"))
     (:ROW NIL (:CELL NIL (:VARREF NIL " *")) (:CELL NIL (:VARREF NIL "+"))
      (:CELL NIL (:VARREF NIL "/")) (:CELL NIL (:VARREF NIL "-")))
     (:ROW NIL (:CELL NIL (:VARREF NIL " **")) (:CELL NIL (:VARREF NIL "++"))
      (:CELL NIL (:VARREF NIL "//")) (:CELL NIL))
     (:ROW NIL (:CELL NIL (:VARREF NIL " ***")) (:CELL NIL (:VARREF NIL "+++"))
      (:CELL NIL (:VARREF NIL "///")) (:CELL NIL)))
    " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Debugging Utilities")) (:NEXTFIGURE (:CAPS T))
    " shows " (:TERM NIL "defined names") " relating to debugging. " :PAR
    (:TABLE (:NAME ("Defined names relating to debugging"))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " *debugger-hook*"))
      (:CELL NIL (:FUNREF NIL "documentation"))
      (:CELL NIL (:FUNREF NIL "step")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " apropos"))
      (:CELL NIL (:FUNREF NIL "dribble")) (:CELL NIL (:FUNREF NIL "time")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " apropos-list"))
      (:CELL NIL (:FUNREF NIL "ed")) (:CELL NIL (:FUNREF NIL "trace")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " break"))
      (:CELL NIL (:FUNREF NIL "inspect")) (:CELL NIL (:FUNREF NIL "untrace")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " describe"))
      (:CELL NIL (:FUNREF NIL "invoke-debugger")) (:CELL NIL)))
    " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Environment Inquiry")) "Environment inquiry "
    (:TERM NIL "defined names")
    " provide information about the hardware and software configuration on which a "
    (:RM NIL " Common Lisp") " program is being executed. " :PAR
    (:NEXTFIGURE (:CAPS T)) " shows " (:TERM NIL "defined names")
    " relating to environment inquiry. " :PAR
    (:TABLE (:NAME ("Defined names relating to environment inquiry."))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " *features*"))
      (:CELL NIL (:FUNREF NIL "machine-instance"))
      (:CELL NIL (:FUNREF NIL "short-site-name")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " lisp-implementation-type"))
      (:CELL NIL (:FUNREF NIL "machine-type"))
      (:CELL NIL (:FUNREF NIL "software-type")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " lisp-implementation-version"))
      (:CELL NIL (:FUNREF NIL "machine-version"))
      (:CELL NIL (:FUNREF NIL "software-version")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " long-site-name"))
      (:CELL NIL (:FUNREF NIL "room")) (:CELL NIL)))
    " " (:COMMENT NIL "Removed identity! -kmp 3-Jan-91") :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Time") :TAGS (:TIME)) " " :PAR
    (:COMMENT NIL "% 25.4.1 1")
    "Time is represented in four different ways in " (:RM NIL " Common Lisp")
    ": " (:TERM NIL "decoded time") ", " (:TERM NIL "universal time") ", "
    (:TERM NIL "internal time") ", and seconds. " (:TERM NIL "Decoded time")
    " and " (:TERM NIL "universal time")
    " are used primarily to represent calendar time, and are precise only to one second. "
    (:TERM NIL "Internal time")
    " is used primarily to represent measurements of computer time (such as run time) and is precise to some "
    (:TERM NIL "implementation-dependent") " fraction of a second called an "
    (:TERM NIL "internal time unit") ", as specified by "
    (:CONREF NIL "internal-time-units-per-second") ". "
    (:COMMENT NIL
     "Actually, relative universal times aren't actually used for anything."
     "But it didn't seem worth removing the mention, since it's a legit concept. -kmp 9-Sep-91"
     "% Moon wanted this shifted to say that Universal time is only absolute."
     " \\term{Decoded time} is used only for \\term{absolute} \\term{time} indications."
     " \\term{Universal time} and \\term{internal time} formats are used for both \\term{absolute}"
     " and \\term{relative} \\term{times}.")
    "An " (:TERM NIL "internal time") " can be used for either "
    (:TERM NIL "absolute") " and " (:TERM NIL "relative") " "
    (:TERM NIL "time") " measurements. Both a " (:TERM NIL "universal time")
    " and a " (:TERM NIL "decoded time") " can be used only for "
    (:TERM NIL "absolute") " " (:TERM NIL "time") " measurements. "
    (:COMMENT NIL "This may be gratuitous, but I just want to be clear.")
    "In the case of one function, " (:FUNREF NIL "sleep")
    ", time intervals are represented as a non-negative " (:TERM NIL "real")
    " number of seconds. " :PAR (:NEXTFIGURE (:CAPS T)) " shows "
    (:TERM NIL "defined names") " relating to " (:TERM NIL "time") ". " :PAR
    (:TABLE (:NAME ("Defined names involving Time."))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " decode-universal-time"))
      (:CELL NIL (:FUNREF NIL "get-internal-run-time")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " encode-universal-time"))
      (:CELL NIL (:FUNREF NIL "get-universal-time")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " get-decoded-time"))
      (:CELL NIL (:FUNREF NIL "internal-time-units-per-second")))
     (:ROW NIL (:CELL NIL (:FUNREF NIL " get-internal-real-time"))
      (:CELL NIL (:FUNREF NIL "sleep"))))
    " " :PAR
    (:SUBSUBSECTION (:TITLE ("Decoded Time") :TAGS (:DECODED-TIME)) " " :PAR
     (:COMMENT NIL "% 25.4.1 2") "A " (:NEWTERM NIL "decoded time")
     " is an ordered series of nine values that, taken together, represent a point in calendar time (ignoring "
     (:TERM NIL "leap seconds") "): " :PAR (:COMMENT NIL "% 25.4.1 3")
     (:LIST NIL
      (:ITEM NIL (:B NIL "Second") " " :PAR "An " (:TERM NIL "integer")
       " between 0 and 59, inclusive. " :PAR (:COMMENT NIL "% 25.4.1 4"))
      (:ITEM NIL (:B NIL "Minute") " " :PAR "An " (:TERM NIL "integer")
       " between 0 and 59, inclusive. " :PAR (:COMMENT NIL "% 25.4.1 5"))
      (:ITEM NIL (:B NIL "Hour") " " :PAR "An " (:TERM NIL "integer")
       " between 0 and 23, inclusive. " :PAR (:COMMENT NIL "% 25.4.1 6"))
      (:ITEM NIL (:B NIL "Date") " " :PAR "An " (:TERM NIL "integer")
       " between 1 and 31, inclusive (the upper limit actually depends on the month and year, of course). "
       :PAR (:COMMENT NIL "% 25.4.1 7"))
      (:ITEM NIL (:B NIL "Month") " " :PAR "An " (:TERM NIL "integer")
       " between 1 and 12, inclusive; 1 means January, 2 means February, and so on; 12 means December. "
       :PAR (:COMMENT NIL "% 25.4.1 8"))
      (:ITEM NIL (:B NIL "Year") " " :PAR "An " (:TERM NIL "integer")
       " indicating the year A.D. However, if this " (:TERM NIL "integer")
       " is between 0 and 99, the “obvious” year is used; more precisely, that year is assumed that is equal to the "
       (:TERM NIL "integer")
       " modulo 100 and within fifty years of the current year (inclusive backwards and exclusive forwards). Thus, in the year 1978, year 28 is 1928 but year 27 is 2027. (Functions that return time in this format always return a full year number.) "
       :PAR (:COMMENT NIL "% 25.4.1 10"))
      (:ITEM NIL (:B NIL "Day of week") " " :PAR "An " (:TERM NIL "integer")
       " between 0 and 6, inclusive; 0 means Monday, 1 means Tuesday, and so on; 6 means Sunday. "
       :PAR (:COMMENT NIL "% 25.4.1 11"))
      (:ITEM NIL (:B NIL "Daylight saving time flag") " " :PAR "A "
       (:TERM NIL "generalized boolean") " that, if " (:TERM NIL "true")
       ", indicates that daylight saving time is in effect. " :PAR
       (:COMMENT NIL "% 25.4.1 12"))
      (:ITEM NIL (:B NIL "Time zone") " " :PAR "A " (:TERM NIL "time zone")
       ". " :PAR))
     " " :PAR (:NEXTFIGURE (:CAPS T)) " shows " (:TERM NIL "defined names")
     " relating to " (:TERM NIL "decoded time") ". " :PAR
     (:TABLE (:NAME ("Defined names involving time in Decoded Time."))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " decode-universal-time"))
       (:CELL NIL (:FUNREF NIL "get-decoded-time"))))
     " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Universal Time") :TAGS (:UNIVERSAL-TIME)) " "
     :PAR
     (:COMMENT NIL "% 25.4.1 13"
      " \\newtermidx{Universal time}{universal time} represents time as a single non-negative \\term{integer}."
      " For \\term{relative} time purposes, this is a number of seconds."
      " For absolute time, this is the"
      " number of seconds since midnight, January 1, 1900 GMT (ignoring \\term{leap seconds}).")
     (:NEWTERM (:IDX "universal time") "Universal time") " is an "
     (:TERM NIL "absolute") " " (:TERM NIL "time")
     " represented as a single non-negative " (:TERM NIL "integer")
     "—the number of seconds since midnight, January 1, 1900 GMT (ignoring "
     (:TERM NIL "leap seconds")
     "). Thus the time 1 is 00:00:01 (that is, 12:00:01 a.m.) on January 1, 1900 GMT. Similarly, the time 2398291201 corresponds to time 00:00:01 on January 1, 1976 GMT. Recall that the year 1900 was not a leap year; for the purposes of "
     (:RM NIL " Common Lisp")
     ", a year is a leap year if and only if its number is divisible by 4, except that years divisible by 100 are not leap years, except that years divisible by 400 are leap years. Therefore the year 2000 will be a leap year. Because "
     (:TERM NIL "universal time") " must be a non-negative "
     (:TERM NIL "integer")
     ", times before the base time of midnight, January 1, 1900 GMT cannot be processed by "
     (:RM NIL " Common Lisp") ". " :PAR
     (:TABLE (:NAME ("Defined names involving time in Universal Time."))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " decode-universal-time"))
       (:CELL NIL (:FUNREF NIL "get-universal-time")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " encode-universal-time"))
       (:CELL NIL)))
     " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Internal Time") :TAGS (:INTERNAL-TIME)) " " :PAR
     (:COMMENT NIL "% 25.4.1 14")
     (:NEWTERM (:IDX "internal time") "Internal time")
     " represents time as a single " (:TERM NIL "integer") ", in terms of an "
     (:TERM NIL "implementation-dependent") " unit called an "
     (:TERM NIL "internal time unit")
     ". Relative time is measured as a number of these units. Absolute time is relative to an arbitrary time base. "
     :PAR (:NEXTFIGURE (:CAPS T)) " shows " (:TERM NIL "defined names")
     " related to " (:TERM NIL "internal time") ". " :PAR
     (:TABLE (:NAME ("Defined names involving time in Internal Time."))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " get-internal-real-time"))
       (:CELL NIL (:FUNREF NIL "internal-time-units-per-second")))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " get-internal-run-time"))
       (:CELL NIL)))
     " " :PAR)
    :PAR
    (:SUBSUBSECTION (:TITLE ("Seconds")) "One function, " (:FUNREF NIL "sleep")
     ", takes its argument as a non-negative " (:TERM NIL "real")
     " number of seconds. Informally, it may be useful to think of this as a "
     (:TERM NIL "relative") " " (:TERM NIL "universal time")
     ", but it differs in one important way: " (:TERM NIL "universal times")
     " are always non-negative " (:TERM NIL "integers")
     ", whereas the argument to " (:FUNREF NIL "sleep")
     " can be any kind of non-negative " (:TERM NIL "real")
     ", in order to allow for the possibility of fractional seconds. " :PAR
     (:TABLE (:NAME ("Defined names involving time in Seconds."))
      (:ROW NIL (:CELL NIL (:FUNREF NIL " sleep")) (:CELL NIL)))
     " " :PAR)
    :PAR)
   :PAR)
  :PAR
  (:DICTIONARY NIL :PAR
   (:COMMENT NIL " Environment" "  Time" "  Debugging/Tuning"
    "  Storage System" "  Browsing/Editing" "  Read-Eval-Print Loop"
    "  External Environment Queries")
   :PAR (:COMMENT NIL "-------------------- Time --------------------") :PAR
   (:COMMENT NIL "%% ========== DECODE-UNIVERSAL-TIME")
   (:COM (:NAME "decode-universal-time" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "decode-universal-time")
      (:ARGLIST NIL "universal-time " (:KEYWORD NIL " &optional") " time-zone")
      (:VALUES NIL
       "second, minute, hour, date, month, year, day, daylight-p, zone"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "universal-time") "—a " (:TERM NIL "universal time") ". " :PAR
     (:ISSUE NIL "TIME-ZONE-NON-INTEGER:ALLOW") " " (:PARAM NIL "time-zone")
     "—a " (:TERM NIL "time zone") ". "
     (:ENDISSUE NIL "TIME-ZONE-NON-INTEGER:ALLOW") " " :PAR
     (:PARAM NIL "second") ", " (:PARAM NIL "minute") ", " (:PARAM NIL "hour")
     ", " (:PARAM NIL "date") ", " (:PARAM NIL "month") ", "
     (:PARAM NIL "year") ", " (:PARAM NIL "day") ", " (:PARAM NIL "daylight-p")
     ", " (:PARAM NIL "zone") "—a " (:TERM NIL "decoded time") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 25.4.1 18")
     "Returns the " (:TERM NIL "decoded time") " represented by the given "
     (:TERM NIL "universal time") ". " :PAR "If " (:PARAM NIL "time-zone")
     " is not supplied, it defaults to the current time zone adjusted for daylight saving time. "
     (:ISSUE NIL "DECODE-UNIVERSAL-TIME-DAYLIGHT:LIKE-ENCODE") " If "
     (:PARAM NIL "time-zone")
     " is supplied, daylight saving time information is ignored. The daylight saving time flag is "
     (:MISC NIL "nil") " if " (:PARAM NIL "time-zone") " is supplied. "
     (:ENDISSUE NIL "DECODE-UNIVERSAL-TIME-DAYLIGHT:LIKE-ENCODE") " " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:ISSUE NIL "DECODE-UNIVERSAL-TIME-DAYLIGHT:LIKE-ENCODE") " "
     (:CODE NIL " (decode-universal-time 0 0) → 0, 0, 0, 1, 1, 1900, 0, "
      (:TERM NIL "false") ", 0

;; The next two examples assume Eastern Daylight Time.
 (decode-universal-time 2414296800 5) → 0, 0, 1, 4, 7, 1976, 6, "
      (:TERM NIL "false") ", 5
 (decode-universal-time 2414293200) → 0, 0, 1, 4, 7, 1976, 6, "
      (:TERM NIL "true") ", 5

;; This example assumes that the time zone is Eastern Daylight Time
;; (and that the time zone is constant throughout the example).
 (let* ((here (nth 8 (multiple-value-list (get-decoded-time)))) ;Time zone
        (recently (get-universal-time))
        (a (nthcdr 7 (multiple-value-list (decode-universal-time recently))))
        (b (nthcdr 7 (multiple-value-list (decode-universal-time recently here)))))
   (list a b (equal a b))) → ((T 5) (NIL 5) NIL)
")
     " " (:ENDISSUE NIL "DECODE-UNIVERSAL-TIME-DAYLIGHT:LIKE-ENCODE") " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     (:TERM NIL "Implementation-dependent")
     " mechanisms for calculating when or if daylight savings time is in effect for any given session. "
     :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "encode-universal-time")
     ", " (:FUNREF NIL "get-universal-time") ", " (:COMMENT NIL "5.3")
     (:SECREF NIL :TIME) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== ENCODE-UNIVERSAL-TIME")
   (:COM (:NAME "encode-universal-time" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "encode-universal-time")
      (:ARGLIST NIL "second minute hour date month year "
       (:KEYWORD NIL " &optional") " time-zone")
      (:VALUES NIL "universal-time"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "second") ", "
     (:PARAM NIL "minute") ", " (:PARAM NIL "hour") ", " (:PARAM NIL "date")
     ", " (:PARAM NIL "month") ", " (:PARAM NIL "year") ", "
     (:PARAM NIL "time-zone") "—the corresponding parts of a "
     (:TERM NIL "decoded time")
     ". (Note that some of the nine values in a full "
     (:TERM NIL "decoded time")
     " are redundant, and so are not used as inputs to this function.) " :PAR
     (:PARAM NIL "universal-time") "—a " (:TERM NIL "universal time") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:COMMENT NIL "% 25.4.1 20"
      "!!! Actually, the args are only part of a decoded time")
     (:FUNREF NIL "encode-universal-time")
     " converts a time from Decoded Time format to a "
     (:TERM NIL "universal time") ". " :PAR "If " (:PARAM NIL "time-zone")
     " is supplied, no adjustment for daylight savings time is performed. "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (encode-universal-time 0 0 0 1 1 1900 0) → 0
 (encode-universal-time 0 0 1 4 7 1976 5) → 2414296800
;; The next example assumes Eastern Daylight Time.
 (encode-universal-time 0 0 1 4 7 1976) → 2414293200
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "decode-universal-time")
     ", " (:FUNREF NIL "get-decoded-time") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== GET-DECODED-TIME"
    "%% ========== GET-UNIVERSAL-TIME")
   (:COM (:NAME "get-universal-time, get-decoded-time" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "get-universal-time")
      (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments")))
      (:VALUES NIL "universal-time"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "get-decoded-time")
      (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments")))
      (:VALUES NIL
       "second, minute, hour, date, month, year, day, daylight-p, zone"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:PARAM NIL "universal-time") "—a " (:TERM NIL "universal time") ". " :PAR
     (:PARAM NIL "second") ", " (:PARAM NIL "minute") ", " (:PARAM NIL "hour")
     ", " (:PARAM NIL "date") ", " (:PARAM NIL "month") ", "
     (:PARAM NIL "year") ", " (:PARAM NIL "day") ", " (:PARAM NIL "daylight-p")
     ", " (:PARAM NIL "zone") "—a " (:TERM NIL "decoded time") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 25.4.1 17")
     (:FUNREF NIL "get-universal-time")
     " returns the current time, represented as a "
     (:TERM NIL "universal time") ". " :PAR (:COMMENT NIL "% 25.4.1 15")
     (:FUNREF NIL "get-decoded-time")
     " returns the current time, represented as a " (:TERM NIL "decoded time")
     ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL ";; At noon on July 4, 1976 in Eastern Daylight Time.
 (get-decoded-time) → 0, 0, 12, 4, 7, 1976, 6, "
      (:TERM NIL "true") ", 5
;; At exactly the same instant.
 (get-universal-time) → 2414332800
;; Exactly five minutes later.
 (get-universal-time) → 2414333100
;; The difference is 300 seconds (five minutes)
 (- * **) → 300
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The time of day (" (:I NIL "i.e.")
     ",  the passage of time), the system clock's ability to keep accurate time, and the accuracy of the system clock's initial setting. "
     :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR "An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error")
     " might be signaled if the current time cannot be determined. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "decode-universal-time")
     ", " (:FUNREF NIL "encode-universal-time") ", " (:SECREF NIL :TIME) " "
     :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL
      " (get-decoded-time) ≡ (decode-universal-time (get-universal-time))
")
     " " :PAR "No " (:TERM NIL "implementation")
     " is required to have a way to verify that the time returned is correct. However, if an "
     (:TERM NIL "implementation") " provides a validity check ("
     (:I NIL "e.g.")
     ",  the failure to have properly initialized the system clock can be reliably detected) and that validity check fails, the "
     (:TERM NIL "implementation")
     " is strongly encouraged (but not required) to signal an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "error")
     " (rather than, for example, returning a known-to-be-wrong value) that is "
     (:TERM NIL "correctable")
     " by allowing the user to interactively set the correct time. " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== SLEEP")
   (:COM (:NAME "sleep" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "sleep") (:ARGLIST NIL "seconds")
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "seconds")
     "—a non-negative " (:TERM NIL "real") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 25.4.1 24")
     "Causes execution to cease and become dormant for approximately the seconds of real time indicated by "
     (:PARAM NIL "seconds") ", whereupon execution is resumed. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (sleep 1) → NIL 

;; Actually, since SLEEP is permitted to use approximate timing, 
;; this might not always yield true, but it will often enough that
;; we felt it to be a productive example of the intent.
 (let ((then (get-universal-time))
       (now  (progn (sleep 10) (get-universal-time))))
   (>= (- now then) 10))
→ "
      (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "Causes processing to pause. " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The granularity of the scheduler. "
     :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "seconds")
     " is not a non-negative " (:TERM NIL "real") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Debugging Tuning --------------------")
   :PAR (:COMMENT NIL "%% ========== APROPOS" "%% ========== APROPOS-LIST")
   :PAR
   (:COM (:NAME "apropos, apropos-list" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "apropos")
      (:ARGLIST NIL "string " (:KEYWORD NIL " &optional") " package")
      (:VALUES NIL (:ANG NIL "no " (:TERM NIL "values"))))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "apropos-list")
      (:ARGLIST NIL "string " (:KEYWORD NIL " &optional") " package")
      (:VALUES NIL "symbols"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "string") "—a "
     (:TERM NIL "string designator") ". " :PAR (:PARAM NIL "package") "—a "
     (:TERM NIL "package designator") " or " (:MISC NIL "nil")
     ". The default is " (:MISC NIL "nil") ". " :PAR (:PARAM NIL "symbols")
     "—a " (:TERM NIL "list") " of " (:TERM NIL "symbols") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 25.3.0 23")
     "These functions search for " (:TERM NIL "interned") " "
     (:TERM NIL "symbols") " whose " (:TERM NIL "names")
     " contain the substring " (:PARAM NIL "string") ". " :PAR "For "
     (:FUNREF NIL "apropos") ", as each such " (:TERM NIL "symbol")
     " is found, its name is printed on " (:TERM NIL "standard output")
     ". In addition, if such a " (:TERM NIL "symbol") " is defined as a "
     (:TERM NIL "function") " or " (:TERM NIL "dynamic variable")
     ", information about those definitions might also be printed. " :PAR
     (:COMMENT NIL "% 25.3.0 23") "For " (:FUNREF NIL "apropos-list")
     ", no output occurs as the search proceeds; instead a list of the matching "
     (:TERM NIL "symbols") " is returned when the search is complete. " :PAR
     "If " (:PARAM NIL "package") " is " (:TERM NIL "non-nil") ", only the "
     (:TERM NIL "symbols") " " (:TERM NIL "accessible") " in that "
     (:PARAM NIL "package") " are searched; otherwise all "
     (:TERM NIL "symbols") " " (:TERM NIL "accessible") " in any "
     (:TERM NIL "package") " are searched. " :PAR "Because a "
     (:TERM NIL "symbol")
     " might be available by way of more than one inheritance path, "
     (:FUNREF NIL "apropos") " might print information about the "
     (:TERM NIL "same") " " (:TERM NIL "symbol") " more than once, "
     (:COMMENT NIL
      "What about APROPOS-LIST? Can its result contain duplicates? -kmp 24-Apr-91"
      "I added this next since it was implicitly vague; makes it explicitly vague. -kmp 1-Feb-92")
     "or " (:FUNREF NIL "apropos-list") " might return a " (:TERM NIL "list")
     " containing duplicate " (:TERM NIL "symbols") ". " :PAR
     (:COMMENT NIL
      "!!! This really wants a technical issue in order to resolve it.")
     "Whether or not the search is case-sensitive is "
     (:TERM NIL "implementation-defined") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The set of " (:TERM NIL "symbols")
     " which are currently " (:TERM NIL "interned") " in any "
     (:TERM NIL "packages") " being searched. " :PAR (:FUNREF NIL "apropos")
     " is also affected by " (:VARREF NIL "*standard-output*") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DESCRIBE")
   (:COM (:NAME "describe" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "describe")
      (:ARGLIST NIL "object " (:KEYWORD NIL " &optional") " stream")
      (:VALUES NIL (:ANG NIL "no " (:TERM NIL "values"))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR
     (:ISSUE NIL "DESCRIBE-UNDERSPECIFIED:DESCRIBE-OBJECT") " "
     (:PARAM NIL "stream") "—an " (:TERM NIL "output") " "
     (:TERM NIL "stream designator") ". The default is "
     (:TERM NIL "standard output") ". "
     (:ENDISSUE NIL "DESCRIBE-UNDERSPECIFIED:DESCRIBE-OBJECT") " " :PAR)
    (:PART (:NAME "Description") " " :PAR (:FUNREF NIL "describe")
     " displays information about " (:PARAM NIL "object") " "
     (:ISSUE NIL "DESCRIBE-UNDERSPECIFIED:DESCRIBE-OBJECT") " to "
     (:PARAM NIL "stream") ". "
     (:ENDISSUE NIL "DESCRIBE-UNDERSPECIFIED:DESCRIBE-OBJECT") " " :PAR
     (:COMMENT NIL
      "This used to be worded in a way which required these two behaviors in seeming"
      "contradiction to the remark about output being implementation-dependent."
      "Barmar flagged this and I fixed it in a way that is hopefully non-controversial."
      "  -kmp 29-Dec-90")
     "For example, " (:FUNREF NIL "describe") " of a " (:TERM NIL "symbol")
     " might show the " (:TERM NIL "symbol")
     "'s value, its definition, and each of its properties. "
     (:FUNREF NIL "describe") " of a " (:TERM NIL "float")
     " might show the number's internal representation in a way that is useful for tracking down round-off errors. In all cases, however, the nature and format of the output of "
     (:FUNREF NIL "describe") " is " (:TERM NIL "implementation-dependent")
     ". " :PAR (:COMMENT NIL "% 25.3.0 13") (:FUNREF NIL "describe")
     " can describe something that it finds inside the " (:PARAM NIL "object")
     "; in such cases, a notational device such as increased indentation or positioning in a table is typically used in order to visually distinguish such recursive descriptions from descriptions of the argument "
     (:PARAM NIL "object") ". " :PAR
     (:ISSUE NIL "DESCRIBE-UNDERSPECIFIED:DESCRIBE-OBJECT")
     " The actual act of describing the object is implemented by "
     (:FUNREF NIL "describe-object") ". " (:FUNREF NIL "describe")
     " exists as an interface primarily to manage argument defaulting (including conversion of arguments "
     (:MISC NIL "t") " and " (:MISC NIL "nil") " into " (:TERM NIL "stream")
     " " (:TERM NIL "objects") ") and to inhibit any return values from "
     (:FUNREF NIL "describe-object") ". "
     (:ENDISSUE NIL "DESCRIBE-UNDERSPECIFIED:DESCRIBE-OBJECT") " " :PAR
     (:ISSUE NIL "DESCRIBE-INTERACTIVE:NO") " " (:FUNREF NIL "describe")
     " is not intended to be an interactive function. In a "
     (:TERM NIL "conforming implementation") ", " (:FUNREF NIL "describe")
     " must not, by default, prompt for user input. User-defined methods for "
     (:FUNREF NIL "describe-object") " are likewise restricted. "
     (:ENDISSUE NIL "DESCRIBE-INTERACTIVE:NO") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "Output to "
     (:TERM NIL "standard output") " or " (:TERM NIL "terminal I/O") ". " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*standard-output*")
     " and " (:VARREF NIL "*terminal-io*") ", methods on "
     (:FUNREF NIL "describe-object") " and " (:FUNREF NIL "print-object")
     " for " (:TERM NIL "objects") " having user-defined "
     (:TERM NIL "classes") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "inspect") ", "
     (:FUNREF NIL "describe-object") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:COMMENT NIL
      "% There are argument congruence problems with this stuff, so it's just not worth"
      "% keeping.  A discussion among Quinquevirate left us with no good way out. -kmp 30-Jan-92"
      "\\issue{DESCRIBE-INTERACTIVE:NO}"
      " An \\term{implementation} may be extended to permit additional, non-portable keyword arguments to \\funref{describe} "
      " which, if used, might cause \\funref{describe} to behave in an interactive way."
      " "
      " An implementations may be extended to permit additional, non-portable keyword"
      " arguments would prompt for or require"
      " user input as long as the default action if no keyword arguments are supplied does not"
      " prompt for or" "     require user input."
      " For example, the following kind of interaction would be permissible in"
      " implementations which chose to do it:" " " " \\code"
      "  (defvar *my-table* (make-hash-table))"
      "  (setf (gethash 'foo *my-table*) 1)"
      "  (setf (gethash 'bar *my-table*) 2)"
      "  (setf (gethash 'foobar *my-table*) 3)"
      "  (describe *my-table* :interactive t)"
      " #<EQ-HASH-TABLE 259> has 3 entries."
      " Do you want to see its contents? (Yes or No) Yes" " \\endcode"
      "\\endissue{DESCRIBE-INTERACTIVE:NO}")
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DESCRIBE-OBJECT")
   (:COM (:NAME "describe-object" :FTYPE "Standard Generic Function")
    (:ISSUE NIL "DESCRIBE-UNDERSPECIFIED:DESCRIBE-OBJECT") " " :PAR
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "generic-function") (:NAMES NIL "describe-object")
      (:ARGLIST NIL "object stream")
      (:VALUES NIL (:TERM NIL "implementation-dependent")))
     " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR
     (:DEF (:KIND "method") (:NAMES NIL "describe-object")
      (:ARGLIST NIL "(" (:PARAM NIL "object") " standard-object) "
       (:PARAM NIL "stream")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR (:PARAM NIL "stream") "—a "
     (:TERM NIL "stream") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The generic function "
     (:FUNREF NIL "describe-object") " prints a description of "
     (:PARAM NIL "object") " to a " (:PARAM NIL "stream") ". "
     (:FUNREF NIL "describe-object") " is called by " (:FUNREF NIL "describe")
     "; it must not be called by the user. "
     (:COMMENT NIL
      "I changed should -> must in the above.  An implementation can always defined"
      "the consequences in order to lift this restriction.")
     :PAR "Each implementation is required to provide a " (:TERM NIL "method")
     " on the " (:TERM NIL "class") " " (:TYPEREF NIL "standard-object")
     " and " (:TERM NIL "methods") " on enough other " (:TERM NIL "classes")
     " so as to ensure that there is always an applicable "
     (:TERM NIL "method") ". Implementations are free to add "
     (:TERM NIL "methods") " for other " (:TERM NIL "classes")
     ". Users can write " (:TERM NIL "methods") " for "
     (:FUNREF NIL "describe-object") " for their own " (:TERM NIL "classes")
     " if they do not wish to inherit an implementation-supplied "
     (:TERM NIL "method") ". " :PAR (:TERM NIL "Methods") " on "
     (:FUNREF NIL "describe-object") " can recursively call "
     (:FUNREF NIL "describe")
     ". Indentation, depth limits, and circularity detection are all taken care of automatically, provided that each "
     (:TERM NIL "method") " handles exactly one level of structure and calls "
     (:FUNREF NIL "describe")
     " recursively if there are more structural levels. The consequences are undefined if this rule is not obeyed. "
     :PAR "In some implementations the " (:PARAM NIL "stream")
     " argument passed to a " (:FUNREF NIL "describe-object")
     " method is not the original " (:PARAM NIL "stream")
     ", but is an intermediate " (:TERM NIL "stream")
     " that implements parts of " (:FUNREF NIL "describe") ". "
     (:TERM NIL "Methods")
     " should therefore not depend on the identity of this "
     (:TERM NIL "stream") ". " :PAR
     (:COMMENT NIL "Output is sent to \\param{stream}. ") :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defclass spaceship ()
   ((captain :initarg :captain :accessor spaceship-captain)
    (serial# :initarg :serial-number :accessor spaceship-serial-number)))

 (defclass federation-starship (spaceship) ())

 (defmethod describe-object ((s spaceship) stream)
   (with-slots (captain serial#) s
     (format stream \"~&~S is a spaceship of type ~S,~
                     ~%with ~A at the helm ~
                       and with serial number ~D.~%\"
             s (type-of s) captain serial#)))

 (make-instance 'federation-starship
                :captain \"Rachel Garrett\"
                :serial-number \"NCC-1701-C\")
→ #<FEDERATION-STARSHIP 26312465>

 (describe *)
⊳ #<FEDERATION-STARSHIP 26312465> is a spaceship of type FEDERATION-STARSHIP,
⊳ with Rachel Garrett at the helm and with serial number NCC-1701-C.
→ "
      (:ANG NIL "no " (:TERM NIL "values")) "
")
     " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "describe") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "The same implementation techniques that are applicable to "
     (:FUNREF NIL "print-object") " are applicable to "
     (:FUNREF NIL "describe-object") ". " :PAR
     "The reason for making the return values for "
     (:FUNREF NIL "describe-object")
     " unspecified is to avoid forcing users to include explicit "
     (:TT NIL "(values)") " in all of their " (:TERM NIL "methods") ". "
     (:FUNREF NIL "describe") " takes care of that. " :PAR
     (:ENDISSUE NIL "DESCRIBE-UNDERSPECIFIED:DESCRIBE-OBJECT") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== TRACE" "%% ========== UNTRACE")
   (:COM (:NAME "trace, untrace" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "trace")
      (:ARGLIST NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "function-name"))))
      (:VALUES NIL "trace-result"))
     " "
     (:DEF (:KIND "macro") (:NAMES NIL "untrace")
      (:ARGLIST NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "function-name"))))
      (:VALUES NIL "untrace-result"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "FUNCTION-NAME:LARGE") " " (:PARAM NIL "function-name") "—a "
     (:TERM NIL "function name") ". " (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " "
     :PAR (:PARAM NIL "trace-result") "—"
     (:TERM NIL "implementation-dependent") ", unless no "
     (:PARAM NIL "function-names") " are supplied, "
     (:COMMENT NIL "% 25.3.0 6") "in which case " (:PARAM NIL "trace-result")
     " is a " (:TERM NIL "list") " of " (:TERM NIL "function names") ". " :PAR
     (:PARAM NIL "untrace-result") "—" (:TERM NIL "implementation-dependent")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "trace") " and "
     (:MACREF NIL "untrace") " control the invocation of the trace facility. "
     :PAR "Invoking " (:MACREF NIL "trace") " with one or more "
     (:PARAM NIL "function-names") " causes the denoted "
     (:TERM NIL "functions") " to be “traced.” Whenever a traced "
     (:TERM NIL "function")
     " is invoked, information about the call, about the arguments passed, and about any eventually returned values is printed to "
     (:TERM NIL "trace output") ". If " (:MACREF NIL "trace")
     " is used with no " (:PARAM NIL "function-names")
     ", no tracing action is performed; instead, a list of the "
     (:TERM NIL "functions") " currently being traced is returned. " :PAR
     (:COMMENT NIL "% 25.3.0 4") "Invoking " (:MACREF NIL "untrace")
     " with one or more function names causes those functions to be “untraced” ("
     (:I NIL "i.e.") ",  no longer traced). " (:COMMENT NIL "% 25.3.0 7") "If "
     (:MACREF NIL "untrace") " is used with no " (:PARAM NIL "function-names")
     ", all " (:TERM NIL "functions") " currently being traced are untraced. "
     :PAR "If a " (:TERM NIL "function") " to be traced has been open-coded ("
     (:I NIL "e.g.") ",  because it was declared " (:DECLREF NIL "inline")
     "), a call to that " (:TERM NIL "function")
     " might not produce trace output. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (defun fact (n) (if (zerop n) 1 (* n (fact (- n 1)))))
→ FACT
 (trace fact)
→ (FACT)
;; Of course, the format of traced output is implementation-dependent.
 (fact 3)
⊳ 1 Enter FACT 3
⊳ | 2 Enter FACT 2
⊳ |   3 Enter FACT 1
⊳ |   | 4 Enter FACT 0
⊳ |   | 4 Exit FACT 1
⊳ |   3 Exit FACT 1
⊳ | 2 Exit FACT 2
⊳ 1 Exit FACT 6
→ 6
")
     " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR
     "Might change the definitions of the " (:TERM NIL "functions")
     " named by " (:PARAM NIL "function-names") ". " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "Whether the functions named are defined or already being traced. " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL " addressed in the packages chapter.  --sjl 5 Mar 92"
      "\\issue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}"
      " The consequences are undefined if an \\term{external symbol} of"
      " \\thepackage{common-lisp} is"
      " used as a \\param{function-name} argument."
      "\\endissue{LISP-SYMBOL-REDEFINITION:MAR89-X3J13}")
     :PAR (:COMMENT NIL "% 25.3.0 5")
     "Tracing an already traced function, or untracing a function not currently being traced, should produce no harmful effects, but might signal a warning. "
     :PAR)
    (:PART (:NAME "See Also") " " :PAR (:VARREF NIL "*trace-output*") ", "
     (:MACREF NIL "step") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:COMMENT NIL "% 25.3.0 8")
     (:MACREF NIL "trace") " and " (:MACREF NIL "untrace")
     " may also accept additional " (:TERM NIL "implementation-dependent")
     " argument formats. The format of the trace output is "
     (:TERM NIL "implementation-dependent") ". " :PAR "Although "
     (:MACREF NIL "trace") " can be extended to permit non-standard options, "
     (:TERM NIL "implementations")
     " are nevertheless encouraged (but not required) to warn about the use of syntax or options that are neither specified by this standard nor added as an extension by the "
     (:TERM NIL "implementation")
     ", since they could be symptomatic of typographical errors or of reliance on features supported in "
     (:TERM NIL "implementations") " other than the current "
     (:TERM NIL "implementation") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== STEP")
   (:COM (:NAME "step" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "step") (:ARGLIST NIL "form")
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "form") "—a "
     (:TERM NIL "form") "; evaluated as described below. " :PAR
     (:PARAM NIL "results") "—the " (:TERM NIL "values") " returned by the "
     (:PARAM NIL "form") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:MACREF NIL "step")
     " implements a debugging paradigm wherein the programmer is allowed to "
     (:TERM NIL "step") " through the " (:TERM NIL "evaluation") " of a "
     (:TERM NIL "form") ". The specific nature of the interaction, "
     (:ISSUE NIL "EVALHOOK-STEP-CONFUSION:X3J13-NOV-89")
     " including which I/O streams are used and whether the stepping has lexical or dynamic scope, "
     (:ENDISSUE NIL "EVALHOOK-STEP-CONFUSION:X3J13-NOV-89") " is "
     (:TERM NIL "implementation-defined") ". " :PAR (:COMMENT NIL "% 25.3.0 9")
     (:ISSUE NIL "STEP-ENVIRONMENT:CURRENT") " " (:MACREF NIL "step")
     " evaluates " (:PARAM NIL "form") " in the current "
     (:TERM NIL "environment") ". A call to " (:MACREF NIL "step")
     " can be compiled, but it is acceptable for an implementation to interactively step through only those parts of the computation that are interpreted. "
     (:ENDISSUE NIL "STEP-ENVIRONMENT:CURRENT") " " :PAR
     (:ISSUE NIL "STEP-MINIMAL:PERMIT-PROGN")
     " It is technically permissible for a "
     (:TERM NIL "conforming implementation")
     " to take no action at all other than normal " (:TERM NIL "execution")
     " of the " (:PARAM NIL "form") ". In such a situation, "
     (:TT NIL "(step " (:I NIL "form") ")") " is equivalent to, for example, "
     (:TT NIL "(let () " (:I NIL "form") ")")
     ". In implementations where this is the case, the associated documentation should mention that fact. "
     (:ENDISSUE NIL "STEP-MINIMAL:PERMIT-PROGN") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " "
     (:COMMENT NIL "% clean-up item in progress here."
      "% Could be bindings of streams to which i/o occurs, current"
      "% dynamic environment, lexical too?")
     :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:MACREF NIL "trace") " " :PAR
     (:ISSUE NIL "EVALHOOK-STEP-CONFUSION:X3J13-NOV-89") " "
     (:COMMENT NIL "\\varref{*evalhook*}, \\varref{*applyhook*}.")
     (:ENDISSUE NIL "EVALHOOK-STEP-CONFUSION:X3J13-NOV-89") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR (:TERM NIL "Implementations")
     " are encouraged to respond to the typing of " (:TT NIL "?")
     " or the pressing of a “help key” by providing help including a list of commands. "
     :PAR (:ISSUE NIL "EVALHOOK-STEP-CONFUSION:X3J13-NOV-89") " "
     (:COMMENT NIL " %% 20.1.0 9"
      " The \\macref{step} facility can be implemented using the \\varref{*evalhook*}"
      " and \\varref{*applyhook*} features.")
     (:ENDISSUE NIL "EVALHOOK-STEP-CONFUSION:X3J13-NOV-89") " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== TIME")
   (:COM (:NAME "time" :FTYPE "Macro")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "macro") (:NAMES NIL "time") (:ARGLIST NIL "form")
      (:VALUES NIL (:STAR NIL (:CURLY NIL (:PARAM NIL "result")))))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "form") "—a "
     (:TERM NIL "form") "; evaluated as described below. " :PAR
     (:PARAM NIL "results") "—the " (:TERM NIL "values") " returned by the "
     (:PARAM NIL "form") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:ISSUE NIL "STEP-ENVIRONMENT:CURRENT") " " (:MACREF NIL "time")
     " evaluates " (:PARAM NIL "form") " in the current "
     (:TERM NIL "environment") " (lexical and dynamic). A call to "
     (:MACREF NIL "time") " can be compiled. "
     (:ENDISSUE NIL "STEP-ENVIRONMENT:CURRENT") " " :PAR (:MACREF NIL "time")
     " prints various timing data and other information to "
     (:TERM NIL "trace output")
     ". The nature and format of the printed information is "
     (:TERM NIL "implementation-defined")
     ". Implementations are encouraged to provide such information as elapsed real time, machine run time, and storage management statistics. "
     :PAR
     (:COMMENT NIL "%% 25.3.0 10" "\\funref{time} evaluates \\param{form}.")
     :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "The accuracy of the results depends, among other things, on the accuracy of the corresponding functions provided by the underlying operating system. "
     :PAR
     "The magnitude of the results may depend on the hardware, the operating system, the lisp implementation, and the state of the global environment. Some specific issues which frequently affect the outcome are hardware speed, nature of the scheduler (if any), number of competing processes (if any), system paging, whether the call is interpreted or compiled, whether functions called are compiled, the kind of garbage collector involved and whether it runs, whether internal data structures (e.g., hash tables) are implicitly reorganized, "
     (:I NIL "etc.") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "get-internal-real-time")
     ", " (:FUNREF NIL "get-internal-run-time") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "In general, these timings are not guaranteed to be reliable enough for marketing comparisons. Their value is primarily heuristic, for tuning purposes. "
     :PAR
     "For useful background information on the complicated issues involved in interpreting timing results, see "
     (:BIB
      (:URL "https://archive.org/details/performanceevalu0000gabr" :DOI
       "10.7551/mitpress/5298.001.0001" :ISBN "9780262070935")
      "Performance and Evaluation of Lisp Programs")
     ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== INTERNAL-TIME-UNITS-PER-SECOND")
   (:COM (:NAME "internal-time-units-per-second" :FTYPE "Constant Variable")
    (:PART (:NAME "Constant Value") " " :PAR "A positive "
     (:TERM NIL "integer") ", the magnitude of which is "
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The number of "
     (:TERM NIL "internal time units") " in one second. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "get-internal-run-time")
     ", " (:FUNREF NIL "get-internal-real-time") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:COMMENT NIL
      "Shouldn't this be in the glossary with the definition of internal time unit? -kmp")
     "These units form the basis of the Internal Time format representation. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== GET-INTERNAL-REAL-TIME")
   (:COM (:NAME "get-internal-real-time" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "get-internal-real-time")
      (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments")))
      (:VALUES NIL "internal-time"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "internal-time")
     "—a non-negative " (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 25.4.1 23")
     (:FUNREF NIL "get-internal-real-time") " returns as an "
     (:TERM NIL "integer") " the current time in "
     (:TERM NIL "internal time units")
     ", relative to an arbitrary time base. The difference between the values of two calls to this function is the amount of elapsed real time ("
     (:I NIL "i.e.") ",  clock time) between the two calls. " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "Time of day (" (:I NIL "i.e.")
     ",  the passage of time). The time base affects the result magnitude. "
     :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:CONREF NIL "internal-time-units-per-second") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== GET-INTERNAL-RUN-TIME")
   (:COM (:NAME "get-internal-run-time" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "get-internal-run-time")
      (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments")))
      (:VALUES NIL "internal-time"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "internal-time")
     "—a non-negative " (:TERM NIL "integer") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 25.4.1 22")
     "Returns as an " (:TERM NIL "integer") " the current run time in "
     (:TERM NIL "internal time units")
     ". The precise meaning of this quantity is "
     (:TERM NIL "implementation-defined")
     "; it may measure real time, run time, CPU cycles, or some other quantity. The intent is that the difference between the values of two calls to this function be the amount of time between the two calls during which computational effort was expended on behalf of the executing program. "
     :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The " (:TERM NIL "implementation")
     ", the time of day (" (:I NIL "i.e.") ",  the passage of time). " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:CONREF NIL "internal-time-units-per-second") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR "Depending on the "
     (:TERM NIL "implementation")
     ", paging time and garbage collection time might be included in this measurement. Also, in a multitasking environment, it might not be possible to show the time for just the running process, so in some "
     (:TERM NIL "implementations")
     ", time taken by other processes during the same time interval might be included in this measurement as well. "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== DISASSEMBLE")
   (:COM (:NAME "disassemble" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "disassemble") (:ARGLIST NIL "fn")
      (:VALUES NIL (:MISC NIL "nil")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "FUNCTION-NAME:LARGE") " " (:PARAM NIL "fn") "—an "
     (:TERM NIL "extended function designator") " or a "
     (:TERM NIL "lambda expression") ". " (:ENDISSUE NIL "FUNCTION-NAME:LARGE")
     " " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "function") " "
     (:FUNREF NIL "disassemble")
     " is a debugging aid that composes symbolic instructions or expressions in some "
     (:TERM NIL "implementation-dependent")
     " language which represent the code used to produce the "
     (:TERM NIL "function") " which is or is named by the argument "
     (:PARAM NIL "fn") ". The result is displayed to "
     (:TERM NIL "standard output") " in an "
     (:TERM NIL "implementation-dependent") " format. " :PAR "If "
     (:PARAM NIL "fn") " is a " (:TERM NIL "lambda expression") " or "
     (:TERM NIL "interpreted function")
     ", it is compiled first and the result is disassembled. " :PAR "If the "
     (:PARAM NIL "fn") " " (:TERM NIL "designator") " is a "
     (:TERM NIL "function name") ", the " (:TERM NIL "function") " that it "
     (:TERM NIL "names") " is disassembled. "
     (:ISSUE NIL "DISASSEMBLE-SIDE-EFFECT:DO-NOT-INSTALL") " (If that "
     (:TERM NIL "function") " is an " (:TERM NIL "interpreted function")
     ", it is first compiled but the result of this implicit compilation is not installed.) "
     (:ENDISSUE NIL "DISASSEMBLE-SIDE-EFFECT:DO-NOT-INSTALL") " " :PAR)
    (:PART (:NAME "Examples") " "
     (:ISSUE NIL "DISASSEMBLE-SIDE-EFFECT:DO-NOT-INSTALL") " "
     (:CODE NIL " (defun f (a) (1+ a)) → F
 (eq (symbol-function 'f)
     (progn (disassemble 'f)
            (symbol-function 'f))) → "
      (:TERM NIL "true") "
")
     " " (:ENDISSUE NIL "DISASSEMBLE-SIDE-EFFECT:DO-NOT-INSTALL") " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*standard-output*")
     ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     "Should signal an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "type-error") " if " (:PARAM NIL "fn") " is not an "
     (:TERM NIL "extended function designator") " or a "
     (:TERM NIL "lambda expression") ". " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:ISSUE NIL "DOCUMENTATION-FUNCTION-TANGLED:REQUIRE-ARGUMENT") " "
   :PAR
   (:COMMENT NIL "%% ========== COMPILER-MACRO" "%% ========== FUNCTION"
    "%% ========== METHOD-COMBINATION" "%% ========== SETF"
    "%% ========== STRUCTURE" "%% ========== TYPE" "%% ========== VARIABLE"
    "%% ========== DOCUMENTATION" "%% ========== (SETF DOCUMENTATION)")
   (:COM
    (:NAME "documentation, (setf documentation)" :FTYPE
     "Standard Generic Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "generic-function") (:NAMES NIL "documentation")
      (:ARGLIST NIL "x doc-type") (:VALUES NIL "documentation"))
     " " :PAR
     (:DEF (:KIND "generic-function") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL "new-value x doc-type") (:VALUES NIL "new-value"))
     " " :PAR)
    (:PART (:NAME "Argument Precedence Order") " " :PAR (:PARAM NIL "doc-type")
     ", " (:PARAM NIL "object") " " :PAR)
    (:PART (:NAME "Method Signatures") " " :PAR " " :PAR
     (:COMMENT NIL
      " I fixed a bunch of font-o's and formatting inconsistencies, and reordered"
      " all the methods into something a little less confusing.  --sjl 7 Mar 92")
     :PAR (:ISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " "
     (:COMMENT NIL "Signature for STANDARD-SLOT-DESCRIPTION removed.") :PAR
     (:B NIL " Functions, Macros, and Special Forms:") :PAR " "
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "function"))
       " " (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 't)"))))
     (:IDXREF NIL "t") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "function"))
       " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 'function)"))))
     (:IDXREF NIL "function") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "list")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 'function)"))))
     (:IDXREF NIL "function") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "list")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " "
        (:TT NIL "(eql 'compiler-macro)"))))
     (:IDXREF NIL "compiler-macro") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "symbol"))
       " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 'function)"))))
     (:IDXREF NIL "function") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "symbol"))
       " "
       (:PAREN NIL (:PARAM NIL "doc-type") " "
        (:TT NIL "(eql 'compiler-macro)"))))
     (:IDXREF NIL "compiler-macro") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "symbol"))
       " " (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 'setf)"))))
     (:IDXREF NIL "setf") :PAR :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "function")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 't)"))))
     (:IDXREF NIL "t") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "function")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 'function)"))))
     (:IDXREF NIL "function") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "list")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 'function)"))))
     (:IDXREF NIL "function") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "list")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " "
        (:TT NIL "(eql 'compiler-macro)"))))
     (:IDXREF NIL "compiler-macro") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "symbol")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 'function)"))))
     (:IDXREF NIL "function") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "symbol")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " "
        (:TT NIL "(eql 'compiler-macro)"))))
     (:IDXREF NIL "compiler-macro") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "symbol")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 'setf)"))))
     (:IDXREF NIL "setf") :PAR :PAR " " :PAR (:B NIL " Method Combinations:")
     :PAR " "
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "method-combination"))
       " " (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 't)"))))
     (:IDXREF NIL "t") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "method-combination"))
       " "
       (:PAREN NIL (:PARAM NIL "doc-type") " "
        (:TT NIL "(eql 'method-combination)"))))
     (:IDXREF NIL "method-combination") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "symbol"))
       " "
       (:PAREN NIL (:PARAM NIL "doc-type") " "
        (:TT NIL "(eql 'method-combination)"))))
     (:IDXREF NIL "method-combination") :PAR :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "method-combination"))
       " " (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 't)"))))
     (:IDXREF NIL "t") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "method-combination"))
       " "
       (:PAREN NIL (:PARAM NIL "doc-type") " "
        (:TT NIL "(eql 'method-combination)"))))
     (:IDXREF NIL "method-combination") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "symbol")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " "
        (:TT NIL "(eql 'method-combination)"))))
     (:IDXREF NIL "method-combination") :PAR :PAR " " :PAR (:B NIL " Methods:")
     :PAR " "
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "standard-method")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 't)"))))
     (:IDXREF NIL "t") :PAR :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "standard-method")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 't)"))))
     (:IDXREF NIL "t") :PAR :PAR " " :PAR (:B NIL " Packages:") :PAR " "
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "package"))
       " " (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 't)"))))
     (:IDXREF NIL "t") :PAR :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "package")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 't)"))))
     (:IDXREF NIL "t") :PAR :PAR " " :PAR
     (:B NIL " Types, Classes, and Structure Names:") :PAR " "
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "standard-class")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 't)"))))
     (:IDXREF NIL "t") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "standard-class")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 'type)"))))
     (:IDXREF NIL "type") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "structure-class")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 't)"))))
     (:IDXREF NIL "t") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "structure-class")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 'type)"))))
     (:IDXREF NIL "type") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "symbol"))
       " " (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 'type)"))))
     (:IDXREF NIL "type") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "symbol"))
       " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 'structure)"))))
     (:IDXREF NIL "structure") :PAR :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "standard-class")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 't)"))))
     (:IDXREF NIL "t") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "standard-class")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 'type)"))))
     (:IDXREF NIL "type") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "structure-class")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 't)"))))
     (:IDXREF NIL "t") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "structure-class")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 'type)"))))
     (:IDXREF NIL "type") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "symbol")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 'type)"))))
     (:IDXREF NIL "type") :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "symbol")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 'structure)"))))
     (:IDXREF NIL "structure") :PAR :PAR " " :PAR (:B NIL " Variables:") :PAR
     " "
     (:DEF (:KIND "method") (:NAMES NIL "documentation")
      (:ARGLIST NIL (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "symbol"))
       " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 'variable)"))))
     (:IDXREF NIL "variable") :PAR :PAR
     (:DEF (:KIND "method") (:NAMES NIL "(setf documentation)")
      (:ARGLIST NIL (:PARAM NIL "new-value") " "
       (:PAREN NIL (:PARAM NIL "x") " " (:TYPEREF NIL "symbol")) " "
       (:PAREN NIL (:PARAM NIL "doc-type") " " (:TT NIL "(eql 'variable)"))))
     (:IDXREF NIL "variable") :PAR :PAR " " :PAR
     (:ENDISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " " (:PARAM NIL "x") "—an "
     (:TERM NIL "object") ". "
     (:COMMENT NIL
      "% Removed the detail here because it is implied by the signatures above."
      "  This leaves room more naturally for implementation-defined extension. -kmp 2-Sep-91"
      "           a \\term{symbol}," " 	    a \\term{list}, "
      " 	    a \\term{method}," " 	    a \\term{class}, "
      " 	    a \\term{package}," " 	    a \\term{function}, "
      " 	 or a \\term{method combination} \\term{object}."
      " %	 or a slot-description \\term{object}.")
     (:ENDISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " " :PAR
     (:PARAM NIL "doc-type") "—a " (:TERM NIL "symbol") ". "
     (:COMMENT NIL
      "% Per issue DOCUMENTATION-FUNCTION-TANGLED, this has been simplified."
      " If \\param{x} is a \\term{symbol} or a \\term{list},"
      "  \\param{doc-type} must be one of"
      "  \\issue{DOCUMENTATION-FUNCTION-BUGS:FIX}"
      "         \\misc{compiler-macro},"
      "  \\endissue{DOCUMENTATION-FUNCTION-BUGS:FIX}"
      "         \\misc{function}," "         \\misc{method-combination},"
      "         \\misc{setf}, " "         \\misc{structure},"
      "         \\misc{type}," "      or \\misc{variable};"
      "  otherwise, \\param{doc-type} must not be supplied.")
     :PAR (:PARAM NIL "documentation") "—a " (:TERM NIL "string") ", or "
     (:MISC NIL "nil") ". " :PAR (:PARAM NIL "new-value") "—a "
     (:TERM NIL "string") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR "The " (:TERM NIL "generic function")
     " " (:FUNREF NIL "documentation") " returns the "
     (:TERM NIL "documentation string") " associated with the given "
     (:TERM NIL "object") " if it is available; otherwise it returns "
     (:MISC NIL "nil") ". " :PAR "The " (:TERM NIL "generic function") " "
     (:FUNREF NIL "(setf documentation)") " updates the "
     (:TERM NIL "documentation string") " associated with " (:PARAM NIL "x")
     " to " (:PARAM NIL "new-value") ". If " (:PARAM NIL "x") " is a "
     (:TERM NIL "list") ", it must be of the form "
     (:TT NIL "(setf " (:PARAM NIL "symbol") ")") ". " :PAR
     (:TERM NIL "Documentation strings")
     " are made available for debugging purposes. "
     (:TERM NIL "Conforming programs") " are permitted to use "
     (:TERM NIL "documentation strings")
     " when they are present, but should not depend for their correct behavior on the presence of those "
     (:TERM NIL "documentation strings") ". An " (:TERM NIL "implementation")
     " is permitted to discard " (:TERM NIL "documentation strings")
     " at any time for " (:TERM NIL "implementation-defined") " reasons. " :PAR
     (:COMMENT NIL
      " For those situations where a \\param{doc-type} argument is permitted,")
     "The nature of the " (:TERM NIL "documentation string")
     " returned depends on the " (:PARAM NIL "doc-type") ", as follows: " :PAR
     (:COMMENT NIL " I alphabetized this list.  --sjl 7 Mar 92") :PAR
     (:LIST NIL
      (:ITEM NIL (:MISC NIL "compiler-macro") " " :PAR "Returns the "
       (:TERM NIL "documentation string") " of the "
       (:TERM NIL "compiler macro") " whose " (:TERM NIL "name") " is the "
       (:TERM NIL "function name") " " (:PARAM NIL "x") ". "
       (:ENDISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " " :PAR)
      (:ITEM NIL (:MISC NIL "function") " " :PAR "If " (:PARAM NIL "x")
       " is a " (:TERM NIL "function name") ", returns the "
       (:TERM NIL "documentation string") " of the " (:TERM NIL "function")
       ", " (:TERM NIL "macro") ", or " (:TERM NIL "special operator")
       " whose " (:TERM NIL "name") " is " (:PARAM NIL "x") ". " :PAR "If "
       (:PARAM NIL "x") " is a " (:TERM NIL "function") ", returns the "
       (:TERM NIL "documentation string") " associated with " (:PARAM NIL "x")
       ". " :PAR)
      (:ITEM NIL (:MISC NIL "method-combination") " " :PAR "If "
       (:PARAM NIL "x") " is a " (:TERM NIL "symbol") ", returns the "
       (:TERM NIL "documentation string") " of the "
       (:TERM NIL "method combination") " whose " (:TERM NIL "name") " is "
       (:PARAM NIL "x") ". " :PAR "If " (:PARAM NIL "x") " is a "
       (:TERM NIL "method combination") ", returns the "
       (:TERM NIL "documentation string") " associated with " (:PARAM NIL "x")
       ". " :PAR)
      (:ITEM NIL (:MISC NIL "setf") " " :PAR "Returns the "
       (:TERM NIL "documentation string") " of "
       (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " the "
       (:TERM NIL "setf expander") " "
       (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " whose "
       (:TERM NIL "name") " is the " (:TERM NIL "symbol") " " (:PARAM NIL "x")
       ". " :PAR)
      (:ITEM NIL (:MISC NIL "structure") " " :PAR
       (:COMMENT NIL "!!! wording??") "Returns the "
       (:TERM NIL "documentation string") " associated with the "
       (:TERM NIL "structure name") " " (:PARAM NIL "x") ". " :PAR)
      (:ITEM NIL (:MISC NIL "t") " " :PAR
       (:COMMENT NIL
        " added introductory text for this next list  --sjl 7 Mar 92")
       "Returns a " (:TERM NIL "documentation string") " specialized on the "
       (:TERM NIL "class") " of the argument " (:PARAM NIL "x")
       " itself. For example, if " (:PARAM NIL "x") " is a "
       (:TERM NIL "function") ", the " (:TERM NIL "documentation string")
       " associated with the " (:TERM NIL "function") " " (:PARAM NIL "x")
       " is returned. " :PAR
       (:COMMENT NIL " \\beginlist" " " " \\itemitem{\\typeref{function}}" " "
        " Returns the \\term{documentation string} associated with"
        " the \\term{function} \\param{x}." " "
        " \\itemitem{\\typeref{method-combination}}" " "
        " Returns the \\term{documentation string} associated with"
        " the \\term{method combination} \\param{x}." " "
        " \\itemitem{\\typeref{package}}" " "
        " Returns the \\term{documentation string} associated with"
        " the \\term{package} \\param{x}." " "
        " \\itemitem{\\typeref{standard-class} or \\typeref{structure-class}}"
        " " " Returns the \\term{documentation string} associated with"
        " the \\term{class} \\param{x}." " "
        " \\itemitem{\\typeref{standard-method}}" " "
        " Returns the \\term{documentation string} associated with"
        " the \\term{method} \\param{x}." " " " \\endlist ")
       :PAR)
      (:ITEM NIL (:MISC NIL "type") " " :PAR "If " (:PARAM NIL "x") " is a "
       (:TERM NIL "symbol") ", returns the " (:TERM NIL "documentation string")
       " of the " (:TERM NIL "class") " whose " (:TERM NIL "name") " is the "
       (:TERM NIL "symbol") " " (:PARAM NIL "x") ", if there is such a "
       (:TERM NIL "class") ". Otherwise, it returns the "
       (:TERM NIL "documentation string") " of the " (:TERM NIL "type")
       " which is the " (:TERM NIL "type specifier") " " (:TERM NIL "symbol")
       " " (:PARAM NIL "x") ". " :PAR "If " (:PARAM NIL "x") " is a "
       (:TERM NIL "structure class") " or " (:TERM NIL "standard class")
       ", returns the " (:TERM NIL "documentation string")
       " associated with the " (:TERM NIL "class") " " (:PARAM NIL "x") ". "
       :PAR)
      (:ITEM NIL (:MISC NIL "variable") " " :PAR "Returns the "
       (:TERM NIL "documentation string") " of the "
       (:TERM NIL "dynamic variable") " or " (:TERM NIL "constant variable")
       " whose " (:TERM NIL "name") " is the " (:TERM NIL "symbol") " "
       (:PARAM NIL "x") ". " :PAR))
     " " :PAR
     (:COMMENT NIL " An implementation may extend the set of \\term{symbols} "
      " that are acceptable as the \\param{doc-type}."
      " If a \\term{symbol} is not recognized as an acceptable \\param{doc-type}"
      " by the \\term{implementation}, an error must be signaled."
      " \\editornote{KMP: Can't the user extend this, too, via methods?}%!!!"
      "% Rewrite per Moon's instructions:")
     "A " (:TERM NIL "conforming implementation") " or a "
     (:TERM NIL "conforming program") " may extend the set of "
     (:TERM NIL "symbols") " that are acceptable as the "
     (:PARAM NIL "doc-type") ". "
     (:COMMENT NIL
      "% This info should follow from the normal rules of method dispatching."
      "% No need to risk making it more complicated. -kmp 21-Aug-93"
      "If \\param{doc-type} is not recognized, an error is signaled.")
     :PAR
     (:COMMENT NIL " %Moon: This is useless and should be removed."
      " %KMP: Done. 1-Feb-92"
      " For those situations where a \\param{doc-type} argument is not permitted,"
      " the nature of the \\term{documentation string} returned depends on the"
      " \\term{type} of the \\term{object} \\param{x}.")
     :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR
     (:COMMENT NIL
      "% All of this should follow from normal method dispatch now.  Let's not beat"
      "% people over the head with a restatement of what should already be apparent,"
      "% and also risk that we've said it in some way that's hard to implement. -kmp 21-Aug-93"
      " If \\param{x} is" "      a \\term{method} \\term{object}, "
      "      a \\term{class} \\term{object},"
      " \\issue{DOCUMENTATION-FUNCTION-BUGS:FIX}"
      "      a \\term{package} \\term{object},"
      "      a \\term{function} \\term{object}, "
      " \\endissue{DOCUMENTATION-FUNCTION-BUGS:FIX}"
      "   or a \\term{method combination} \\term{object},"
      " \\issue{DOCUMENTATION-FUNCTION-BUGS:FIX}"
      " % or a slot description \\term{object},"
      " \\endissue{DOCUMENTATION-FUNCTION-BUGS:FIX}"
      " the second argument must not be supplied, "
      " or else an error \\oftype{program-error} is signaled." "  "
      " If a \\term{symbol} is not recognized as an acceptable \\param{doc-type} argument by the"
      " \\term{implementation}, an error \\oftype{error} is signaled.")
     :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:ISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX")
     " This standard prescribes no means to retrieve the "
     (:TERM NIL "documentation strings")
     " for individual slots specified in a " (:MACREF NIL "defclass")
     " form, but " (:TERM NIL "implementations")
     " might still provide debugging tools and/or programming language extensions which manipulate this information. Implementors wishing to provide such support are encouraged to consult the "
     (:TERM NIL "Metaobject Protocol")
     " for suggestions about how this might be done. "
     (:ENDISSUE NIL "DOCUMENTATION-FUNCTION-BUGS:FIX") " " :PAR))
   " " :PAR (:ENDISSUE NIL "DOCUMENTATION-FUNCTION-TANGLED:REQUIRE-ARGUMENT")
   " " :PAR
   (:COMMENT NIL "-------------------- Storage System --------------------")
   :PAR (:COMMENT NIL "%% ========== ROOM")
   (:COM (:NAME "room" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "room")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " x")
      (:VALUES NIL (:TERM NIL "implementation-dependent")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "x") "—one of "
     (:MISC NIL "t") ", " (:MISC NIL "nil") ", or " (:KWD NIL "default") ". "
     :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 25.3.0 15")
     (:FUNREF NIL "room") " prints, to " (:TERM NIL "standard output")
     ", information about the state of internal storage and its management. This might include descriptions of the amount of memory in use and the degree of memory compaction, possibly broken down by internal data type if that is appropriate. The nature and format of the printed information is "
     (:TERM NIL "implementation-dependent")
     ". The intent is to provide information that a " (:TERM NIL "programmer")
     " might use to tune a " (:TERM NIL "program") " for a particular "
     (:TERM NIL "implementation") ". " :PAR (:COMMENT NIL "% 25.3.0 16")
     (:TT NIL "(room nil)") " prints out a minimal amount of information. "
     (:TT NIL "(room t)") " prints out a maximal amount of information. "
     (:ISSUE NIL "ROOM-DEFAULT-ARGUMENT:NEW-VALUE") " " (:TT NIL "(room)")
     " or " (:TT NIL "(room :default)")
     " prints out an intermediate amount of information that is likely to be useful. "
     (:ENDISSUE NIL "ROOM-DEFAULT-ARGUMENT:NEW-VALUE") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR "Output to "
     (:TERM NIL "standard output") ". " :PAR)
    (:PART (:NAME "Affected By") " " :PAR (:VARREF NIL "*standard-output*")
     ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "-------------------- Browsing Editing --------------------")
   :PAR (:COMMENT NIL "%% ========== ED")
   (:COM (:NAME "ed" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "ed")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " x")
      (:VALUES NIL (:TERM NIL "implementation-dependent")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR
     (:ISSUE NIL "FUNCTION-NAME:LARGE") " " (:PARAM NIL "x") "—"
     (:MISC NIL "nil") ", a " (:TERM NIL "pathname") ", a "
     (:TERM NIL "string") ", or a " (:TERM NIL "function name") ". "
     (:ENDISSUE NIL "FUNCTION-NAME:LARGE") " The default is " (:MISC NIL "nil")
     ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 25.3.0 17")
     (:FUNREF NIL "ed") " invokes the editor if the "
     (:TERM NIL "implementation") " provides a resident editor. " :PAR
     (:COMMENT NIL "% 25.3.0 18") "If " (:PARAM NIL "x") " is "
     (:MISC NIL "nil")
     ", the editor is entered. If the editor had been previously entered, its prior state is resumed, if possible. "
     :PAR (:COMMENT NIL "% 25.3.0 19") "If " (:PARAM NIL "x") " is a "
     (:TERM NIL "pathname") " or " (:TERM NIL "string") ", it is taken as the "
     (:TERM NIL "pathname designator") " for a " (:TERM NIL "file")
     " to be edited. " :PAR (:COMMENT NIL "% 25.3.0 20                       ")
     "If " (:PARAM NIL "x") " is a " (:TERM NIL "function name")
     ", the text of its definition is edited. The means by which the function text is obtained is "
     (:TERM NIL "implementation-defined") ". " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:COMMENT NIL
      " I changed this from \"implicitly vague\" to \"explicitly vauge\" since CLtL doesn't"
      " say and since Sandra felt this should be explicit. -kmp 9-Jan-92")
     "The consequences are undefined if the " (:TERM NIL "implementation")
     " does not provide a resident editor. " :PAR "Might signal "
     (:TYPEREF NIL "type-error") " if its argument is supplied but is not a "
     (:TERM NIL "symbol") ", a " (:TERM NIL "pathname") ", or "
     (:MISC NIL "nil") ". " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR")
     " If a failure occurs when performing some operation on the "
     (:TERM NIL "file system") " while attempting to edit a "
     (:TERM NIL "file") ", an error of " (:TERM NIL "type") " "
     (:TYPEREF NIL "file-error") " is signaled. "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error")
     " might be signaled if " (:PARAM NIL "x") " is a "
     (:TERM NIL "designator") " for a " (:TERM NIL "wild") " "
     (:TERM NIL "pathname") ". "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR
     (:TERM NIL "Implementation-dependent")
     " additional conditions might be signaled as well. " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:TYPEREF NIL "pathname") ", "
     (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " " (:TYPEREF NIL "logical-pathname")
     ", " (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " "
     (:FUNREF NIL "compile-file") ", " (:FUNREF NIL "load") ", "
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR
     (:ISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
     (:COMMENT NIL " \\issue{PATHNAME-LOGICAL:ADD}"
      " Whether \\funref{ed} recognizes \\term{logical pathname} \\term{namestrings}"
      " is \\term{implementation-defined}."
      " \\endissue{PATHNAME-LOGICAL:ADD}")
     (:ENDISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
     :PAR))
   " " :PAR (:COMMENT NIL "%% ========== INSPECT")
   (:COM (:NAME "inspect" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:ISSUE NIL "RETURN-VALUES-UNSPECIFIED:SPECIFY") " "
     (:DEF (:KIND "function") (:NAMES NIL "inspect") (:ARGLIST NIL "object")
      (:VALUES NIL (:TERM NIL "implementation-dependent")))
     " " (:ENDISSUE NIL "RETURN-VALUES-UNSPECIFIED:SPECIFY") " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "object") "—an "
     (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 25.3.0 14")
     (:FUNREF NIL "inspect") " is an interactive version of "
     (:FUNREF NIL "describe") ". The nature of the interaction is "
     (:TERM NIL "implementation-dependent") ", but the purpose of "
     (:FUNREF NIL "inspect")
     " is to make it easy to wander through a data structure, examining and modifying parts of it. "
     :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Side Effects") " " :PAR
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "describe") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "Implementations are encouraged to respond to the typing of "
     (:TT NIL "?")
     " or a “help key” by providing help, including a list of commands. "
     :PAR))
   " " :PAR
   (:COMMENT NIL
    "-------------------- Read-Eval-Print Loop --------------------")
   :PAR (:COMMENT NIL "%% ========== DRIBBLE")
   (:COM (:NAME "dribble" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "dribble")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " pathname")
      (:VALUES NIL (:TERM NIL "implementation-dependent")))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "pathname")
     "—a " (:TERM NIL "pathname designator") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 25.3.0 21") :PAR
     "Either " (:TERM NIL "binds") " " (:VARREF NIL "*standard-input*") " and "
     (:VARREF NIL "*standard-output*")
     " or takes other appropriate action, so as to send a record of the input/output interaction to a file named by "
     (:PARAM NIL "pathname") ". " (:FUNREF NIL "dribble")
     " is intended to create a readable record of an interactive session. "
     :PAR (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " If " (:PARAM NIL "pathname")
     " is a " (:TERM NIL "logical pathname")
     ", it is translated into a physical pathname as if by calling "
     (:FUNREF NIL "translate-logical-pathname") ". "
     (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " " :PAR
     (:COMMENT NIL "% 25.3.0 22") (:TT NIL "(dribble)")
     " terminates the recording of input and output and closes the dribble file. "
     :PAR (:ISSUE NIL "JUN90-TRIVIAL-ISSUES:25") " "
     (:COMMENT NIL
      "Actually, the cleanup said \"consequences are unspecified\", but I wasn't happy with that,"
      "so I made the implementation have to tell you what would happen.")
     "If " (:FUNREF NIL "dribble") " is " (:TERM NIL "called") " while a "
     (:TERM NIL "stream") " to a “dribble file” is still open from a previous "
     (:TERM NIL "call") " to " (:FUNREF NIL "dribble") ", the effect is "
     (:TERM NIL "implementation-defined") ". For example, the already-"
     (:TERM NIL "open") " " (:TERM NIL "stream") " might be "
     (:TERM NIL "closed") ", or dribbling might occur both to the old "
     (:TERM NIL "stream") " and to a new one, or the old " (:TERM NIL "stream")
     " might stay open but not receive any further output, or the new request might be ignored, or some other action might be taken. "
     (:ENDISSUE NIL "JUN90-TRIVIAL-ISSUES:25") " " :PAR)
    (:PART (:NAME "Examples" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The " (:TERM NIL "implementation")
     ". " :PAR)
    (:PART (:NAME "Exceptional Situations") " " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR")
     " If a failure occurs when performing some operation on the "
     (:TERM NIL "file system") " while creating the dribble file, an error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error") " is signaled. "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR
     (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " An error of "
     (:TERM NIL "type") " " (:TYPEREF NIL "file-error")
     " might be signaled if " (:PARAM NIL "pathname") " is a "
     (:TERM NIL "designator") " for a " (:TERM NIL "wild") " "
     (:TERM NIL "pathname") ". "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "See Also") " " :PAR
     (:COMMENT NIL
      " This used to say the following, but Sandra thought it was bogus."
      " I tend to agree.  People can cross-reference through \"pathname designator\". -kmp 9-Jan-92"
      " \\typeref{pathname}," " \\issue{PATHNAME-LOGICAL:ADD}"
      " \\typeref{logical-pathname}" " \\endissue{PATHNAME-LOGICAL:ADD}")
     :PAR (:ISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " "
     (:SECREF NIL :PATHNAMES-AS-FILENAMES) " "
     (:ENDISSUE NIL "FILE-OPEN-ERROR:SIGNAL-FILE-ERROR") " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:ISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
     (:COMMENT NIL " \\issue{PATHNAME-LOGICAL:ADD}"
      " Whether \\funref{dribble} recognizes \\term{logical pathname} \\term{namestrings}"
      " is \\term{implementation-defined}."
      " \\endissue{PATHNAME-LOGICAL:ADD}")
     (:ENDISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
     :PAR (:FUNREF NIL "dribble") " can return before subsequent "
     (:TERM NIL "forms")
     " are executed. It also can enter a recursive interaction loop, returning only when "
     (:TT NIL "(dribble)") " is done. " :PAR (:ISSUE NIL "DRIBBLE-TECHNIQUE")
     " " (:FUNREF NIL "dribble")
     " is intended primarily for interactive debugging; its effect cannot be relied upon when used in a program. "
     (:ENDISSUE NIL "DRIBBLE-TECHNIQUE") " "))
   " " :PAR (:COMMENT NIL "%% ========== - (Variable)")
   (:COM (:NAME "-" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "form") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 20.2.0 6") :PAR
     "The " (:TERM NIL "value") " of " (:VARREF NIL "-") " is the "
     (:TERM NIL "form") " that is currently being evaluated by the "
     (:TERM NIL "Lisp read-eval-print loop") ". " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL "(format t \"~&Evaluating ~S~%\" -)
⊳ Evaluating (FORMAT T \"~&Evaluating ~S~%\" -)
→ NIL
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     (:TERM NIL "Lisp read-eval-print loop") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "+") " ("
     (:TERM NIL "variable") "), " (:FUNREF NIL "*") " (" (:TERM NIL "variable")
     "), " (:FUNREF NIL "/") " (" (:TERM NIL "variable") "), "
     (:SECREF NIL :TOP-LEVEL-LOOP) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== + (Variable)" "%% ========== ++ (Variable)"
    "%% ========== +++ (Variable)")
   (:COM (:NAME "+, ++, +++" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "an " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 20.2.0 5") "The "
     (:TERM NIL "variables") " " (:VARREF NIL "+") ", " (:MISC NIL "++")
     ", and " (:MISC NIL "+++") " are maintained by the "
     (:TERM NIL "Lisp read-eval-print loop") " to save " (:TERM NIL "forms")
     " that were recently " (:TERM NIL "evaluated") ". " :PAR "The "
     (:TERM NIL "value") " of " (:VARREF NIL "+") " is the last "
     (:TERM NIL "form") " that was " (:TERM NIL "evaluated") ", the "
     (:TERM NIL "value") " of " (:VARREF NIL "++") " is the previous value of "
     (:MISC NIL "+") ", and the " (:TERM NIL "value") " of "
     (:VARREF NIL "+++") " is the previous value of " (:MISC NIL "++") ". "
     (:COMMENT NIL "% 20.2.0 8") :PAR
     (:COMMENT NIL
      "If the evaluation of the variable \\misc{+} is aborted for some reason,"
      "then the values associated with \\misc{++}, "
      "and \\misc{+++} are updated ???")
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL "(+ 0 1) → 1
(- 4 2) → 2
(/ 9 3) → 3
(list + ++ +++) → ((/ 9 3) (- 4 2) (+ 0 1))
(setq a 1 b 2 c 3 d (list a b c)) → (1 2 3)
(setq a 4 b 5 c 6 d (list a b c)) → (4 5 6)
(list a b c) → (4 5 6)
(eval +++) → (1 2 3)
#.`(,@++ d) → (1 2 3 (1 2 3))
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     (:TERM NIL "Lisp read-eval-print loop") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "-") " ("
     (:TERM NIL "variable") "), " (:FUNREF NIL "*") " (" (:TERM NIL "variable")
     "), " (:FUNREF NIL "/") " (" (:TERM NIL "variable") "), "
     (:SECREF NIL :TOP-LEVEL-LOOP) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== * (Variable)" "%% ========== ** (Variable)"
    "%% ========== *** (Variable)")
   (:COM (:NAME "*, **, ***" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "an " (:TERM NIL "object") ". " :PAR)
    (:PART (:NAME "Initial Value") " " :PAR
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 20.2.0 7") "The "
     (:TERM NIL "variables") " " (:VARREF NIL "*") ", " (:MISC NIL "**")
     ", and " (:MISC NIL "***") " are maintained by the "
     (:TERM NIL "Lisp read-eval-print loop")
     " to save the values of results that are printed each time through the loop. "
     :PAR "The " (:TERM NIL "value") " of " (:VARREF NIL "*")
     " is the most recent " (:TERM NIL "primary value")
     " that was printed, the " (:TERM NIL "value") " of " (:VARREF NIL "**")
     " is the previous value of " (:MISC NIL "*") ", and the "
     (:TERM NIL "value") " of " (:VARREF NIL "***")
     " is the previous value of " (:MISC NIL "**") ". " :PAR
     (:COMMENT NIL
      "The values of these variables are not updated when the evaluation of"
      "a form is aborted.")
     :PAR "If several values are produced, " (:MISC NIL "*")
     " contains the first value only; " (:MISC NIL "*") " contains "
     (:MISC NIL "nil") " if zero values are produced. " :PAR
     (:COMMENT NIL "%This is very muddled. -kmp 17-Dec-90"
      " If the evaluation of the variable \\misc{+} is aborted for some reason,"
      " then the values associated with \\misc{*}, \\misc{**}, and \\misc{***} are not updated;"
      " they are updated only if the printing of values is at least begun (though not"
      " necessarily completed).")
     :PAR "The " (:TERM NIL "values") " of " (:MISC NIL "*") ", "
     (:MISC NIL "**") ", and " (:MISC NIL "***")
     " are updated immediately prior to printing the "
     (:TERM NIL "return value") " of a top-level " (:TERM NIL "form")
     " by the " (:TERM NIL "Lisp read-eval-print loop") ". If the "
     (:TERM NIL "evaluation") " of such a " (:TERM NIL "form")
     " is aborted prior to its normal return, the values of " (:MISC NIL "*")
     ", " (:MISC NIL "**") ", and " (:MISC NIL "***") " are not updated. "
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL "(values 'a1 'a2) → A1, A2
'b → B
(values 'c1 'c2 'c3) → C1, C2, C3
(list * ** ***) → (C1 B A1)

(defun cube-root (x) (expt x 1/3)) → CUBE-ROOT
(compile *) → CUBE-ROOT
(setq a (cube-root 27.0)) → 3.0
(* * 9.0) → 27.0
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     (:TERM NIL "Lisp read-eval-print loop") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "-") " ("
     (:TERM NIL "variable") "), " (:FUNREF NIL "+") " (" (:TERM NIL "variable")
     "), " (:FUNREF NIL "/") " (" (:TERM NIL "variable") "), "
     (:SECREF NIL :TOP-LEVEL-LOOP) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     (:CODE NIL " *   ≡ (car /)
 **  ≡ (car //)
 *** ≡ (car ///)
")
     " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== / (Variable)" "%% ========== // (Variable)"
    "%% ========== /// (Variable)")
   (:COM (:NAME "/, //, ///" :FTYPE "Variable")
    (:PART (:NAME "Value Type") " " :PAR "a " (:TERM NIL "proper list") ". "
     :PAR)
    (:PART (:NAME "Initial Value") " " :PAR
     (:TERM NIL "implementation-dependent") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 20.2.0 9") "The "
     (:TERM NIL "variables") " " (:VARREF NIL "/") ", " (:MISC NIL "//")
     ", and " (:MISC NIL "///") " are maintained by the "
     (:TERM NIL "Lisp read-eval-print loop")
     " to save the values of results that were printed at the end of the loop. "
     :PAR "The " (:TERM NIL "value") " of " (:VARREF NIL "/") " is a "
     (:TERM NIL "list") " of the most recent " (:TERM NIL "values")
     " that were printed, the " (:TERM NIL "value") " of " (:VARREF NIL "//")
     " is the previous value of " (:MISC NIL "/") ", and the "
     (:TERM NIL "value") " of " (:VARREF NIL "///")
     " is the previous value of " (:MISC NIL "//") ". " :PAR
     (:COMMENT NIL "% 20.2.0 10") :PAR
     (:COMMENT NIL "% This is pretty muddled. -kmp 17-Dec-90"
      " If the evaluation of the \\term{form} associated"
      " with the variable \\misc{+} is aborted for some reason,"
      " then the values associated with "
      " \\misc{/}, \\misc{//}, and \\misc{///} are not updated;"
      " they are updated only if the printing of values is at least begun (though not"
      " necessarily completed).")
     :PAR "The " (:TERM NIL "values") " of " (:MISC NIL "/") ", "
     (:MISC NIL "//") ", and " (:MISC NIL "///")
     " are updated immediately prior to printing the "
     (:TERM NIL "return value") " of a top-level " (:TERM NIL "form")
     " by the " (:TERM NIL "Lisp read-eval-print loop") ". If the "
     (:TERM NIL "evaluation") " of such a " (:TERM NIL "form")
     " is aborted prior to its normal return, the values of " (:MISC NIL "/")
     ", " (:MISC NIL "//") ", and " (:MISC NIL "///") " are not updated. "
     :PAR)
    (:PART (:NAME "Examples") " "
     (:CODE NIL " (floor 22 7) → 3, 1
 (+ (* (car /) 7) (cadr /)) → 22
")
     " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     (:TERM NIL "Lisp read-eval-print loop") ". " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "-") " ("
     (:TERM NIL "variable") "), " (:FUNREF NIL "+") " (" (:TERM NIL "variable")
     "), " (:FUNREF NIL "*") " (" (:TERM NIL "variable") "), "
     (:SECREF NIL :TOP-LEVEL-LOOP) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL
    "-------------------- External Environment Queries --------------------")
   :PAR
   (:COMMENT NIL "%% ========== LISP-IMPLEMENTATION-TYPE"
    "%% ========== LISP-IMPLEMENTATION-VERSION")
   (:COM
    (:NAME "lisp-implementation-type, lisp-implementation-version" :FTYPE
     "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "lisp-implementation-type")
      (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments")))
      (:VALUES NIL "description"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "lisp-implementation-version")
      (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments")))
      (:VALUES NIL "description"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "description")
     "—a " (:TERM NIL "string") " or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR
     (:FUNREF NIL "lisp-implementation-type") " and "
     (:FUNREF NIL "lisp-implementation-version")
     " identify the current implementation of " (:RM NIL " Common Lisp") ". "
     :PAR (:COMMENT NIL "% 25.4.2 2") (:FUNREF NIL "lisp-implementation-type")
     " returns a " (:TERM NIL "string")
     " that identifies the generic name of the particular "
     (:RM NIL " Common Lisp") " implementation. " :PAR
     (:COMMENT NIL "% 25.4.2 3") (:FUNREF NIL "lisp-implementation-version")
     " returns a " (:TERM NIL "string")
     " that identifies the version of the particular " (:RM NIL " Common Lisp")
     " implementation. " :PAR (:COMMENT NIL "% 25.4.2 1")
     "If no appropriate and relevant result can be produced, "
     (:MISC NIL "nil") " is returned instead of a " (:TERM NIL "string") ". "
     :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (lisp-implementation-type)
→ \"ACME Lisp\"
OR→ \"Joe's Common Lisp\"
 (lisp-implementation-version)
→ \"1.3a\"
→ \"V2\"
OR→ \"Release 17.3, ECO #6\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By" :NONE T) " " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== SHORT-SITE-NAME"
    "%% ========== LONG-SITE-NAME")
   (:COM (:NAME "short-site-name, long-site-name" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "short-site-name")
      (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments")))
      (:VALUES NIL "description"))
     " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "long-site-name")
      (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments")))
      (:VALUES NIL "description"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "description")
     "—a " (:TERM NIL "string") " or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 25.4.2 11")
     (:FUNREF NIL "short-site-name") " and " (:FUNREF NIL "long-site-name")
     " return a " (:TERM NIL "string")
     " that identifies the physical location of the computer hardware, or "
     (:MISC NIL "nil") " if no appropriate " (:PARAM NIL "description")
     " can be produced. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (short-site-name)
→ \"MIT AI Lab\"
OR→ \"CMU-CSD\"
 (long-site-name)
→ \"MIT Artificial Intelligence Laboratory\"
OR→ \"CMU Computer Science Department\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "The implementation, the location of the computer hardware, and the installation/configuration process. "
     :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MACHINE-INSTANCE")
   (:COM (:NAME "machine-instance" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "machine-instance")
      (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments")))
      (:VALUES NIL "description"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "description")
     "—a " (:TERM NIL "string") " or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 25.4.2 6")
     "Returns a " (:TERM NIL "string")
     " that identifies the particular instance of the computer hardware on which "
     (:RM NIL " Common Lisp") " is running, or " (:MISC NIL "nil")
     " if no such " (:TERM NIL "string") " can be computed. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (machine-instance)
→ \"ACME.COM\"
OR→ \"S/N 123231\"
OR→ \"18.26.0.179\"
OR→ \"AA-00-04-00-A7-A4\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The machine instance, and the "
     (:TERM NIL "implementation") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "machine-type") ", "
     (:FUNREF NIL "machine-version") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MACHINE-TYPE")
   (:COM (:NAME "machine-type" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "machine-type")
      (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments")))
      (:VALUES NIL "description"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "description")
     "—a " (:TERM NIL "string") " or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 25.4.2 4")
     "Returns a " (:TERM NIL "string")
     " that identifies the generic name of the computer hardware on which "
     (:RM NIL " Common Lisp") " is running. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (machine-type)
→ \"DEC PDP-10\"
OR→ \"Symbolics LM-2\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "The machine type. The implementation. " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "machine-version") " "
     :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== MACHINE-VERSION")
   (:COM (:NAME "machine-version" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "machine-version")
      (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments")))
      (:VALUES NIL "description"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "description")
     "—a " (:TERM NIL "string") " or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 25.4.2 5")
     "Returns a " (:TERM NIL "string")
     " that identifies the version of the computer hardware on which "
     (:RM NIL " Common Lisp") " is running, or " (:MISC NIL "nil")
     " if no such value can be computed. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (machine-version) → \"KL-10, microcode 9\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "The machine version, and the "
     (:TERM NIL "implementation") ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also") " " :PAR (:FUNREF NIL "machine-type") ", "
     (:FUNREF NIL "machine-instance") " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " " :PAR
   (:COMMENT NIL "%% ========== SOFTWARE-TYPE"
    "%% ========== SOFTWARE-VERSION")
   (:COM (:NAME "software-type, software-version" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "software-type")
      (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments")))
      (:VALUES NIL "description"))
     " "
     (:DEF (:KIND "function") (:NAMES NIL "software-version")
      (:ARGLIST NIL (:ANG NIL "no " (:TERM NIL "arguments")))
      (:VALUES NIL "description"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "description")
     "—a " (:TERM NIL "string") " or " (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 25.4.2 7")
     (:FUNREF NIL "software-type") " returns a " (:TERM NIL "string")
     " that identifies the generic name of any relevant supporting software, or "
     (:MISC NIL "nil")
     " if no appropriate or relevant result can be produced. " :PAR
     (:COMMENT NIL "% 25.4.2 8") (:FUNREF NIL "software-version") " returns a "
     (:TERM NIL "string")
     " that identifies the version of any relevant supporting software, or "
     (:MISC NIL "nil")
     " if no appropriate or relevant result can be produced. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (software-type) → \"Multics\"
 (software-version) → \"1.3x\"
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR "Operating system environment. "
     :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes") " " :PAR
     "This information should be of use to maintainers of the "
     (:TERM NIL "implementation") ". " :PAR))
   " " :PAR (:COMMENT NIL "%% ========== USER-HOMEDIR-PATHNAME")
   (:COM (:NAME "user-homedir-pathname" :FTYPE "Function")
    (:PART (:NAME "Syntax") " " :PAR
     (:DEF (:KIND "function") (:NAMES NIL "user-homedir-pathname")
      (:ARGLIST NIL (:KEYWORD NIL " &optional") " host")
      (:VALUES NIL "pathname"))
     " " :PAR)
    (:PART (:NAME "Arguments and Values") " " :PAR (:PARAM NIL "host") "—a "
     (:TERM NIL "string") ", a " (:TERM NIL "list") " of "
     (:TERM NIL "strings") ", or " (:KWD NIL "unspecific") ". "
     (:COMMENT NIL "!!! Barmar: What does a list of strings denote??") :PAR
     (:PARAM NIL "pathname") "—a " (:TERM NIL "pathname") ", or "
     (:MISC NIL "nil") ". " :PAR)
    (:PART (:NAME "Description") " " :PAR (:COMMENT NIL "% 23.1.2 36")
     (:FUNREF NIL "user-homedir-pathname") " determines the "
     (:TERM NIL "pathname")
     " that corresponds to the user's home directory on " (:PARAM NIL "host")
     ". If " (:PARAM NIL "host") " is not supplied, its value is "
     (:TERM NIL "implementation-dependent") ". "
     (:ISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN")
     " For a description of " (:KWD NIL "unspecific") ", see "
     (:SECREF NIL :PATHNAME-COMPONENTS) ". "
     (:ENDISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN") " " :PAR
     "The definition of home directory is "
     (:TERM NIL "implementation-dependent") ", but defined in "
     (:RM NIL " Common Lisp")
     " to mean the directory where the user keeps personal files such as initialization files and mail. "
     :PAR (:FUNREF NIL "user-homedir-pathname") " returns a "
     (:TERM NIL "pathname")
     " without any name, type, or version component (those components are all "
     (:MISC NIL "nil") ") for the user's home directory on "
     (:PARAM NIL "host") ". " :PAR
     "If it is impossible to determine the user's home directory on "
     (:PARAM NIL "host") ", then " (:MISC NIL "nil") " is returned. "
     (:FUNREF NIL "user-homedir-pathname") " never returns " (:MISC NIL "nil")
     " if " (:PARAM NIL "host") " is not supplied. " :PAR)
    (:PART (:NAME "Examples") " " :PAR
     (:CODE NIL " (pathnamep (user-homedir-pathname)) → " (:TERM NIL "true") "
")
     " " :PAR)
    (:PART (:NAME "Side Effects" :NONE T) " " :PAR)
    (:PART (:NAME "Affected By") " " :PAR
     "The host computer's file system, and the " (:TERM NIL "implementation")
     ". " :PAR)
    (:PART (:NAME "Exceptional Situations" :NONE T) " " :PAR)
    (:PART (:NAME "See Also" :NONE T) " " :PAR)
    (:PART (:NAME "Notes" :NONE T) " " :PAR))
   " ")
  " " :PAR)
 (:CHAPTER
  (:NUM "26" :TITLE ("Glossary") :NUMTAG :CHAP-TWENTY-SIX :NAMETAG :GLOSSARY)
  (:SECTION (:TITLE ("Glossary")) :PAR
   (:COMMENT NIL
    " !!! Moon wonders if \"denote\" is the right verb for talking about what \"designators\""
    "     refer to."
    " !!! Moon thinks the bottom header gets too close to the running text in this chapter."
    "     It even overstrikes on a few pages (e.g., p26-28 of draft 10.156)"
    " Barmar thinks we should define reference terms for expressions like \"left & right\"."
    " Moon sez: Most occurrences of \"which\" in the glossary should be \"that\" in correct English."
    " I should review this later. -kmp"
    " Think about unifying terms: \"type lattice\", \"type hierarchy\", \"type hierarchy lattice\","
    " \"directed acyclic graph\"."
    " RPG says \"hierarchy\" or \"dag\" are ok, but not \"lattice\"."
    " Allan Wechsler (ACW@Symbolics.COM) says: "
    "  Regarding DAGs vs. lattices: I don't know the basis of Dick Gabriel's"
    "  objection to the latter term.  I think that it's quite clear"
    "  mathematically that \"lattice\" is correct and \"directed acyclic graph\" is"
    "  incorrect, but Gabriel's objection may not be mathematical.  Details on"
    "  request.  I'm using the definitions from the ``Encyclopedic Dictionary of"
    "  Mathematics.''"
    " Think about these terms, which are commonly used without definition:"
    "   \"qualifier pattern\" - something that gets matched against in method comb."
    "   \"type specifier list\" - the list form of a type specifier"
    "   \"default value\"" "   \"optional parameter\", ..."
    " Think about these terms, which are common concepts in search of a name, to cut"
    " down on wasted verbiage at multiple places in the text."
    "   \"stringname\" - a string or a symbol, which is taken the name of a string."
    "                  if a symbol, then then it is treated as if its name had been supplied."
    " Sometime search for braces immediately followed by an alpha char "
    " (\"{...}s\", \"{...}es\", \"{...}ing\", \"{...}ed\", etc.) because these are often"
    " clues to needed glossary words."
    " KMP: Maybe a term \"user symbol\" being defined as "
    "      \"a symbol that is not accessible in the common-lisp package\"."
    "    (I find it cumbersome to write a param description that says"
    "     a symbol that is not in the common-lisp package."
    "    This comes up in a number of places.)"
    " Barmar: That sounds like a reasonable term and definition."
    " KMP: Issue--some places might need a restriction on keywords, too, but that should"
    "    probably not be piggy-backed on the \"user symbol\" term.")
   :PAR "     " :PAR "     " :PAR "       " :PAR (:COMMENT NIL "% Glossary")
   :PAR "Each entry in this glossary has the following parts: " :PAR
   (:LIST NIL (:ITEM NIL " the term being defined, set in boldface. " :PAR)
    (:ITEM NIL
     " optional pronunciation, enclosed in square brackets and set in boldface, as in the following example: "
     (:PRONOUNCED NIL (:HI-STRESS NIL "a") (:LO-STRESS NIL "list"))
     ". The pronunciation key follows "
     (:BIB
      (:URL "https://archive.org/details/webstersthirdne001gove" :ISBN
       "9780877792017")
      "Webster's Third New International Dictionary of the English Language, Unabridged")
     ", except that “ə” is used to notate the schwa (upside-down “e”) character. "
     :PAR)
    (:ITEM NIL
     " the part or parts of speech, set in italics. If a term can be used as several parts of speech, there is a separate definition for each part of speech. "
     :PAR)
    (:ITEM NIL " one or more definitions, organized as follows: " :PAR
     (:LIST NIL
      (:ITEM NIL
       "– an optional number, present if there are several definitions. Lowercase letters might also be used in cases where subdefinitions of a numbered definition are necessary. "
       :PAR)
      (:ITEM NIL
       "– an optional part of speech, set in italics, present if the term is one of several parts of speech. "
       :PAR)
      (:ITEM NIL
       "– an optional discipline, set in italics, present if the term has a standard definition being repeated. For example, “"
       (:I NIL "Math.") "” " :PAR)
      (:ITEM NIL
       "– an optional context, present if this definition is meaningful only in that context. For example, “(of a "
       (:TERM NIL "symbol") ")”. " :PAR)
      (:ITEM NIL "– the definition. " :PAR)
      (:ITEM NIL
       "– an optional example sentence. For example, “This is an example of an example.” "
       :PAR)
      (:ITEM NIL "– optional cross references. "
       (:COMMENT NIL
        "%There are a lot of options, and they are all pretty self-explanatory. -kmp 11-Sep-91"
        "A cross reference to another word uses the following form: \\Seeterm{word}."
        "A cross reference to a section uses the following form: \\Seesection\\Sample.")
       :PAR))
     " "))
   " " :PAR
   "In addition, some terms have idiomatic usage in the Common Lisp community which is not shared by other communities, or which is not technically correct. Definitions labeled “"
   (:I NIL "Idiom.")
   "” represent such idiomatic usage; these definitions are sometimes followed by an explanatory note. "
   :PAR "Words in " (:TERM NIL "this font")
   " are words with entries in the glossary. "
   (:COMMENT NIL "Word in \\typeref{this font} are names of data types.")
   "Words in example sentences do not follow this convention. " :PAR
   "When an ambiguity arises, the longest matching substring has precedence. For example, “"
   (:TERM NIL "complex float") "” refers to a single glossary entry for “"
   (:TERM NIL "complex float")
   "” rather than the combined meaning of the glossary terms “"
   (:TERM NIL "complex") "” and “" (:TERM NIL "float") ".” " :PAR
   "Subscript notation, as in “" (:TERM NIL "something") (:SUB NIL "n")
   "” means that the " (:I NIL "n") "th definition of “"
   (:TERM NIL "something")
   "” is intended. This notation is used only in situations where the context might be insufficient to disambiguate. "
   :PAR "The following are abbreviations used in the glossary: " :PAR
   (:TABLE (:NAME NIL)
    (:ROW NIL (:CELL NIL "Abbreviation") (:CELL NIL "Meaning"))
    (:ROW NIL (:CELL NIL (:I NIL "adj.")) (:CELL NIL "adjective"))
    (:ROW NIL (:CELL NIL (:I NIL "adv.")) (:CELL NIL "adverb"))
    (:ROW NIL (:CELL NIL (:I NIL "ANSI"))
     (:CELL NIL "compatible with one or more ANSI standards"))
    (:ROW NIL (:CELL NIL (:I NIL "Comp.")) (:CELL NIL "computers"))
    (:ROW NIL (:CELL NIL (:I NIL "Idiom.")) (:CELL NIL "idiomatic"))
    (:ROW NIL (:CELL NIL (:I NIL "IEEE"))
     (:CELL NIL "compatible with one or more IEEE standards"))
    (:ROW NIL (:CELL NIL (:I NIL "ISO"))
     (:CELL NIL "compatible with one or more ISO standards"))
    (:ROW NIL (:CELL NIL (:I NIL "Math.")) (:CELL NIL "mathematics"))
    (:ROW NIL (:CELL NIL (:I NIL "Trad.")) (:CELL NIL "traditional"))
    (:ROW NIL (:CELL NIL (:I NIL "n.")) (:CELL NIL "noun"))
    (:ROW NIL (:CELL NIL (:I NIL "v.")) (:CELL NIL "verb"))
    (:ROW NIL (:CELL NIL (:I NIL "v.t.")) (:CELL NIL "transitive verb")))
   " " :PAR
   (:LIST NIL
    (:ITEM NIL (:B NIL "Non-alphabetic")
     (:LIST NIL
      (:ITEM NIL (:B NIL "()") (:IDXTERM NIL "()") " "
       (:PRONOUNCED NIL (:HI-STRESS NIL "nil")) ", " (:I NIL "n.")
       " an alternative notation for writing the symbol " (:MISC NIL "nil")
       ", used to emphasize the use of " (:TERM NIL "nil") " as an "
       (:TERM NIL "empty list") ". " :PAR)))
    (:ITEM NIL (:B NIL "A")
     (:LIST NIL
      (:ITEM NIL (:B NIL "absolute") (:IDXTERM NIL "absolute") " "
       (:I NIL "adj.") " 1. (of a " (:TERM NIL "time")
       ") representing a specific point in time. 2. (of a "
       (:TERM NIL "pathname")
       ") representing a specific position in a directory hierarchy. See "
       (:TERM NIL "relative") ". " :PAR)
      (:ITEM NIL (:B NIL "access") (:IDXTERM NIL "access") " " (:I NIL "n.")
       ", " (:I NIL "v.t.") " "
       (:COMMENT NIL
        "\\term{variable} removed since generalized reference implies it.")
       "1. " (:I NIL "v.t.") " (a " (:TERM NIL "place") ", or "
       (:TERM NIL "array") ") to " (:TERM NIL "read") (:SUB NIL "1") " or "
       (:TERM NIL "write") (:SUB NIL "1") " the " (:TERM NIL "value")
       " of the " (:TERM NIL "place") " or an " (:TERM NIL "element")
       " of the " (:TERM NIL "array") ". 2. " (:I NIL "n.") " (of a "
       (:TERM NIL "place") ") an attempt to " (:TERM NIL "access")
       (:SUB NIL "1") " the " (:TERM NIL "value") " of the "
       (:TERM NIL "place") ". " :PAR
       (:COMMENT NIL
        " Moon: Useless entry. Adds nothing to normal English usage."
        " KMP: Allows usage to be italicized; also, courtesy to non-native "
        "      English speakers, who may not be as familiar with all our word forms."))
      (:ITEM NIL (:B NIL "accessibility") (:IDXTERM NIL "accessibility") " "
       (:I NIL "n.") " the state of being " (:TERM NIL "accessible") ". " :PAR
       (:COMMENT NIL
        "!!! Moon: accessible[1] and reference[2] don't seem to match up."))
      (:ITEM NIL (:B NIL "accessible") (:IDXTERM NIL "accessible") " "
       (:I NIL "adj.") " 1. (of an " (:TERM NIL "object") ") capable of being "
       (:TERM NIL "referenced") ". 2. (of " (:TERM NIL "shared slots") " or "
       (:TERM NIL "local slots") " in an " (:TERM NIL "instance") " of a "
       (:TERM NIL "class") ") having been defined by the " (:TERM NIL "class")
       " of the " (:TERM NIL "instance") " or " (:TERM NIL "inherited")
       " from a " (:TERM NIL "superclass") " of that " (:TERM NIL "class") ". "
       (:COMMENT NIL
        "!!! JonL: this reader thing should be an effect, not the definition."
        "          use \"present\" and \"inherited\".")
       "3. (of a " (:TERM NIL "symbol") " in a " (:TERM NIL "package")
       ") capable of being " (:TERM NIL "referenced") " without a "
       (:TERM NIL "package prefix") " when that " (:TERM NIL "package")
       " is current, regardless of whether the " (:TERM NIL "symbol") " is "
       (:TERM NIL "present") " in that " (:TERM NIL "package") " or is "
       (:TERM NIL "inherited") ". " :PAR)
      (:ITEM NIL (:B NIL "accessor") (:IDXTERM NIL "accessor") " "
       (:I NIL "n.") " an " (:TERM NIL "operator") " that performs an "
       (:TERM NIL "access") ". See " (:TERM NIL "reader") " and "
       (:TERM NIL "writer") ". " :PAR)
      (:ITEM NIL (:B NIL "active") (:IDXTERM NIL "active") " " (:I NIL "adj.")
       " 1. (of a " (:TERM NIL "handler") ", a " (:TERM NIL "restart")
       ", or a " (:TERM NIL "catch tag") ") having been "
       (:TERM NIL "established") " but not yet " (:TERM NIL "disestablished")
       ". 2. (of an " (:TERM NIL "element") " of an " (:TERM NIL "array")
       ") having an index that is greater than or equal to zero, but less than the "
       (:TERM NIL "fill pointer") " (if any). For an " (:TERM NIL "array")
       " that has no " (:TERM NIL "fill pointer") ", all "
       (:TERM NIL "elements") " are considered " (:TERM NIL "active") ". "
       :PAR)
      (:ITEM NIL (:B NIL "actual adjustability")
       (:IDXTERM NIL "actual adjustability") " " (:I NIL "n.") " (of an "
       (:TERM NIL "array") ") a " (:TERM NIL "generalized boolean")
       " that is associated with the " (:TERM NIL "array")
       ", representing whether the " (:TERM NIL "array") " is "
       (:TERM NIL "actually adjustable") ". See also "
       (:TERM NIL "expressed adjustability") " and "
       (:FUNREF NIL "adjustable-array-p") ". " :PAR)
      (:ITEM NIL (:B NIL "actual argument") (:IDXTERM NIL "actual argument")
       " " (:I NIL "n.") " " (:I NIL "Trad.") " an " (:TERM NIL "argument")
       ". " :PAR)
      (:ITEM NIL (:B NIL "actual array element type")
       (:IDXTERM NIL "actual array element type") " " (:I NIL "n.") " (of an "
       (:TERM NIL "array") ") the " (:TERM NIL "type") " for which the "
       (:TERM NIL "array") " is actually specialized, which is the "
       (:TERM NIL "upgraded array element type") " of the "
       (:TERM NIL "expressed array element type") " of the "
       (:TERM NIL "array") ". See the " (:TERM NIL "function") " "
       (:FUNREF NIL "array-element-type") ". " :PAR)
      (:ITEM NIL (:B NIL "actual complex part type")
       (:IDXTERM NIL "actual complex part type") " " (:I NIL "n.") " (of a "
       (:TERM NIL "complex") ") the " (:TERM NIL "type")
       " in which the real and imaginary parts of the " (:TERM NIL "complex")
       " are actually represented, which is the "
       (:TERM NIL "upgraded complex part type") " of the "
       (:TERM NIL "expressed complex part type") " of the "
       (:TERM NIL "complex") ". " :PAR)
      (:ITEM NIL (:B NIL "actual parameter") (:IDXTERM NIL "actual parameter")
       " " (:I NIL "n.") " " (:I NIL "Trad.") " an " (:TERM NIL "argument")
       ". " :PAR)
      (:ITEM NIL (:B NIL "actually adjustable")
       (:IDXTERM NIL "actually adjustable") " " (:I NIL "adj.") " (of an "
       (:TERM NIL "array") ") such that " (:FUNREF NIL "adjust-array")
       " can adjust its characteristics by direct modification. A "
       (:TERM NIL "conforming program") " may depend on an "
       (:TERM NIL "array") " being " (:TERM NIL "actually adjustable")
       " only if either that " (:TERM NIL "array") " is known to have been "
       (:TERM NIL "expressly adjustable") " or if that " (:TERM NIL "array")
       " has been explicitly tested by " (:FUNREF NIL "adjustable-array-p")
       ". " :PAR)
      (:ITEM NIL (:B NIL "adjustability") (:IDXTERM NIL "adjustability") " "
       (:I NIL "n.") " (of an " (:TERM NIL "array") ") 1. "
       (:TERM NIL "expressed adjustability") ". 2. "
       (:TERM NIL "actual adjustability") ". " :PAR)
      (:ITEM NIL (:B NIL "adjustable") (:IDXTERM NIL "adjustable") " "
       (:I NIL "adj.") " (of an " (:TERM NIL "array") ") 1. "
       (:TERM NIL "expressly adjustable") ". 2. "
       (:TERM NIL "actually adjustable") ". " :PAR)
      (:ITEM NIL (:B NIL "after method") (:IDXTERM NIL "after method") " "
       (:I NIL "n.") " a " (:TERM NIL "method") " having the "
       (:TERM NIL "qualifier") " " (:KWD NIL "after") ". " :PAR)
      (:ITEM NIL (:B NIL "alist") (:IDXTERM NIL "alist") " "
       (:PRONOUNCED NIL (:HI-STRESS NIL "ā") (:LO-STRESS NIL "list")) ", "
       (:I NIL "n.") " an " (:TERM NIL "association list") ". " :PAR)
      (:ITEM NIL (:B NIL "alphabetic") (:IDXTERM NIL "alphabetic") " "
       (:I NIL "n.") ", " (:I NIL "adj.") " " (:COMMENT NIL "% 13.2.0 12")
       "1. " (:I NIL "adj.") " (of a " (:TERM NIL "character")
       ") being one of the " (:TERM NIL "standard characters") " "
       (:TT NIL "A") " through " (:TT NIL "Z") " or " (:TT NIL "a") " through "
       (:TT NIL "z") ", or being any " (:TERM NIL "implementation-defined")
       " character that has " (:TERM NIL "case") ", or being some other "
       (:TERM NIL "graphic") " " (:TERM NIL "character") " defined by the "
       (:TERM NIL "implementation") " to be " (:TERM NIL "alphabetic")
       (:SUB NIL "1") ". 2. a. " (:I NIL "n.") " one of several possible "
       (:TERM NIL "constituent traits") " of a " (:TERM NIL "character")
       ". For details, see " (:SECREF NIL :CONSTITUENT-CHARS) " and "
       (:SECREF NIL :READER-ALGORITHM) ". b. " (:I NIL "adj.") " (of a "
       (:TERM NIL "character") ") being a " (:TERM NIL "character")
       " that has " (:TERM NIL "syntax type") " " (:TERM NIL "constituent")
       " in the " (:TERM NIL "current readtable") " and that has the "
       (:TERM NIL "constituent trait") " " (:TERM NIL "alphabetic")
       (:SUB NIL "2a") ". See " (:FIGREF NIL :CONSTITUENT-TRAITS-OF-STD-CHARS)
       ". " :PAR)
      (:ITEM NIL (:B NIL "alphanumeric") (:IDXTERM NIL "alphanumeric") " "
       (:I NIL "adj.") " (of a " (:TERM NIL "character") ") "
       (:COMMENT NIL "% 13.2.0 12") "being either an " (:TERM NIL "alphabetic")
       (:SUB NIL "1") " " (:TERM NIL "character") " or a "
       (:TERM NIL "numeric") " character. " :PAR)
      (:ITEM NIL (:B NIL "ampersand") (:IDXTERM NIL "ampersand") " "
       (:I NIL "n.") " the " (:TERM NIL "standard character")
       " that is called “ampersand” (" (:TT NIL "&") "). See "
       (:FIGREF NIL :STD-CHARS-THREE) ". " :PAR)
      (:ITEM NIL (:B NIL "anonymous") (:IDXTERM NIL "anonymous") " "
       (:I NIL "adj.") " 1. (of a " (:TERM NIL "class") " or "
       (:TERM NIL "function") ") having no " (:TERM NIL "name") " 2. (of a "
       (:TERM NIL "restart") ") having a " (:TERM NIL "name") " of "
       (:MISC NIL "nil") ". " :PAR)
      (:ITEM NIL (:B NIL "apparently uninterned")
       (:IDXTERM NIL "apparently uninterned") " " (:I NIL "adj.") " having a "
       (:TERM NIL "home package") " of " (:MISC NIL "nil") ". (An "
       (:TERM NIL "apparently uninterned") " " (:TERM NIL "symbol")
       " might or might not be an " (:TERM NIL "uninterned") " "
       (:TERM NIL "symbol") ". " (:TERM NIL "Uninterned symbols") " have a "
       (:TERM NIL "home package") " of " (:MISC NIL "nil") ", but "
       (:TERM NIL "symbols") " which have been " (:TERM NIL "uninterned")
       " from their " (:TERM NIL "home package") " also have a "
       (:TERM NIL "home package") " of " (:MISC NIL "nil")
       ", even though they might still be " (:TERM NIL "interned")
       " in some other " (:TERM NIL "package") ".) " :PAR
       (:COMMENT NIL
        "!!! Moon: Need to reconcile this entry with the following three."))
      (:ITEM NIL (:B NIL "applicable") (:IDXTERM NIL "applicable") " "
       (:I NIL "adj.") " 1. (of a " (:TERM NIL "handler") ") being an "
       (:TERM NIL "applicable handler") ". 2. (of a " (:TERM NIL "method")
       ") being an " (:TERM NIL "applicable method") ". 3. (of a "
       (:TERM NIL "restart") ") being an " (:TERM NIL "applicable restart")
       ". " :PAR)
      (:ITEM NIL (:B NIL "applicable handler")
       (:IDXTERM NIL "applicable handler") " " (:I NIL "n.") " (for a "
       (:TERM NIL "condition") " being " (:TERM NIL "signaled") ") an "
       (:TERM NIL "active") " " (:TERM NIL "handler")
       " for which the associated type contains the " (:TERM NIL "condition")
       ". " :PAR)
      (:ITEM NIL (:B NIL "applicable method")
       (:IDXTERM NIL "applicable method") " " (:I NIL "n.") " (of a "
       (:TERM NIL "generic function") " called with " (:TERM NIL "arguments")
       ") a " (:TERM NIL "method") " of the " (:TERM NIL "generic function")
       " for which the " (:TERM NIL "arguments") " satisfy the "
       (:TERM NIL "parameter specializers") " of that " (:TERM NIL "method")
       ". "
       (:COMMENT NIL " and which has not been \\term{shadowed}\\meaning{2}."
        "Moon says: ``applicableness does not take method combination into account"
        "             and shadowing is a property of method combination.''")
       "See " (:SECREF NIL :SEL-APPL-METH) ". " :PAR
       (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " ")
      (:ITEM NIL (:B NIL "applicable restart")
       (:IDXTERM NIL "applicable restart") " " (:I NIL "n.") " 1. (for a "
       (:TERM NIL "condition") ") an " (:TERM NIL "active") " "
       (:TERM NIL "handler") " for which the associated test returns "
       (:TERM NIL "true") " when given the " (:TERM NIL "condition")
       " as an argument. 2. (for no particular " (:TERM NIL "condition")
       ") an " (:TERM NIL "active") " " (:TERM NIL "handler")
       " for which the associated test returns " (:TERM NIL "true")
       " when given " (:MISC NIL "nil") " as an argument. "
       (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION") " " :PAR)
      (:ITEM NIL (:B NIL "apply") (:IDXTERM NIL "apply") " " (:I NIL "v.t.")
       " (a " (:TERM NIL "function") " to a " (:TERM NIL "list") ") to "
       (:TERM NIL "call") " the " (:TERM NIL "function")
       " with arguments that are the " (:TERM NIL "elements") " of the "
       (:TERM NIL "list") ". “Applying the function " (:FUNREF NIL "+")
       " to a list of integers returns the sum of the elements of that list.” "
       :PAR)
      (:ITEM NIL (:B NIL "argument") (:IDXTERM NIL "argument") " "
       (:I NIL "n.") " 1. (of a " (:TERM NIL "function") ") an "
       (:TERM NIL "object") " which is offered as data to the "
       (:TERM NIL "function") " when it is " (:TERM NIL "called") ". "
       (:COMMENT NIL "% I wonder if we should say this. -kmp"
        "    In other literature, but not here, this is sometimes called an ``actual argument.''"
        " 1. (of a \\term{function}) an \\term{object} which is paired "
        "    with a corresponding \\term{parameter} in order to provide data"
        "    flow into the function at the time it is called." " Moon says:"
        "   ``Not all arguments have corresponding parameters, when the function accepts"
        "     keyword or rest arguments.  Consider \\kwd{allow-other-keys}.  Thus this definition"
        "     cannot be exactly correct.  I don't think the definition of arguments should"
        "     have anything to do with what the function does internally to receive the"
        "     arguments.''")
       (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " 2. (of a "
       (:TERM NIL "format control") ") a " (:TERM NIL "format argument") ". "
       (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR)
      (:ITEM NIL (:B NIL "argument evaluation order")
       (:IDXTERM NIL "argument evaluation order") " " (:I NIL "n.")
       " the order in which " (:TERM NIL "arguments")
       " are evaluated in a function call. “The argument evaluation order for Common Lisp is left to right.” See "
       (:SECREF NIL :EVALUATION) ". " :PAR)
      (:ITEM NIL (:B NIL "argument precedence order")
       (:IDXTERM NIL "argument precedence order") " " (:I NIL "n.")
       " the order in which the " (:TERM NIL "arguments") " to a "
       (:TERM NIL "generic function") " are considered when sorting the "
       (:TERM NIL "applicable methods") " into precedence order. " :PAR)
      (:ITEM NIL (:B NIL "around method") (:IDXTERM NIL "around method") " "
       (:I NIL "n.") " a " (:TERM NIL "method") " having the "
       (:TERM NIL "qualifier") " " (:KWD NIL "around") ". " :PAR)
      (:ITEM NIL (:B NIL "array") (:IDXTERM NIL "array") " " (:I NIL "n.")
       " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "array") ", which serves as a container for other "
       (:TERM NIL "objects") " arranged in a Cartesian coordinate system. "
       :PAR)
      (:ITEM NIL (:B NIL "array element type")
       (:IDXTERM NIL "array element type") " " (:I NIL "n.") " (of an "
       (:TERM NIL "array") ") 1. a " (:TERM NIL "type") " associated with the "
       (:TERM NIL "array") ", and of which all " (:TERM NIL "elements")
       " of the " (:TERM NIL "array") " are constrained to be members. 2. the "
       (:TERM NIL "actual array element type") " of the " (:TERM NIL "array")
       ". 3. the " (:TERM NIL "expressed array element type") " of the "
       (:TERM NIL "array") ". " :PAR)
      (:ITEM NIL (:B NIL "array total size") (:IDXTERM NIL "array total size")
       " " (:I NIL "n.") " the total number of " (:TERM NIL "elements")
       " in an " (:TERM NIL "array") ", computed by taking the product of the "
       (:TERM NIL "dimensions") " of the " (:TERM NIL "array")
       ". (The size of a zero-dimensional " (:TERM NIL "array")
       " is therefore one.) " :PAR)
      (:ITEM NIL (:B NIL "assign") (:IDXTERM NIL "assign") " " (:I NIL "v.t.")
       " (a " (:TERM NIL "variable") ") to change the " (:TERM NIL "value")
       " of the " (:TERM NIL "variable") " in a " (:TERM NIL "binding")
       " that has already been " (:TERM NIL "established") ". See the "
       (:TERM NIL "special operator") " " (:SPECREF NIL "setq") ". " :PAR)
      (:ITEM NIL (:B NIL "association list") (:IDXTERM NIL "association list")
       " " (:I NIL "n.") " a " (:TERM NIL "list") " of " (:TERM NIL "conses")
       " representing an association of " (:TERM NIL "keys") " with "
       (:TERM NIL "values") ", where the " (:TERM NIL "car") " of each "
       (:TERM NIL "cons") " is the " (:TERM NIL "key") " and the "
       (:TERM NIL "cdr") " is the " (:TERM NIL "value")
       " associated with that " (:TERM NIL "key") ". " :PAR)
      (:ITEM NIL (:B NIL "asterisk") (:IDXTERM NIL "asterisk") " "
       (:I NIL "n.") " the " (:TERM NIL "standard character")
       " that is variously called “asterisk” or “star” (" (:TT NIL "*")
       "). See " (:FIGREF NIL :STD-CHARS-THREE) ". " :PAR)
      (:ITEM NIL (:B NIL "at-sign") (:IDXTERM NIL "at-sign") " " (:I NIL "n.")
       " the " (:TERM NIL "standard character")
       " that is variously called “commercial at” or “at sign” (" (:TT NIL "@")
       "). See " (:FIGREF NIL :STD-CHARS-THREE) ". " :PAR)
      (:ITEM NIL (:B NIL "atom") (:IDXTERM NIL "atom") " " (:I NIL "n.")
       " any " (:TERM NIL "object") " that is not a " (:TERM NIL "cons")
       ". “A vector is an atom.” " :PAR)
      (:ITEM NIL (:B NIL "atomic") (:IDXTERM NIL "atomic") " " (:I NIL "adj.")
       " being an " (:TERM NIL "atom") ". “The number 3, the symbol "
       (:TT NIL "foo") ", and " (:MISC NIL "nil") " are atomic.” " :PAR)
      (:ITEM NIL (:B NIL "atomic type specifier")
       (:IDXTERM NIL "atomic type specifier") " " (:I NIL "n.") " a "
       (:TERM NIL "type specifier") " that is " (:TERM NIL "atomic")
       ". For every " (:TERM NIL "atomic type specifier") ", " (:I NIL "x")
       ", there is an equivalent " (:TERM NIL "compound type specifier")
       " with no arguments supplied, " (:TT NIL "(" (:I NIL "x") ")") ". "
       :PAR)
      (:ITEM NIL (:B NIL "attribute") (:IDXTERM NIL "attribute") " "
       (:I NIL "n.") " (of a " (:TERM NIL "character")
       ") a program-visible aspect of the " (:TERM NIL "character")
       ". The only " (:TERM NIL "standardized") " " (:TERM NIL "attribute")
       " of a " (:TERM NIL "character") " is its " (:TERM NIL "code")
       (:SUB NIL "2") ", but " (:TERM NIL "implementations")
       " are permitted to have additional "
       (:TERM NIL "implementation-defined") " " (:TERM NIL "attributes")
       ". See " (:SECREF NIL :CHARACTER-ATTRIBUTES)
       ". “An implementation that support fonts might make font information an attribute of a character, while others might represent font information separately from characters.” "
       :PAR)
      (:ITEM NIL (:B NIL "aux variable") (:IDXTERM NIL "aux variable") " "
       (:I NIL "n.") " a " (:TERM NIL "variable")
       " that occurs in the part of a " (:TERM NIL "lambda list")
       " that was introduced by " (:KEYREF NIL "aux") ". Unlike all other "
       (:TERM NIL "variables") " introduced by a " (:TERM NIL "lambda list")
       ", " (:TERM NIL "aux variables") " are not " (:TERM NIL "parameters")
       ". " :PAR)
      (:ITEM NIL (:B NIL "auxiliary method") (:IDXTERM NIL "auxiliary method")
       " " (:I NIL "n.") " a member of one of two sets of "
       (:TERM NIL "methods") " (the set of " (:TERM NIL "primary methods")
       " is the other) that form an exhaustive partition of the set of "
       (:TERM NIL "methods") " on the " (:TERM NIL "method") "'s "
       (:TERM NIL "generic function")
       ". How these sets are determined is dependent on the "
       (:TERM NIL "method combination") " type; see "
       (:SECREF NIL :INTRO-TO-METHODS) ". " :PAR)))
    (:ITEM NIL (:B NIL "B")
     (:LIST NIL
      (:ITEM NIL (:B NIL "backquote") (:IDXTERM NIL "backquote") " "
       (:I NIL "n.") " the " (:TERM NIL "standard character")
       " that is variously called “grave accent” or “backquote” ("
       (:TT NIL "`") "). See " (:FIGREF NIL :STD-CHARS-THREE) ". " :PAR)
      (:ITEM NIL (:B NIL "backslash") (:IDXTERM NIL "backslash") " "
       (:I NIL "n.") " the " (:TERM NIL "standard character")
       " that is variously called “reverse solidus” or “backslash” ("
       (:TT NIL "\\") "). See " (:FIGREF NIL :STD-CHARS-THREE) ". " :PAR)
      (:ITEM NIL (:B NIL "base character") (:IDXTERM NIL "base character") " "
       (:I NIL "n.") " a " (:TERM NIL "character") " "
       (:ISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " of "
       (:TERM NIL "type") " " (:TYPEREF NIL "base-char") ". "
       (:ENDISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " " :PAR)
      (:ITEM NIL (:B NIL "base string") (:IDXTERM NIL "base string") " "
       (:I NIL "n.") " a " (:TERM NIL "string") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "base-string") ". " :PAR)
      (:ITEM NIL (:B NIL "before method") (:IDXTERM NIL "before method") " "
       (:I NIL "n.") " a " (:TERM NIL "method") " having the "
       (:TERM NIL "qualifier") " " (:KWD NIL "before") ". " :PAR)
      (:ITEM NIL (:B NIL "bidirectional") (:IDXTERM NIL "bidirectional") " "
       (:I NIL "adj.") " (of a " (:TERM NIL "stream") ") being both an "
       (:TERM NIL "input") " " (:TERM NIL "stream") " and an "
       (:TERM NIL "output") " " (:TERM NIL "stream") ". " :PAR)
      (:ITEM NIL (:B NIL "binary") (:IDXTERM NIL "binary") " " (:I NIL "adj.")
       " 1. (of a " (:TERM NIL "stream") ") being a " (:TERM NIL "stream")
       " that has an " (:TERM NIL "element type") " that is a "
       (:TERM NIL "subtype") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "integer") ". The most fundamental operation on a "
       (:TERM NIL "binary") " " (:TERM NIL "input") " " (:TERM NIL "stream")
       " is " (:FUNREF NIL "read-byte") " and on a " (:TERM NIL "binary") " "
       (:TERM NIL "output") " " (:TERM NIL "stream") " is "
       (:FUNREF NIL "write-byte") ". See " (:TERM NIL "character")
       ". 2. (of a " (:TERM NIL "file") ") having been created by opening a "
       (:TERM NIL "binary") " " (:TERM NIL "stream") ". (It is "
       (:TERM NIL "implementation-dependent")
       " whether this is an detectable aspect of the " (:TERM NIL "file")
       ", or whether any given " (:TERM NIL "character") " " (:TERM NIL "file")
       " can be treated as a " (:TERM NIL "binary") " " (:TERM NIL "file")
       ".) " :PAR
       (:COMMENT NIL
        "!!! JonL: In the iteration chapter, you also use this to mean to "
        "          reset the value of a variable."
        " KMP: Those references need to be fixed."))
      (:ITEM NIL (:B NIL "bind") (:IDXTERM NIL "bind") " " (:I NIL "v.t.")
       " (a " (:TERM NIL "variable") ") to establish a " (:TERM NIL "binding")
       " for the " (:TERM NIL "variable") ". " :PAR)
      (:ITEM NIL (:B NIL "binding") (:IDXTERM NIL "binding") " " (:I NIL "n.")
       " an association between a " (:TERM NIL "name") " and that which the "
       (:TERM NIL "name")
       " denotes. “A lexical binding is a lexical association between a name and its value.” "
       (:COMMENT NIL
        "% Added per Boyer/Kaufmann/Moore #5 (by X3J13 vote at May 4-5, 1994 meeting)."
        "% -kmp 9-May-94")
       "When the term " (:TERM NIL "binding") " is qualified by the name of a "
       (:TERM NIL "namespace")
       ", such as “variable” or “function,” it restricts the binding to the indicated namespace, as in: “"
       (:SPECREF NIL "let") " establishes variable bindings.” or “"
       (:SPECREF NIL "let") " establishes bindings of variables.” " :PAR)
      (:ITEM NIL (:B NIL "bit") (:IDXTERM NIL "bit") " " (:I NIL "n.") " an "
       (:TERM NIL "object") " of " (:TERM NIL "type") " " (:TYPEREF NIL "bit")
       "; that is, the " (:TERM NIL "integer") " " (:TT NIL "0") " or the "
       (:TERM NIL "integer") " " (:TT NIL "1") ". " :PAR)
      (:ITEM NIL (:B NIL "bit array") (:IDXTERM NIL "bit array") " "
       (:I NIL "n.") " a specialized " (:TERM NIL "array") " that is of "
       (:TERM NIL "type") " " (:TT NIL "(array bit)")
       ", and whose elements are of " (:TERM NIL "type") " "
       (:TYPEREF NIL "bit") ". " :PAR)
      (:ITEM NIL (:B NIL "bit vector") (:IDXTERM NIL "bit vector") " "
       (:I NIL "n.") " a specialized " (:TERM NIL "vector") " that is of "
       (:TERM NIL "type") " " (:TYPEREF NIL "bit-vector")
       ", and whose elements are of " (:TERM NIL "type") " "
       (:TYPEREF NIL "bit") ". " :PAR)
      (:ITEM NIL (:B NIL "bit-wise logical operation specifier")
       (:IDXTERM NIL "bit-wise logical operation specifier") " " (:I NIL "n.")
       " an " (:TERM NIL "object")
       " which names one of the sixteen possible bit-wise logical operations that can be performed by the "
       (:FUNREF NIL "boole") " function, and which is the " (:TERM NIL "value")
       " of exactly one of the " (:TERM NIL "constant variables") " "
       (:CONREF NIL "boole-clr") ", " (:CONREF NIL "boole-set") ", "
       (:CONREF NIL "boole-1") ", " (:CONREF NIL "boole-2") ", "
       (:CONREF NIL "boole-c1") ", " (:CONREF NIL "boole-c2") ", "
       (:CONREF NIL "boole-and") ", " (:CONREF NIL "boole-ior") ", "
       (:CONREF NIL "boole-xor") ", " (:CONREF NIL "boole-eqv") ", "
       (:CONREF NIL "boole-nand") ", " (:CONREF NIL "boole-nor") ", "
       (:CONREF NIL "boole-andc1") ", " (:CONREF NIL "boole-andc2") ", "
       (:CONREF NIL "boole-orc1") ", or " (:CONREF NIL "boole-orc2") ". " :PAR)
      (:ITEM NIL (:B NIL "block") (:IDXTERM NIL "block") " " (:I NIL "n.")
       " a named lexical " (:TERM NIL "exit point") ", "
       (:TERM NIL "established") " explicitly by " (:SPECREF NIL "block")
       " or implicitly by " (:TERM NIL "operators") " such as "
       (:MACREF NIL "loop") ", " (:MACREF NIL "do") " and "
       (:MACREF NIL "prog")
       ", to which control and values may be transfered by using a "
       (:SPECREF NIL "return-from") " " (:TERM NIL "form")
       " with the name of the " (:TERM NIL "block") ". " :PAR)
      (:ITEM NIL (:B NIL "block tag") (:IDXTERM NIL "block tag") " "
       (:I NIL "n.") " the " (:TERM NIL "symbol") " that, within the "
       (:TERM NIL "lexical scope") " of a " (:SPECREF NIL "block") " "
       (:TERM NIL "form") ", names the " (:TERM NIL "block") " "
       (:TERM NIL "established") " by that " (:SPECREF NIL "block") " "
       (:TERM NIL "form") ". See " (:MACREF NIL "return") " or "
       (:SPECREF NIL "return-from") ". " :PAR)
      (:ITEM NIL (:B NIL "boa lambda list") (:IDXTERM NIL "boa lambda list")
       " " (:I NIL "n.") " a " (:TERM NIL "lambda list")
       " that is syntactically like an " (:TERM NIL "ordinary lambda list")
       ", but that is processed in “" (:B NIL "b") "y " (:B NIL "o") "rder of "
       (:B NIL "a") "rgument” style. See " (:SECREF NIL :BOA-LAMBDA-LISTS) ". "
       :PAR)
      (:ITEM NIL (:B NIL "body parameter") (:IDXTERM NIL "body parameter") " "
       (:I NIL "n.") " a " (:TERM NIL "parameter") " available in certain "
       (:TERM NIL "lambda lists") " which from the point of view of "
       (:TERM NIL "conforming programs") " is like a "
       (:TERM NIL "rest parameter")
       " in every way except that it is introduced by " (:KEYREF NIL "body")
       " instead of " (:KEYREF NIL "rest") ". (" (:TERM NIL "Implementations")
       " are permitted to provide extensions which distinguish "
       (:TERM NIL "body parameters") " and " (:TERM NIL "rest parameters") "—"
       (:I NIL "e.g.") ",  the " (:TERM NIL "forms") " for "
       (:TERM NIL "operators") " which were defined using a "
       (:TERM NIL "body parameter")
       " might be pretty printed slightly differently than "
       (:TERM NIL "forms") " for " (:TERM NIL "operators")
       " which were defined using " (:TERM NIL "rest parameters") ".) " :PAR)
      (:ITEM NIL (:B NIL "boolean") (:IDXTERM NIL "boolean") " " (:I NIL "n.")
       " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "boolean") "; that is, one of the following "
       (:TERM NIL "objects") ": the symbol " (:MISC NIL "t") " (representing "
       (:TERM NIL "true") "), or the symbol " (:MISC NIL "nil")
       " (representing " (:TERM NIL "false") "). See "
       (:TERM NIL "generalized boolean") ". " :PAR)
      (:ITEM NIL (:B NIL "boolean equivalent")
       (:IDXTERM NIL "boolean equivalent") " " (:I NIL "n.") " (of an "
       (:TERM NIL "object") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1"))) ") any "
       (:TERM NIL "object") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "2")))
       " that has the same truth value as "
       (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1"))) " when both "
       (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1"))) " and "
       (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "2"))) " are viewed as "
       (:TERM NIL "generalized booleans") ". " :PAR)
      (:ITEM NIL (:B NIL "bound") (:IDXTERM NIL "bound") " " (:I NIL "adj.")
       ", " (:I NIL "v.t.") " 1. " (:I NIL "adj.")
       " having an associated denotation in a " (:TERM NIL "binding")
       ". “The variables named by a " (:SPECREF NIL "let")
       " are bound within its body.” See " (:TERM NIL "unbound") ". 2. "
       (:I NIL "adj.") " having a local " (:TERM NIL "binding") " which "
       (:TERM NIL "shadows") (:SUB NIL "2") " another. “The variable "
       (:VARREF NIL "*print-escape*") " is bound while in the "
       (:FUNREF NIL "princ") " function.” 3. " (:I NIL "v.t.")
       " the past tense of " (:TERM NIL "bind") ". " :PAR)
      (:ITEM NIL (:B NIL "bound declaration")
       (:IDXTERM NIL "bound declaration") " " (:I NIL "n.") " a "
       (:TERM NIL "declaration") " that refers to or is associated with a "
       (:TERM NIL "variable") " or " (:TERM NIL "function")
       " and that appears within the " (:TERM NIL "special form") " that "
       (:TERM NIL "establishes") " the " (:TERM NIL "variable") " or "
       (:TERM NIL "function") ", but before the body of that "
       (:TERM NIL "special form") " "
       (:COMMENT NIL
        " This next parenthetical remark was added because Moon thinks (and I agree)"
        " that rather than just \"within\" we need to say \"at the head of the body\" "
        " in order to make it clear that " "    (let ((a (let ((b 1))"
        "               (declare (fixnum a))" "               (expt b 100))))"
        "      (print a))" "    is not accidentally covered.")
       "(specifically, at the head of that " (:TERM NIL "form") "'s body). "
       (:COMMENT NIL
        "!!! Barmar: The following should be replaced by a cross-reference to a"
        "   	     concept section.")
       "(If a " (:TERM NIL "bound declaration") " refers to a "
       (:TERM NIL "function") " " (:TERM NIL "binding") " or a "
       (:TERM NIL "lexical variable") " " (:TERM NIL "binding") ", the "
       (:TERM NIL "scope") " of the " (:TERM NIL "declaration")
       " is exactly the " (:TERM NIL "scope") " of that " (:TERM NIL "binding")
       ". If the " (:TERM NIL "declaration") " refers to a "
       (:TERM NIL "dynamic variable") " " (:TERM NIL "binding") ", the "
       (:TERM NIL "scope") " of the " (:TERM NIL "declaration") " is what the "
       (:TERM NIL "scope") " of the " (:TERM NIL "binding")
       " would have been if it were lexical rather than dynamic.) " :PAR)
      (:ITEM NIL (:B NIL "bounded") (:IDXTERM NIL "bounded") " "
       (:I NIL "adj.") " (of a " (:TERM NIL "sequence") " "
       (:MATH NIL (:MI NIL "S")) ", by an ordered pair of "
       (:TERM NIL "bounding indices") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "i") (:MI NIL "start"))) " and "
       (:MATH NIL (:MSUB NIL (:MI NIL "i") (:MI NIL "end")))
       ") restricted to a subrange of the " (:TERM NIL "elements") " of "
       (:MATH NIL (:MI NIL "S")) " that includes each " (:TERM NIL "element")
       " beginning with (and including) the one indexed by "
       (:MATH NIL (:MSUB NIL (:MI NIL "i") (:MI NIL "start")))
       " and continuing up to (but not including) the one indexed by "
       (:MATH NIL (:MSUB NIL (:MI NIL "i") (:MI NIL "end"))) ". " :PAR)
      (:ITEM NIL (:B NIL "bounding index") (:IDXTERM NIL "bounding index") " "
       (:I NIL "n.") " (of a " (:TERM NIL "sequence") " with "
       (:TERM NIL "length") " " (:MATH NIL (:MI NIL "n"))
       ") either of a conceptual pair of " (:TERM NIL "integers") ", "
       (:MATH NIL (:MSUB NIL (:MI NIL "i") (:MI NIL "start"))) " and "
       (:MATH NIL (:MSUB NIL (:MI NIL "i") (:MI NIL "end")))
       ", respectively called the “lower bounding index” and “upper bounding index”, such that "
       (:MATH NIL (:MN NIL "0") (:MO NIL "≤")
        (:MSUB NIL (:MI NIL "i") (:MI NIL "start")) (:MO NIL "≤")
        (:MSUB NIL (:MI NIL "i") (:MI NIL "end")) (:MO NIL "≤") (:MI NIL "n"))
       ", and which therefore delimit a subrange of the "
       (:TERM NIL "sequence") " " (:TERM NIL "bounded") " by "
       (:MATH NIL (:MSUB NIL (:MI NIL "i") (:MI NIL "start"))) " and "
       (:MATH NIL (:MSUB NIL (:MI NIL "i") (:MI NIL "end"))) ". " :PAR)
      (:ITEM NIL (:B NIL "bounding index designator")
       (:IDXTERM NIL "bounding index designator") " (for a "
       (:TERM NIL "sequence") ") one of two " (:TERM NIL "objects")
       " that, taken together as an ordered pair, behave as a "
       (:TERM NIL "designator") " for " (:TERM NIL "bounding indices")
       " of the " (:TERM NIL "sequence") "; that is, they denote "
       (:TERM NIL "bounding indices") " of the " (:TERM NIL "sequence")
       ", and are either: an " (:TERM NIL "integer") " (denoting itself) and "
       (:MISC NIL "nil") " (denoting the " (:TERM NIL "length") " of the "
       (:TERM NIL "sequence") "), or two " (:TERM NIL "integers")
       " (each denoting themselves). " :PAR)
      (:ITEM NIL (:B NIL "break loop") (:IDXTERM NIL "break loop") " "
       (:I NIL "n.") " A variant of the normal "
       (:TERM NIL "Lisp read-eval-print loop")
       " that is recursively entered, usually because the ongoing "
       (:TERM NIL "evaluation") " of some other " (:TERM NIL "form")
       " has been suspended for the purpose of debugging. Often, a "
       (:TERM NIL "break loop")
       " provides the ability to exit in such a way as to continue the suspended computation. See the "
       (:TERM NIL "function") " " (:FUNREF NIL "break") ". " :PAR)
      (:ITEM NIL (:B NIL "broadcast stream") (:IDXTERM NIL "broadcast stream")
       " " (:I NIL "n.") " an " (:TERM NIL "output") " " (:TERM NIL "stream")
       " of " (:TERM NIL "type") " " (:TYPEREF NIL "broadcast-stream") ". "
       :PAR)
      (:ITEM NIL (:B NIL "built-in class") (:IDXTERM NIL "built-in class") " "
       (:I NIL "n.") " "
       (:COMMENT NIL
        "\"instance\" => \"generalized instance\" per Quinquevirate. -kmp 14-Feb-92")
       "a " (:TERM NIL "class") " that is a "
       (:TERM NIL "generalized instance") " of " (:TERM NIL "class") " "
       (:TYPEREF NIL "built-in-class") ". " :PAR
       (:COMMENT NIL
        "!!! KMP: This term is confusing and should probably be called something else."))
      (:ITEM NIL (:B NIL "built-in type") (:IDXTERM NIL "built-in type") " "
       (:I NIL "n.") " one of the " (:TERM NIL "types") " in "
       (:FIGREF NIL :STANDARDIZED-ATOMIC-TYPE-SPECS) ". " :PAR
       (:COMMENT NIL " \\gentry{built-in type} \\Noun\\"
        "   one of the \\term{types} in \\thenextfigure." " "
        " Moon: Aren't there a bunch missing, like base-char and simple-vector."
        " \\displaythree{Built-in types}{" " array&integer&restart\\cr"
        " bit-vector&long-float&sequence\\cr" " character&null&short-float\\cr"
        " complex&number&single-float\\cr" " condition&package&stream\\cr"
        " cons&pathname&string\\cr" " double-float&random-state&symbol\\cr"
        " float&ratio&vector\\cr" " function&rational&\\cr"
        " hash-table&readtable&\\cr" " }")
       :PAR)
      (:ITEM NIL (:B NIL "byte") (:IDXTERM NIL "byte") " " (:I NIL "n.")
       " 1. adjacent bits within an " (:TERM NIL "integer")
       ". (The specific number of bits can vary from point to point in the program; see the "
       (:TERM NIL "function") " " (:FUNREF NIL "byte")
       ".) 2. an integer in a specified range. "
       (:COMMENT NIL " Moon: Below 0 and a power of 2?"
        " KMP: I'm not so sure.  In the context of OPEN, it seems to mean any integer.")
       "(The specific range can vary from point to point in the program; see the "
       (:TERM NIL "functions") " " (:FUNREF NIL "open") " and "
       (:FUNREF NIL "write-byte") ".) " :PAR)
      (:ITEM NIL (:B NIL "byte specifier") (:IDXTERM NIL "byte specifier") " "
       (:I NIL "n.") " An " (:TERM NIL "object") " of "
       (:TERM NIL "implementation-dependent")
       " nature that is returned by the " (:TERM NIL "function") " "
       (:FUNREF NIL "byte") " and that specifies the range of bits in an "
       (:TERM NIL "integer") " to be used as a " (:TERM NIL "byte") " by "
       (:TERM NIL "functions") " such as " (:FUNREF NIL "ldb") ". " :PAR)))
    (:ITEM NIL (:B NIL "C")
     (:LIST NIL
      (:ITEM NIL (:B NIL "cadr") (:IDXTERM NIL "cadr") " "
       (:PRONOUNCED NIL (:HI-STRESS NIL "ka") (:LO-STRESS NIL "də r")) ", "
       (:I NIL "n.") " (of an " (:TERM NIL "object") ") the " (:TERM NIL "car")
       " of the " (:TERM NIL "cdr") " of that " (:TERM NIL "object") ". " :PAR)
      (:ITEM NIL (:B NIL "call") (:IDXTERM NIL "call") " " (:I NIL "v.t.") ", "
       (:I NIL "n.") " 1. " (:I NIL "v.t.") " (a " (:TERM NIL "function")
       " with " (:TERM NIL "arguments") ") to cause the " (:TERM NIL "code")
       " represented by that " (:TERM NIL "function") " to be "
       (:TERM NIL "executed") " in an " (:TERM NIL "environment") " where "
       (:TERM NIL "bindings") " for the " (:TERM NIL "values") " of its "
       (:TERM NIL "parameters") " have been " (:TERM NIL "established")
       " based on the " (:TERM NIL "arguments") ". “Calling the function "
       (:FUNREF NIL "+") " with the arguments " (:TT NIL "5") " and "
       (:TT NIL "1") " yields a value of " (:TT NIL "6") ".” 2. " (:I NIL "n.")
       " a " (:TERM NIL "situation") " in which a " (:TERM NIL "function")
       " is called. " :PAR)
      (:ITEM NIL (:B NIL "captured initialization form")
       (:IDXTERM NIL "captured initialization form") " " (:I NIL "n.") " an "
       (:TERM NIL "initialization form") " along with the "
       (:TERM NIL "lexical environment") " in which the " (:TERM NIL "form")
       " that defined the " (:TERM NIL "initialization form") " was "
       (:TERM NIL "evaluated")
       ". “Each newly added shared slot is set to the result of evaluating the captured initialization form for the slot that was specified in the "
       (:MACREF NIL "defclass") " form for the new class.” " :PAR)
      (:ITEM NIL (:B NIL "car") (:IDXTERM NIL "car") " " (:I NIL "n.")
       " 1. a. (of a " (:TERM NIL "cons") ") the component of a "
       (:TERM NIL "cons") " corresponding to the first " (:TERM NIL "argument")
       " to " (:FUNREF NIL "cons") "; the other component is the "
       (:TERM NIL "cdr") ". “The function " (:FUNREF NIL "rplaca")
       " modifies the car of a cons.” b. (of a " (:TERM NIL "list")
       ") the first " (:TERM NIL "element") " of the " (:TERM NIL "list")
       ", or " (:MISC NIL "nil") " if the " (:TERM NIL "list") " is the "
       (:TERM NIL "empty list") ". 2. the " (:TERM NIL "object")
       " that is held in the " (:TERM NIL "car") (:SUB NIL "1")
       ". “The function " (:FUNREF NIL "car") " returns the car of a cons.” "
       :PAR)
      (:ITEM NIL (:B NIL "case") (:IDXTERM NIL "case") " " (:I NIL "n.")
       " (of a " (:TERM NIL "character") ") the property of being either "
       (:TERM NIL "uppercase") " or " (:TERM NIL "lowercase") ". Not all "
       (:TERM NIL "characters") " have " (:TERM NIL "case")
       ". “The characters " (:TT NIL "#\\A") " and " (:TT NIL "#\\a")
       " have case, but the character " (:TT NIL "#\\$") " has no case.” See "
       (:SECREF NIL :CHARACTERS-WITH-CASE) " and the " (:TERM NIL "function")
       " " (:FUNREF NIL "both-case-p") ". " :PAR)
      (:ITEM NIL (:B NIL "case sensitivity mode")
       (:IDXTERM NIL "case sensitivity mode") " " (:I NIL "n.") " one of the "
       (:TERM NIL "symbols") " " (:KWD NIL "upcase") ", " (:KWD NIL "downcase")
       ", " (:KWD NIL "preserve") ", or " (:KWD NIL "invert") ". " :PAR)
      (:ITEM NIL (:B NIL "catch") (:IDXTERM NIL "catch") " " (:I NIL "n.")
       " an " (:TERM NIL "exit point") " which is " (:TERM NIL "established")
       " by a " (:SPECREF NIL "catch") " " (:TERM NIL "form") " within the "
       (:TERM NIL "dynamic scope") " of its body, which is named by a "
       (:TERM NIL "catch tag") ", and to which control and "
       (:TERM NIL "values") " may be " (:TERM NIL "thrown") ". " :PAR)
      (:ITEM NIL (:B NIL "catch tag") (:IDXTERM NIL "catch tag") " "
       (:I NIL "n.") " an " (:TERM NIL "object") " which names an "
       (:TERM NIL "active") " " (:TERM NIL "catch") ". (If more than one "
       (:TERM NIL "catch") " is active with the same " (:TERM NIL "catch tag")
       ", it is only possible to " (:TERM NIL "throw")
       " to the innermost such " (:TERM NIL "catch")
       " because the outer one is " (:TERM NIL "shadowed") (:SUB NIL "2") ".) "
       :PAR)
      (:ITEM NIL (:B NIL "cddr") (:IDXTERM NIL "cddr") " "
       (:PRONOUNCED NIL (:HI-STRESS NIL "k.ud") "ə " (:LO-STRESS NIL "də r"))
       " or "
       (:PRONOUNCED NIL (:HI-STRESS NIL "kə") (:LO-STRESS NIL "d.udə r")) ", "
       (:I NIL "n.") " (of an " (:TERM NIL "object") ") the " (:TERM NIL "cdr")
       " of the " (:TERM NIL "cdr") " of that " (:TERM NIL "object") ". " :PAR)
      (:ITEM NIL (:B NIL "cdr") (:IDXTERM NIL "cdr") " "
       (:PRONOUNCED NIL (:HI-STRESS NIL "k.u") (:LO-STRESS NIL "də r")) ", "
       (:I NIL "n.") " 1. a. (of a " (:TERM NIL "cons") ") the component of a "
       (:TERM NIL "cons") " corresponding to the second "
       (:TERM NIL "argument") " to " (:FUNREF NIL "cons")
       "; the other component is the " (:TERM NIL "car") ". “The function "
       (:FUNREF NIL "rplacd") " modifies the cdr of a cons.” b. (of a "
       (:TERM NIL "list") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "L") (:MN NIL "1"))) ") either the "
       (:TERM NIL "list") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "L") (:MN NIL "2")))
       " that contains the " (:TERM NIL "elements") " of "
       (:MATH NIL (:MSUB NIL (:MI NIL "L") (:MN NIL "1")))
       " that follow after the first, or else " (:MISC NIL "nil") " if "
       (:MATH NIL (:MSUB NIL (:MI NIL "L") (:MN NIL "1"))) " is the "
       (:TERM NIL "empty list") ". 2. the " (:TERM NIL "object")
       " that is held in the " (:TERM NIL "cdr") (:SUB NIL "1")
       ". “The function " (:FUNREF NIL "cdr") " returns the cdr of a cons.” "
       :PAR)
      (:ITEM NIL (:B NIL "cell") (:IDXTERM NIL "cell") " " (:I NIL "n.") " "
       (:I NIL "Trad.") " (of an " (:TERM NIL "object") ") a conceptual "
       (:TERM NIL "slot") " of that " (:TERM NIL "object") ". The "
       (:TERM NIL "dynamic variable") " and global " (:TERM NIL "function") " "
       (:TERM NIL "bindings") " of a " (:TERM NIL "symbol")
       " are sometimes referred to as its " (:TERM NIL "value cell") " and "
       (:TERM NIL "function cell") ", respectively. " :PAR)
      (:ITEM NIL (:B NIL "character") (:IDXTERM NIL "character") " "
       (:I NIL "n.") ", " (:I NIL "adj.") " 1. " (:I NIL "n.") " an "
       (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "character") "; that is, an " (:TERM NIL "object")
       " that represents a unitary token in an aggregate quantity of text; see "
       (:SECREF NIL :CHARACTER-CONCEPTS) ". 2. " (:I NIL "adj.") " a. (of a "
       (:TERM NIL "stream") ") having an " (:TERM NIL "element type")
       " that is a " (:TERM NIL "subtype") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "character") ". The most fundamental operation on a "
       (:TERM NIL "character") " " (:TERM NIL "input") " " (:TERM NIL "stream")
       " is " (:FUNREF NIL "read-char") " and on a " (:TERM NIL "character")
       " " (:TERM NIL "output") " " (:TERM NIL "stream") " is "
       (:FUNREF NIL "write-char") ". See " (:TERM NIL "binary") ". b. (of a "
       (:TERM NIL "file") ") having been created by opening a "
       (:TERM NIL "character") " " (:TERM NIL "stream") ". (It is "
       (:TERM NIL "implementation-dependent")
       " whether this is an inspectable aspect of the " (:TERM NIL "file")
       ", or whether any given " (:TERM NIL "binary") " " (:TERM NIL "file")
       " can be treated as a " (:TERM NIL "character") " " (:TERM NIL "file")
       ".) " :PAR (:COMMENT NIL "!!! Moon: This never says what it is!"))
      (:ITEM NIL (:B NIL "character code") (:IDXTERM NIL "character code") " "
       (:I NIL "n.") " 1. one of possibly several " (:TERM NIL "attributes")
       " of a " (:TERM NIL "character") ". 2. a non-negative "
       (:TERM NIL "integer") " less than the " (:TERM NIL "value") " of "
       (:VARREF NIL "char-code-limit") " that is suitable for use as a "
       (:TERM NIL "character code") (:SUB NIL "1") ". " :PAR)
      (:ITEM NIL (:B NIL "character designator")
       (:IDXTERM NIL "character designator") " " (:I NIL "n.") " a "
       (:TERM NIL "designator") " for a " (:TERM NIL "character")
       "; that is, an " (:TERM NIL "object") " that denotes a "
       (:TERM NIL "character") " and that is one of: a "
       (:TERM NIL "designator") " for a " (:TERM NIL "string") " of "
       (:TERM NIL "length") " one (denoting the " (:TERM NIL "character")
       " that is its only " (:TERM NIL "element") "), "
       (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " "
       (:COMMENT NIL
        " Integers used to be permitted (a la INT-CHAR), but are now removed.")
       (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " or a "
       (:TERM NIL "character") " (denoting itself). " :PAR)
      (:ITEM NIL (:B NIL "circular") (:IDXTERM NIL "circular") " "
       (:I NIL "adj.") " 1. (of a " (:TERM NIL "list") ") a "
       (:TERM NIL "circular list") ". 2. (of an arbitrary "
       (:TERM NIL "object") ") having a " (:TERM NIL "component") ", "
       (:TERM NIL "element") ", " (:TERM NIL "constituent") (:SUB NIL "2")
       ", or " (:TERM NIL "subexpression")
       " (as appropriate to the context) that is the " (:TERM NIL "object")
       " itself. " :PAR)
      (:ITEM NIL (:B NIL "circular list") (:IDXTERM NIL "circular list") " "
       (:I NIL "n.") " a chain of " (:TERM NIL "conses")
       " that has no termination because some " (:TERM NIL "cons")
       " in the chain is the " (:TERM NIL "cdr") " of a later "
       (:TERM NIL "cons") ". " :PAR)
      (:ITEM NIL (:B NIL "class") (:IDXTERM NIL "class") " " (:I NIL "n.")
       " 1. an " (:TERM NIL "object")
       " that uniquely determines the structure and behavior of a set of other "
       (:TERM NIL "objects") " called its " (:TERM NIL "direct instances")
       ", that contributes structure and behavior to a set of other "
       (:TERM NIL "objects") " called its " (:TERM NIL "indirect instances")
       ", and that acts as a " (:TERM NIL "type specifier")
       " for a set of objects called its " (:TERM NIL "generalized instances")
       ". “The class " (:TYPEREF NIL "integer") " is a subclass of the class "
       (:TYPEREF NIL "number") ".” (Note that the phrase “the "
       (:TERM NIL "class") " " (:TT NIL "foo")
       "” is often substituted for the more precise phrase “the "
       (:TERM NIL "class") " named " (:TT NIL "foo") "”—in both cases, a "
       (:TERM NIL "class") " " (:TERM NIL "object") " (not a "
       (:TERM NIL "symbol") ") is denoted.) 2. (of an " (:TERM NIL "object")
       ") the uniquely determined " (:TERM NIL "class") " of which the "
       (:TERM NIL "object") " is a " (:TERM NIL "direct instance") ". See the "
       (:TERM NIL "function") " " (:FUNREF NIL "class-of")
       ". “The class of the object returned by " (:FUNREF NIL "gensym") " is "
       (:TYPEREF NIL "symbol")
       ".” (Note that with this usage a phrase such as “its "
       (:TERM NIL "class") " is " (:TT NIL "foo")
       "” is often substituted for the more precise phrase “its "
       (:TERM NIL "class") " is the " (:TERM NIL "class") " named "
       (:TT NIL "foo") "”—in both cases, a " (:TERM NIL "class") " "
       (:TERM NIL "object") " (not a " (:TERM NIL "symbol") ") is denoted.) "
       :PAR)
      (:ITEM NIL (:B NIL "class designator") (:IDXTERM NIL "class designator")
       " " (:I NIL "n.") " a " (:TERM NIL "designator") " for a "
       (:TERM NIL "class") "; that is, an " (:TERM NIL "object")
       " that denotes a " (:TERM NIL "class") " and that is one of: a "
       (:TERM NIL "symbol") " (denoting the " (:TERM NIL "class")
       " named by that " (:TERM NIL "symbol") "; see the "
       (:TERM NIL "function") " " (:FUNREF NIL "find-class") ") or a "
       (:TERM NIL "class") " (denoting itself). " :PAR)
      (:ITEM NIL (:B NIL "class precedence list")
       (:IDXTERM NIL "class precedence list") " " (:I NIL "n.")
       " a unique total ordering on a " (:TERM NIL "class") " and its "
       (:TERM NIL "superclasses") " that is consistent with the "
       (:TERM NIL "local precedence orders") " for the " (:TERM NIL "class")
       " and its " (:TERM NIL "superclasses")
       ". For detailed information, see " (:SECREF NIL :DETERMINING-THE-CPL)
       ". " :PAR)
      (:ITEM NIL (:B NIL "close") (:IDXTERM NIL "close") " " (:I NIL "v.t.")
       " (a " (:TERM NIL "stream") ") to terminate usage of the "
       (:TERM NIL "stream") " as a source or sink of data, permitting the "
       (:TERM NIL "implementation")
       " to reclaim its internal data structures, and to free any external resources which might have been locked by the "
       (:TERM NIL "stream") " when it was opened. " :PAR)
      (:ITEM NIL (:B NIL "closed") (:IDXTERM NIL "closed") " " (:I NIL "adj.")
       " (of a " (:TERM NIL "stream") ") having been " (:TERM NIL "closed")
       " (see " (:TERM NIL (:TERM NIL "close"))
       "). Some (but not all) operations that are valid on " (:TERM NIL "open")
       " " (:TERM NIL "streams") " are not valid on " (:TERM NIL "closed") " "
       (:TERM NIL "streams") ". See " (:SECREF NIL :OPEN-AND-CLOSED-STREAMS)
       ". " :PAR)
      (:ITEM NIL (:B NIL "closure") (:IDXTERM NIL "closure") " " (:I NIL "n.")
       " a " (:TERM NIL "lexical closure") ". " :PAR
       (:COMMENT NIL
        "\"constant objects\" => \"literal objects\" per Moon #4(first public review) --kmp 5-May-93"))
      (:ITEM NIL (:B NIL "coalesce") (:IDXTERM NIL "coalesce") " "
       (:I NIL "v.t.") " (" (:TERM NIL "literal objects") " that are "
       (:TERM NIL "similar") ") to consolidate the identity of those "
       (:TERM NIL "objects") ", such that they become the " (:TERM NIL "same")
       " " (:COMMENT NIL "was \"identical\". -kmp 27-Jul-93")
       (:TERM NIL "object") ". See " (:SECREF NIL :COMPILATION-TERMS) ". "
       :PAR)
      (:ITEM NIL (:B NIL "code") (:IDXTERM NIL "code") " " (:I NIL "n.") " 1. "
       (:I NIL "Trad.")
       " any representation of actions to be performed, whether conceptual or as an actual "
       (:TERM NIL "object") ", such as " (:TERM NIL "forms") ", "
       (:TERM NIL "lambda expressions") ", " (:TERM NIL "objects") " of "
       (:TERM NIL "type") " " (:TERM NIL "function") ", text in a "
       (:TERM NIL "source file") ", or instruction sequences in a "
       (:TERM NIL "compiled file")
       ". This is a generic term; the specific nature of the representation depends on its context. 2. (of a "
       (:TERM NIL "character") ") a " (:TERM NIL "character code") ". " :PAR)
      (:ITEM NIL (:B NIL "coerce") (:IDXTERM NIL "coerce") " " (:I NIL "v.t.")
       " (an " (:TERM NIL "object") " to a " (:TERM NIL "type")
       ") to produce an " (:TERM NIL "object") " from the given "
       (:TERM NIL "object") ", without modifying that " (:TERM NIL "object")
       ", by following some set of coercion rules that must be specifically stated for any context in which this term is used. The resulting "
       (:TERM NIL "object") " is necessarily of the indicated "
       (:TERM NIL "type") ", except when that type is a " (:TERM NIL "subtype")
       " of " (:TERM NIL "type") " " (:TYPEREF NIL "complex")
       "; in that case, if a " (:TERM NIL "complex rational")
       " with an imaginary part of zero would result, the result is a "
       (:TERM NIL "rational") " rather than a " (:TERM NIL "complex") "—see "
       (:SECREF NIL :RULE-OF-CANON-REP-FOR-COMPLEX-RATIONALS) ". " :PAR)
      (:ITEM NIL (:B NIL "colon") (:IDXTERM NIL "colon") " " (:I NIL "n.")
       " the " (:TERM NIL "standard character") " that is called “colon” ("
       (:TT NIL ":") "). See " (:FIGREF NIL :STD-CHARS-THREE) ". " :PAR)
      (:ITEM NIL (:B NIL "comma") (:IDXTERM NIL "comma") " " (:I NIL "n.")
       " the " (:TERM NIL "standard character") " that is called “comma” ("
       (:TT NIL ",") "). See " (:FIGREF NIL :STD-CHARS-THREE) ". " :PAR)
      (:ITEM NIL (:B NIL "compilation") (:IDXTERM NIL "compilation") " "
       (:I NIL "n.") " the process of " (:TERM NIL "compiling") " "
       (:TERM NIL "code") " by the " (:TERM NIL "compiler") ". " :PAR
       (:COMMENT NIL
        "!!! Needs to acknowledge the interpreter in case of lazy semantic processing."))
      (:ITEM NIL (:B NIL "compilation environment")
       (:IDXTERM NIL "compilation environment") " " (:I NIL "n.") " 1. An "
       (:TERM NIL "environment") " that represents information known by the "
       (:TERM NIL "compiler") " about a " (:TERM NIL "form") " that is being "
       (:TERM NIL "compiled") ". See " (:SECREF NIL :COMPILATION-TERMS)
       ". 2. An " (:TERM NIL "object") " that represents the "
       (:TERM NIL "compilation environment") (:SUB NIL "1")
       " and that is used as a second argument to a "
       (:TERM NIL "macro function") " (which supplies a " (:TERM NIL "value")
       " for any " (:KEYREF NIL "environment") " " (:TERM NIL "parameter")
       " in the " (:TERM NIL "macro function") "'s definition). " :PAR)
      (:ITEM NIL (:B NIL "compilation unit") (:IDXTERM NIL "compilation unit")
       " " (:I NIL "n.")
       " an interval during which a single unit of compilation is occurring. See the "
       (:TERM NIL "macro") " " (:MACREF NIL "with-compilation-unit") ". " :PAR)
      (:ITEM NIL (:B NIL "compile") (:IDXTERM NIL "compile") " "
       (:I NIL "v.t.") " 1. (" (:TERM NIL "code")
       ") to perform semantic preprocessing of the " (:TERM NIL "code")
       ", usually optimizing one or more qualities of the code, such as run-time speed of "
       (:TERM NIL "execution")
       " or run-time storage usage. The minimum semantic requirements of compilation are that it must remove all macro calls and arrange for all "
       (:TERM NIL "load time values")
       " to be resolved prior to run time. 2. (a " (:TERM NIL "function")
       ") to produce a new " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "compiled-function") " which represents the result of "
       (:TERM NIL "compiling") " the " (:TERM NIL "code")
       " represented by the " (:TERM NIL "function") ". See the "
       (:TERM NIL "function") " " (:FUNREF NIL "compile") ". 3. (a "
       (:TERM NIL "source file") ") to produce a " (:TERM NIL "compiled file")
       " from a " (:TERM NIL "source file") ". See the " (:TERM NIL "function")
       " " (:FUNREF NIL "compile-file") ". " :PAR)
      (:ITEM NIL (:B NIL "compile time") (:IDXTERM NIL "compile time") " "
       (:I NIL "n.") " the duration of time that the " (:TERM NIL "compiler")
       " is processing " (:TERM NIL "source code") ". " :PAR)
      (:ITEM NIL (:B NIL "compile-time definition")
       (:IDXTERM NIL "compile-time definition") " " (:I NIL "n.")
       " a definition in the " (:TERM NIL "compilation environment") ". " :PAR)
      (:ITEM NIL (:B NIL "compiled code") (:IDXTERM NIL "compiled code") " "
       (:I NIL "n.") " 1. " (:TERM NIL "compiled functions") ". 2. "
       (:TERM NIL "code") " that represents " (:TERM NIL "compiled functions")
       ", such as the contents of a " (:TERM NIL "compiled file") ". " :PAR)
      (:ITEM NIL (:B NIL "compiled file") (:IDXTERM NIL "compiled file") " "
       (:I NIL "n.") " a " (:TERM NIL "file")
       " which represents the results of " (:TERM NIL "compiling") " the "
       (:TERM NIL "forms") " which appeared in a corresponding "
       (:TERM NIL "source file") ", and which can be " (:TERM NIL "loaded")
       ". See the " (:TERM NIL "function") " " (:FUNREF NIL "compile-file")
       ". " :PAR (:ISSUE NIL "COMPILED-FUNCTION-REQUIREMENTS:TIGHTEN") " ")
      (:ITEM NIL (:B NIL "compiled function")
       (:IDXTERM NIL "compiled function") " " (:I NIL "n.") " an "
       (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "compiled-function") ", which is a "
       (:TERM NIL "function") " that has been " (:TERM NIL "compiled")
       ", which contains no references to " (:TERM NIL "macros")
       " that must be expanded at run time, and which contains no unresolved references to "
       (:TERM NIL "load time values") ". "
       (:ENDISSUE NIL "COMPILED-FUNCTION-REQUIREMENTS:TIGHTEN") " " :PAR)
      (:ITEM NIL (:B NIL "compiler") (:IDXTERM NIL "compiler") " "
       (:I NIL "n.") " a facility that is part of Lisp and that translates "
       (:TERM NIL "code") " into an " (:TERM NIL "implementation-dependent")
       " form that might be represented or " (:TERM NIL "executed")
       " efficiently. The functions " (:FUNREF NIL "compile") " and "
       (:FUNREF NIL "compile-file") " permit programs to invoke the "
       (:TERM NIL "compiler") ". " :PAR
       (:ISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89") " ")
      (:ITEM NIL (:B NIL "compiler macro") (:IDXTERM NIL "compiler macro") " "
       (:I NIL "n.") " an auxiliary macro definition for a globally defined "
       (:TERM NIL "function") " or " (:TERM NIL "macro")
       " which might or might not be called by any given "
       (:TERM NIL "conforming implementation")
       " and which must preserve the semantics of the globally defined "
       (:TERM NIL "function") " or " (:TERM NIL "macro")
       " but which might perform some additional optimizations. (Unlike a "
       (:TERM NIL "macro") ", a " (:TERM NIL "compiler macro")
       " does not extend the syntax of " (:RM NIL " Common Lisp")
       "; rather, it provides an alternate implementation strategy for some existing syntax or functionality.) "
       :PAR)
      (:ITEM NIL (:B NIL "compiler macro expansion")
       (:IDXTERM NIL "compiler macro expansion") " " (:I NIL "n.")
       " 1. the process of translating a " (:TERM NIL "form") " into another "
       (:TERM NIL "form") " by a " (:TERM NIL "compiler macro") ". 2. the "
       (:TERM NIL "form") " resulting from this process. " :PAR)
      (:ITEM NIL (:B NIL "compiler macro form")
       (:IDXTERM NIL "compiler macro form") " " (:I NIL "n.") " a "
       (:TERM NIL "function form") " or " (:TERM NIL "macro form") " whose "
       (:TERM NIL "operator") " has a definition as a "
       (:TERM NIL "compiler macro") ", or a " (:FUNREF NIL "funcall") " "
       (:TERM NIL "form") " whose first " (:TERM NIL "argument") " is a "
       (:SPECREF NIL "function") " " (:TERM NIL "form") " whose "
       (:TERM NIL "argument") " is the " (:TERM NIL "name") " of a "
       (:TERM NIL "function") " that has a definition as a "
       (:TERM NIL "compiler macro") ". " :PAR)
      (:ITEM NIL (:B NIL "compiler macro function")
       (:IDXTERM NIL "compiler macro function") " " (:I NIL "n.") " a "
       (:TERM NIL "function") " of two arguments, a " (:TERM NIL "form")
       " and an " (:TERM NIL "environment") ", that implements "
       (:TERM NIL "compiler macro expansion") " by producing either a "
       (:TERM NIL "form") " to be used in place of the original argument "
       (:TERM NIL "form") " or else " (:MISC NIL "nil")
       ", indicating that the original " (:TERM NIL "form")
       " should not be replaced. See " (:SECREF NIL :COMPILER-MACROS) ". "
       (:ENDISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89") " " :PAR)
      (:ITEM NIL (:B NIL "complex") (:IDXTERM NIL "complex") " " (:I NIL "n.")
       " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "complex") ". " :PAR)
      (:ITEM NIL (:B NIL "complex float") (:IDXTERM NIL "complex float") " "
       (:I NIL "n.") " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "complex") " which has a " (:TERM NIL "complex part type")
       " that is a " (:TERM NIL "subtype") " of " (:TYPEREF NIL "float") ". A "
       (:TERM NIL "complex float") " is a " (:TERM NIL "complex")
       ", but it is not a " (:TERM NIL "float") ". " :PAR)
      (:ITEM NIL (:B NIL "complex part type")
       (:IDXTERM NIL "complex part type") " " (:I NIL "n.") " (of a "
       (:TERM NIL "complex") ") 1. the " (:TERM NIL "type")
       " which is used to represent both the real part and the imaginary part of the "
       (:TERM NIL "complex") ". 2. the " (:TERM NIL "actual complex part type")
       " of the " (:TERM NIL "complex") ". 3. the "
       (:TERM NIL "expressed complex part type") " of the "
       (:TERM NIL "complex") ". " :PAR)
      (:ITEM NIL (:B NIL "complex rational") (:IDXTERM NIL "complex rational")
       " " (:I NIL "n.") " an " (:TERM NIL "object") " of " (:TERM NIL "type")
       " " (:TYPEREF NIL "complex") " which has a "
       (:TERM NIL "complex part type") " that is a " (:TERM NIL "subtype")
       " of " (:TYPEREF NIL "rational") ". A " (:TERM NIL "complex rational")
       " is a " (:TERM NIL "complex") ", but it is not a "
       (:TERM NIL "rational") ". No " (:TERM NIL "complex rational")
       " has an imaginary part of zero because such a number is always represented by "
       (:RM NIL " Common Lisp") " as an " (:TERM NIL "object") " of "
       (:TERM NIL "type") " " (:TYPEREF NIL "rational") "; see "
       (:SECREF NIL :RULE-OF-CANON-REP-FOR-COMPLEX-RATIONALS) ". " :PAR)
      (:ITEM NIL (:B NIL "complex single float")
       (:IDXTERM NIL "complex single float") " " (:I NIL "n.") " an "
       (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "complex") " which has a " (:TERM NIL "complex part type")
       " that is a " (:TERM NIL "subtype") " of " (:TYPEREF NIL "single-float")
       ". A " (:TERM NIL "complex single float") " is a " (:TERM NIL "complex")
       ", but it is not a " (:TERM NIL "single float") ". " :PAR)
      (:ITEM NIL (:B NIL "composite stream") (:IDXTERM NIL "composite stream")
       " " (:I NIL "n.") " a " (:TERM NIL "stream")
       " that is composed of one or more other " (:TERM NIL "streams") ". “"
       (:FUNREF NIL "make-synonym-stream") " creates a composite stream.” "
       :PAR)
      (:ITEM NIL (:B NIL "compound form") (:IDXTERM NIL "compound form") " "
       (:I NIL "n.") " a " (:TERM NIL "non-empty") " " (:TERM NIL "list")
       " which is a " (:TERM NIL "form") ": a " (:TERM NIL "special form")
       ", a " (:TERM NIL "lambda form") ", a " (:TERM NIL "macro form")
       ", or a " (:TERM NIL "function form") ". " :PAR)
      (:ITEM NIL (:B NIL "compound type specifier")
       (:IDXTERM NIL "compound type specifier") " " (:I NIL "n.") " a "
       (:TERM NIL "type specifier") " that is a " (:TERM NIL "cons") "; "
       (:I NIL "i.e.") ",  a " (:TERM NIL "type specifier") " that is not an "
       (:TERM NIL "atomic type specifier") ". “"
       (:TT NIL "(vector single-float)") " is a compound type specifier.” "
       :PAR)
      (:ITEM NIL (:B NIL "concatenated stream")
       (:IDXTERM NIL "concatenated stream") " " (:I NIL "n.") " an "
       (:TERM NIL "input") " " (:TERM NIL "stream") " of " (:TERM NIL "type")
       " " (:TYPEREF NIL "concatenated-stream") ". " :PAR)
      (:ITEM NIL (:B NIL "condition") (:IDXTERM NIL "condition") " "
       (:I NIL "n.") " 1. an " (:TERM NIL "object") " which represents a "
       (:TERM NIL "situation") "—usually, but not necessarily, during "
       (:TERM NIL "signaling") ". 2. an " (:TERM NIL "object") " of "
       (:TERM NIL "type") " " (:TYPEREF NIL "condition") ". " :PAR)
      (:ITEM NIL (:B NIL "condition designator")
       (:IDXTERM NIL "condition designator") " " (:I NIL "n.") " one or more "
       (:TERM NIL "objects")
       " that, taken together, denote either an existing "
       (:TERM NIL "condition") " " (:TERM NIL "object") " or a "
       (:TERM NIL "condition") " " (:TERM NIL "object")
       " to be implicitly created. For details, see "
       (:SECREF NIL :CONDITION-DESIGNATORS) ". " :PAR)
      (:ITEM NIL (:B NIL "condition handler")
       (:IDXTERM NIL "condition handler") " " (:I NIL "n.") " a "
       (:TERM NIL "function") " that might be invoked by the act of "
       (:TERM NIL "signaling") ", that receives the " (:TERM NIL "condition")
       " being signaled as its only argument, and that is permitted to "
       (:TERM NIL "handle") " the " (:TERM NIL "condition") " or to "
       (:TERM NIL "decline") ". See " (:SECREF NIL :SIGNALING) ". " :PAR)
      (:ITEM NIL (:B NIL "condition reporter")
       (:IDXTERM NIL "condition reporter") " " (:I NIL "n.") " a "
       (:TERM NIL "function") " that describes how a " (:TERM NIL "condition")
       " is to be printed when the " (:TERM NIL "Lisp printer")
       " is invoked while " (:VARREF NIL "*print-escape*") " is "
       (:TERM NIL "false") ". See " (:SECREF NIL :PRINTING-CONDITIONS) ". "
       :PAR)
      (:ITEM NIL (:B NIL "conditional newline")
       (:IDXTERM NIL "conditional newline") " " (:I NIL "n.")
       " a point in output where a " (:TERM NIL "newline")
       " might be inserted at the discretion of the "
       (:TERM NIL "pretty printer") ". There are four kinds of "
       (:TERM NIL "conditional newlines")
       ", called “linear-style,” “fill-style,” “miser-style,” and “mandatory-style.” See the "
       (:TERM NIL "function") " " (:FUNREF NIL "pprint-newline") " and "
       (:SECREF NIL :DYNAMIC-CONTROL-OF-OUTPUT) ". " :PAR)
      (:ITEM NIL (:B NIL "conformance") (:IDXTERM NIL "conformance") " "
       (:I NIL "n.")
       " a state achieved by proper and complete adherence to the requirements of this specification. See "
       (:SECREF NIL :CONFORMANCE) ". " :PAR)
      (:ITEM NIL (:B NIL "conforming code") (:IDXTERM NIL "conforming code")
       " " (:I NIL "n.") " " (:TERM NIL "code") " that is all of part of a "
       (:TERM NIL "conforming program") ". " :PAR)
      (:ITEM NIL (:B NIL "conforming implementation")
       (:IDXTERM NIL "conforming implementation") " " (:I NIL "n.") " an "
       (:TERM NIL "implementation")
       ", used to emphasize complete and correct adherance to all conformance criteria. A "
       (:TERM NIL "conforming implementation") " is capable of accepting a "
       (:TERM NIL "conforming program") " as input, preparing that "
       (:TERM NIL "program") " for " (:TERM NIL "execution")
       ", and executing the prepared " (:TERM NIL "program")
       " in accordance with this specification. An "
       (:TERM NIL "implementation") " which has been extended may still be a "
       (:TERM NIL "conforming implementation")
       " provided that no extension interferes with the correct function of any "
       (:TERM NIL "conforming program") ". " :PAR)
      (:ITEM NIL (:B NIL "conforming processor")
       (:IDXTERM NIL "conforming processor") " " (:I NIL "n.") " "
       (:I NIL "ANSI") " a " (:TERM NIL "conforming implementation") ". " :PAR)
      (:ITEM NIL (:B NIL "conforming program")
       (:IDXTERM NIL "conforming program") " " (:I NIL "n.") " a "
       (:TERM NIL "program") ", used to emphasize the fact that the "
       (:TERM NIL "program")
       " depends for its correctness only upon documented aspects of "
       (:RM NIL " Common Lisp")
       ", and can therefore be expected to run correctly in any "
       (:TERM NIL "conforming implementation") ". " :PAR)
      (:ITEM NIL (:B NIL "congruent") (:IDXTERM NIL "congruent") " "
       (:I NIL "n.") " conforming to the rules of " (:TERM NIL "lambda list")
       " congruency, as detailed in "
       (:SECREF NIL :GF-METHOD-LAMBDA-LIST-CONGRUENCY) ". " :PAR)
      (:ITEM NIL (:B NIL "cons") (:IDXTERM NIL "cons") " " (:I NIL "n.")
       (:I NIL "v.") " 1. " (:I NIL "n.") " a compound data "
       (:TERM NIL "object") " having two components called the "
       (:TERM NIL "car") " and the " (:TERM NIL "cdr") ". 2. " (:I NIL "v.")
       " to create such an " (:TERM NIL "object") ". 3. " (:I NIL "v.") " "
       (:I NIL "Idiom.") " to create any " (:TERM NIL "object")
       ", or to allocate storage. " :PAR)
      (:ITEM NIL (:B NIL "constant") (:IDXTERM NIL "constant") " "
       (:I NIL "n.") " 1. a " (:TERM NIL "constant form") ". 2. a "
       (:TERM NIL "constant variable") ". 3. a " (:TERM NIL "constant object")
       ". 4. a " (:TERM NIL "self-evaluating object") ". " :PAR)
      (:ITEM NIL (:B NIL "constant form") (:IDXTERM NIL "constant form") " "
       (:I NIL "n.") " any " (:TERM NIL "form") " for which "
       (:TERM NIL "evaluation") " always " (:TERM NIL "yields") " the same "
       (:TERM NIL "value") ", that neither affects nor is affected by the "
       (:TERM NIL "environment") " in which it is " (:TERM NIL "evaluated")
       " (except that it is permitted to refer to the names of "
       (:TERM NIL "constant variables") " defined in the "
       (:TERM NIL "environment")
       "), and that neither affects nor is affected by the state of any "
       (:TERM NIL "object") " except those " (:TERM NIL "objects") " that are "
       (:TERM NIL "otherwise inaccessible parts") " of " (:TERM NIL "objects")
       " created by the " (:TERM NIL "form") " itself. “A " (:FUNREF NIL "car")
       " form in which the argument is a " (:SPECREF NIL "quote")
       " form is a constant form.” " :PAR)
      (:ITEM NIL (:B NIL "constant object") (:IDXTERM NIL "constant object")
       " " (:I NIL "n.") " an " (:TERM NIL "object") " that is constrained ("
       (:I NIL "e.g.") ",  by its context in a " (:TERM NIL "program")
       " or by the source from which it was obtained) to be "
       (:TERM NIL "immutable")
       ". “A literal object that has been processed by "
       (:FUNREF NIL "compile-file") " is a constant object.” " :PAR)
      (:ITEM NIL (:B NIL "constant variable")
       (:IDXTERM NIL "constant variable") " " (:I NIL "n.") " a "
       (:TERM NIL "variable") ", the " (:TERM NIL "value")
       " of which can never change; that is, a " (:TERM NIL "keyword")
       (:SUB NIL "1") " or a " (:TERM NIL "named constant") ". “The symbols "
       (:MISC NIL "t") ", " (:MISC NIL "nil") ", " (:KWD NIL "direction")
       ", and " (:CONREF NIL "most-positive-fixnum")
       " are constant variables.” " :PAR)
      (:ITEM NIL (:B NIL "constituent") (:IDXTERM NIL "constituent") " "
       (:I NIL "n.") ", " (:I NIL "adj.") " 1. a. " (:I NIL "n.") " the "
       (:TERM NIL "syntax type") " of a " (:TERM NIL "character")
       " that is part of a " (:TERM NIL "token") ". For details, see "
       (:SECREF NIL :CONSTITUENT-CHARS) ". b. " (:I NIL "adj.") " (of a "
       (:TERM NIL "character") ") having the " (:TERM NIL "constituent")
       (:SUB NIL "1a") " " (:TERM NIL "syntax type") (:SUB NIL "2") ". c. "
       (:I NIL "n.") " a " (:TERM NIL "constituent") (:SUB NIL "1b") " "
       (:TERM NIL "character") ". 2. " (:I NIL "n.") " (of a "
       (:TERM NIL "composite stream") ") one of possibly several "
       (:TERM NIL "objects")
       " that collectively comprise the source or sink of that "
       (:TERM NIL "stream") ". " :PAR)
      (:ITEM NIL (:B NIL "constituent trait")
       (:IDXTERM NIL "constituent trait") " " (:I NIL "n.") " (of a "
       (:TERM NIL "character") ") one of several classifications of a "
       (:TERM NIL "constituent") " " (:TERM NIL "character") " in a "
       (:TERM NIL "readtable") ". See " (:SECREF NIL :CONSTITUENT-CHARS) ". "
       :PAR)
      (:ITEM NIL (:B NIL "constructed stream")
       (:IDXTERM NIL "constructed stream") " " (:I NIL "n.") " a "
       (:TERM NIL "stream") " whose source or sink is a Lisp "
       (:TERM NIL "object") ". Note that since a " (:TERM NIL "stream")
       " is another Lisp " (:TERM NIL "object") ", "
       (:TERM NIL "composite streams") " are considered "
       (:TERM NIL "constructed streams")
       ". “A string stream is a constructed stream.” " :PAR)
      (:ITEM NIL (:B NIL "contagion") (:IDXTERM NIL "contagion") " "
       (:I NIL "n.") " a process whereby operations on " (:TERM NIL "objects")
       " of differing " (:TERM NIL "types") " (" (:I NIL "e.g.")
       ",  arithmetic on mixed " (:TERM NIL "types") " of "
       (:TERM NIL "numbers") ") produce a result whose " (:TERM NIL "type")
       " is controlled by the dominance of one " (:TERM NIL "argument") "'s "
       (:TERM NIL "type") " over the " (:TERM NIL "types") " of the other "
       (:TERM NIL "arguments") ". See " (:SECREF NIL :NUMERIC-CONTAGION-RULES)
       ". " :PAR)
      (:ITEM NIL (:B NIL "continuable") (:IDXTERM NIL "continuable") " "
       (:I NIL "n.") " (of an " (:TERM NIL "error") ") an " (:TERM NIL "error")
       " that is " (:TERM NIL "correctable") " by the " (:TT NIL "continue")
       " restart. " :PAR)
      (:ITEM NIL (:B NIL "control form") (:IDXTERM NIL "control form") " "
       (:I NIL "n.") " 1. a " (:TERM NIL "form")
       " that establishes one or more places to which control can be transferred. 2. a "
       (:TERM NIL "form") " that transfers control. "
       (:COMMENT NIL
        " Moon says he can't think of any form which doesn't match this:"
        " 3. a \\term{form} from which control can be transferred.")
       :PAR)
      (:ITEM NIL (:B NIL "copy") (:IDXTERM NIL "copy") " " (:I NIL "n.")
       " 1. (of a " (:TERM NIL "cons") " " (:MATH NIL (:MI NIL "C")) ") a "
       (:TERM NIL "fresh") " " (:TERM NIL "cons") " with the "
       (:TERM NIL "same") " " (:TERM NIL "car") " and " (:TERM NIL "cdr")
       " as " (:MATH NIL (:MI NIL "C")) ". 2. (of a " (:TERM NIL "list") " "
       (:MATH NIL (:MI NIL "L")) ") a " (:TERM NIL "fresh") " "
       (:TERM NIL "list") " with the " (:TERM NIL "same") " "
       (:TERM NIL "elements") " as " (:MATH NIL (:MI NIL "L")) ". (Only the "
       (:TERM NIL "list structure") " is " (:TERM NIL "fresh") "; the "
       (:TERM NIL "elements") " are the " (:TERM NIL "same") ".) See the "
       (:TERM NIL "function") " " (:FUNREF NIL "copy-list") ". 3. (of an "
       (:TERM NIL "association list") " " (:MATH NIL (:MI NIL "A")) " with "
       (:TERM NIL "elements") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "A") (:MI NIL "i"))) ") a "
       (:TERM NIL "fresh") " " (:TERM NIL "list") " " (:MATH NIL (:MI NIL "B"))
       " with " (:TERM NIL "elements") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "B") (:MI NIL "i")))
       ", each of which is " (:MISC NIL "nil") " if "
       (:MATH NIL (:MSUB NIL (:MI NIL "A") (:MI NIL "i"))) " is "
       (:MISC NIL "nil") ", or else a " (:TERM NIL "copy") " of the "
       (:TERM NIL "cons") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "A") (:MI NIL "i"))) ". See the "
       (:TERM NIL "function") " " (:FUNREF NIL "copy-alist") ". 4. (of a "
       (:TERM NIL "tree") " " (:MATH NIL (:MI NIL "T")) ") a "
       (:TERM NIL "fresh") " " (:TERM NIL "tree") " with the "
       (:TERM NIL "same") " " (:TERM NIL "leaves") " as "
       (:MATH NIL (:MI NIL "T")) ". See the " (:TERM NIL "function") " "
       (:FUNREF NIL "copy-tree") ". 5. (of a " (:TERM NIL "random state") " "
       (:MATH NIL (:MI NIL "R")) ") a " (:TERM NIL "fresh") " "
       (:TERM NIL "random state") " that, if used as an argument to to the "
       (:TERM NIL "function") " " (:FUNREF NIL "random")
       " would produce the same series of “random” values as "
       (:MATH NIL (:MI NIL "R")) " would produce. "
       (:ISSUE NIL "DEFSTRUCT-COPIER:ARGUMENT-TYPE") " 6. (of a "
       (:TERM NIL "structure") " " (:MATH NIL (:MI NIL "S")) ") a "
       (:TERM NIL "fresh") " " (:TERM NIL "structure") " that has the same "
       (:TERM NIL "type") " as " (:MATH NIL (:MI NIL "S"))
       ", and that has slot values, each of which is the " (:TERM NIL "same")
       " as the corresponding slot value of " (:MATH NIL (:MI NIL "S")) ". "
       (:ENDISSUE NIL "DEFSTRUCT-COPIER:ARGUMENT-TYPE") " "
       (:COMMENT NIL "% Proposed:" "   7. (of an \\term{array} $A\\sub 1$)"
        "      a \\term{fresh} \\term{array} $A\\sub 2$"
        "      with the same \\term{array element type} as $A\\sub 1$"
        "      and the \\term{same} \\term{active} \\term{elements} as $A\\sub 1$."
        "   8. (of a \\term{readtable} $R\\sub 1$)"
        "      a \\term{fresh} \\term{readtable} $R\\sub 2$"
        "      that has the same \\term{readtable case} as $R\\sub 1$"
        "      and whose associations between \\term{macro characters} "
        "        			        and their \\term{reader macro functions}"
        "      are distinct from those of $R\\sub 1$." " ")
       "(Note that since the difference between a " (:TERM NIL "cons") ", a "
       (:TERM NIL "list") ", and a " (:TERM NIL "tree")
       " is a matter of “view” or “intention,” there can be no general-purpose "
       (:TERM NIL "function") " which, based solely on the " (:TERM NIL "type")
       " of an " (:TERM NIL "object")
       ", can determine which of these distinct meanings is intended. The distinction rests solely on the basis of the text description within this document. For example, phrases like “a "
       (:TERM NIL "copy") " of the given " (:TERM NIL "list")
       "” or “copy of the " (:TERM NIL "list") " " (:PARAM NIL "x")
       "” imply the second definition.) " :PAR)
      (:ITEM NIL (:B NIL "correctable") (:IDXTERM NIL "correctable") " "
       (:I NIL "adj.") " (of an " (:TERM NIL "error") ") 1. (by a "
       (:TERM NIL "restart") " other than " (:MISC NIL "abort")
       " that has been associated with the " (:TERM NIL "error")
       ") capable of being corrected by invoking that " (:TERM NIL "restart")
       ". “The function " (:FUNREF NIL "cerror")
       " signals an error that is correctable by the " (:MISC NIL "continue")
       " " (:TERM NIL "restart") ".” "
       (:ISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION")
       " (Note that correctability is not a property of an "
       (:TERM NIL "error") " " (:TERM NIL "object")
       ", but rather a property of the " (:TERM NIL "dynamic environment")
       " that is in effect when the " (:TERM NIL "error") " is "
       (:TERM NIL "signaled") ". Specifically, the " (:TERM NIL "restart")
       " is “associated with” the " (:TERM NIL "error") " "
       (:TERM NIL "condition") " " (:TERM NIL "object") ". See "
       (:SECREF NIL :ASSOC-RESTART-WITH-COND) ".) "
       (:ENDISSUE NIL "CONDITION-RESTARTS:PERMIT-ASSOCIATION")
       " 2. (when no specific " (:TERM NIL "restart") " is mentioned) "
       (:TERM NIL "correctable") (:SUB NIL "1") " by at least one "
       (:TERM NIL "restart") ". “" (:FUNREF NIL "import")
       " signals a correctable error of " (:TERM NIL "type") " "
       (:TYPEREF NIL "package-error")
       " if any of the imported symbols has the same name as some distinct symbol already accessible in the package.” "
       :PAR)
      (:ITEM NIL (:B NIL "current input base")
       (:IDXTERM NIL "current input base") " " (:I NIL "n.") " (in a "
       (:TERM NIL "dynamic environment") ") the " (:TERM NIL "radix")
       " that is the " (:TERM NIL "value") " of " (:VARREF NIL "*read-base*")
       " in that " (:TERM NIL "environment") ", and that is the default "
       (:TERM NIL "radix") " employed by the " (:TERM NIL "Lisp reader")
       " and its related " (:TERM NIL "functions") ". " :PAR)
      (:ITEM NIL (:B NIL "current logical block")
       (:IDXTERM NIL "current logical block") " " (:I NIL "n.")
       " the context of the innermost lexically enclosing use of "
       (:MACREF NIL "pprint-logical-block") ". " :PAR)
      (:ITEM NIL (:B NIL "current output base")
       (:IDXTERM NIL "current output base") " " (:I NIL "n.") " (in a "
       (:TERM NIL "dynamic environment") ") the " (:TERM NIL "radix")
       " that is the " (:TERM NIL "value") " of " (:VARREF NIL "*print-base*")
       " in that " (:TERM NIL "environment") ", and that is the default "
       (:TERM NIL "radix") " employed by the " (:TERM NIL "Lisp printer")
       " and its related " (:TERM NIL "functions") ". " :PAR)
      (:ITEM NIL (:B NIL "current package") (:IDXTERM NIL "current package")
       " " (:I NIL "n.") " (in a " (:TERM NIL "dynamic environment") ") the "
       (:TERM NIL "package") " that is the " (:TERM NIL "value") " of "
       (:VARREF NIL "*package*") " in that " (:TERM NIL "environment")
       ", and that is the default " (:TERM NIL "package") " employed by the "
       (:TERM NIL "Lisp reader") " and " (:TERM NIL "Lisp printer")
       ", and their related " (:TERM NIL "functions") ". " :PAR
       (:COMMENT NIL
        " Added for consistency with other \"current xxx\" terms. -kmp 27-Aug-93"))
      (:ITEM NIL (:B NIL "current pprint dispatch table")
       (:IDXTERM NIL "current pprint dispatch table") " " (:I NIL "n.")
       " (in a " (:TERM NIL "dynamic environment") ") the "
       (:TERM NIL "pprint dispatch table") " that is the " (:TERM NIL "value")
       " of " (:VARREF NIL "*print-pprint-dispatch*") " in that "
       (:TERM NIL "environment") ", and that is the default "
       (:TERM NIL "pprint dispatch table") " employed by the "
       (:TERM NIL "pretty printer") ". " :PAR)
      (:ITEM NIL (:B NIL "current random state")
       (:IDXTERM NIL "current random state") " " (:I NIL "n.") " (in a "
       (:TERM NIL "dynamic environment") ") the " (:TERM NIL "random state")
       " that is the " (:TERM NIL "value") " of "
       (:VARREF NIL "*random-state*") " in that " (:TERM NIL "environment")
       ", and that is the default " (:TERM NIL "random state") " employed by "
       (:FUNREF NIL "random") ". " :PAR)
      (:ITEM NIL (:B NIL "current readtable")
       (:IDXTERM NIL "current readtable") " " (:I NIL "n.") " (in a "
       (:TERM NIL "dynamic environment") ") the " (:TERM NIL "readtable")
       " that is the " (:TERM NIL "value") " of " (:VARREF NIL "*readtable*")
       " in that " (:TERM NIL "environment")
       ", and that affects the way in which " (:TERM NIL "expressions")
       (:SUB NIL "2") " are parsed into " (:TERM NIL "objects") " by the "
       (:TERM NIL "Lisp reader") ". " :PAR)))
    (:ITEM NIL (:B NIL "D")
     (:LIST NIL
      (:ITEM NIL (:B NIL "data type") (:IDXTERM NIL "data type") " "
       (:I NIL "n.") " " (:I NIL "Trad.") " a " (:TERM NIL "type") ". " :PAR)
      (:ITEM NIL (:B NIL "debug I/O") (:IDXTERM NIL "debug I/O") " "
       (:I NIL "n.") " the " (:TERM NIL "bidirectional") " "
       (:TERM NIL "stream") " that is the " (:TERM NIL "value") " of the "
       (:TERM NIL "variable") " " (:VARREF NIL "*debug-io*") ". " :PAR)
      (:ITEM NIL (:B NIL "debugger") (:IDXTERM NIL "debugger") " "
       (:I NIL "n.") " a facility that allows the " (:TERM NIL "user")
       " to handle a " (:TERM NIL "condition")
       " interactively. For example, the " (:TERM NIL "debugger")
       " might permit interactive selection of a " (:TERM NIL "restart")
       " from among the " (:TERM NIL "active") " " (:TERM NIL "restarts")
       ", and it might perform additional "
       (:TERM NIL "implementation-defined")
       " services for the purposes of debugging. " :PAR)
      (:ITEM NIL (:B NIL "declaration") (:IDXTERM NIL "declaration") " "
       (:I NIL "n.") " a " (:TERM NIL "global declaration") " or "
       (:TERM NIL "local declaration") ". " :PAR)
      (:ITEM NIL (:B NIL "declaration identifier")
       (:IDXTERM NIL "declaration identifier") " " (:I NIL "n.") " one of the "
       (:TERM NIL "symbols") " " (:DECLREF NIL "declaration") ", "
       (:DECLREF NIL "dynamic-extent") ", " (:DECLREF NIL "ftype") ", "
       (:DECLREF NIL "function") ", " (:DECLREF NIL "ignore") ", "
       (:DECLREF NIL "inline") ", " (:DECLREF NIL "notinline") ", "
       (:DECLREF NIL "optimize") ", " (:DECLREF NIL "special") ", or "
       (:DECLREF NIL "type") "; or a " (:TERM NIL "symbol") " which is the "
       (:TERM NIL "name") " of a " (:TERM NIL "type") "; or a "
       (:TERM NIL "symbol") " which has been " (:TERM NIL "declared")
       " to be a " (:TERM NIL "declaration identifier") " by using a "
       (:DECLREF NIL "declaration") " " (:TERM NIL "declaration") ". "
       (:ISSUE NIL "SYNTACTIC-ENVIRONMENT-ACCESS:RETRACTED-MAR91") " "
       (:COMMENT NIL " or by using \\funref{define-declaration}.")
       (:ENDISSUE NIL "SYNTACTIC-ENVIRONMENT-ACCESS:RETRACTED-MAR91") " " :PAR)
      (:ITEM NIL (:B NIL "declaration specifier")
       (:IDXTERM NIL "declaration specifier") " " (:I NIL "n.") " an "
       (:TERM NIL "expression") " that can appear at top level of a "
       (:MISC NIL "declare") " expression or a " (:MACREF NIL "declaim")
       " form, or as the argument to " (:FUNREF NIL "proclaim")
       ", and which has a " (:TERM NIL "car") " which is a "
       (:TERM NIL "declaration identifier") ", and which has a "
       (:TERM NIL "cdr")
       " that is data interpreted according to rules specific to the "
       (:TERM NIL "declaration identifier") ". " :PAR)
      (:ITEM NIL (:B NIL "declare") (:IDXTERM NIL "declare") " " (:I NIL "v.")
       " to " (:TERM NIL "establish") " a " (:TERM NIL "declaration") ". See "
       (:MISC NIL "declare") ", " (:MACREF NIL "declaim") ", or "
       (:FUNREF NIL "proclaim") ". " :PAR)
      (:ITEM NIL (:B NIL "decline") (:IDXTERM NIL "decline") " " (:I NIL "v.")
       " (of a " (:TERM NIL "handler") ") to return normally without having "
       (:TERM NIL "handled") " the " (:TERM NIL "condition") " being "
       (:TERM NIL "signaled")
       ", permitting the signaling process to continue as if the "
       (:TERM NIL "handler") " had not been present. " :PAR)
      (:ITEM NIL (:B NIL "decoded time") (:IDXTERM NIL "decoded time") " "
       (:I NIL "n.") " " (:TERM NIL "absolute") " " (:TERM NIL "time")
       ", represented as an ordered series of nine " (:TERM NIL "objects")
       " which, taken together, form a description of a point in calendar time, accurate to the nearest second (except that "
       (:TERM NIL "leap seconds") " are ignored). See "
       (:SECREF NIL :DECODED-TIME) ". " :PAR)
      (:ITEM NIL (:B NIL "default method") (:IDXTERM NIL "default method") " "
       (:I NIL "n.") " a " (:TERM NIL "method") " having no "
       (:TERM NIL "parameter specializers") " other than the "
       (:TERM NIL "class") " " (:TYPEREF NIL "t") ". Such a "
       (:TERM NIL "method") " is always an " (:TERM NIL "applicable method")
       " but might be " (:TERM NIL "shadowed") (:SUB NIL "2")
       " by a more specific " (:TERM NIL "method") ". " :PAR)
      (:ITEM NIL (:B NIL "defaulted initialization argument list")
       (:IDXTERM NIL "defaulted initialization argument list") " "
       (:I NIL "n.") " a " (:TERM NIL "list")
       " of alternating initialization argument " (:TERM NIL "names") " and "
       (:TERM NIL "values")
       " in which unsupplied initialization arguments are defaulted, used in the protocol for initializing and reinitializing "
       (:TERM NIL "instances") " of " (:TERM NIL "classes") ". " :PAR
       (:COMMENT NIL
        " This is new per Barrett #3 (first public review). -kmp 12-May-93"))
      (:ITEM NIL (:B NIL "define-method-combination arguments lambda list")
       (:IDXTERM NIL "define-method-combination arguments lambda list") " "
       (:I NIL "n.") " a " (:TERM NIL "lambda list") " used by the "
       (:KWD NIL "arguments") " option to "
       (:MACREF NIL "define-method-combination") ". See "
       (:SECREF NIL :DEF-METH-COMB-ARGS-LAMBDA-LISTS) ". " :PAR
       (:COMMENT NIL " This is new.  --sjl 5 Mar 92"))
      (:ITEM NIL (:B NIL "define-modify-macro lambda list")
       (:IDXTERM NIL "define-modify-macro lambda list") " " (:I NIL "n.") " a "
       (:TERM NIL "lambda list") " used by "
       (:MACREF NIL "define-modify-macro") ". See "
       (:SECREF NIL :DEFINE-MODIFY-MACRO-LAMBDA-LISTS) ". " :PAR)
      (:ITEM NIL (:B NIL "defined name") (:IDXTERM NIL "defined name") " "
       (:I NIL "n.") " a " (:TERM NIL "symbol")
       " the meaning of which is defined by " (:RM NIL " Common Lisp") ". "
       :PAR)
      (:ITEM NIL (:B NIL "defining form") (:IDXTERM NIL "defining form") " "
       (:I NIL "n.") " a " (:TERM NIL "form") " that has the side-effect of "
       (:TERM NIL "establishing") " a definition. “" (:MACREF NIL "defun")
       " and " (:MACREF NIL "defparameter") " are defining forms.” " :PAR)
      (:ITEM NIL (:B NIL "defsetf lambda list")
       (:IDXTERM NIL "defsetf lambda list") " " (:I NIL "n.") " a "
       (:TERM NIL "lambda list") " that is like an "
       (:TERM NIL "ordinary lambda list") " except that it does not permit "
       (:KEYREF NIL "aux") " and that it permits use of "
       (:KEYREF NIL "environment") ". See " (:SECREF NIL :DEFSETF-LAMBDA-LISTS)
       ". " :PAR (:ISSUE NIL "DEFTYPE-KEY:ALLOW") " "
       (:ISSUE NIL "DEFTYPE-DESTRUCTURING:YES") " ")
      (:ITEM NIL (:B NIL "deftype lambda list")
       (:IDXTERM NIL "deftype lambda list") " " (:I NIL "n.") " a "
       (:TERM NIL "lambda list") " that is like a "
       (:TERM NIL "macro lambda list") " except that the default "
       (:TERM NIL "value") " for unsupplied " (:TERM NIL "optional parameters")
       " and " (:TERM NIL "keyword parameters") " is the " (:TERM NIL "symbol")
       " " (:MISC NIL "*") " (rather than " (:MISC NIL "nil") "). See "
       (:SECREF NIL :DEFTYPE-LAMBDA-LISTS) ". "
       (:ENDISSUE NIL "DEFTYPE-DESTRUCTURING:YES") " "
       (:ENDISSUE NIL "DEFTYPE-KEY:ALLOW") " " :PAR)
      (:ITEM NIL (:B NIL "denormalized") (:IDXTERM NIL "denormalized") " "
       (:I NIL "adj.") ", " (:I NIL "ANSI") ", " (:I NIL "IEEE") " (of a "
       (:TERM NIL "float")
       ") conforming to the description of “denormalized” as described by "
       (:BIB (:DOI "10.1109/IEEESTD.1985.82928" :ISBN "0-7381-1165-1")
        "IEEE Standard for Binary Floating-Point Arithmetic")
       ". For example, in an " (:TERM NIL "implementation")
       " where the minimum possible exponent was " (:TT NIL "-7") " but where "
       (:TT NIL "0.001") " was a valid mantissa, the number "
       (:TT NIL "1.0e-10") " might be representable as " (:TT NIL "0.001e-7")
       " internally even if the " (:TERM NIL "normalized")
       " representation would call for it to be represented instead as "
       (:TT NIL "1.0e-10") " or " (:TT NIL "0.1e-9") ". By their nature, "
       (:TERM NIL "denormalized") " " (:TERM NIL "floats")
       " generally have less precision than " (:TERM NIL "normalized") " "
       (:TERM NIL "floats") ". " :PAR)
      (:ITEM NIL (:B NIL "derived type") (:IDXTERM NIL "derived type") " "
       (:I NIL "n.") " a " (:TERM NIL "type specifier")
       " which is defined in terms of an expansion into another "
       (:TERM NIL "type specifier") ". " (:MACREF NIL "deftype") " defines "
       (:TERM NIL "derived types") ", and there may be other "
       (:TERM NIL "implementation-defined") " " (:TERM NIL "operators")
       " which do so as well. " :PAR)
      (:ITEM NIL (:B NIL "derived type specifier")
       (:IDXTERM NIL "derived type specifier") " " (:I NIL "n.") " a "
       (:TERM NIL "type specifier") " for a " (:TERM NIL "derived type") ". "
       :PAR)
      (:ITEM NIL (:B NIL "designator") (:IDXTERM NIL "designator") " "
       (:I NIL "n.") " an " (:TERM NIL "object") " that denotes another "
       (:TERM NIL "object") ". In the dictionary entry for an "
       (:TERM NIL "operator") " if a " (:TERM NIL "parameter")
       " is described as a " (:TERM NIL "designator") " for a "
       (:TERM NIL "type") ", the description of the " (:TERM NIL "operator")
       " is written in a way that assumes that appropriate coercion to that "
       (:TERM NIL "type") " has already occurred; that is, that the "
       (:TERM NIL "parameter") " is already of the denoted " (:TERM NIL "type")
       ". For more detailed information, see " (:SECREF NIL :DESIGNATORS) ". "
       :PAR)
      (:ITEM NIL (:B NIL "destructive") (:IDXTERM NIL "destructive") " "
       (:I NIL "adj.") " (of an " (:TERM NIL "operator")
       ") capable of modifying some program-visible aspect of one or more "
       (:TERM NIL "objects") " that are either explicit "
       (:TERM NIL "arguments") " to the " (:TERM NIL "operator")
       " or that can be obtained directly or indirectly from the "
       (:TERM NIL "global environment") " by the " (:TERM NIL "operator") ". "
       :PAR (:COMMENT NIL " This is new.  --sjl 5 Mar 92"))
      (:ITEM NIL (:B NIL "destructuring lambda list")
       (:IDXTERM NIL "destructuring lambda list") " " (:I NIL "n.") " an "
       (:TERM NIL "extended lambda list") " used in "
       (:MACREF NIL "destructuring-bind") " and nested within "
       (:TERM NIL "macro lambda lists") ". See "
       (:SECREF NIL :DESTRUCTURING-LAMBDA-LISTS) ". " :PAR)
      (:ITEM NIL (:B NIL "different") (:IDXTERM NIL "different") " "
       (:I NIL "adj.") " not the " (:TERM NIL "same") " “The strings "
       (:TT NIL "\"FOO\"") " and " (:TT NIL "\"foo\"") " are different under "
       (:FUNREF NIL "equal") " but not under " (:FUNREF NIL "equalp") ".” "
       :PAR)
      (:ITEM NIL (:B NIL "digit") (:IDXTERM NIL "digit") " " (:I NIL "n.")
       " (in a " (:TERM NIL "radix") ") a " (:TERM NIL "character")
       " that is among the possible digits (" (:TT NIL "0") " to "
       (:TT NIL "9") ", " (:TT NIL "A") " to " (:TT NIL "Z") ", and "
       (:TT NIL "a") " to " (:TT NIL "z")
       ") and that is defined to have an associated numeric weight as a digit in that "
       (:TERM NIL "radix") ". See " (:SECREF NIL :DIGITS) ". " :PAR)
      (:ITEM NIL (:B NIL "dimension") (:IDXTERM NIL "dimension") " "
       (:I NIL "n.") " 1. a non-negative " (:TERM NIL "integer")
       " indicating the number of " (:TERM NIL "objects") " an "
       (:TERM NIL "array") " can hold along one axis. If the "
       (:TERM NIL "array") " is a " (:TERM NIL "vector") " with a "
       (:TERM NIL "fill pointer") ", the " (:TERM NIL "fill pointer")
       " is ignored. “The second dimension of that array is 7.” 2. an axis of an array. “This array has six dimensions.” "
       :PAR)
      (:ITEM NIL (:B NIL "direct instance") (:IDXTERM NIL "direct instance")
       " " (:I NIL "n.") " (of a " (:TERM NIL "class") " "
       (:MATH NIL (:MI NIL "C")) ") an " (:TERM NIL "object") " whose "
       (:TERM NIL "class") " is " (:MATH NIL (:MI NIL "C"))
       " itself, rather than some " (:TERM NIL "subclass") " of "
       (:MATH NIL (:MI NIL "C")) ". “The function "
       (:FUNREF NIL "make-instance")
       " always returns a direct instance of the class which is (or is named by) its first argument.” "
       :PAR)
      (:ITEM NIL (:B NIL "direct subclass") (:IDXTERM NIL "direct subclass")
       " " (:I NIL "n.") " (of a " (:TERM NIL "class") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) ") a "
       (:TERM NIL "class") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) ", such that "
       (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) " is a "
       (:TERM NIL "direct superclass") " of "
       (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) ". " :PAR)
      (:ITEM NIL (:B NIL "direct superclass")
       (:IDXTERM NIL "direct superclass") " " (:I NIL "n.") " (of a "
       (:TERM NIL "class") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) ") a "
       (:TERM NIL "class") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2")))
       " which was explicitly designated as a " (:TERM NIL "superclass") " of "
       (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1")))
       " in the definition of "
       (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) ". " :PAR)
      (:ITEM NIL (:B NIL "disestablish") (:IDXTERM NIL "disestablish") " "
       (:I NIL "v.t.") " to withdraw the " (:TERM NIL "establishment")
       " of an " (:TERM NIL "object") ", a " (:TERM NIL "binding") ", an "
       (:TERM NIL "exit point") ", a " (:TERM NIL "tag") ", a "
       (:TERM NIL "handler") ", a " (:TERM NIL "restart") ", or an "
       (:TERM NIL "environment") ". " :PAR)
      (:ITEM NIL (:B NIL "disjoint") (:IDXTERM NIL "disjoint") " "
       (:I NIL "n.") " (of " (:TERM NIL "types") ") having no "
       (:TERM NIL "elements") " in common. " :PAR)
      (:ITEM NIL (:B NIL "dispatching macro character")
       (:IDXTERM NIL "dispatching macro character") " " (:I NIL "n.") " a "
       (:TERM NIL "macro character")
       " that has an associated table that specifies the "
       (:TERM NIL "function") " to be called for each " (:TERM NIL "character")
       " that is seen following the " (:TERM NIL "dispatching macro character")
       ". See the " (:TERM NIL "function") " "
       (:FUNREF NIL "make-dispatch-macro-character") ". " :PAR)
      (:ITEM NIL (:B NIL "displaced array") (:IDXTERM NIL "displaced array")
       " " (:I NIL "n.") " "
       (:COMMENT NIL "Alternatively (from an old definition of make-array):"
        " ...an indirect or shared \\term{array} that shares its contents...")
       "an " (:TERM NIL "array")
       " which has no storage of its own, but which is instead indirected to the storage of another "
       (:TERM NIL "array") ", called its " (:TERM NIL "target")
       ", at a specified offset, in such a way that any attempt to "
       (:TERM NIL "access") " the " (:TERM NIL "displaced array")
       " implicitly references the " (:TERM NIL "target") " "
       (:TERM NIL "array") ". " :PAR)
      (:ITEM NIL (:B NIL "distinct") (:IDXTERM NIL "distinct") " "
       (:I NIL "adj.") " not " (:TERM NIL "identical") ". " :PAR)
      (:ITEM NIL (:B NIL "documentation string")
       (:IDXTERM NIL "documentation string") " " (:I NIL "n.")
       " (in a defining " (:TERM NIL "form") ") A " (:TERM NIL "literal") " "
       (:TERM NIL "string")
       " which because of the context in which it appears (rather than because of some intrinsically observable aspect of the "
       (:TERM NIL "string") ") is taken as documentation. In some cases, the "
       (:TERM NIL "documentation string")
       " is saved in such a way that it can later be obtained by supplying either an "
       (:TERM NIL "object") ", or by supplying a " (:TERM NIL "name")
       " and a “kind” to the " (:TERM NIL "function") " "
       (:FUNREF NIL "documentation") ". “The body of code in a "
       (:MACREF NIL "defmacro")
       " form can be preceded by a documentation string of kind "
       (:MISC NIL "function") ".” " :PAR)
      (:ITEM NIL (:B NIL "dot") (:IDXTERM NIL "dot") " " (:I NIL "n.") " the "
       (:TERM NIL "standard character")
       " that is variously called “full stop,” “period,” or “dot” ("
       (:TT NIL ".") "). See " (:FIGREF NIL :STD-CHARS-THREE) ". " :PAR
       (:COMMENT NIL
        "Maybe separate into adjective so we can say \"(possibly dotted) list\" etc. -kmp 7-May-91"))
      (:ITEM NIL (:B NIL "dotted list") (:IDXTERM NIL "dotted list") " "
       (:I NIL "n.") " a " (:TERM NIL "list") " which has a terminating "
       (:TERM NIL "atom") " that is not " (:MISC NIL "nil") ". (An "
       (:TERM NIL "atom") " by itself is not a " (:TERM NIL "dotted list")
       ", however.) " :PAR)
      (:ITEM NIL (:B NIL "dotted pair") (:IDXTERM NIL "dotted pair") " "
       (:I NIL "n.") " 1. a " (:TERM NIL "cons") " whose " (:TERM NIL "cdr")
       " is a " (:TERM NIL "non-list") ". 2. any " (:TERM NIL "cons")
       ", used to emphasize the use of the " (:TERM NIL "cons")
       " as a symmetric data pair. " :PAR)
      (:ITEM NIL (:B NIL "double float") (:IDXTERM NIL "double float") " "
       (:I NIL "n.") " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "double-float") ". " :PAR)
      (:ITEM NIL (:B NIL "double-quote") (:IDXTERM NIL "double-quote") " "
       (:I NIL "n.") " the " (:TERM NIL "standard character")
       " that is variously called “quotation mark” or “double quote” ("
       (:TT NIL "\"") "). See " (:FIGREF NIL :STD-CHARS-THREE) ". " :PAR)
      (:ITEM NIL (:B NIL "dynamic binding") (:IDXTERM NIL "dynamic binding")
       " " (:I NIL "n.") " a " (:TERM NIL "binding") " in a "
       (:TERM NIL "dynamic environment") ". " :PAR)
      (:ITEM NIL (:B NIL "dynamic environment")
       (:IDXTERM NIL "dynamic environment") " " (:I NIL "n.")
       " that part of an " (:TERM NIL "environment") " that contains "
       (:TERM NIL "bindings") " with " (:TERM NIL "dynamic extent") ". A "
       (:TERM NIL "dynamic environment") " contains, "
       (:COMMENT NIL
        "!!! Moon: This phrase [\"among other things\"] always scares me. Is it necessary?")
       "among other things: " (:TERM NIL "exit points") " established by "
       (:SPECREF NIL "unwind-protect") ", and " (:TERM NIL "bindings") " of "
       (:TERM NIL "dynamic variables") ", " (:TERM NIL "exit points")
       " established by " (:SPECREF NIL "catch") ", "
       (:TERM NIL "condition handlers") ", and " (:TERM NIL "restarts") ". "
       :PAR
       (:COMMENT NIL "%!!! The CLIM folks want to be able to say:"
        "%      ``the parameter x has dynamic extent''"
        "%    and have it imply that:"
        "%      (a) ``the implementation of the indicated function "
        "%            may declare the argument to be dynamic extent''"
        "%    and"
        "%      (b) ``it is permissible to pass an object which was "
        "%            the value of a variable which had been declared dynamic extent''"
        "%    -kmp 30-Jan-92"))
      (:ITEM NIL (:B NIL "dynamic extent") (:IDXTERM NIL "dynamic extent") " "
       (:I NIL "n.") " an " (:TERM NIL "extent")
       " whose duration is bounded by points of " (:TERM NIL "establishment")
       " and " (:TERM NIL "disestablishment")
       " within the execution of a particular " (:TERM NIL "form") ". See "
       (:TERM NIL "indefinite extent")
       ". “Dynamic variable bindings have dynamic extent.” " :PAR)
      (:ITEM NIL (:B NIL "dynamic scope") (:IDXTERM NIL "dynamic scope") " "
       (:I NIL "n.") " " (:TERM NIL "indefinite scope") " along with "
       (:TERM NIL "dynamic extent") ". " :PAR)
      (:ITEM NIL (:B NIL "dynamic variable") (:IDXTERM NIL "dynamic variable")
       " " (:I NIL "n.") " a " (:TERM NIL "variable") " the "
       (:TERM NIL "binding") " for which is in the "
       (:TERM NIL "dynamic environment") ". See " (:MISC NIL "special") ". "
       :PAR)))
    (:ITEM NIL (:B NIL "E")
     (:LIST NIL
      (:ITEM NIL (:B NIL "echo stream") (:IDXTERM NIL "echo stream") " "
       (:I NIL "n.") " a " (:TERM NIL "stream") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "echo-stream") ". " :PAR)
      (:ITEM NIL (:B NIL "effective method") (:IDXTERM NIL "effective method")
       " " (:I NIL "n.") " the combination of "
       (:TERM NIL "applicable methods") " that are executed when a "
       (:TERM NIL "generic function")
       " is invoked with a particular sequence of " (:TERM NIL "arguments")
       ". " :PAR)
      (:ITEM NIL (:B NIL "element") (:IDXTERM NIL "element") " " (:I NIL "n.")
       " 1. (of a " (:TERM NIL "list") ") an " (:TERM NIL "object")
       " that is the " (:TERM NIL "car") " of one of the " (:TERM NIL "conses")
       " that comprise the " (:TERM NIL "list") ". 2. (of an "
       (:TERM NIL "array") ") an " (:TERM NIL "object")
       " that is stored in the " (:TERM NIL "array") ". 3. (of a "
       (:TERM NIL "sequence") ") an " (:TERM NIL "object") " that is an "
       (:TERM NIL "element") " of the " (:TERM NIL "list") " or "
       (:TERM NIL "array") " that is the " (:TERM NIL "sequence") ". 4. (of a "
       (:TERM NIL "type") ") an " (:TERM NIL "object")
       " that is a member of the set of " (:TERM NIL "objects")
       " designated by the " (:TERM NIL "type") ". 5. (of an "
       (:TERM NIL "input") " " (:TERM NIL "stream") ") a "
       (:TERM NIL "character") " or " (:TERM NIL "number")
       " (as appropriate to the " (:TERM NIL "element type") " of the "
       (:TERM NIL "stream") ") that is among the ordered series of "
       (:TERM NIL "objects") " that can be read from the " (:TERM NIL "stream")
       " (using " (:FUNREF NIL "read-char") " or " (:FUNREF NIL "read-byte")
       ", as appropriate to the " (:TERM NIL "stream") "). 6. (of an "
       (:TERM NIL "output") " " (:TERM NIL "stream") ") a "
       (:TERM NIL "character") " or " (:TERM NIL "number")
       " (as appropriate to the " (:TERM NIL "element type") " of the "
       (:TERM NIL "stream") ") that is among the ordered series of "
       (:TERM NIL "objects") " that has been or will be written to the "
       (:TERM NIL "stream") " (using " (:FUNREF NIL "write-char") " or "
       (:FUNREF NIL "write-byte") ", as appropriate to the "
       (:TERM NIL "stream") "). 7. (of a " (:TERM NIL "class") ") a "
       (:TERM NIL "generalized instance") " of the " (:TERM NIL "class") ". "
       :PAR)
      (:ITEM NIL (:B NIL "element type") (:IDXTERM NIL "element type") " "
       (:I NIL "n.") " 1. (of an " (:TERM NIL "array") ") the "
       (:TERM NIL "array element type") " of the " (:TERM NIL "array")
       ". 2. (of a " (:TERM NIL "stream") ") the "
       (:TERM NIL "stream element type") " of the " (:TERM NIL "stream") ". "
       :PAR)
      (:ITEM NIL (:B NIL "em") (:IDXTERM NIL "em") " " (:I NIL "n.") " "
       (:I NIL "Trad.")
       " a context-dependent unit of measure commonly used in typesetting, equal to the displayed width of a letter “M” in the current font. (The letter “M” is traditionally chosen because it is typically represented by the widest "
       (:TERM NIL "glyph")
       " in the font, and other characters' widths are typically fractions of an "
       (:TERM NIL "em")
       ". In implementations providing non-Roman characters with wider characters than “M,” it is permissible for another character to be the "
       (:TERM NIL "implementation-defined")
       " reference character for this measure, and for “M” to be only a fraction of an "
       (:TERM NIL "em") " wide.) In a fixed width font, a line with "
       (:I NIL "n") " characters is " (:I NIL "n") " " (:TERM NIL "ems")
       " wide; in a variable width font, " (:I NIL "n") " " (:TERM NIL "ems")
       " is the expected upper bound on the width of such a line. " :PAR)
      (:ITEM NIL (:B NIL "empty list") (:IDXTERM NIL "empty list") " "
       (:I NIL "n.") " the " (:TERM NIL "list") " containing no "
       (:TERM NIL "elements") ". See " (:TERM NIL "()") ". " :PAR)
      (:ITEM NIL (:B NIL "empty type") (:IDXTERM NIL "empty type") " "
       (:I NIL "n.") " the " (:TERM NIL "type") " that contains no "
       (:TERM NIL "elements") ", and that is a " (:TERM NIL "subtype")
       " of all " (:TERM NIL "types") " (including itself). See "
       (:TERM NIL "nil") ". " :PAR)
      (:ITEM NIL (:B NIL "end of file") (:IDXTERM NIL "end of file") " "
       (:I NIL "n.") " 1. the point in an " (:TERM NIL "input") " "
       (:TERM NIL "stream")
       " beyond which there is no further data. Whether or not there is such a point on an "
       (:TERM NIL "interactive stream") " is "
       (:TERM NIL "implementation-defined") ". 2. a " (:TERM NIL "situation")
       " that occurs upon an attempt to obtain data from an "
       (:TERM NIL "input stream") " that is at the " (:TERM NIL "end of file")
       (:SUB NIL "1") ". " :PAR
       (:COMMENT NIL "% This might be handy sometime..."
        " \\gentry{end of line} \\Noun\\"
        "   the termination of a line of text,"
        "   whether by a \\term{newline} or an \\term{end of file}.")
       :PAR)
      (:ITEM NIL (:B NIL "environment") (:IDXTERM NIL "environment") " "
       (:I NIL "n.") " 1. a set of " (:TERM NIL "bindings") ". See "
       (:SECREF NIL :INTRO-TO-ENVS) ". 2. an " (:TERM NIL "environment object")
       ". “" (:FUNREF NIL "macroexpand")
       " takes an optional environment argument.” " :PAR)
      (:ITEM NIL (:B NIL "environment object")
       (:IDXTERM NIL "environment object") " " (:I NIL "n.") " an "
       (:TERM NIL "object") " representing a set of "
       (:TERM NIL "lexical bindings") ", used in the processing of a "
       (:TERM NIL "form") " to provide meanings for " (:TERM NIL "names")
       " within that " (:TERM NIL "form") ". “" (:FUNREF NIL "macroexpand")
       " takes an optional environment argument.” (The " (:TERM NIL "object")
       " " (:MISC NIL "nil") " when used as an "
       (:TERM NIL "environment object") " denotes the "
       (:TERM NIL "null lexical environment") "; the " (:TERM NIL "values")
       " of " (:TERM NIL "environment parameters") " to "
       (:TERM NIL "macro functions") " are " (:TERM NIL "objects") " of "
       (:TERM NIL "implementation-dependent") " nature which represent the "
       (:TERM NIL "environment") (:SUB NIL "1") " in which the corresponding "
       (:TERM NIL "macro form") " is to be expanded.) See "
       (:SECREF NIL :ENV-OBJS) ". " :PAR)
      (:ITEM NIL (:B NIL "environment parameter")
       (:IDXTERM NIL "environment parameter") " " (:I NIL "n.") " A "
       (:TERM NIL "parameter") " in a " (:TERM NIL "defining form") " "
       (:MATH NIL (:MI NIL "f")) " for which there is no corresponding "
       (:TERM NIL "argument") "; instead, this " (:TERM NIL "parameter")
       " receives as its value an " (:TERM NIL "environment") " "
       (:TERM NIL "object") " which corresponds to the "
       (:TERM NIL "lexical environment") " in which the "
       (:TERM NIL "defining form") " " (:MATH NIL (:MI NIL "f")) " appeared. "
       :PAR
       (:COMMENT NIL
        "!!! Moon: I disagree with 1 and 2, \"undefined consequences\" /= \"defined to signal an error\""))
      (:ITEM NIL (:B NIL "error") (:IDXTERM NIL "error") " " (:I NIL "n.")
       " 1. (only in the phrase “is an error”) a " (:TERM NIL "situation")
       " in which the semantics of a program are not specified, and in which the consequences are undefined. 2. a "
       (:TERM NIL "condition") " which represents an " (:TERM NIL "error") " "
       (:TERM NIL "situation") ". See " (:SECREF NIL :ERROR-TERMS) ". 3. an "
       (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "error") ". " :PAR)
      (:ITEM NIL (:B NIL "error output") (:IDXTERM NIL "error output") " "
       (:I NIL "n.") " the " (:TERM NIL "output") " " (:TERM NIL "stream")
       " which is the " (:TERM NIL "value") " of the "
       (:TERM NIL "dynamic variable") " " (:VARREF NIL "*error-output*") ". "
       :PAR)
      (:ITEM NIL (:B NIL "escape") (:IDXTERM NIL "escape") " " (:I NIL "n.")
       ", " (:I NIL "adj.") " 1. " (:I NIL "n.") " a "
       (:TERM NIL "single escape") " or a " (:TERM NIL "multiple escape")
       ". 2. " (:I NIL "adj.") " " (:TERM NIL "single escape") " or "
       (:TERM NIL "multiple escape") ". " :PAR
       (:COMMENT NIL
        "!!!! RPG doesn't think this definition is really adequate, "
        "     especially for declarations."))
      (:ITEM NIL (:B NIL "establish") (:IDXTERM NIL "establish") " "
       (:I NIL "v.t.") " to build or bring into being a " (:TERM NIL "binding")
       ", a " (:TERM NIL "declaration") ", an " (:TERM NIL "exit point") ", a "
       (:TERM NIL "tag") ", a " (:TERM NIL "handler") ", a "
       (:TERM NIL "restart") ", or an " (:TERM NIL "environment") ". “"
       (:SPECREF NIL "let") " establishes lexical bindings.” " :PAR
       (:COMMENT NIL "% Experimental definition not installed. -kmp 26-Jan-92"
        " \\gentry{establish} \\TransitiveVerb\\ "
        "   1. (an \\term{environment}) to build or bring into being."
        "   2. (a  \\term{binding}," "       a  \\term{declaration},"
        "       an \\term{exit point}," "       a  \\term{tag},"
        "       a  \\term{handler}, " "       a \\term{restart})"
        "      to \\term{establish}\\meaning{1} an augmented \\term{environment}"
        "      in which that entity is \\term{active}, applicable, present, or visible."
        "   \\gexample{\\specref{let} establishes lexical bindings.}")
       :PAR)
      (:ITEM NIL (:B NIL "evaluate") (:IDXTERM NIL "evaluate") " "
       (:I NIL "v.t.") " (a " (:TERM NIL "form") " or an "
       (:TERM NIL "implicit progn") ") to " (:TERM NIL "execute") " the "
       (:TERM NIL "code") " represented by the " (:TERM NIL "form")
       " (or the series of " (:TERM NIL "forms") " making up the "
       (:TERM NIL "implicit progn") ") by applying the rules of "
       (:TERM NIL "evaluation") ", returning zero or more values. " :PAR)
      (:ITEM NIL (:B NIL "evaluation") (:IDXTERM NIL "evaluation") " "
       (:I NIL "n.") " a model whereby " (:TERM NIL "forms") " are "
       (:TERM NIL "executed")
       ", returning zero or more values. Such execution might be implemented directly in one step by an interpreter or in two steps by first "
       (:TERM NIL "compiling") " the " (:TERM NIL "form") " and then "
       (:TERM NIL "executing") " the " (:TERM NIL "compiled") " "
       (:TERM NIL "code")
       "; this choice is dependent both on context and the nature of the "
       (:TERM NIL "implementation")
       ", but in any case is not in general detectable by any program. The evaluation model is designed in such a way that a "
       (:TERM NIL "conforming implementation")
       " might legitimately have only a compiler and no interpreter, or vice versa. See "
       (:SECREF NIL :EVALUATION-MODEL) ". " :PAR)
      (:ITEM NIL (:B NIL "evaluation environment")
       (:IDXTERM NIL "evaluation environment") " " (:I NIL "n.") " a "
       (:TERM NIL "run-time environment")
       " in which macro expanders and code specified by "
       (:SPECREF NIL "eval-when")
       " to be evaluated are evaluated. All evaluations initiated by the "
       (:TERM NIL "compiler") " take place in the "
       (:TERM NIL "evaluation environment") ". " :PAR)
      (:ITEM NIL (:B NIL "execute") (:IDXTERM NIL "execute") " "
       (:I NIL "v.t.") " " (:I NIL "Trad.") " (" (:TERM NIL "code")
       ") to perform the imperative actions represented by the "
       (:TERM NIL "code") ". " :PAR)
      (:ITEM NIL (:B NIL "execution time") (:IDXTERM NIL "execution time") " "
       (:I NIL "n.") " the duration of time that " (:TERM NIL "compiled code")
       " is being " (:TERM NIL "executed") ". " :PAR)
      (:ITEM NIL (:B NIL "exhaustive partition")
       (:IDXTERM NIL "exhaustive partition") " " (:I NIL "n.") " (of a "
       (:TERM NIL "type") ") a set of " (:TERM NIL "pairwise") " "
       (:TERM NIL "disjoint") " " (:TERM NIL "types") " that form an "
       (:TERM NIL "exhaustive union") ". " :PAR)
      (:ITEM NIL (:B NIL "exhaustive union") (:IDXTERM NIL "exhaustive union")
       " " (:I NIL "n.") " (of a " (:TERM NIL "type") ") a set of "
       (:TERM NIL "subtypes") " of the " (:TERM NIL "type")
       ", whose union contains all " (:TERM NIL "elements") " of that "
       (:TERM NIL "type") ". " :PAR)
      (:ITEM NIL (:B NIL "exit point") (:IDXTERM NIL "exit point") " "
       (:I NIL "n.") " a point in a " (:TERM NIL "control form") " "
       (:COMMENT NIL
        " Moon would remove this first phrase, but I think the phrases refer "
        " respectively to BLOCK, UNWIND-PROTECT, and TAGBODY. -kmp 14-Nov-91")
       "from which (" (:I NIL "e.g.") ",  " (:SPECREF NIL "block")
       "), through which (" (:I NIL "e.g.") ",  "
       (:SPECREF NIL "unwind-protect") "), or to which (" (:I NIL "e.g.") ",  "
       (:SPECREF NIL "tagbody") ") control and possibly " (:TERM NIL "values")
       " can be transferred both actively by using another "
       (:TERM NIL "control form")
       " and passively through the normal control and data flow of "
       (:TERM NIL "evaluation") ". “" (:SPECREF NIL "catch") " and "
       (:SPECREF NIL "block") " establish bindings for exit points to which "
       (:SPECREF NIL "throw") " and " (:SPECREF NIL "return-from")
       ", respectively, can transfer control and values; "
       (:SPECREF NIL "tagbody")
       " establishes a binding for an exit point with lexical extent to which "
       (:SPECREF NIL "go") " can transfer control; and "
       (:SPECREF NIL "unwind-protect")
       " establishes an exit point through which control might be transferred by operators such as "
       (:SPECREF NIL "throw") ", " (:SPECREF NIL "return-from") ", and "
       (:SPECREF NIL "go") ".” " :PAR)
      (:ITEM NIL (:B NIL "explicit return") (:IDXTERM NIL "explicit return")
       " " (:I NIL "n.") " the act of transferring control (and possibly "
       (:TERM NIL "values") ") to a " (:TERM NIL "block") " by using "
       (:SPECREF NIL "return-from") " (or " (:MACREF NIL "return") "). " :PAR)
      (:ITEM NIL (:B NIL "explicit use") (:IDXTERM NIL "explicit use") " "
       (:I NIL "n.") " (of a " (:TERM NIL "variable") " "
       (:MATH NIL (:MI NIL "V")) " in a " (:TERM NIL "form") " "
       (:MATH NIL (:MI NIL "F")) ") a reference to " (:MATH NIL (:MI NIL "V"))
       " that is directly apparent in the normal semantics of "
       (:MATH NIL (:MI NIL "F")) "; " (:I NIL "i.e.")
       ",  that does not expose any undocumented details of the "
       (:TERM NIL "macro expansion") " of the " (:TERM NIL "form")
       " itself. References to " (:MATH NIL (:MI NIL "V"))
       " exposed by expanding " (:TERM NIL "subforms") " of "
       (:MATH NIL (:MI NIL "F")) " are, however, considered to be "
       (:TERM NIL "explicit uses") " of " (:MATH NIL (:MI NIL "V")) ". " :PAR
       (:COMMENT NIL
        "Barmar prefers \"printed representation of\" to \"textual notation for\""))
      (:ITEM NIL (:B NIL "exponent marker") (:IDXTERM NIL "exponent marker")
       " " (:I NIL "n.")
       " a character that is used in the textual notation for a "
       (:TERM NIL "float")
       " to separate the mantissa from the exponent. The characters defined as "
       (:TERM NIL "exponent markers") " in the "
       (:TERM NIL "standard readtable") " are shown in " (:NEXTFIGURE NIL)
       ". For more information, see " (:SECREF NIL :CHARACTER-SYNTAX)
       ". “The exponent marker `d' in `3.0d7' indicates that this number is to be represented as a double float.” "
       :PAR
       (:TABLE (:NAME ("Exponent Markers"))
        (:ROW NIL (:CELL NIL "Marker") (:CELL NIL "Meaning"))
        (:ROW NIL (:CELL NIL (:TT NIL "D") " or " (:TT NIL "d"))
         (:CELL NIL (:TYPEREF NIL "double-float")))
        (:ROW NIL (:CELL NIL (:TT NIL "E") " or " (:TT NIL "e"))
         (:CELL NIL (:TYPEREF NIL "float") " (see "
          (:VARREF NIL "*read-default-float-format*") ") "))
        (:ROW NIL (:CELL NIL (:TT NIL "F") " or " (:TT NIL "f"))
         (:CELL NIL (:TYPEREF NIL "single-float")))
        (:ROW NIL (:CELL NIL (:TT NIL "L") " or " (:TT NIL "l"))
         (:CELL NIL (:TYPEREF NIL "long-float")))
        (:ROW NIL (:CELL NIL (:TT NIL "S") " or " (:TT NIL "s"))
         (:CELL NIL (:TYPEREF NIL "short-float"))))
       " " :PAR)
      (:ITEM NIL (:B NIL "export") (:IDXTERM NIL "export") " " (:I NIL "v.t.")
       " (a " (:TERM NIL "symbol") " in a " (:TERM NIL "package")
       ") to add the " (:TERM NIL "symbol") " to the list of "
       (:TERM NIL "external symbols") " of the " (:TERM NIL "package") ". "
       :PAR)
      (:ITEM NIL (:B NIL "exported") (:IDXTERM NIL "exported") " "
       (:I NIL "adj.") " (of a " (:TERM NIL "symbol") " in a "
       (:TERM NIL "package") ") being an " (:TERM NIL "external symbol")
       " of the " (:TERM NIL "package") ". " :PAR)
      (:ITEM NIL (:B NIL "expressed adjustability")
       (:IDXTERM NIL "expressed adjustability") " " (:I NIL "n.") " (of an "
       (:TERM NIL "array") ") a " (:TERM NIL "generalized boolean")
       " that is conceptually (but not necessarily actually) associated with the "
       (:TERM NIL "array") ", representing whether the " (:TERM NIL "array")
       " is " (:TERM NIL "expressly adjustable") ". See also "
       (:TERM NIL "actual adjustability") ". " :PAR)
      (:ITEM NIL (:B NIL "expressed array element type")
       (:IDXTERM NIL "expressed array element type") " " (:I NIL "n.")
       " (of an " (:TERM NIL "array") ") the " (:TERM NIL "type")
       " which is the " (:TERM NIL "array element type") " implied by a "
       (:TERM NIL "type declaration") " for the " (:TERM NIL "array")
       ", or which is the requested " (:TERM NIL "array element type")
       " at its time of creation, prior to any selection of an "
       (:TERM NIL "upgraded array element type") ". (" (:RM NIL " Common Lisp")
       " does not provide a way of detecting this " (:TERM NIL "type")
       " directly at run time, but an " (:TERM NIL "implementation")
       " is permitted to make assumptions about the " (:TERM NIL "array")
       "'s contents and the operations which may be performed on the "
       (:TERM NIL "array") " when this " (:TERM NIL "type")
       " is noted during code analysis, even if those assumptions would not be valid in general for the "
       (:TERM NIL "upgraded array element type") " of the "
       (:TERM NIL "expressed array element type") ".) "
       (:COMMENT NIL " KMP->Barmar:"
        "  You remarked that you think you can rely on array-element-type and "
        "  upgraded-xxx-type. This is intended to permit a compiler optimizer like:"
        "      (frob (make-array n :element-type '(unsigned-byte 13)))"
        "  to turn into" "      (si:frob-internal-signed-byte-13 "
        "        (make-array n :element-type '(unsigned-byte 13)))"
        "  even though the implementation knows that (unsigned-byte 16) will really get"
        "  allocated, let's say.  Moreover, the compiler should be permitted to warn about:"
        "      (defun foo (n) "
        "        (let ((x (make-array n :element-type '(unsigned-byte 2))))"
        " 	 (setf (aref x 0) 17.) ...))" "  It generally will not warn about:"
        "      (defun foo (n)"
        "        (bar (make-array n :element-type '(unsigned-byte 2))))"
        "      (defun bar (a)" "        (setf (aref x 0) 17.) ...)"
        "  I agree that it should never warn about:" "      (defun foo (n) "
        "        (let ((x (make-array n :element-type '(unsigned-byte 2))))"
        " 	 (when (type-equivalent-p (array-element-type x) 'fixnum)"
        " 	    (setf (aref x 0) 17.) ...)))"
        "  because this is portably guarded even if it behaves differently on the"
        "  different implementations to which it is ported." " "
        "  This makes it tough to do the optimization I'm referring to, but I don't"
        "  think that implementations which really properly check that the path is"
        "  clear between the allocation and the reference should be forbidden from"
        "  flagging an unconditional non-portability." " Barmar: "
        "  You apparently understand the point I was making.  If you can come up"
        "  with a concise way to phrase it in the definition of \"declared XXX"
        "  type\", that's all I was hoping for.  If not, I don't think this is a"
        "  critical issue.")
       :PAR)
      (:ITEM NIL (:B NIL "expressed complex part type")
       (:IDXTERM NIL "expressed complex part type") " " (:I NIL "n.") " (of a "
       (:TERM NIL "complex") ") the " (:TERM NIL "type")
       " which is implied as the " (:TERM NIL "complex part type") " by a "
       (:TERM NIL "type declaration") " for the " (:TERM NIL "complex")
       ", or which is the requested " (:TERM NIL "complex part type")
       " at its time of creation, prior to any selection of an "
       (:TERM NIL "upgraded complex part type") ". (" (:RM NIL " Common Lisp")
       " does not provide a way of detecting this " (:TERM NIL "type")
       " directly at run time, but an " (:TERM NIL "implementation")
       " is permitted to make assumptions about the operations which may be performed on the "
       (:TERM NIL "complex") " when this " (:TERM NIL "type")
       " is noted during code analysis, even if those assumptions would not be valid in general for the "
       (:TERM NIL "upgraded complex part type") " of the "
       (:TERM NIL "expressed complex part type") ".) " :PAR)
      (:ITEM NIL (:B NIL "expression") (:IDXTERM NIL "expression") " "
       (:I NIL "n.") " 1. an " (:TERM NIL "object")
       ", often used to emphasize the use of the " (:TERM NIL "object")
       " to encode or represent information in a specialized format, such as program text. “The second expression in a "
       (:SPECREF NIL "let")
       " form is a list of bindings.” 2. the textual notation used to notate an "
       (:TERM NIL "object") " in a source file. “The expression "
       (:TT NIL "'sample") " is equivalent to " (:TT NIL "(quote sample)")
       ".” " :PAR)
      (:ITEM NIL (:B NIL "expressly adjustable")
       (:IDXTERM NIL "expressly adjustable") " " (:I NIL "adj.") " (of an "
       (:TERM NIL "array") ") being " (:TERM NIL "actually adjustable")
       " by virtue of an explicit request for this characteristic having been made at the time of its creation. All "
       (:TERM NIL "arrays") " that are " (:TERM NIL "expressly adjustable")
       " are " (:TERM NIL "actually adjustable")
       ", but not necessarily vice versa. " :PAR)
      (:ITEM NIL (:B NIL "extended character")
       (:IDXTERM NIL "extended character") " " (:I NIL "n.") " a "
       (:TERM NIL "character") " "
       (:ISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " of "
       (:TERM NIL "type") " " (:TYPEREF NIL "extended-char") ": "
       (:ENDISSUE NIL "CHARACTER-VS-CHAR:LESS-INCONSISTENT-SHORT") " a "
       (:TERM NIL "character") " that is not a " (:TERM NIL "base character")
       ". " :PAR)
      (:ITEM NIL (:B NIL "extended function designator")
       (:IDXTERM NIL "extended function designator") " " (:I NIL "n.") " a "
       (:TERM NIL "designator") " for a " (:TERM NIL "function")
       "; that is, an " (:TERM NIL "object") " that denotes a "
       (:TERM NIL "function") " and that is one of: a "
       (:TERM NIL "function name") " (denoting the " (:TERM NIL "function")
       " it names in the " (:TERM NIL "global environment") "), or a "
       (:TERM NIL "function")
       " (denoting itself). The consequences are undefined if a "
       (:TERM NIL "function name") " is used as an "
       (:TERM NIL "extended function designator")
       " but it does not have a global definition as a " (:TERM NIL "function")
       ", or if it is a " (:TERM NIL "symbol")
       " that has a global definition as a " (:TERM NIL "macro") " or a "
       (:TERM NIL "special form") ". See also "
       (:TERM NIL "function designator") ". " :PAR)
      (:ITEM NIL (:B NIL "extended lambda list")
       (:IDXTERM NIL "extended lambda list") " " (:I NIL "n.")
       " a list resembling an " (:TERM NIL "ordinary lambda list")
       " in form and purpose, but offering additional syntax or functionality not available in an "
       (:TERM NIL "ordinary lambda list") ". “" (:MACREF NIL "defmacro")
       " uses extended lambda lists.” " :PAR)
      (:ITEM NIL (:B NIL "extension") (:IDXTERM NIL "extension") " "
       (:I NIL "n.") " a facility in an " (:TERM NIL "implementation") " of "
       (:RM NIL " Common Lisp") " that is not specified by this standard. "
       :PAR)
      (:ITEM NIL (:B NIL "extent") (:IDXTERM NIL "extent") " " (:I NIL "n.")
       " the interval of time during which a " (:TERM NIL "reference")
       " to an " (:TERM NIL "object") ", a " (:TERM NIL "binding") ", an "
       (:TERM NIL "exit point") ", a " (:TERM NIL "tag") ", a "
       (:TERM NIL "handler") ", a " (:TERM NIL "restart") ", or an "
       (:TERM NIL "environment") " is defined. " :PAR)
      (:ITEM NIL (:B NIL "external file format")
       (:IDXTERM NIL "external file format") " " (:I NIL "n.") " an "
       (:TERM NIL "object") " of " (:TERM NIL "implementation-dependent")
       " nature which determines one of possibly several "
       (:TERM NIL "implementation-dependent") " ways in which "
       (:TERM NIL "characters") " are encoded externally in a "
       (:TERM NIL "character") " " (:TERM NIL "file") ". " :PAR)
      (:ITEM NIL (:B NIL "external file format designator")
       (:IDXTERM NIL "external file format designator") " " (:I NIL "n.") " a "
       (:TERM NIL "designator") " for an " (:TERM NIL "external file format")
       "; that is, an " (:TERM NIL "object") " that denotes an "
       (:TERM NIL "external file format") " and that is one of: the "
       (:TERM NIL "symbol") " " (:KWD NIL "default") " (denoting an "
       (:TERM NIL "implementation-dependent") " default "
       (:TERM NIL "external file format") " that can accomodate at least the "
       (:TERM NIL "base characters") "), some other " (:TERM NIL "object")
       " defined by the " (:TERM NIL "implementation") " to be an "
       (:TERM NIL "external file format designator") " (denoting an "
       (:TERM NIL "implementation-defined") " "
       (:TERM NIL "external file format") "), or some other "
       (:TERM NIL "object") " defined by the " (:TERM NIL "implementation")
       " to be an " (:TERM NIL "external file format") " (denoting itself). "
       :PAR)
      (:ITEM NIL (:B NIL "external symbol") (:IDXTERM NIL "external symbol")
       " " (:I NIL "n.") " (of a " (:TERM NIL "package") ") a "
       (:TERM NIL "symbol") " that is part of the `external interface' to the "
       (:TERM NIL "package") " and that are " (:TERM NIL "inherited")
       (:SUB NIL "3") " by any other " (:TERM NIL "package") " that "
       (:TERM NIL "uses") " the " (:TERM NIL "package") ". When using the "
       (:TERM NIL "Lisp reader") ", if a " (:TERM NIL "package prefix")
       " is used, the " (:TERM NIL "name") " of an "
       (:TERM NIL "external symbol") " is separated from the "
       (:TERM NIL "package") " " (:TERM NIL "name") " by a single "
       (:TERM NIL "package marker") " while the " (:TERM NIL "name") " of an "
       (:TERM NIL "internal symbol") " is separated from the "
       (:TERM NIL "package") " " (:TERM NIL "name") " by a double "
       (:TERM NIL "package marker") "; see " (:SECREF NIL :SYMBOL-TOKENS) ". "
       :PAR)
      (:ITEM NIL (:B NIL "externalizable object")
       (:IDXTERM NIL "externalizable object") " " (:I NIL "n.") " an "
       (:TERM NIL "object") " that can be used as a " (:TERM NIL "literal") " "
       (:TERM NIL "object") " in " (:TERM NIL "code")
       " to be processed by the " (:TERM NIL "file compiler") ". " :PAR)))
    (:ITEM NIL (:B NIL "F")
     (:LIST NIL
      (:ITEM NIL (:B NIL "false") (:IDXTERM NIL "false") " " (:I NIL "n.")
       " the " (:TERM NIL "symbol") " " (:MISC NIL "nil")
       ", used to represent the failure of a " (:TERM NIL "predicate")
       " test. " :PAR)
      (:ITEM NIL (:B NIL "fbound") (:IDXTERM NIL "fbound") " "
       (:PRONOUNCED NIL (:HI-STRESS NIL "ef") (:LO-STRESS NIL "ba.und")) " "
       (:I NIL "adj.") " (of a " (:TERM NIL "function name") ") "
       (:TERM NIL "bound") " in the " (:TERM NIL "function") " "
       (:TERM NIL "namespace") ". (The " (:TERM NIL "names") " of "
       (:TERM NIL "macros") " and " (:TERM NIL "special operators") " are "
       (:TERM NIL "fbound") ", but the nature and " (:TERM NIL "type")
       " of the " (:TERM NIL "object") " which is their " (:TERM NIL "value")
       " is " (:TERM NIL "implementation-dependent") ". "
       (:ISSUE NIL "SETF-FUNCTIONS-AGAIN:MINIMAL-CHANGES")
       " Further, defining a " (:TERM NIL "setf expander") " " (:PARAM NIL "F")
       " does not cause the " (:TERM NIL "setf function") " "
       (:TT NIL "(setf " (:PARAM NIL "F") ")")
       " to become defined; as such, if there is a such a definition of a "
       (:TERM NIL "setf expander") " " (:PARAM NIL "F") ", the "
       (:TERM NIL "function") " " (:TT NIL "(setf " (:PARAM NIL "F") ")")
       " can be " (:TERM NIL "fbound")
       " if and only if, by design or coincidence, a function binding for "
       (:TT NIL "(setf " (:PARAM NIL "F") ")")
       " has been independently established.) "
       (:ENDISSUE NIL "SETF-FUNCTIONS-AGAIN:MINIMAL-CHANGES") " See the "
       (:TERM NIL "functions") " " (:FUNREF NIL "fboundp") " and "
       (:FUNREF NIL "symbol-function") ". " :PAR)
      (:ITEM NIL (:B NIL "feature") (:IDXTERM NIL "feature") " " (:I NIL "n.")
       " 1. an aspect or attribute of " (:RM NIL " Common Lisp") ", of the "
       (:TERM NIL "implementation") ", or of the " (:TERM NIL "environment")
       ". 2. a " (:TERM NIL "symbol") " that names a " (:TERM NIL "feature")
       (:SUB NIL "1") ". See " (:SECREF NIL :FEATURES) ". “The "
       (:KWD NIL "ansi-cl")
       " feature is present in all conforming implementations.” " :PAR)
      (:ITEM NIL (:B NIL "feature expression")
       (:IDXTERM NIL "feature expression") " " (:I NIL "n.")
       " A boolean combination of " (:TERM NIL "features") " used by the "
       (:TT NIL "#+") " and " (:TT NIL "#-") " " (:TERM NIL "reader macros")
       " in order to direct conditional " (:TERM NIL "reading") " of "
       (:TERM NIL "expressions") " by the " (:TERM NIL "Lisp reader") ". See "
       (:SECREF NIL :FEATURE-EXPRESSIONS) ". " :PAR)
      (:ITEM NIL (:B NIL "features list") (:IDXTERM NIL "features list") " "
       (:I NIL "n.") " the " (:TERM NIL "list") " that is the "
       (:TERM NIL "value") " of " (:VARREF NIL "*features*") ". " :PAR)
      (:ITEM NIL (:B NIL "file") (:IDXTERM NIL "file") " " (:I NIL "n.")
       " a named entry in a " (:TERM NIL "file system") ", having an "
       (:TERM NIL "implementation-defined") " nature. " :PAR)
      (:ITEM NIL (:B NIL "file compiler") (:IDXTERM NIL "file compiler") " "
       (:I NIL "n.") " any " (:TERM NIL "compiler") " which "
       (:TERM NIL "compiles") " " (:TERM NIL "source code") " contained in a "
       (:TERM NIL "file") ", producing a " (:TERM NIL "compiled file")
       " as output. The " (:FUNREF NIL "compile-file")
       " function is the only interface to such a " (:TERM NIL "compiler")
       " provided by " (:RM NIL " Common Lisp") ", but there might be other, "
       (:TERM NIL "implementation-defined") " mechanisms for invoking the "
       (:TERM NIL "file compiler") ". " :PAR)
      (:ITEM NIL (:B NIL "file position") (:IDXTERM NIL "file position") " "
       (:I NIL "n.") " (in a " (:TERM NIL "stream") ") a non-negative "
       (:TERM NIL "integer") " that represents a position in the "
       (:TERM NIL "stream") ". Not all " (:TERM NIL "streams")
       " are able to represent the notion of " (:TERM NIL "file position")
       "; in the description of any " (:TERM NIL "operator")
       " which manipulates " (:TERM NIL "file positions") ", the behavior for "
       (:TERM NIL "streams")
       " that don't have this notion must be explicitly stated. For "
       (:TERM NIL "binary") " " (:TERM NIL "streams") ", the "
       (:TERM NIL "file position") " represents the number of preceding "
       (:TERM NIL "bytes") " in the " (:TERM NIL "stream") ". For "
       (:TERM NIL "character") " " (:TERM NIL "streams")
       ", the constraint is more relaxed: " (:TERM NIL "file positions")
       " must increase monotonically, the amount of the increase between "
       (:TERM NIL "file positions")
       " corresponding to any two successive characters in the "
       (:TERM NIL "stream") " is " (:TERM NIL "implementation-dependent") ". "
       :PAR)
      (:ITEM NIL (:B NIL "file position designator")
       (:IDXTERM NIL "file position designator") " " (:I NIL "n.") " (in a "
       (:TERM NIL "stream") ") a " (:TERM NIL "designator") " for a "
       (:TERM NIL "file position") " in that " (:TERM NIL "stream")
       "; that is, the symbol " (:KWD NIL "start") " (denoting " (:TT NIL "0")
       ", the first " (:TERM NIL "file position") " in that "
       (:TERM NIL "stream") "), the symbol " (:KWD NIL "end")
       " (denoting the last " (:TERM NIL "file position") " in that "
       (:TERM NIL "stream") "; " (:I NIL "i.e.")
       ",  the position following the last " (:TERM NIL "element") " of the "
       (:TERM NIL "stream") "), or a " (:TERM NIL "file position")
       " (denoting itself). " :PAR)
      (:ITEM NIL (:B NIL "file stream") (:IDXTERM NIL "file stream") " "
       (:I NIL "n.") " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "file-stream") ". " :PAR)
      (:ITEM NIL (:B NIL "file system") (:IDXTERM NIL "file system") " "
       (:I NIL "n.")
       " a facility which permits aggregations of data to be stored in named "
       (:TERM NIL "files") " on some medium that is external to the "
       (:TERM NIL "Lisp image") " and that therefore persists from "
       (:TERM NIL "session") " to " (:TERM NIL "session") ". " :PAR
       (:ISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " ")
      (:ITEM NIL (:B NIL "filename") (:IDXTERM NIL "filename") " "
       (:I NIL "n.") " "
       (:COMMENT NIL
        "% This term applies some places to logical pathnames and doesn't work very well"
        "% for them, so I tried to make it more abstract. -kmp 28-Aug-93"
        "   an \\term{implementation-dependent} handle, not necessarily ever directly"
        "   represented as an \\term{object}, that can be used to refer to a \\term{file}"
        "   in a \\term{file system}.  \\term{Physical pathnames} and "
        "   \\term{physical pathname} \\term{namestrings} are two kinds of \\term{objects} "
        "   that substitute for \\term{filenames} in \\clisp.  The specific relationship "
        "   between \\term{filenames} and \\term{physical pathnames}, and between"
        "   \\term{filenames} and \\term{namestrings}, is \\term{implementation-defined}.")
       "a handle, not necessarily ever directly represented as an "
       (:TERM NIL "object") ", that can be used to refer to a "
       (:TERM NIL "file") " in a " (:TERM NIL "file system") ". "
       (:TERM NIL "Pathnames") " and " (:TERM NIL "namestrings")
       " are two kinds of " (:TERM NIL "objects") " that substitute for "
       (:TERM NIL "filenames") " in " (:RM NIL " Common Lisp") ". "
       (:ENDISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
       :PAR)
      (:ITEM NIL (:B NIL "fill pointer") (:IDXTERM NIL "fill pointer") " "
       (:I NIL "n.") " (of a " (:TERM NIL "vector") ") an "
       (:TERM NIL "integer") " associated with a " (:TERM NIL "vector")
       " that represents the index above which no " (:TERM NIL "elements")
       " are " (:TERM NIL "active") ". (A " (:TERM NIL "fill pointer")
       " is a non-negative " (:TERM NIL "integer")
       " no larger than the total number of " (:TERM NIL "elements") " in the "
       (:TERM NIL "vector") ". Not all " (:TERM NIL "vectors") " have "
       (:TERM NIL "fill pointers") ".) " :PAR)
      (:ITEM NIL (:B NIL "finite") (:IDXTERM NIL "finite") " " (:I NIL "adj.")
       " (of a " (:TERM NIL "type") ") having a finite number of "
       (:TERM NIL "elements") ". “The type specifier "
       (:TT NIL "(integer 0 5)")
       " denotes a finite type, but the type specifiers "
       (:TYPEREF NIL "integer") " and " (:TT NIL "(integer 0)") " do not.” "
       :PAR)
      (:ITEM NIL (:B NIL "fixnum") (:IDXTERM NIL "fixnum") " " (:I NIL "n.")
       " an " (:TERM NIL "integer") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "fixnum") ". " :PAR)
      (:ITEM NIL (:B NIL "float") (:IDXTERM NIL "float") " " (:I NIL "n.")
       " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "float") ". " :PAR
       (:ISSUE NIL "IGNORE-USE-TERMINOLOGY:VALUE-ONLY") " ")
      (:ITEM NIL (:B NIL "for-value") (:IDXTERM NIL "for-value") " "
       (:I NIL "adj.") " (of a " (:TERM NIL "reference") " to a "
       (:TERM NIL "binding") ") being a " (:TERM NIL "reference") " that "
       (:TERM NIL "reads") (:SUB NIL "1") " the " (:TERM NIL "value")
       " of the " (:TERM NIL "binding") ". "
       (:ENDISSUE NIL "IGNORE-USE-TERMINOLOGY:VALUE-ONLY") " " :PAR)
      (:ITEM NIL (:B NIL "form") (:IDXTERM NIL "form") " " (:I NIL "n.")
       " 1. any " (:TERM NIL "object") " meant to be " (:TERM NIL "evaluated")
       ". 2. a " (:TERM NIL "symbol") ", a " (:TERM NIL "compound form")
       ", or a " (:TERM NIL "self-evaluating object") ". 3. (for an "
       (:TERM NIL "operator") ", as in “" (:METAVAR NIL "operator") " "
       (:TERM NIL "form") "”) a " (:TERM NIL "compound form") " having that "
       (:TERM NIL "operator") " as its first element. “A "
       (:SPECREF NIL "quote") " form is a constant form.” " :PAR)
      (:ITEM NIL (:B NIL "formal argument") (:IDXTERM NIL "formal argument")
       " " (:I NIL "n.") " " (:I NIL "Trad.") " a " (:TERM NIL "parameter")
       ". " :PAR)
      (:ITEM NIL (:B NIL "formal parameter") (:IDXTERM NIL "formal parameter")
       " " (:I NIL "n.") " " (:I NIL "Trad.") " a " (:TERM NIL "parameter")
       ". " :PAR (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " ")
      (:ITEM NIL (:B NIL "format") (:IDXTERM NIL "format") " " (:I NIL "v.t.")
       " (a " (:TERM NIL "format control") " and "
       (:TERM NIL "format arguments") ") to perform output as if by "
       (:FUNREF NIL "format") ", using the " (:TERM NIL "format string")
       " and " (:TERM NIL "format arguments") ". "
       (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR
       (:ISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " ")
      (:ITEM NIL (:B NIL "format argument") (:IDXTERM NIL "format argument")
       " " (:I NIL "n.") " an " (:TERM NIL "object")
       " which is used as data by functions such as " (:FUNREF NIL "format")
       " which interpret " (:TERM NIL "format controls") ". "
       (:ENDISSUE NIL "FORMAT-STRING-ARGUMENTS:SPECIFY") " " :PAR)
      (:ITEM NIL (:B NIL "format control") (:IDXTERM NIL "format control") " "
       (:I NIL "n.") " a " (:TERM NIL "format string") ", or a "
       (:TERM NIL "function") " that obeys the " (:TERM NIL "argument")
       " conventions for a " (:TERM NIL "function") " returned by the "
       (:FUNREF NIL "formatter") " " (:TERM NIL "macro") ". See "
       (:SECREF NIL :COMPILING-FORMAT-STRINGS) ". " :PAR)
      (:ITEM NIL (:B NIL "format directive") (:IDXTERM NIL "format directive")
       " " (:I NIL "n.") " 1. a sequence of " (:TERM NIL "characters") " in a "
       (:TERM NIL "format string") " which is introduced by a "
       (:TERM NIL "tilde") ", and which is specially interpreted by "
       (:TERM NIL "code") " which processes " (:TERM NIL "format strings")
       " to mean that some special operation should be performed, possibly involving data supplied by the "
       (:TERM NIL "format arguments") " that accompanied the "
       (:TERM NIL "format string") ". See the " (:TERM NIL "function") " "
       (:FUNREF NIL "format") ". “In " (:TT NIL "\" D base 10 =  8R\"")
       ", the character sequences `" (:TT NIL " D") "' and `" (:TT NIL " 8R")
       "' are format directives.” 2. the conceptual category of all "
       (:TERM NIL "format directives") (:SUB NIL "1")
       " which use the same dispatch character. “Both " (:TT NIL "\" 3d\"")
       " and " (:TT NIL "\" 3,'0D\"") " are valid uses of the `" (:TT NIL " D")
       "' format directive.” " :PAR)
      (:ITEM NIL (:B NIL "format string") (:IDXTERM NIL "format string") " "
       (:I NIL "n.") " a " (:TERM NIL "string")
       " which can contain both ordinary text and "
       (:TERM NIL "format directives")
       ", and which is used in conjunction with "
       (:TERM NIL "format arguments")
       " to describe how text output should be formatted by certain functions, such as "
       (:FUNREF NIL "format") ". " :PAR)
      (:ITEM NIL (:B NIL "free declaration") (:IDXTERM NIL "free declaration")
       " " (:I NIL "n.") " a declaration that is not a "
       (:TERM NIL "bound declaration") ". See " (:MISC NIL "declare") ". "
       :PAR)
      (:ITEM NIL (:B NIL "fresh") (:IDXTERM NIL "fresh") " " (:I NIL "adj.")
       " 1. (of an " (:TERM NIL "object") " " (:TERM NIL "yielded") " by a "
       (:TERM NIL "function") ") having been newly-allocated by that "
       (:TERM NIL "function") ". (The caller of a " (:TERM NIL "function")
       " that returns a " (:TERM NIL "fresh") " " (:TERM NIL "object")
       " may freely modify the " (:TERM NIL "object")
       " without fear that such modification will compromise the future correct behavior of that "
       (:TERM NIL "function") ".) 2. (of a " (:TERM NIL "binding") " for a "
       (:TERM NIL "name") ") newly-allocated; not shared with other "
       (:TERM NIL "bindings") " for that " (:TERM NIL "name") ". " :PAR)
      (:ITEM NIL (:B NIL "freshline") (:IDXTERM NIL "freshline") " "
       (:I NIL "n.") " a conceptual operation on a " (:TERM NIL "stream")
       ", implemented by the " (:TERM NIL "function") " "
       (:FUNREF NIL "fresh-line") " and by the " (:TERM NIL "format directive")
       " " (:TT NIL " &")
       ", which advances the display position to the beginning of the next line (as if a "
       (:TERM NIL "newline") " had been typed, or the " (:TERM NIL "function")
       " " (:FUNREF NIL "terpri") " had been called) unless the "
       (:TERM NIL "stream")
       " is already known to be positioned at the beginning of a line. Unlike "
       (:TERM NIL "newline") ", " (:TERM NIL "freshline") " is not a "
       (:TERM NIL "character") ". " :PAR)
      (:ITEM NIL (:B NIL "funbound") (:IDXTERM NIL "funbound") " "
       (:PRONOUNCED NIL (:HI-STRESS NIL "ef") "unba.und") " " (:I NIL "n.")
       " (of a " (:TERM NIL "function name") ") not " (:TERM NIL "fbound") ". "
       :PAR)
      (:ITEM NIL (:B NIL "function") (:IDXTERM NIL "function") " "
       (:I NIL "n.") " " (:COMMENT NIL "% 6.2.2 26") "1. an "
       (:TERM NIL "object") " representing code, which can be "
       (:TERM NIL "called") " with zero or more " (:TERM NIL "arguments")
       ", and which produces zero or more " (:TERM NIL "values") ". 2. an "
       (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "function") ". " :PAR)
      (:ITEM NIL (:B NIL "function block name")
       (:IDXTERM NIL "function block name") " " (:I NIL "n.") " (of a "
       (:TERM NIL "function name") ") The " (:TERM NIL "symbol")
       " that would be used as the name of an " (:TERM NIL "implicit block")
       " which surrounds the body of a " (:TERM NIL "function") " having that "
       (:TERM NIL "function name") ". If the " (:TERM NIL "function name")
       " is a " (:TERM NIL "symbol") ", its " (:TERM NIL "function block name")
       " is the " (:TERM NIL "function name") " itself. If the "
       (:TERM NIL "function name") " is a " (:TERM NIL "list") " whose "
       (:TERM NIL "car") " is " (:MISC NIL "setf") " and whose "
       (:TERM NIL "cadr") " is a " (:TERM NIL "symbol") ", its "
       (:TERM NIL "function block name") " is the " (:TERM NIL "symbol")
       " that is the " (:TERM NIL "cadr") " of the "
       (:TERM NIL "function name") ". An " (:TERM NIL "implementation")
       " which supports additional kinds of " (:TERM NIL "function names")
       " must specify for each how the corresponding "
       (:TERM NIL "function block name") " is computed. " :PAR)
      (:ITEM NIL (:B NIL "function cell") (:IDXTERM NIL "function cell") " "
       (:I NIL "n.") " " (:I NIL "Trad.") " (of a " (:TERM NIL "symbol")
       ") The " (:TERM NIL "place") " which holds the "
       (:TERM NIL "definition") " of the global " (:TERM NIL "function") " "
       (:TERM NIL "binding") ", if any, named by that " (:TERM NIL "symbol")
       ", and which is " (:TERM NIL "accessed") " by "
       (:FUNREF NIL "symbol-function") ". See " (:TERM NIL "cell") ". " :PAR)
      (:ITEM NIL (:B NIL "function designator")
       (:IDXTERM NIL "function designator") " " (:I NIL "n.") " a "
       (:TERM NIL "designator") " for a " (:TERM NIL "function")
       "; that is, an " (:TERM NIL "object") " that denotes a "
       (:TERM NIL "function") " and that is one of: a " (:TERM NIL "symbol")
       " (denoting the " (:TERM NIL "function") " named by that "
       (:TERM NIL "symbol") " in the " (:TERM NIL "global environment")
       "), or a " (:TERM NIL "function")
       " (denoting itself). The consequences are undefined if a "
       (:TERM NIL "symbol") " is used as a " (:TERM NIL "function designator")
       " but it does not have a global definition as a " (:TERM NIL "function")
       ", or it has a global definition as a " (:TERM NIL "macro") " or a "
       (:TERM NIL "special form") ". See also "
       (:TERM NIL "extended function designator") ". " :PAR)
      (:ITEM NIL (:B NIL "function form") (:IDXTERM NIL "function form") " "
       (:I NIL "n.") " a " (:TERM NIL "form") " that is a " (:TERM NIL "list")
       " and that has a first element which is the " (:TERM NIL "name")
       " of a " (:TERM NIL "function") " to be called on "
       (:TERM NIL "arguments") " which are the result of "
       (:TERM NIL "evaluating") " subsequent elements of the "
       (:TERM NIL "function form") ". " :PAR)
      (:ITEM NIL (:B NIL "function name") (:IDXTERM NIL "function name") " "
       (:I NIL "n.") " 1. (in an " (:TERM NIL "environment") ") A "
       (:TERM NIL "symbol") " or a " (:TERM NIL "list") " "
       (:TT NIL "(setf " (:I NIL "symbol") ")") " that is the "
       (:TERM NIL "name") " of a " (:TERM NIL "function") " in that "
       (:TERM NIL "environment") ". "
       (:COMMENT NIL
        "   \\editornote{KMP: I think that in many (but obviously not all) cases where"
        " 	           `function name' is used, `operator name' might be intended."
        " 		   I'll be looking for such cases later, but if readers happen"
        " 		   to notice any of these, they should feel free to mark them.}%!!!"
        " !!! Moon: Not always with respect to an environment, see e.g., function block name."
        "           Also, can sometimes name a macro or special operator or be fbound."
        "% Added per Boyer/Kaufmann/Moore #8,#9 (by X3J13 vote at May 4-5, 1994 meeting)"
        "% -kmp 9-May-94")
       "2. A " (:TERM NIL "symbol") " or a " (:TERM NIL "list") " "
       (:TT NIL "(setf " (:I NIL "symbol") ")") ". " :PAR)
      (:ITEM NIL (:B NIL "functional evaluation")
       (:IDXTERM NIL "functional evaluation") " " (:I NIL "n.")
       " the process of extracting a " (:TERM NIL "functional value")
       " from a " (:TERM NIL "function name") " "
       (:COMMENT NIL "Added for Moon:") "or a " (:TERM NIL "lambda expression")
       ". The evaluator performs " (:TERM NIL "functional evaluation")
       " implicitly when it encounters a " (:TERM NIL "function name") " "
       (:COMMENT NIL "Added for Moon:") "or a " (:TERM NIL "lambda expression")
       " in the " (:TERM NIL "car") " of a " (:TERM NIL "compound form")
       ", or explicitly when it encounters a " (:SPECREF NIL "function") " "
       (:TERM NIL "special form") ". Neither a use of a " (:TERM NIL "symbol")
       " as a " (:TERM NIL "function designator") " nor a use of the "
       (:TERM NIL "function") " " (:FUNREF NIL "symbol-function")
       " to extract the " (:TERM NIL "functional value") " of a "
       (:TERM NIL "symbol") " is considered a "
       (:TERM NIL "functional evaluation") ". " :PAR)
      (:ITEM NIL (:B NIL "functional value") (:IDXTERM NIL "functional value")
       " " (:I NIL "n.") " 1. (of a " (:TERM NIL "function name") " "
       (:MATH NIL (:MI NIL "N")) " in an " (:TERM NIL "environment") " "
       (:MATH NIL (:MI NIL "E")) ") The " (:TERM NIL "value") " of the "
       (:TERM NIL "binding") " named " (:MATH NIL (:MI NIL "N")) " in the "
       (:TERM NIL "function") " " (:TERM NIL "namespace") " for "
       (:TERM NIL "environment") " " (:MATH NIL (:MI NIL "E")) "; "
       (:COMMENT NIL
        "!!! Moon: Wrong.  Function cell only holds global binding.")
       "that is, the contents of the " (:TERM NIL "function cell") " named "
       (:MATH NIL (:MI NIL "N")) " in " (:TERM NIL "environment") " "
       (:MATH NIL (:MI NIL "E")) ". 2. (of an " (:TERM NIL "fbound") " "
       (:TERM NIL "symbol") " " (:MATH NIL (:MI NIL "S"))
       ") the contents of the " (:TERM NIL "symbol") "'s "
       (:TERM NIL "function cell") "; that is, the " (:TERM NIL "value")
       " of the " (:TERM NIL "binding") " named " (:MATH NIL (:MI NIL "S"))
       " in the " (:TERM NIL "function") " " (:TERM NIL "namespace") " of the "
       (:TERM NIL "global environment") ". (A " (:TERM NIL "name")
       " that is a " (:TERM NIL "macro name") " in the "
       (:TERM NIL "global environment") " or is a "
       (:TERM NIL "special operator") " might or might not be "
       (:TERM NIL "fbound") ". "
       (:COMMENT NIL
        "!!! Moon: Isn't this [\"might or might not be fbound\"] contrary to CLtL?"
        "          I don't have the book here, so I didn't check.")
       "But if " (:MATH NIL (:MI NIL "S")) " is such a " (:TERM NIL "name")
       " and is " (:TERM NIL "fbound") ", the specific nature of its "
       (:TERM NIL "functional value") " is "
       (:TERM NIL "implementation-dependent")
       "; in particular, it might or might not be a " (:TERM NIL "function")
       ".) " :PAR)
      (:ITEM NIL (:B NIL "further compilation")
       (:IDXTERM NIL "further compilation") " " (:I NIL "n.") " "
       (:TERM NIL "implementation-dependent") " compilation beyond "
       (:TERM NIL "minimal compilation")
       ". Further compilation is permitted to take place at "
       (:TERM NIL "run time")
       ". “Block compilation and generation of machine-specific instructions are examples of further compilation.” "
       :PAR)))
    (:ITEM NIL (:B NIL "G")
     (:LIST NIL
      (:ITEM NIL (:B NIL "general") (:IDXTERM NIL "general") " "
       (:I NIL "adj.") " (of an " (:TERM NIL "array") ") having "
       (:TERM NIL "element type") " " (:TYPEREF NIL "t")
       ", and consequently able to have any " (:TERM NIL "object") " as an "
       (:TERM NIL "element") ". " :PAR)
      (:ITEM NIL (:B NIL "generalized boolean")
       (:IDXTERM NIL "generalized boolean") " " (:I NIL "n.") " an "
       (:TERM NIL "object") " used as a truth value, where the symbol "
       (:MISC NIL "nil") " represents " (:TERM NIL "false") " and all other "
       (:TERM NIL "objects") " represent " (:TERM NIL "true") ". See "
       (:TERM NIL "boolean") ". " :PAR)
      (:ITEM NIL (:B NIL "generalized instance")
       (:IDXTERM NIL "generalized instance") " " (:I NIL "n.") " (of a "
       (:TERM NIL "class") ") an " (:TERM NIL "object") " the "
       (:TERM NIL "class") " of which is either that " (:TERM NIL "class")
       " itself, or some subclass of that " (:TERM NIL "class")
       ". (Because of the correspondence between types and classes, the term “generalized instance of "
       (:MATH NIL (:MI NIL "X")) "” implies “object of type "
       (:MATH NIL (:MI NIL "X")) "” and in cases where "
       (:MATH NIL (:MI NIL "X")) " is a " (:TERM NIL "class") " (or "
       (:TERM NIL "class name")
       ") the reverse is also true. The former terminology emphasizes the view of "
       (:MATH NIL (:MI NIL "X")) " as a " (:TERM NIL "class")
       " while the latter emphasizes the view of " (:MATH NIL (:MI NIL "X"))
       " as a " (:TERM NIL "type specifier") ".) " :PAR)
      (:ITEM NIL (:B NIL "generalized reference")
       (:IDXTERM NIL "generalized reference") " " (:I NIL "n.")
       " a reference to a location storing an " (:TERM NIL "object")
       " as if to a " (:TERM NIL "variable")
       ". (Such a reference can be either to " (:TERM NIL "read") " or "
       (:TERM NIL "write") " the location.) See "
       (:SECREF NIL :GENERALIZED-REFERENCE) ". See also " (:TERM NIL "place")
       ". " :PAR)
      (:ITEM NIL (:B NIL "generalized synonym stream")
       (:IDXTERM NIL "generalized synonym stream") " " (:I NIL "n.")
       " (with a " (:TERM NIL "synonym stream symbol") ") 1. (to a "
       (:TERM NIL "stream") ") a " (:TERM NIL "synonym stream") " to the "
       (:TERM NIL "stream") ", or a " (:TERM NIL "composite stream")
       " which has as a target a " (:TERM NIL "generalized synonym stream")
       " to the " (:TERM NIL "stream") ". 2. (to a " (:TERM NIL "symbol")
       ") a " (:TERM NIL "synonym stream") " to the " (:TERM NIL "symbol")
       ", or a " (:TERM NIL "composite stream") " which has as a target a "
       (:TERM NIL "generalized synonym stream") " to the " (:TERM NIL "symbol")
       ". " :PAR)
      (:ITEM NIL (:B NIL "generic function") (:IDXTERM NIL "generic function")
       " " (:I NIL "n.") " a " (:TERM NIL "function")
       " whose behavior depends on the " (:TERM NIL "classes")
       " or identities of the arguments supplied to it and whose parts include, among other things, a set of "
       (:TERM NIL "methods") ", a " (:TERM NIL "lambda list") ", and a "
       (:TERM NIL "method combination") " type. " :PAR)
      (:ITEM NIL (:B NIL "generic function lambda list")
       (:IDXTERM NIL "generic function lambda list") " " (:I NIL "n.") " A "
       (:TERM NIL "lambda list") " that is used to describe data flow into a "
       (:TERM NIL "generic function") ". See " (:SECREF NIL :GF-LAMBDA-LISTS)
       ". " :PAR)
      (:ITEM NIL (:B NIL "gensym") (:IDXTERM NIL "gensym") " " (:I NIL "n.")
       " " (:I NIL "Trad.") " an " (:TERM NIL "uninterned") " "
       (:TERM NIL "symbol") ". See the " (:TERM NIL "function") " "
       (:FUNREF NIL "gensym") ". " :PAR
       (:COMMENT NIL "!!! Needs work. -kmp 25-Oct-90"))
      (:ITEM NIL (:B NIL "global declaration")
       (:IDXTERM NIL "global declaration") " " (:I NIL "n.") " a "
       (:TERM NIL "form")
       " that makes certain kinds of information about code globally available; that is, a "
       (:FUNREF NIL "proclaim") " " (:TERM NIL "form") " or a "
       (:MACREF NIL "declaim") " " (:TERM NIL "form") ". " :PAR)
      (:ITEM NIL (:B NIL "global environment")
       (:IDXTERM NIL "global environment") " " (:I NIL "n.")
       " that part of an " (:TERM NIL "environment") " that contains "
       (:TERM NIL "bindings") " with " (:TERM NIL "indefinite scope") " and "
       (:TERM NIL "indefinite extent") ". " :PAR)
      (:ITEM NIL (:B NIL "global variable") (:IDXTERM NIL "global variable")
       " " (:I NIL "n.") " a " (:TERM NIL "dynamic variable") " or a "
       (:TERM NIL "constant variable") "."
       (:COMMENT NIL "Is this really right?") :PAR)
      (:ITEM NIL (:B NIL "glyph") (:IDXTERM NIL "glyph") " " (:I NIL "n.")
       " a visual representation. “Graphic characters have associated glyphs.” "
       :PAR)
      (:ITEM NIL (:B NIL "go") (:IDXTERM NIL "go") " " (:I NIL "v.")
       " to transfer control to a " (:TERM NIL "go point") ". See the "
       (:TERM NIL "special operator") " " (:SPECREF NIL "go") ". " :PAR)
      (:ITEM NIL (:B NIL "go point") (:IDXTERM NIL "go point")
       " one of possibly several " (:TERM NIL "exit points") " that are "
       (:TERM NIL "established") " by " (:SPECREF NIL "tagbody")
       " (or other abstractions, such as " (:MACREF NIL "prog")
       ", which are built from " (:SPECREF NIL "tagbody") "). " :PAR)
      (:ITEM NIL (:B NIL "go tag") (:IDXTERM NIL "go tag") " " (:I NIL "n.")
       " the " (:TERM NIL "symbol") " or " (:TERM NIL "integer")
       " that, within the " (:TERM NIL "lexical scope") " of a "
       (:SPECREF NIL "tagbody") " " (:TERM NIL "form") ", names an "
       (:TERM NIL "exit point") " " (:TERM NIL "established") " by that "
       (:SPECREF NIL "tagbody") " " (:TERM NIL "form") ". " :PAR)
      (:ITEM NIL (:B NIL "graphic") (:IDXTERM NIL "graphic") " "
       (:I NIL "adj.") " (of a " (:TERM NIL "character")
       ") being a “printing” or “displayable” " (:TERM NIL "character")
       " that has a standard visual representation as a single "
       (:TERM NIL "glyph") ", such as " (:TT NIL "A") " or " (:TT NIL "*")
       " or " (:TT NIL "=") ". " (:TERM NIL "Space") " is defined to be "
       (:TERM NIL "graphic") ". Of the " (:TERM NIL "standard characters")
       ", all but " (:TERM NIL "newline") " are " (:TERM NIL "graphic")
       ". See " (:TERM NIL "non-graphic") ". " :PAR)))
    (:ITEM NIL (:B NIL "H")
     (:LIST NIL
      (:ITEM NIL (:B NIL "handle") (:IDXTERM NIL "handle") " " (:I NIL "v.")
       " (of a " (:TERM NIL "condition") " being " (:TERM NIL "signaled")
       ") to perform a non-local transfer of control, terminating the ongoing "
       (:TERM NIL "signaling") " of the " (:TERM NIL "condition") ". " :PAR)
      (:ITEM NIL (:B NIL "handler") (:IDXTERM NIL "handler") " " (:I NIL "n.")
       " "
       (:COMMENT NIL
        "I'm expecting that we might have a need for other kinds of handlers. -kmp 31-Dec-90")
       "a " (:TERM NIL "condition handler") ". " :PAR)
      (:ITEM NIL (:B NIL "hash table") (:IDXTERM NIL "hash table") " "
       (:I NIL "n.") " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "hash-table") ", which provides a mapping from "
       (:TERM NIL "keys") " to " (:TERM NIL "values") ". " :PAR)
      (:ITEM NIL (:B NIL "home package") (:IDXTERM NIL "home package") " "
       (:I NIL "n.") " (of a " (:TERM NIL "symbol") ") the "
       (:TERM NIL "package") ", if any, which is contents of the "
       (:TERM NIL "package cell") " of the " (:TERM NIL "symbol")
       ", and which dictates how the " (:TERM NIL "Lisp printer")
       " prints the " (:TERM NIL "symbol") " when it is not "
       (:TERM NIL "accessible") " in the " (:TERM NIL "current package") ". ("
       (:TERM NIL "Symbols") " which have " (:MISC NIL "nil") " in their "
       (:TERM NIL "package cell") " are said to have no "
       (:TERM NIL "home package") ", and also to be "
       (:TERM NIL "apparently uninterned") ".) " :PAR)))
    (:ITEM NIL (:B NIL "I")
     (:LIST NIL
      (:ITEM NIL (:B NIL "I/O customization variable")
       (:IDXTERM NIL "I/O customization variable") " " (:I NIL "n.")
       " one of the " (:TERM NIL "stream variables") " in " (:NEXTFIGURE NIL)
       ", or some other (" (:TERM NIL "implementation-defined") ") "
       (:TERM NIL "stream variable") " that is defined by the "
       (:TERM NIL "implementation") " to be an "
       (:TERM NIL "I/O customization variable") ". " :PAR
       (:TABLE (:NAME ("Standardized I/O Customization Variables"))
        (:ROW NIL (:CELL NIL " *debug-io*") (:CELL NIL "*error-io*")
         (:CELL NIL "query-io*"))
        (:ROW NIL (:CELL NIL " *standard-input*")
         (:CELL NIL "*standard-output*") (:CELL NIL "*trace-output*")))
       " " :PAR)
      (:ITEM NIL (:B NIL "identical") (:IDXTERM NIL "identical") " "
       (:I NIL "adj.") " the " (:TERM NIL "same") " under " (:FUNREF NIL "eq")
       ". " :PAR)
      (:ITEM NIL (:B NIL "identifier") (:IDXTERM NIL "identifier") " "
       (:I NIL "n.") " 1. a " (:TERM NIL "symbol")
       " used to identify or to distinguish " (:TERM NIL "names") ". 2. a "
       (:TERM NIL "string") " used the same way. " :PAR)
      (:ITEM NIL (:B NIL "immutable") (:IDXTERM NIL "immutable") " "
       (:I NIL "adj.") " not subject to change, either because no "
       (:TERM NIL "operator")
       " is provided which is capable of effecting such change or because some constraint exists which prohibits the use of an "
       (:TERM NIL "operator")
       " that might otherwise be capable of effecting such a change. Except as explicitly indicated otherwise, "
       (:TERM NIL "implementations")
       " are not required to detect attempts to modify "
       (:TERM NIL "immutable") " " (:TERM NIL "objects") " or "
       (:TERM NIL "cells")
       "; the consequences of attempting to make such modification are undefined. “Numbers are immutable.” "
       :PAR)
      (:ITEM NIL (:B NIL "implementation") (:IDXTERM NIL "implementation") " "
       (:I NIL "n.") " a system, mechanism, or body of " (:TERM NIL "code")
       " that implements the semantics of " (:RM NIL " Common Lisp") ". " :PAR)
      (:ITEM NIL (:B NIL "implementation limit")
       (:IDXTERM NIL "implementation limit") " " (:I NIL "n.")
       " a restriction imposed by an " (:TERM NIL "implementation") ". " :PAR)
      (:ITEM NIL (:B NIL "implementation-defined")
       (:IDXTERM NIL "implementation-defined") " " (:I NIL "adj.") " "
       (:TERM NIL "implementation-dependent")
       ", but required by this specification to be defined by each "
       (:TERM NIL "conforming implementation")
       " and to be documented by the corresponding implementor. "
       (:COMMENT NIL
        "When this was moved to this position from far away, it became redundant. -kmp 14-Nov-91"
        " %I added this after asking Quinquevirate if they thought I should."
        " %No one objected, and RPG thought it was a good idea. -kmp 17-Oct-90"
        "   A \\term{conforming implementation} is required to document its treatment of each "
        "   item in this specification which is marked \\term{implementation-defined}.")
       :PAR)
      (:ITEM NIL (:B NIL "implementation-dependent")
       (:IDXTERM NIL "implementation-dependent") " " (:I NIL "adj.")
       " describing a behavior or aspect of " (:RM NIL " Common Lisp")
       " which has been deliberately left unspecified, that might be defined in some "
       (:TERM NIL "conforming implementations")
       " but not in others, and whose details may differ between "
       (:TERM NIL "implementations") ". "
       (:COMMENT NIL
        "I added this after asking Quinquevirate if they thought I should."
        "No one objected, and RPG thought it was a good idea. -kmp 17-Oct-90")
       "A " (:TERM NIL "conforming implementation")
       " is encouraged (but not required) to document its treatment of each item in this specification which is marked "
       (:TERM NIL "implementation-dependent")
       ", although in some cases such documentation might simply identify the item as “undefined.” "
       :PAR)
      (:ITEM NIL (:B NIL "implementation-independent")
       (:IDXTERM NIL "implementation-independent") " " (:I NIL "adj.")
       " used to identify or emphasize a behavior or aspect of "
       (:RM NIL " Common Lisp") " which does not vary between "
       (:TERM NIL "conforming implementations") ". " :PAR)
      (:ITEM NIL (:B NIL "implicit block") (:IDXTERM NIL "implicit block") " "
       (:I NIL "n.") " a " (:TERM NIL "block") " introduced by a "
       (:TERM NIL "macro form") " rather than by an explicit "
       (:SPECREF NIL "block") " " (:TERM NIL "form") ". " :PAR)
      (:ITEM NIL (:B NIL "implicit compilation")
       (:IDXTERM NIL "implicit compilation") " " (:I NIL "n.") " "
       (:TERM NIL "compilation") " performed during " (:TERM NIL "evaluation")
       ". " :PAR)
      (:ITEM NIL (:B NIL "implicit progn") (:IDXTERM NIL "implicit progn") " "
       (:I NIL "n.") " an ordered set of adjacent " (:TERM NIL "forms")
       " appearing in another " (:TERM NIL "form")
       ", and defined by their context in that " (:TERM NIL "form")
       " to be executed as if within a " (:SPECREF NIL "progn") ". " :PAR)
      (:ITEM NIL (:B NIL "implicit tagbody") (:IDXTERM NIL "implicit tagbody")
       " " (:I NIL "n.") " an ordered set of adjacent " (:TERM NIL "forms")
       " and/or " (:TERM NIL "tags") " appearing in another "
       (:TERM NIL "form") ", and defined by their context in that "
       (:TERM NIL "form") " to be executed as if within a "
       (:SPECREF NIL "tagbody") ". " :PAR)
      (:ITEM NIL (:B NIL "import") (:IDXTERM NIL "import") " " (:I NIL "v.t.")
       " (a " (:TERM NIL "symbol") " into a " (:TERM NIL "package")
       ") to make the " (:TERM NIL "symbol") " be " (:TERM NIL "present")
       " in the " (:TERM NIL "package") ". " :PAR)
      (:ITEM NIL (:B NIL "improper list") (:IDXTERM NIL "improper list") " "
       (:I NIL "n.") " a " (:TERM NIL "list") " which is not a "
       (:TERM NIL "proper list") ": a " (:TERM NIL "circular list") " or a "
       (:TERM NIL "dotted list") ". " :PAR)
      (:ITEM NIL (:B NIL "inaccessible") (:IDXTERM NIL "inaccessible") " "
       (:I NIL "adj.") " not " (:TERM NIL "accessible") ". " :PAR)
      (:ITEM NIL (:B NIL "indefinite extent")
       (:IDXTERM NIL "indefinite extent") " " (:I NIL "n.") " an "
       (:TERM NIL "extent")
       " whose duration is unlimited. “Most Common Lisp objects have indefinite extent.” "
       :PAR)
      (:ITEM NIL (:B NIL "indefinite scope") (:IDXTERM NIL "indefinite scope")
       " " (:I NIL "n.") " " (:TERM NIL "scope") " that is unlimited. " :PAR)
      (:ITEM NIL (:B NIL "indicator") (:IDXTERM NIL "indicator") " "
       (:I NIL "n.") " a " (:TERM NIL "property indicator") ". " :PAR)
      (:ITEM NIL (:B NIL "indirect instance")
       (:IDXTERM NIL "indirect instance") " " (:I NIL "n.") " (of a "
       (:TERM NIL "class") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1"))) ") an "
       (:TERM NIL "object") " of " (:TERM NIL "class") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) ", where "
       (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "2"))) " is a "
       (:TERM NIL "subclass") " of "
       (:MATH NIL (:MSUB NIL (:MI NIL "C") (:MN NIL "1")))
       ". “An integer is an indirect instance of the class "
       (:TYPEREF NIL "number") ".” " :PAR)
      (:ITEM NIL (:B NIL "inherit") (:IDXTERM NIL "inherit") " "
       (:I NIL "v.t.")
       " 1. to receive or acquire a quality, trait, or characteristic; to gain access to a feature defined elsewhere. 2. (a "
       (:TERM NIL "class")
       ") to acquire the structure and behavior defined by a "
       (:TERM NIL "superclass") ". 3. (a " (:TERM NIL "package") ") to make "
       (:TERM NIL "symbols") " " (:TERM NIL "exported") " by another "
       (:TERM NIL "package") " " (:TERM NIL "accessible") " by using "
       (:FUNREF NIL "use-package") ". " :PAR
       (:ISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " ")
      (:ITEM NIL (:B NIL "initial pprint dispatch table")
       (:IDXTERM NIL "initial pprint dispatch table") " " (:I NIL "n.") " the "
       (:TERM NIL "value") " of " (:VARREF NIL "*print-pprint-dispatch*")
       " at the time the " (:TERM NIL "Lisp image") " is started. "
       (:ENDISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " " :PAR
       (:ISSUE NIL "WITH-STANDARD-IO-SYNTAX-READTABLE:X3J13-MAR-91") " ")
      (:ITEM NIL (:B NIL "initial readtable")
       (:IDXTERM NIL "initial readtable") " " (:I NIL "n.") " the "
       (:TERM NIL "value") " of " (:VARREF NIL "*readtable*")
       " at the time the " (:TERM NIL "Lisp image") " is started. "
       (:ENDISSUE NIL "WITH-STANDARD-IO-SYNTAX-READTABLE:X3J13-MAR-91") " "
       :PAR (:ISSUE NIL "PLIST-DUPLICATES:ALLOW") " ")
      (:ITEM NIL (:B NIL "initialization argument list")
       (:IDXTERM NIL "initialization argument list") " " (:I NIL "n.") " "
       (:COMMENT NIL " a \\term{proper list} of \\term{keyword/value pairs} "
        " (of initialization argument \\term{names} and \\term{values})")
       "a " (:TERM NIL "property list") " of initialization argument "
       (:TERM NIL "names") " and " (:TERM NIL "values")
       " used in the protocol for initializing and reinitializing "
       (:TERM NIL "instances") " of " (:TERM NIL "classes") ". See "
       (:SECREF NIL :OBJECT-CREATION-AND-INIT) ". "
       (:ENDISSUE NIL "PLIST-DUPLICATES:ALLOW") " " :PAR)
      (:ITEM NIL (:B NIL "initialization form")
       (:IDXTERM NIL "initialization form") " " (:I NIL "n.") " a "
       (:TERM NIL "form") " used to supply the initial " (:TERM NIL "value")
       " for a " (:TERM NIL "slot") " or " (:TERM NIL "variable")
       ". “The initialization form for a slot in a " (:MACREF NIL "defclass")
       " form is introduced by the keyword " (:KWD NIL "initform") ".” " :PAR)
      (:ITEM NIL (:B NIL "input") (:IDXTERM NIL "input") " " (:I NIL "adj.")
       " (of a " (:TERM NIL "stream") ") supporting input operations ("
       (:I NIL "i.e.") ",  being a “data source”). An " (:TERM NIL "input") " "
       (:TERM NIL "stream") " might also be an " (:TERM NIL "output") " "
       (:TERM NIL "stream") ", in which case it is sometimes called a "
       (:TERM NIL "bidirectional") " " (:TERM NIL "stream") ". See the "
       (:TERM NIL "function") " " (:FUNREF NIL "input-stream-p") ". " :PAR)
      (:ITEM NIL (:B NIL "instance") (:IDXTERM NIL "instance") " "
       (:I NIL "n.") " 1. a " (:TERM NIL "direct instance") ". 2. a "
       (:TERM NIL "generalized instance") ". 3. an "
       (:TERM NIL "indirect instance") ". " :PAR)
      (:ITEM NIL (:B NIL "integer") (:IDXTERM NIL "integer") " " (:I NIL "n.")
       " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "integer") ", which represents a mathematical integer. "
       :PAR)
      (:ITEM NIL (:B NIL "interactive stream")
       (:IDXTERM NIL "interactive stream") " " (:I NIL "n.") " a "
       (:TERM NIL "stream")
       " on which it makes sense to perform interactive querying. See "
       (:SECREF NIL :INTERACTIVE-STREAMS) ". " :PAR
       (:COMMENT NIL
        "!!! The usage \"interning a symbol\" is used but not described here."
        "     e.g., see the type entry for KEYWORD."))
      (:ITEM NIL (:B NIL "intern") (:IDXTERM NIL "intern") " " (:I NIL "v.t.")
       " 1. (a " (:TERM NIL "string") " in a " (:TERM NIL "package")
       ") to look up the " (:TERM NIL "string") " in the "
       (:TERM NIL "package") ", returning either a " (:TERM NIL "symbol")
       " with that " (:TERM NIL "name") " which was already "
       (:TERM NIL "accessible") " in the " (:TERM NIL "package")
       " or a newly created " (:TERM NIL "internal symbol") " of the "
       (:TERM NIL "package") " with that " (:TERM NIL "name") ". 2. "
       (:I NIL "Idiom.")
       " generally, to observe a protocol whereby objects which are equivalent or have equivalent names under some predicate defined by the protocol are mapped to a single canonical object. "
       :PAR)
      (:ITEM NIL (:B NIL "internal symbol") (:IDXTERM NIL "internal symbol")
       " " (:I NIL "n.") " (of a " (:TERM NIL "package") ") a symbol which is "
       (:TERM NIL "accessible") " in the " (:TERM NIL "package")
       ", but which is not an " (:TERM NIL "external symbol") " of the "
       (:TERM NIL "package") ". " :PAR)
      (:ITEM NIL (:B NIL "internal time") (:IDXTERM NIL "internal time") " "
       (:I NIL "n.") " " (:TERM NIL "time") ", represented as an "
       (:TERM NIL "integer") " number of " (:TERM NIL "internal time units")
       ". " (:TERM NIL "Absolute") " " (:TERM NIL "internal time")
       " is measured as an offset from an arbitrarily chosen, "
       (:TERM NIL "implementation-dependent") " base. See "
       (:SECREF NIL :INTERNAL-TIME) ". " :PAR (:COMMENT NIL "% 25.4.1 21"))
      (:ITEM NIL (:B NIL "internal time unit")
       (:IDXTERM NIL "internal time unit") " " (:I NIL "n.")
       " a unit of time equal to "
       (:MATH NIL (:MN NIL "1") (:MO NIL "/") (:MI NIL "n"))
       " of a second, for some " (:TERM NIL "implementation-defined") " "
       (:TERM NIL "integer") " value of " (:MATH NIL (:MI NIL "n"))
       ". See the " (:TERM NIL "variable") " "
       (:VARREF NIL "internal-time-units-per-second") ". " :PAR)
      (:ITEM NIL (:B NIL "interned") (:IDXTERM NIL "interned") " "
       (:I NIL "adj.") " " (:I NIL "Trad.") " 1. (of a " (:TERM NIL "symbol")
       ") " (:TERM NIL "accessible") (:SUB NIL "3") " in any "
       (:TERM NIL "package") ". 2. (of a " (:TERM NIL "symbol")
       " in a specific " (:TERM NIL "package") ") " (:TERM NIL "present")
       " in that " (:TERM NIL "package") ". " :PAR)
      (:ITEM NIL (:B NIL "interpreted function")
       (:IDXTERM NIL "interpreted function") " " (:I NIL "n.") " a "
       (:TERM NIL "function") " that is not a " (:TERM NIL "compiled function")
       ". (It is possible for there to be a "
       (:TERM NIL "conforming implementation") " which has no "
       (:TERM NIL "interpreted functions") ", but a "
       (:TERM NIL "conforming program") " must not assume that all "
       (:TERM NIL "functions") " are " (:TERM NIL "compiled functions") ".) "
       :PAR)
      (:ITEM NIL (:B NIL "interpreted implementation")
       (:IDXTERM NIL "interpreted implementation") " " (:I NIL "n.") " an "
       (:TERM NIL "implementation") " that uses an execution strategy for "
       (:TERM NIL "interpreted functions")
       " that does not involve a one-time semantic analysis pre-pass, and instead uses “lazy” (and sometimes repetitious) semantic analysis of "
       (:TERM NIL "forms") " as they are encountered during execution. " :PAR)
      (:ITEM NIL (:B NIL "interval designator")
       (:IDXTERM NIL "interval designator") " " (:I NIL "n.") " (of "
       (:TERM NIL "type") " " (:MATH NIL (:MI NIL "T")) ") an ordered pair of "
       (:TERM NIL "objects") " that describe a " (:TERM NIL "subtype") " of "
       (:MATH NIL (:MI NIL "T"))
       " by delimiting an interval on the real number line. See "
       (:SECREF NIL :INTERVAL-DESIGNATORS) ". " :PAR)
      (:ITEM NIL (:B NIL "invalid") (:IDXTERM NIL "invalid") " " (:I NIL "n.")
       ", " (:I NIL "adj.") " 1. " (:I NIL "n.") " a possible "
       (:TERM NIL "constituent trait") " of a " (:TERM NIL "character")
       " which if present signifies that the " (:TERM NIL "character")
       " cannot ever appear in a " (:TERM NIL "token")
       " except under the control of a " (:TERM NIL "single escape") " "
       (:TERM NIL "character") ". For details, see "
       (:SECREF NIL :CONSTITUENT-CHARS) ". 2. " (:I NIL "adj.") " (of a "
       (:TERM NIL "character") ") being a " (:TERM NIL "character")
       " that has " (:TERM NIL "syntax type") " " (:TERM NIL "constituent")
       " in the " (:TERM NIL "current readtable") " and that has the "
       (:TERM NIL "constituent trait") " " (:TERM NIL "invalid") (:SUB NIL "1")
       ". See " (:FIGREF NIL :CONSTITUENT-TRAITS-OF-STD-CHARS) ". " :PAR
       (:ISSUE NIL "DOTIMES-IGNORE:X3J13-MAR91") " ")
      (:ITEM NIL (:B NIL "iteration form") (:IDXTERM NIL "iteration form") " "
       (:I NIL "n.") " a " (:TERM NIL "compound form") " whose "
       (:TERM NIL "operator") " is named in " (:NEXTFIGURE NIL) ", or a "
       (:TERM NIL "compound form") " that has an "
       (:TERM NIL "implementation-defined") " " (:TERM NIL "operator")
       " and that is defined by the " (:TERM NIL "implementation") " to be an "
       (:TERM NIL "iteration form") ". " :PAR
       (:TABLE (:NAME ("Standardized Iteration Forms"))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " do"))
         (:CELL NIL (:FUNREF NIL "do-external-symbols"))
         (:CELL NIL (:FUNREF NIL "dotimes")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " do*"))
         (:CELL NIL (:FUNREF NIL "do-symbols"))
         (:CELL NIL (:FUNREF NIL "loop")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " do-all-symbols"))
         (:CELL NIL (:FUNREF NIL "dolist")) (:CELL NIL)))
       " " :PAR
       (:COMMENT NIL
        " Moon: Is this correct? I think WITH variables in LOOP are not iteration variables."
        " KMP: Looks right to me. See issue DOTIMES-IGNORE."))
      (:ITEM NIL (:B NIL "iteration variable")
       (:IDXTERM NIL "iteration variable") " " (:I NIL "n.") " a "
       (:TERM NIL "variable") " " (:MATH NIL (:MI NIL "V")) ", the "
       (:TERM NIL "binding") " for which was created by an "
       (:TERM NIL "explicit use") " of " (:MATH NIL (:MI NIL "V")) " in an "
       (:TERM NIL "iteration form") ". "
       (:ENDISSUE NIL "DOTIMES-IGNORE:X3J13-MAR91") " " :PAR)))
    (:ITEM NIL (:B NIL "K")
     (:LIST NIL
      (:ITEM NIL (:B NIL "key") (:IDXTERM NIL "key") " " (:I NIL "n.") " an "
       (:TERM NIL "object") " used for selection during retrieval. See "
       (:TERM NIL "association list") ", " (:TERM NIL "property list") ", and "
       (:TERM NIL "hash table") ". Also, see " (:SECREF NIL :SEQUENCE-CONCEPTS)
       ". " :PAR)
      (:ITEM NIL (:B NIL "keyword") (:IDXTERM NIL "keyword") " " (:I NIL "n.")
       " 1. a " (:TERM NIL "symbol") " the " (:TERM NIL "home package")
       " of which is the " (:PACKREF NIL "keyword") " " (:TERM NIL "package")
       ". 2. any " (:TERM NIL "symbol") ", usually but not necessarily in the "
       (:PACKREF NIL "keyword") " " (:TERM NIL "package")
       ", that is used as an identifying marker in keyword-style argument passing. See "
       (:MISC NIL "lambda") ". 3. " (:I NIL "Idiom.") " a "
       (:TERM NIL "lambda list keyword") ". " :PAR)
      (:ITEM NIL (:B NIL "keyword parameter")
       (:IDXTERM NIL "keyword parameter") " " (:I NIL "n.") " A "
       (:TERM NIL "parameter") " for which a corresponding keyword "
       (:TERM NIL "argument")
       " is optional. (There is no such thing as a required keyword "
       (:TERM NIL "argument") ".) If the " (:TERM NIL "argument")
       " is not supplied, a default value is used. See also "
       (:TERM NIL "supplied-p parameter") ". " :PAR
       (:ISSUE NIL "PLIST-DUPLICATES:ALLOW") " ")
      (:ITEM NIL (:B NIL "keyword/value pair")
       (:IDXTERM NIL "keyword/value pair") " " (:I NIL "n.") " two successive "
       (:TERM NIL "elements") " (a " (:TERM NIL "keyword") " and a "
       (:TERM NIL "value") ", respectively) of a " (:TERM NIL "property list")
       ". " (:ENDISSUE NIL "PLIST-DUPLICATES:ALLOW") " " :PAR)))
    (:ITEM NIL (:B NIL "L")
     (:LIST NIL
      (:ITEM NIL (:B NIL "lambda combination")
       (:IDXTERM NIL "lambda combination") " " (:I NIL "n.") " "
       (:I NIL "Trad.") " a " (:TERM NIL "lambda form") ". " :PAR)
      (:ITEM NIL (:B NIL "lambda expression")
       (:IDXTERM NIL "lambda expression") " " (:I NIL "n.") " a "
       (:TERM NIL "list") " which can be used in place of a "
       (:TERM NIL "function name") " in certain contexts to denote a "
       (:TERM NIL "function")
       " by directly describing its behavior rather than indirectly by referring to the name of an "
       (:TERM NIL "established") " " (:TERM NIL "function")
       "; its name derives from the fact that its first element is the "
       (:TERM NIL "symbol") " " (:TT NIL "lambda") ". See "
       (:MISC NIL "lambda") ". " :PAR)
      (:ITEM NIL (:B NIL "lambda form") (:IDXTERM NIL "lambda form") " "
       (:I NIL "n.") " a " (:TERM NIL "form") " that is a " (:TERM NIL "list")
       " and that has a first element which is a "
       (:TERM NIL "lambda expression") " representing a "
       (:TERM NIL "function") " to be called on " (:TERM NIL "arguments")
       " which are the result of " (:TERM NIL "evaluating")
       " subsequent elements of the " (:TERM NIL "lambda form") ". " :PAR)
      (:ITEM NIL (:B NIL "lambda list") (:IDXTERM NIL "lambda list") " "
       (:I NIL "n.") " a " (:TERM NIL "list") " that specifies a set of "
       (:TERM NIL "parameters") " (sometimes called "
       (:TERM NIL "lambda variables") ") and a protocol for receiving "
       (:TERM NIL "values") " for those " (:TERM NIL "parameters")
       "; that is, an " (:TERM NIL "ordinary lambda list") ", an "
       (:TERM NIL "extended lambda list") ", or a "
       (:TERM NIL "modified lambda list") ". " :PAR)
      (:ITEM NIL (:B NIL "lambda list keyword")
       (:IDXTERM NIL "lambda list keyword") " " (:I NIL "n.") " a "
       (:TERM NIL "symbol") " whose " (:TERM NIL "name") " begins with "
       (:TERM NIL "ampersand") " and that is specially recognized in a "
       (:TERM NIL "lambda list") ". Note that no " (:TERM NIL "standardized")
       " " (:TERM NIL "lambda list keyword") " is in the "
       (:PACKREF NIL "keyword") " " (:TERM NIL "package") ". " :PAR)
      (:ITEM NIL (:B NIL "lambda variable") (:IDXTERM NIL "lambda variable")
       " " (:I NIL "n.") " a " (:TERM NIL "formal parameter")
       ", used to emphasize the " (:TERM NIL "variable") "'s relation to the "
       (:TERM NIL "lambda list") " that " (:TERM NIL "established") " it. "
       :PAR)
      (:ITEM NIL (:B NIL "leaf") (:IDXTERM NIL "leaf") " " (:I NIL "n.")
       " 1. an " (:TERM NIL "atom") " in a " (:TERM NIL "tree") (:SUB NIL "1")
       ". 2. a terminal node of a " (:TERM NIL "tree") (:SUB NIL "2") ". "
       :PAR)
      (:ITEM NIL (:B NIL "leap seconds") (:IDXTERM NIL "leap seconds") " "
       (:I NIL "n.")
       " additional one-second intervals of time that are occasionally inserted into the true calendar by official timekeepers as a correction similar to “leap years.” All "
       (:RM NIL " Common Lisp") " " (:TERM NIL "time")
       " representations ignore " (:TERM NIL "leap seconds")
       "; every day is assumed to be exactly 86400 seconds long. " :PAR)
      (:ITEM NIL (:B NIL "left-parenthesis") (:IDXTERM NIL "left-parenthesis")
       " " (:I NIL "n.") " the " (:TERM NIL "standard character") " “"
       (:TT NIL "(")
       "”, that is variously called “left parenthesis” or “open parenthesis” See "
       (:FIGREF NIL :STD-CHARS-THREE) ". " :PAR)
      (:ITEM NIL (:B NIL "length") (:IDXTERM NIL "length") " " (:I NIL "n.")
       " (of a " (:TERM NIL "sequence") ") the number of "
       (:TERM NIL "elements") " in the " (:TERM NIL "sequence")
       ". (Note that if the " (:TERM NIL "sequence") " is a "
       (:TERM NIL "vector") " with a " (:TERM NIL "fill pointer") ", its "
       (:TERM NIL "length") " is the same as the " (:TERM NIL "fill pointer")
       " even though the total allocated size of the " (:TERM NIL "vector")
       " might be larger.) " :PAR)
      (:ITEM NIL (:B NIL "lexical binding") (:IDXTERM NIL "lexical binding")
       " " (:I NIL "n.") " a " (:TERM NIL "binding") " in a "
       (:TERM NIL "lexical environment") ". " :PAR)
      (:ITEM NIL (:B NIL "lexical closure") (:IDXTERM NIL "lexical closure")
       " " (:I NIL "n.") " a " (:TERM NIL "function") " that, when invoked on "
       (:TERM NIL "arguments") ", executes the body of a "
       (:TERM NIL "lambda expression") " in the "
       (:TERM NIL "lexical environment")
       " that was captured at the time of the creation of the "
       (:TERM NIL "lexical closure") ", augmented by " (:TERM NIL "bindings")
       " of the " (:TERM NIL "function") "'s " (:TERM NIL "parameters")
       " to the corresponding " (:TERM NIL "arguments") ". " :PAR)
      (:ITEM NIL (:B NIL "lexical environment")
       (:IDXTERM NIL "lexical environment") " " (:I NIL "n.")
       " that part of the " (:TERM NIL "environment") " that contains "
       (:TERM NIL "bindings") " whose names have " (:TERM NIL "lexical scope")
       ". A " (:TERM NIL "lexical environment")
       " contains, among other things: "
       (:COMMENT NIL "!!! Moon: [re \"among other things\"] scary!")
       "ordinary " (:TERM NIL "bindings") " of " (:TERM NIL "variable") " "
       (:TERM NIL "names") " to " (:TERM NIL "values") ", lexically "
       (:TERM NIL "established") " " (:TERM NIL "bindings") " of "
       (:TERM NIL "function names") " to " (:TERM NIL "functions") ", "
       (:TERM NIL "macros") ", " (:TERM NIL "symbol macros") ", "
       (:TERM NIL "blocks") ", " (:TERM NIL "tags") ", and "
       (:TERM NIL "local declarations") " (see " (:MISC NIL "declare") "). "
       :PAR)
      (:ITEM NIL (:B NIL "lexical scope") (:IDXTERM NIL "lexical scope") " "
       (:I NIL "n.") " " (:TERM NIL "scope")
       " that is limited to a spatial or textual region within the establishing "
       (:TERM NIL "form") ". "
       (:COMMENT NIL "!!! Moon: [re \"names\" in this example] \"bindings\"?")
       "“The names of parameters to a function normally are lexically scoped.” "
       :PAR)
      (:ITEM NIL (:B NIL "lexical variable") (:IDXTERM NIL "lexical variable")
       " " (:I NIL "n.") " a " (:TERM NIL "variable") " the "
       (:TERM NIL "binding") " for which is in the "
       (:TERM NIL "lexical environment") ". " :PAR
       (:COMMENT NIL
        "!!! KMP wonders if the \"Lisp xxx\" terms shouldn't be renamed to not require "
        "    the use of the prefix \"Lisp\".")
       :PAR
       (:COMMENT NIL "!!! Moon: Too long?"
        "    KMP: Maybe I'll separate out into a concept section."))
      (:ITEM NIL (:B NIL "Lisp image") (:IDXTERM NIL "Lisp image") " "
       (:I NIL "n.") " a running instantiation of a " (:RM NIL " Common Lisp")
       " " (:TERM NIL "implementation") ". A " (:TERM NIL "Lisp image")
       " is characterized by a single address space in which any "
       (:TERM NIL "object")
       " can directly refer to any another in conformance with this specification, and by a single, common, "
       (:TERM NIL "global environment")
       ". (External operating systems sometimes call this a “core image,” “fork,” “incarnation,” “job,” or “process.” Note however, that the issue of a “process” in such an operating system is technically orthogonal to the issue of a "
       (:TERM NIL "Lisp image")
       " being defined here. Depending on the operating system, a single “process” might have multiple "
       (:TERM NIL "Lisp images")
       ", and multiple “processes” might reside in a single "
       (:TERM NIL "Lisp image")
       ". Hence, it is the idea of a fully shared address space for direct reference among all "
       (:TERM NIL "objects")
       " which is the defining characteristic. Note, too, that two “processes” which have a communication area that permits the sharing of some but not all "
       (:TERM NIL "objects") " are considered to be distinct "
       (:TERM NIL "Lisp images") ".) " :PAR)
      (:ITEM NIL (:B NIL "Lisp printer") (:IDXTERM NIL "Lisp printer") " "
       (:I NIL "n.") " " (:I NIL "Trad.")
       " the procedure that prints the character representation of an "
       (:TERM NIL "object") " onto a " (:TERM NIL "stream")
       ". (This procedure is implemented by the " (:TERM NIL "function") " "
       (:FUNREF NIL "write") ".) " :PAR)
      (:ITEM NIL (:B NIL "Lisp read-eval-print loop")
       (:IDXTERM NIL "Lisp read-eval-print loop") " " (:I NIL "n.") " "
       (:I NIL "Trad.") " an endless loop that " (:TERM NIL "reads")
       (:SUB NIL "2") " a " (:TERM NIL "form") ", " (:TERM NIL "evaluates")
       " it, and prints (" (:I NIL "i.e.") ",  " (:TERM NIL "writes")
       (:SUB NIL "2") ") the results. In many " (:TERM NIL "implementations")
       ", the default mode of interaction with " (:RM NIL " Common Lisp")
       " during program development is through such a loop. " :PAR)
      (:ITEM NIL (:B NIL "Lisp reader") (:IDXTERM NIL "Lisp reader") " "
       (:I NIL "n.") " " (:I NIL "Trad.")
       " the procedure that parses character representations of "
       (:TERM NIL "objects") " from a " (:TERM NIL "stream") ", producing "
       (:TERM NIL "objects") ". (This procedure is implemented by the "
       (:TERM NIL "function") " " (:FUNREF NIL "read") ".) "
       (:COMMENT NIL "!!! KMP wants more words about the readtable here.")
       :PAR)
      (:ITEM NIL (:B NIL "list") (:IDXTERM NIL "list") " " (:I NIL "n.")
       " 1. a chain of " (:TERM NIL "conses") " in which the "
       (:TERM NIL "car") " of each " (:TERM NIL "cons") " is an "
       (:TERM NIL "element") " of the " (:TERM NIL "list") ", and the "
       (:TERM NIL "cdr") " of each " (:TERM NIL "cons")
       " is either the next link in the chain or a terminating "
       (:TERM NIL "atom") ". See also " (:TERM NIL "proper list") ", "
       (:TERM NIL "dotted list") ", or " (:TERM NIL "circular list")
       ". 2. the " (:TERM NIL "type") " that is the union of "
       (:TYPEREF NIL "null") " and " (:TYPEREF NIL "cons") ". " :PAR)
      (:ITEM NIL (:B NIL "list designator") (:IDXTERM NIL "list designator")
       " " (:I NIL "n.") " a " (:TERM NIL "designator") " for a "
       (:TERM NIL "list") " of " (:TERM NIL "objects") "; that is, an "
       (:TERM NIL "object") " that denotes a " (:TERM NIL "list")
       " and that is one of: a " (:TERM NIL "non-nil") " " (:TERM NIL "atom")
       " (denoting a " (:TERM NIL "singleton") " " (:TERM NIL "list") " whose "
       (:TERM NIL "element") " is that " (:TERM NIL "non-nil") " "
       (:TERM NIL "atom") ") or a " (:TERM NIL "proper list")
       " (denoting itself). " :PAR)
      (:ITEM NIL (:B NIL "list structure") (:IDXTERM NIL "list structure") " "
       (:I NIL "n.") " (of a " (:TERM NIL "list") ") the set of "
       (:TERM NIL "conses") " that make up the " (:TERM NIL "list")
       ". Note that while the " (:TERM NIL "car") (:SUB NIL "1b")
       " component of each such " (:TERM NIL "cons") " is part of the "
       (:TERM NIL "list structure") ", the " (:TERM NIL "objects") " that are "
       (:TERM NIL "elements") " of the " (:TERM NIL "list") " ("
       (:I NIL "i.e.") ",  the " (:TERM NIL "objects") " that are the "
       (:TERM NIL "cars") (:SUB NIL "2") " of each " (:TERM NIL "cons")
       " in the " (:TERM NIL "list") ") are not themselves part of its "
       (:TERM NIL "list structure") ", even if they are " (:TERM NIL "conses")
       ", except in the (" (:TERM NIL "circular") (:SUB NIL "2")
       ") case where the " (:TERM NIL "list") " actually contains one of its "
       (:TERM NIL "tails") " as an " (:TERM NIL "element") ". (The "
       (:TERM NIL "list structure") " of a " (:TERM NIL "list")
       " is sometimes redundantly referred to as its “top-level list structure” in order to emphasize that any "
       (:TERM NIL "conses") " that are " (:TERM NIL "elements") " of the "
       (:TERM NIL "list") " are not involved.) " :PAR)
      (:ITEM NIL (:B NIL "literal") (:IDXTERM NIL "literal") " "
       (:I NIL "adj.") " (of an " (:TERM NIL "object")
       ") referenced directly in a program rather than being computed by the program; that is, appearing as data in a "
       (:SPECREF NIL "quote") " " (:TERM NIL "form") ", or, if the "
       (:TERM NIL "object") " is a " (:TERM NIL "self-evaluating object")
       ", appearing as unquoted data. “In the form "
       (:TT NIL "(cons \"one\" '(\"two\"))") ", the expressions "
       (:TT NIL "\"one\"") ", " (:TT NIL "(\"two\")") ", and "
       (:TT NIL "\"two\"") " are literal objects.” " :PAR)
      (:ITEM NIL (:B NIL "load") (:IDXTERM NIL "load") " " (:I NIL "v.t.")
       " (a " (:TERM NIL "file") ") to cause the " (:TERM NIL "code")
       " contained in the " (:TERM NIL "file") " to be " (:TERM NIL "executed")
       ". See the " (:TERM NIL "function") " " (:FUNREF NIL "load") ". " :PAR)
      (:ITEM NIL (:B NIL "load time") (:IDXTERM NIL "load time") " "
       (:I NIL "n.") " the duration of time that the loader is "
       (:TERM NIL "loading") " " (:TERM NIL "compiled code") ". " :PAR)
      (:ITEM NIL (:B NIL "load time value") (:IDXTERM NIL "load time value")
       " " (:I NIL "n.") " an " (:TERM NIL "object") " referred to in "
       (:TERM NIL "code") " by a " (:SPECREF NIL "load-time-value") " "
       (:TERM NIL "form") ". The " (:TERM NIL "value") " of such a "
       (:TERM NIL "form") " is some specific " (:TERM NIL "object")
       " which can only be computed in the run-time " (:TERM NIL "environment")
       ". In the case of " (:TERM NIL "file") " " (:TERM NIL "compilation")
       ", the " (:TERM NIL "value")
       " is computed once as part of the process of " (:TERM NIL "loading")
       " the " (:TERM NIL "compiled file") ", and not again. See the "
       (:TERM NIL "special operator") " " (:SPECREF NIL "load-time-value") ". "
       :PAR)
      (:ITEM NIL (:B NIL "loader") (:IDXTERM NIL "loader") " " (:I NIL "n.")
       " a facility that is part of Lisp and that " (:TERM NIL "loads") " a "
       (:TERM NIL "file") ". See the " (:TERM NIL "function") " "
       (:FUNREF NIL "load") ". " :PAR)
      (:ITEM NIL (:B NIL "local declaration")
       (:IDXTERM NIL "local declaration") " " (:I NIL "n.") " an "
       (:TERM NIL "expression")
       " which may appear only in specially designated positions of certain "
       (:TERM NIL "forms")
       ", and which provides information about the code contained within the containing "
       (:TERM NIL "form") "; that is, a " (:MISC NIL "declare") " "
       (:TERM NIL "expression") ". " :PAR)
      (:ITEM NIL (:B NIL "local precedence order")
       (:IDXTERM NIL "local precedence order") " " (:I NIL "n.") " (of a "
       (:TERM NIL "class") ") a " (:TERM NIL "list") " consisting of the "
       (:TERM NIL "class") " followed by its "
       (:TERM NIL "direct superclasses")
       " in the order mentioned in the defining " (:TERM NIL "form")
       " for the " (:TERM NIL "class") ". " :PAR)
      (:ITEM NIL (:B NIL "local slot") (:IDXTERM NIL "local slot") " "
       (:I NIL "n.") " (of a " (:TERM NIL "class") ") a " (:TERM NIL "slot")
       " " (:TERM NIL "accessible") " in only one " (:TERM NIL "instance")
       ", namely the " (:TERM NIL "instance") " in which the "
       (:TERM NIL "slot") " is allocated. " :PAR
       (:COMMENT NIL
        " Or maybe... {Request for comment sent to Moon. -kmp 28-Feb-91}"
        " \\gentry{local slot} \\Noun\\ "
        "   1. (of an \\term{instance}) a \\term{slot} which is allocated in and \\term{accessible}"
        "      to just that \\term{instance}."
        "   2. (of a \\term{class}) a \\term{slot} which is allocated anew for each "
        "      \\term{generalized instance} of the \\term{class}.")
       :PAR)
      (:ITEM NIL (:B NIL "logical block") (:IDXTERM NIL "logical block") " "
       (:I NIL "n.") " a conceptual grouping of related output used by the "
       (:TERM NIL "pretty printer") ". See the " (:TERM NIL "macro") " "
       (:MACREF NIL "pprint-logical-block") " and "
       (:SECREF NIL :DYNAMIC-CONTROL-OF-OUTPUT) ". " :PAR)
      (:ITEM NIL (:B NIL "logical host") (:IDXTERM NIL "logical host") " "
       (:I NIL "n.") " an " (:TERM NIL "object") " of "
       (:TERM NIL "implementation-dependent")
       " nature that is used as the representation of a “host” in a "
       (:TERM NIL "logical pathname")
       ", and that has an associated set of translation rules for converting "
       (:TERM NIL "logical pathnames") " belonging to that host into "
       (:TERM NIL "physical pathnames") ". See "
       (:SECREF NIL :LOGICAL-PATHNAMES) ". " :PAR)
      (:ITEM NIL (:B NIL "logical host designator")
       (:IDXTERM NIL "logical host designator") " " (:I NIL "n.") " a "
       (:TERM NIL "designator") " for a " (:TERM NIL "logical host")
       "; that is, an " (:TERM NIL "object") " that denotes a "
       (:TERM NIL "logical host") " and that is one of: a "
       (:TERM NIL "string") " (denoting the " (:TERM NIL "logical host")
       " that it names), or a " (:TERM NIL "logical host")
       " (denoting itself). (Note that because the representation of a "
       (:TERM NIL "logical host") " is " (:TERM NIL "implementation-dependent")
       ", it is possible that an " (:TERM NIL "implementation")
       " might represent a " (:TERM NIL "logical host") " as the "
       (:TERM NIL "string") " that names it.) " :PAR)
      (:ITEM NIL (:B NIL "logical pathname") (:IDXTERM NIL "logical pathname")
       " " (:I NIL "n.") " an " (:TERM NIL "object") " of " (:TERM NIL "type")
       " " (:TYPEREF NIL "logical-pathname") ". " :PAR)
      (:ITEM NIL (:B NIL "long float") (:IDXTERM NIL "long float") " "
       (:I NIL "n.") " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "long-float") ". " :PAR)
      (:ITEM NIL (:B NIL "loop keyword") (:IDXTERM NIL "loop keyword") " "
       (:I NIL "n.") " " (:I NIL "Trad.")
       " a symbol that is a specially recognized part of the syntax of an extended "
       (:MACREF NIL "loop") " " (:TERM NIL "form")
       ". Such symbols are recognized by their " (:TERM NIL "name") " (using "
       (:FUNREF NIL "string=")
       "), not by their identity; as such, they may be in any package. A "
       (:TERM NIL "loop keyword") " is not a " (:TERM NIL "keyword") ". " :PAR)
      (:ITEM NIL (:B NIL "lowercase") (:IDXTERM NIL "lowercase") " "
       (:I NIL "adj.") " (of a " (:TERM NIL "character") ") being among "
       (:TERM NIL "standard characters") " corresponding to the small letters "
       (:TT NIL "a") " through " (:TT NIL "z") ", or being some other "
       (:TERM NIL "implementation-defined") " " (:TERM NIL "character")
       " that is defined by the " (:TERM NIL "implementation") " to be "
       (:TERM NIL "lowercase") ". See " (:SECREF NIL :CHARACTERS-WITH-CASE)
       ". " :PAR)))
    (:ITEM NIL (:B NIL "M")
     (:LIST NIL
      (:ITEM NIL (:B NIL "macro") (:IDXTERM NIL "macro") " " (:I NIL "n.")
       " 1. a " (:TERM NIL "macro form") " 2. a " (:TERM NIL "macro function")
       ". 3. a " (:TERM NIL "macro name") ". " :PAR)
      (:ITEM NIL (:B NIL "macro character") (:IDXTERM NIL "macro character")
       " " (:I NIL "n.") " a " (:TERM NIL "character")
       " which, when encountered by the " (:TERM NIL "Lisp reader")
       " in its main dispatch loop, introduces a " (:TERM NIL "reader macro")
       (:SUB NIL "1") ". (" (:TERM NIL "Macro characters")
       " have nothing to do with " (:TERM NIL "macros") ".) " :PAR)
      (:ITEM NIL (:B NIL "macro expansion") (:IDXTERM NIL "macro expansion")
       " " (:I NIL "n.") " 1. the process of translating a "
       (:TERM NIL "macro form") " into another " (:TERM NIL "form") ". 2. the "
       (:TERM NIL "form") " resulting from this process. " :PAR)
      (:ITEM NIL (:B NIL "macro form") (:IDXTERM NIL "macro form") " "
       (:I NIL "n.") " "
       (:COMMENT NIL "!!! JonL thinks \"stands for\" is \"shaky\"") "a "
       (:TERM NIL "form") " that stands for another " (:TERM NIL "form") " ("
       (:I NIL "e.g.")
       ",  for the purposes of abstraction, information hiding, or syntactic convenience); that is, either a "
       (:TERM NIL "compound form") " whose first element is a "
       (:TERM NIL "macro name") ", or a " (:TERM NIL "form") " that is a "
       (:TERM NIL "symbol") " that names a " (:TERM NIL "symbol macro") ". "
       :PAR)
      (:ITEM NIL (:B NIL "macro function") (:IDXTERM NIL "macro function") " "
       (:I NIL "n.") " a " (:TERM NIL "function") " of two arguments, a "
       (:TERM NIL "form") " and an " (:TERM NIL "environment")
       ", that implements " (:TERM NIL "macro expansion") " by producing a "
       (:TERM NIL "form") " to be evaluated in place of the original argument "
       (:TERM NIL "form") ". " :PAR)
      (:ITEM NIL (:B NIL "macro lambda list")
       (:IDXTERM NIL "macro lambda list") " " (:I NIL "n.") " an "
       (:TERM NIL "extended lambda list") " used in " (:TERM NIL "forms")
       " that " (:TERM NIL "establish") " " (:TERM NIL "macro")
       " definitions, such as " (:MACREF NIL "defmacro") " and "
       (:SPECREF NIL "macrolet") ". See " (:SECREF NIL :MACRO-LAMBDA-LISTS)
       ". " :PAR)
      (:ITEM NIL (:B NIL "macro name") (:IDXTERM NIL "macro name") " "
       (:I NIL "n.") " a " (:TERM NIL "name") " for which "
       (:FUNREF NIL "macro-function") " returns " (:TERM NIL "true")
       " and which when used as the first element of a "
       (:TERM NIL "compound form") " identifies that " (:TERM NIL "form")
       " as a " (:TERM NIL "macro form") ". " :PAR)
      (:ITEM NIL (:B NIL "macroexpand hook") (:IDXTERM NIL "macroexpand hook")
       " " (:I NIL "n.") " the " (:TERM NIL "function") " that is the "
       (:TERM NIL "value") " of " (:VARREF NIL "*macroexpand-hook*") ". " :PAR)
      (:ITEM NIL (:B NIL "mapping") (:IDXTERM NIL "mapping") " " (:I NIL "n.")
       " 1. a type of iteration in which a " (:TERM NIL "function")
       " is successively applied to " (:TERM NIL "objects")
       " taken from corresponding entries in collections such as "
       (:TERM NIL "sequences") " or " (:TERM NIL "hash tables") ". 2. "
       (:I NIL "Math.")
       " a relation between two sets in which each element of the first set (the “domain”) is assigned one element of the second set (the “range”). "
       :PAR)
      (:ITEM NIL (:B NIL "metaclass") (:IDXTERM NIL "metaclass") " "
       (:I NIL "n.") " 1. a " (:TERM NIL "class") " whose instances are "
       (:TERM NIL "classes") ". 2. (of an " (:TERM NIL "object") ") the "
       (:TERM NIL "class") " of the " (:TERM NIL "class") " of the "
       (:TERM NIL "object") ". " :PAR)
      (:ITEM NIL (:B NIL "Metaobject Protocol")
       (:IDXTERM NIL "Metaobject Protocol") " " (:I NIL "n.")
       " one of many possible descriptions of how a "
       (:TERM NIL "conforming implementation")
       " might implement various aspects of the object system. This description is beyond the scope of this document, and no "
       (:TERM NIL "conforming implementation")
       " is required to adhere to it except as noted explicitly in this specification. Nevertheless, its existence helps to establish normative practice, and implementors with no reason to diverge from it are encouraged to consider making their "
       (:TERM NIL "implementation")
       " adhere to it where possible. It is described in detail in "
       (:BIB
        (:URL "https://archive.org/details/artofmetaobjectp0000kicz" :DOI
         "10.7551/mitpress/1405.001.0001" :ISBN "0262610744")
        "The Art of the Metaobject Protocol")
       ". " :PAR)
      (:ITEM NIL (:B NIL "method") (:IDXTERM NIL "method") " " (:I NIL "n.")
       " an " (:TERM NIL "object") " that is part of a "
       (:TERM NIL "generic function")
       " and which provides information about how that "
       (:TERM NIL "generic function") " should behave when its "
       (:TERM NIL "arguments") " are " (:TERM NIL "objects") " of certain "
       (:TERM NIL "classes") " or with certain identities. " :PAR)
      (:ITEM NIL (:B NIL "method combination")
       (:IDXTERM NIL "method combination") " " (:I NIL "n.")
       " 1. generally, the composition of a set of " (:TERM NIL "methods")
       " to produce an " (:TERM NIL "effective method") " for a "
       (:TERM NIL "generic function") ". 2. an object of " (:TERM NIL "type")
       " " (:TYPEREF NIL "method-combination")
       ", which represents the details of how the "
       (:TERM NIL "method combination") (:SUB NIL "1")
       " for one or more specific " (:TERM NIL "generic functions")
       " is to be performed. " :PAR)
      (:ITEM NIL (:B NIL "method-defining form")
       (:IDXTERM NIL "method-defining form") " " (:I NIL "n.") " a "
       (:TERM NIL "form") " that defines a " (:TERM NIL "method") " for a "
       (:TERM NIL "generic function")
       ", whether explicitly or implicitly. See " (:SECREF NIL :INTRO-TO-GFS)
       ". " :PAR)
      (:ITEM NIL (:B NIL "method-defining operator")
       (:IDXTERM NIL "method-defining operator") " " (:I NIL "n.") " an "
       (:TERM NIL "operator") " corresponding to a "
       (:TERM NIL "method-defining") " " (:TERM NIL "form") ". See "
       (:FIGREF NIL :STD-METH-DEF-OPS) ". " :PAR)
      (:ITEM NIL (:B NIL "minimal compilation")
       (:IDXTERM NIL "minimal compilation") " " (:I NIL "n.") " actions the "
       (:TERM NIL "compiler") " must take at compile time. See "
       (:SECREF NIL :COMPILATION-SEMANTICS) ". " :PAR)
      (:ITEM NIL (:B NIL "modified lambda list")
       (:IDXTERM NIL "modified lambda list") " " (:I NIL "n.")
       " a list resembling an " (:TERM NIL "ordinary lambda list")
       " in form and purpose, but which deviates in syntax or functionality from the definition of an "
       (:TERM NIL "ordinary lambda list") ". See "
       (:TERM NIL "ordinary lambda list") ". “" (:MACREF NIL "deftype")
       " uses a modified lambda list.” " :PAR)
      (:ITEM NIL (:B NIL "most recent") (:IDXTERM NIL "most recent") " "
       (:I NIL "adj.") " innermost; that is, having been "
       (:TERM NIL "established") " (and not yet " (:TERM NIL "disestablished")
       ") "
       (:COMMENT NIL
        "!!! Moon: This next line looks out of order.  Maybe reorganize this description."
        "          Put it before the parens? No. Hmm...")
       "more recently than any other of its kind. " :PAR)
      (:ITEM NIL (:B NIL "multiple escape") (:IDXTERM NIL "multiple escape")
       " " (:I NIL "n.") ", " (:I NIL "adj.") " 1. " (:I NIL "n.") " the "
       (:TERM NIL "syntax type") " of a " (:TERM NIL "character")
       " that is used in pairs to indicate that the enclosed "
       (:TERM NIL "characters") " are to be treated as "
       (:TERM NIL "alphabetic") (:SUB NIL "2") " " (:TERM NIL "characters")
       " with their " (:TERM NIL "case") " preserved. For details, see "
       (:SECREF NIL :MULTIPLE-ESCAPE-CHAR) ". 2. " (:I NIL "adj.") " (of a "
       (:TERM NIL "character") ") having the " (:TERM NIL "multiple escape")
       " " (:TERM NIL "syntax type") ". 3. " (:I NIL "n.") " a "
       (:TERM NIL "multiple escape") (:SUB NIL "2") " " (:TERM NIL "character")
       ". (In the " (:TERM NIL "standard readtable") ", "
       (:TERM NIL "vertical-bar") " is a " (:TERM NIL "multiple escape") " "
       (:TERM NIL "character") ".) " :PAR)
      (:ITEM NIL (:B NIL "multiple values") (:IDXTERM NIL "multiple values")
       " " (:I NIL "n.") " 1. more than one " (:TERM NIL "value")
       ". “The function " (:FUNREF NIL "truncate")
       " returns multiple values.” 2. a variable number of "
       (:TERM NIL "values") ", possibly including zero or one. “The function "
       (:FUNREF NIL "values")
       " returns multiple values.” 3. a fixed number of values other than one. “The macro "
       (:MACREF NIL "multiple-value-bind") " is among the few operators in "
       (:RM NIL " Common Lisp")
       " which can detect and manipulate multiple values.” " :PAR)))
    (:ITEM NIL (:B NIL "N")
     (:LIST NIL
      (:ITEM NIL (:B NIL "name") (:IDXTERM NIL "name") " " (:I NIL "n.") ", "
       (:I NIL "v.t.") " 1. " (:I NIL "n.") " an " (:TERM NIL "identifier")
       " by which an " (:TERM NIL "object") ", a " (:TERM NIL "binding")
       ", or an " (:TERM NIL "exit point") " " (:COMMENT NIL "or \"tag\"")
       "is referred to by association using a " (:TERM NIL "binding") ". 2. "
       (:I NIL "v.t.") " to give a " (:TERM NIL "name") " to. 3. "
       (:I NIL "n.") " (of an " (:TERM NIL "object")
       " having a name component) the " (:TERM NIL "object")
       " which is that component. “The string which is a symbol's name is returned by "
       (:FUNREF NIL "symbol-name") ".” 4. " (:I NIL "n.") " (of a "
       (:TERM NIL "pathname") ") a. the name component, returned by "
       (:FUNREF NIL "pathname-name") ". b. the entire namestring, returned by "
       (:FUNREF NIL "namestring") ". 5. " (:I NIL "n.") " (of a "
       (:TERM NIL "character") ") a " (:TERM NIL "string") " that names the "
       (:TERM NIL "character") " and that has " (:TERM NIL "length")
       " greater than one. (All " (:TERM NIL "non-graphic") " "
       (:TERM NIL "characters") " are required to have " (:TERM NIL "names")
       " unless they have some " (:TERM NIL "implementation-defined") " "
       (:TERM NIL "attribute") " which is not " (:TERM NIL "null")
       ". Whether or not other " (:TERM NIL "characters") " have "
       (:TERM NIL "names") " is " (:TERM NIL "implementation-dependent") ".) "
       :PAR)
      (:ITEM NIL (:B NIL "named constant") (:IDXTERM NIL "named constant") " "
       (:I NIL "n.") " a " (:TERM NIL "variable") " that is defined by "
       (:RM NIL " Common Lisp") ", by the " (:TERM NIL "implementation")
       ", or by user code (see the " (:TERM NIL "macro") " "
       (:MACREF NIL "defconstant") ") to always " (:TERM NIL "yield")
       " the same " (:TERM NIL "value") " when " (:TERM NIL "evaluated")
       ". “The value of a named constant may not be changed by assignment or by binding.” "
       :PAR
       (:COMMENT NIL
        "!!! Moon: \"kind\" is not defined, but I thin kthis is wrong.  Especially if \"kind\""
        "          is similar to \"type\".  Also, should relate to \"environment\" and section 3.1."))
      (:ITEM NIL (:B NIL "namespace") (:IDXTERM NIL "namespace") " "
       (:I NIL "n.") " 1. " (:TERM NIL "bindings")
       " whose denotations are restricted to a particular kind. “The bindings of names to tags is the tag namespace.” 2. any "
       (:TERM NIL "mapping") " whose domain is a set of " (:TERM NIL "names")
       ". “A package defines a namespace.” " :PAR
       (:ISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " ")
      (:ITEM NIL (:B NIL "namestring") (:IDXTERM NIL "namestring") " "
       (:I NIL "n.") " a " (:TERM NIL "string") " that represents a "
       (:TERM NIL "filename") " using either the " (:TERM NIL "standardized")
       " notation for naming " (:TERM NIL "logical pathnames") " described in "
       (:SECREF NIL :LOG-PATH-NAMESTRINGS) ", or some "
       (:TERM NIL "implementation-defined") " notation for naming a "
       (:TERM NIL "physical pathname") ". "
       (:ENDISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
       :PAR)
      (:ITEM NIL (:B NIL "newline") (:IDXTERM NIL "newline") " " (:I NIL "n.")
       " the " (:TERM NIL "standard character") " " (:ANG NIL "Newline")
       ", notated for the " (:TERM NIL "Lisp reader") " as "
       (:TT NIL "#\\Newline") ". " :PAR)
      (:ITEM NIL (:B NIL "next method") (:IDXTERM NIL "next method") " "
       (:I NIL "n.") " the next " (:TERM NIL "method")
       " to be invoked with respect to a given " (:TERM NIL "method")
       " for a particular set of arguments or argument " (:TERM NIL "classes")
       ". "
       (:COMMENT NIL
        "JonL thinks we should add \"under standardized method combinations\"?"
        "Moon thinks maybe not.  He says this is about as good as we should expect to get"
        " given the space in the glossary.")
       "See " (:SECREF NIL :APPLY-METH-COMB-TO-SORTED-METHODS) ". " :PAR)
      (:ITEM NIL (:B NIL "nickname") (:IDXTERM NIL "nickname") " "
       (:I NIL "n.") " (of a " (:TERM NIL "package")
       ") one of possibly several " (:TERM NIL "names")
       " that can be used to refer to the " (:TERM NIL "package")
       " but that is not the primary " (:TERM NIL "name") " of the "
       (:TERM NIL "package") ". " :PAR)
      (:ITEM NIL (:B NIL "nil") (:IDXTERM NIL "nil") " " (:I NIL "n.") " the "
       (:TERM NIL "object") " that is at once the " (:TERM NIL "symbol")
       " named " (:TT NIL "\"NIL\"") " in the " (:PACKREF NIL "common-lisp")
       " " (:TERM NIL "package") ", the " (:TERM NIL "empty list") ", the "
       (:TERM NIL "boolean") " (or " (:TERM NIL "generalized boolean")
       ") representing " (:TERM NIL "false") ", and the " (:TERM NIL "name")
       " of the " (:TERM NIL "empty type") ". "
       (:COMMENT NIL
        "!!! Should other things be here like use of NIL to represent "
        "    null lexical environment (should there be a term \"environment designator\"?),"
        "    use of NIL as an input/output stream designator, etc.?")
       :PAR)
      (:ITEM NIL (:B NIL "non-atomic") (:IDXTERM NIL "non-atomic") " "
       (:I NIL "adj.") " being other than an " (:TERM NIL "atom") "; "
       (:I NIL "i.e.") ",  being a " (:TERM NIL "cons") ". " :PAR)
      (:ITEM NIL (:B NIL "non-constant variable")
       (:IDXTERM NIL "non-constant variable") " " (:I NIL "n.") " a "
       (:TERM NIL "variable") " that is not a " (:TERM NIL "constant variable")
       ". " :PAR)
      (:ITEM NIL (:B NIL "non-correctable") (:IDXTERM NIL "non-correctable")
       " " (:I NIL "adj.") " (of an " (:TERM NIL "error")
       ") not intentionally " (:TERM NIL "correctable")
       ". (Because of the dynamic nature of " (:TERM NIL "restarts")
       ", it is neither possible nor generally useful to completely prohibit an "
       (:TERM NIL "error") " from being " (:TERM NIL "correctable")
       ". This term is used in order to express an intent that no special effort should be made by "
       (:TERM NIL "code") " signaling an " (:TERM NIL "error") " to make that "
       (:TERM NIL "error") " " (:TERM NIL "correctable")
       "; however, there is no actual requirement on "
       (:TERM NIL "conforming programs") " or "
       (:TERM NIL "conforming implementations") " imposed by this term.) "
       :PAR)
      (:ITEM NIL (:B NIL "non-empty") (:IDXTERM NIL "non-empty") " "
       (:I NIL "adj.") " having at least one " (:TERM NIL "element") ". " :PAR
       (:COMMENT NIL " Replaced by \"distinct\""
        " \\gentry{non-eq} \\Adjective\\" "   not \\term{eq}.")
       :PAR)
      (:ITEM NIL (:B NIL "non-generic function")
       (:IDXTERM NIL "non-generic function") " " (:I NIL "n.") " a "
       (:TERM NIL "function") " that is not a " (:TERM NIL "generic function")
       ". " :PAR)
      (:ITEM NIL (:B NIL "non-graphic") (:IDXTERM NIL "non-graphic") " "
       (:I NIL "adj.") " (of a " (:TERM NIL "character") ") not "
       (:TERM NIL "graphic") ". See " (:SECREF NIL :GRAPHIC-CHARS) ". " :PAR)
      (:ITEM NIL (:B NIL "non-list") (:IDXTERM NIL "non-list") " "
       (:I NIL "n.") ", " (:I NIL "adj.") " other than a " (:TERM NIL "list")
       "; " (:I NIL "i.e.") ",  a " (:TERM NIL "non-nil") " "
       (:TERM NIL "atom") ". " :PAR)
      (:ITEM NIL (:B NIL "non-local exit") (:IDXTERM NIL "non-local exit") " "
       (:I NIL "n.") " a transfer of control (and sometimes "
       (:TERM NIL "values") ") to an " (:TERM NIL "exit point")
       " for reasons other than a " (:TERM NIL "normal return")
       ". “The operators " (:SPECREF NIL "go") ", " (:SPECREF NIL "throw")
       ", and " (:SPECREF NIL "return-from") " cause a non-local exit.” " :PAR)
      (:ITEM NIL (:B NIL "non-nil") (:IDXTERM NIL "non-nil") " " (:I NIL "n.")
       ", " (:I NIL "adj.") " not " (:MISC NIL "nil") ". Technically, any "
       (:TERM NIL "object") " which is not " (:MISC NIL "nil")
       " can be referred to as " (:TERM NIL "true")
       ", but that would tend to imply a unique view of the "
       (:TERM NIL "object") " as a " (:TERM NIL "generalized boolean")
       ". Referring to such an " (:TERM NIL "object") " as "
       (:TERM NIL "non-nil") " avoids this implication. " :PAR
       (:COMMENT NIL "!!! Moon: Is this right? Is it a non-empty environment, "
        "          or any environment other than NIL?  Where is this term used?"))
      (:ITEM NIL (:B NIL "non-null lexical environment")
       (:IDXTERM NIL "non-null lexical environment") " " (:I NIL "n.") " a "
       (:TERM NIL "lexical environment")
       " that has additional information not present in the "
       (:TERM NIL "global environment") ", such as one or more "
       (:TERM NIL "bindings") ". " :PAR)
      (:ITEM NIL (:B NIL "non-simple") (:IDXTERM NIL "non-simple") " "
       (:I NIL "adj.") " not " (:TERM NIL "simple") ". " :PAR
       (:COMMENT NIL "!!! Make a glossary term for \"constituent character\"?"
        "!!! What about \"extended token\"?"))
      (:ITEM NIL (:B NIL "non-terminating") (:IDXTERM NIL "non-terminating")
       " " (:I NIL "adj.") " (of a " (:TERM NIL "macro character")
       ") being such that it is treated as a constituent "
       (:TERM NIL "character")
       " when it appears in the middle of an extended token. See "
       (:SECREF NIL :READER-ALGORITHM) ". " :PAR)
      (:ITEM NIL (:B NIL "non-top-level form")
       (:IDXTERM NIL "non-top-level form") " " (:I NIL "n.") " a "
       (:TERM NIL "form") " that, by virtue of its position as a "
       (:TERM NIL "subform") " of another " (:TERM NIL "form") ", is not a "
       (:TERM NIL "top level form") ". See " (:SECREF NIL :TOP-LEVEL-FORMS)
       ". " :PAR)
      (:ITEM NIL (:B NIL "normal return") (:IDXTERM NIL "normal return") " "
       (:I NIL "n.") " the natural transfer of control and "
       (:TERM NIL "values") " which occurs after the complete "
       (:TERM NIL "execution") " of a " (:TERM NIL "form") ". " :PAR)
      (:ITEM NIL (:B NIL "normalized") (:IDXTERM NIL "normalized") " "
       (:I NIL "adj.") ", " (:I NIL "ANSI") ", " (:I NIL "IEEE") " (of a "
       (:TERM NIL "float")
       ") conforming to the description of “normalized” as described by "
       (:BIB (:DOI "10.1109/IEEESTD.1985.82928" :ISBN "0-7381-1165-1")
        "IEEE Standard for Binary Floating-Point Arithmetic")
       ". See " (:TERM NIL "denormalized") ". " :PAR)
      (:ITEM NIL (:B NIL "null") (:IDXTERM NIL "null") " " (:I NIL "adj.") ", "
       (:I NIL "n.") " 1. " (:I NIL "adj.") " a. (of a " (:TERM NIL "list")
       ") having no " (:TERM NIL "elements") ": empty. See "
       (:TERM NIL "empty list") ". b. (of a " (:TERM NIL "string")
       ") having a " (:TERM NIL "length")
       " of zero. (It is common, both within this document and in observed spoken behavior, to refer to an empty string by an apparent definite reference, as in “the "
       (:TERM NIL "null") " " (:TERM NIL "string")
       "” even though no attempt is made to " (:TERM NIL "intern")
       (:SUB NIL "2") " null strings. The phrase “a " (:TERM NIL "null") " "
       (:TERM NIL "string")
       "” is technically more correct, but is generally considered awkward by most Lisp programmers. As such, the phrase “the "
       (:TERM NIL "null") " " (:TERM NIL "string")
       "” should be treated as an indefinite reference in all cases except for anaphoric references.) c. (of an "
       (:TERM NIL "implementation-defined") " " (:TERM NIL "attribute")
       " of a " (:TERM NIL "character") ") An " (:TERM NIL "object")
       " to which the value of that " (:TERM NIL "attribute")
       " defaults if no specific value was requested. 2. " (:I NIL "n.") " an "
       (:TERM NIL "object") " of " (:TERM NIL "type") " " (:TYPEREF NIL "null")
       " (the only such " (:TERM NIL "object") " being " (:MISC NIL "nil")
       "). " :PAR
       (:COMMENT NIL
        "!!! Moon: Is this correct?  has global bindings.  what about declarations?"))
      (:ITEM NIL (:B NIL "null lexical environment")
       (:IDXTERM NIL "null lexical environment") " " (:I NIL "n.") " the "
       (:TERM NIL "lexical environment") " which has no "
       (:TERM NIL "bindings") ". " :PAR)
      (:ITEM NIL (:B NIL "number") (:IDXTERM NIL "number") " " (:I NIL "n.")
       " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "number") ". " :PAR)
      (:ITEM NIL (:B NIL "numeric") (:IDXTERM NIL "numeric") " "
       (:I NIL "adj.") " (of a " (:TERM NIL "character") ") being one of the "
       (:TERM NIL "standard characters") " " (:TT NIL "0") " through "
       (:TT NIL "9") ", or being some other " (:TERM NIL "graphic") " "
       (:TERM NIL "character") " defined by the " (:TERM NIL "implementation")
       " to be " (:TERM NIL "numeric") ". " :PAR)))
    (:ITEM NIL (:B NIL "O")
     (:LIST NIL
      (:ITEM NIL (:B NIL "object") (:IDXTERM NIL "object") " " (:I NIL "n.")
       " 1. any Lisp datum. “The function " (:FUNREF NIL "cons")
       " creates an object which refers to two other objects.” 2. (immediately following the name of a "
       (:TERM NIL "type") ") an " (:TERM NIL "object") " which is of that "
       (:TERM NIL "type") ", used to emphasize that the " (:TERM NIL "object")
       " is not just a " (:TERM NIL "name") " for an object of that "
       (:TERM NIL "type") " but really an " (:TERM NIL "element") " of the "
       (:TERM NIL "type") " in cases where " (:TERM NIL "objects") " of that "
       (:TERM NIL "type") " (such as " (:TYPEREF NIL "function") " or "
       (:TYPEREF NIL "class") ") are commonly referred to by "
       (:TERM NIL "name") ". “The function " (:FUNREF NIL "symbol-function")
       " takes a function name and returns a function object.” " :PAR)
      (:ITEM NIL (:B NIL "object-traversing")
       (:IDXTERM NIL "object-traversing") " " (:I NIL "adj.")
       " operating in succession on components of an " (:TERM NIL "object")
       ". “The operators " (:FUNREF NIL "mapcar") ", " (:FUNREF NIL "maphash")
       ", " (:MACREF NIL "with-package-iterator") " and " (:FUNREF NIL "count")
       " perform object-traversing operations.” " :PAR)
      (:ITEM NIL (:B NIL "open") (:IDXTERM NIL "open") " " (:I NIL "adj.") ", "
       (:I NIL "v.t.") " (a " (:TERM NIL "file") ") 1. " (:I NIL "v.t.")
       " to create and return a " (:TERM NIL "stream") " to the "
       (:TERM NIL "file") ". 2. " (:I NIL "adj.") " (of a "
       (:TERM NIL "stream") ") having been " (:TERM NIL "opened")
       (:SUB NIL "1") ", but not yet " (:TERM NIL "closed") ". " :PAR)
      (:ITEM NIL (:B NIL "operator") (:IDXTERM NIL "operator") " "
       (:I NIL "n.") " 1. a " (:TERM NIL "function") ", " (:TERM NIL "macro")
       ", or " (:TERM NIL "special operator") ". 2. a " (:TERM NIL "symbol")
       " that names such a " (:TERM NIL "function") ", " (:TERM NIL "macro")
       ", or " (:TERM NIL "special operator") ". 3. (in a "
       (:SPECREF NIL "function") " " (:TERM NIL "special form") ") the "
       (:TERM NIL "cadr") " of the " (:SPECREF NIL "function") " "
       (:TERM NIL "special form") ", which might be either an "
       (:TERM NIL "operator") (:SUB NIL "2") " or a "
       (:TERM NIL "lambda expression") ". "
       (:COMMENT NIL
        "Barmar thinks that since operator(2) says \"symbol\" this last is unnecessary and confusing."
        "KMP disagrees because \"lambda expression\" is added here.")
       "4. (of a " (:TERM NIL "compound form") ") the " (:TERM NIL "car")
       " of the " (:TERM NIL "compound form") ", which might be either an "
       (:TERM NIL "operator") (:SUB NIL "2") " "
       (:COMMENT NIL
        "Moon asked whether this was permitted to include function objects,"
        "but I don't think so.  Barmar and Barrett also expressed that sentiment"
        "in mail to Quinquevirate (subject line \"#'#.#'car\").  "
        "No one took the alternate viewpoint. -kmp 14-Nov-91")
       "or a " (:TERM NIL "lambda expression") ", and which is never "
       (:TT NIL "(setf " (:TERM NIL "symbol") ")") ". " :PAR)
      (:ITEM NIL (:B NIL "optimize quality") (:IDXTERM NIL "optimize quality")
       " " (:I NIL "n.")
       " one of several aspects of a program that might be optimizable by certain compilers. Since optimizing one such quality might conflict with optimizing another, relative priorities for qualities can be established in an "
       (:DECLREF NIL "optimize") " " (:TERM NIL "declaration") ". The "
       (:TERM NIL "standardized") " " (:TERM NIL "optimize qualities") " are "
       (:TT NIL "compilation-speed") " (speed of the compilation process), "
       (:ISSUE NIL "OPTIMIZE-DEBUG-INFO:NEW-QUALITY") " " (:TT NIL "debug")
       " (ease of debugging), "
       (:ENDISSUE NIL "OPTIMIZE-DEBUG-INFO:NEW-QUALITY") (:TT NIL "safety")
       " (run-time error checking), " (:TT NIL "space")
       " (both code size and run-time space), and " (:TT NIL "speed")
       " (of the object code). " (:TERM NIL "Implementations")
       " may define additional " (:TERM NIL "optimize qualities") ". " :PAR)
      (:ITEM NIL (:B NIL "optional parameter")
       (:IDXTERM NIL "optional parameter") " " (:I NIL "n.") " A "
       (:TERM NIL "parameter") " for which a corresponding positional "
       (:TERM NIL "argument") " is optional. If the " (:TERM NIL "argument")
       " is not supplied, a default value is used. See also "
       (:TERM NIL "supplied-p parameter") ". " :PAR)
      (:ITEM NIL (:B NIL "ordinary function")
       (:IDXTERM NIL "ordinary function") " " (:I NIL "n.") " a "
       (:TERM NIL "function") " that is not a " (:TERM NIL "generic function")
       ". " :PAR)
      (:ITEM NIL (:B NIL "ordinary lambda list")
       (:IDXTERM NIL "ordinary lambda list") " " (:I NIL "n.") " the kind of "
       (:TERM NIL "lambda list") " used by " (:MISC NIL "lambda") ". See "
       (:TERM NIL "modified lambda list") " and "
       (:TERM NIL "extended lambda list") ". “" (:MACREF NIL "defun")
       " uses an ordinary lambda list.” " :PAR)
      (:ITEM NIL (:B NIL "otherwise inaccessible part")
       (:IDXTERM NIL "otherwise inaccessible part") " " (:I NIL "n.")
       " (of an " (:TERM NIL "object") ", "
       (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1"))) ") an "
       (:TERM NIL "object") ", "
       (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "2")))
       ", which would be made " (:TERM NIL "inaccessible") " if "
       (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1"))) " were made "
       (:TERM NIL "inaccessible") ". (Every " (:TERM NIL "object") " is an "
       (:TERM NIL "otherwise inaccessible part") " of itself.) " :PAR)
      (:ITEM NIL (:B NIL "output") (:IDXTERM NIL "output") " " (:I NIL "adj.")
       " (of a " (:TERM NIL "stream") ") supporting output operations ("
       (:I NIL "i.e.") ",  being a “data sink”). An " (:TERM NIL "output") " "
       (:TERM NIL "stream") " might also be an " (:TERM NIL "input") " "
       (:TERM NIL "stream") ", in which case it is sometimes called a "
       (:TERM NIL "bidirectional") " " (:TERM NIL "stream") ". See the "
       (:TERM NIL "function") " " (:FUNREF NIL "output-stream-p") ". " :PAR)))
    (:ITEM NIL (:B NIL "P")
     (:LIST NIL
      (:ITEM NIL (:B NIL "package") (:IDXTERM NIL "package") " " (:I NIL "n.")
       " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "package") ". " :PAR
       (:COMMENT NIL
        "!!! Moon: \"interned\" means \"accessible\" according to the glossary, but I thought"
        "          a symbol was supposed to be \"present\" in its home package.  Maybe I'm wrong."))
      (:ITEM NIL (:B NIL "package cell") (:IDXTERM NIL "package cell") " "
       (:I NIL "n.") " " (:I NIL "Trad.") " (of a " (:TERM NIL "symbol")
       ") The " (:TERM NIL "place") " in a " (:TERM NIL "symbol")
       " that holds one of possibly several " (:TERM NIL "packages")
       " in which the " (:TERM NIL "symbol") " is " (:TERM NIL "interned")
       ", called the " (:TERM NIL "home package") ", or which holds "
       (:MISC NIL "nil") " if no such " (:TERM NIL "package")
       " exists or is known. See the " (:TERM NIL "function") " "
       (:FUNREF NIL "symbol-package") ". " :PAR)
      (:ITEM NIL (:B NIL "package designator")
       (:IDXTERM NIL "package designator") " " (:I NIL "n.") " a "
       (:TERM NIL "designator") " for a " (:TERM NIL "package")
       "; that is, an " (:TERM NIL "object") " that denotes a "
       (:TERM NIL "package") " and that is one of: a "
       (:TERM NIL "string designator") " (denoting the " (:TERM NIL "package")
       " that has the " (:TERM NIL "string") " that it designates as its "
       (:TERM NIL "name") " or as one of its " (:TERM NIL "nicknames")
       "), or a " (:TERM NIL "package") " (denoting itself). " :PAR)
      (:ITEM NIL (:B NIL "package marker") (:IDXTERM NIL "package marker") " "
       (:I NIL "n.")
       " a character which is used in the textual notation for a symbol to separate the package name from the symbol name, and which is "
       (:TERM NIL "colon") " in the " (:TERM NIL "standard readtable") ". See "
       (:SECREF NIL :CHARACTER-SYNTAX) ". " :PAR
       (:COMMENT NIL " \\gentry{package name designator} \\Noun\\"
        "   a \\term{designator} for the \\term{name} of a \\term{package}; that is,"
        "   an \\term{object} that denotes a \\term{string} "
        "   and that is one of:"
        "        a \\term{character} (denoting a \\term{singleton} \\term{string}"
        " 			   that has the \\term{character} as its only \\term{element}),"
        "        a \\term{symbol} (denoting the \\term{string} that is its \\term{name}),"
        "     or a \\term{string} (denoting itself).")
       :PAR)
      (:ITEM NIL (:B NIL "package prefix") (:IDXTERM NIL "package prefix") " "
       (:I NIL "n.") " a notation preceding the " (:TERM NIL "name") " of a "
       (:TERM NIL "symbol") " in text that is processed by the "
       (:TERM NIL "Lisp reader") ", which uses a " (:TERM NIL "package") " "
       (:TERM NIL "name") " followed by one or more "
       (:TERM NIL "package markers")
       ", and which indicates that the symbol is looked up in the indicated "
       (:TERM NIL "package") ". " :PAR
       (:COMMENT NIL
        "!!! Moon: Is DO-ALL-SYMBOLS really -required- not to find symbols in unregistered packages?"))
      (:ITEM NIL (:B NIL "package registry") (:IDXTERM NIL "package registry")
       " " (:I NIL "n.") " A mapping of " (:TERM NIL "names") " to "
       (:TERM NIL "package") " " (:TERM NIL "objects")
       ". It is possible for there to be a " (:TERM NIL "package") " "
       (:TERM NIL "object") " which is not in this mapping; such a "
       (:TERM NIL "package") " is called an "
       (:TERM NIL "unregistered package") ". " (:TERM NIL "Operators")
       " such as " (:FUNREF NIL "find-package")
       " consult this mapping in order to find a " (:TERM NIL "package")
       " from its " (:TERM NIL "name") ". " (:TERM NIL "Operators") " such as "
       (:MACREF NIL "do-all-symbols") ", " (:FUNREF NIL "find-all-symbols")
       ", and " (:FUNREF NIL "list-all-packages") " operate only on "
       (:TERM NIL "packages") " that exist in the "
       (:TERM NIL "package registry") ". " :PAR)
      (:ITEM NIL (:B NIL "pairwise") (:IDXTERM NIL "pairwise") " "
       (:I NIL "adv.")
       " (of an adjective on a set) applying individually to all possible pairings of elements of the set. “The types "
       (:MATH NIL (:MI NIL "A")) ", " (:MATH NIL (:MI NIL "B")) ", and "
       (:MATH NIL (:MI NIL "C")) " are pairwise disjoint if "
       (:MATH NIL (:MI NIL "A")) " and " (:MATH NIL (:MI NIL "B"))
       " are disjoint, " (:MATH NIL (:MI NIL "B")) " and "
       (:MATH NIL (:MI NIL "C")) " are disjoint, and "
       (:MATH NIL (:MI NIL "A")) " and " (:MATH NIL (:MI NIL "C"))
       " are disjoint.” " :PAR
       (:COMMENT NIL
        "!!! This needs work but should be better than nothing for now. -kmp 13-Feb-92"))
      (:ITEM NIL (:B NIL "parallel") (:IDXTERM NIL "parallel") " "
       (:I NIL "adj.") " " (:I NIL "Trad.") " (of " (:TERM NIL "binding")
       " or " (:TERM NIL "assignment") ") done in the style of "
       (:MACREF NIL "psetq") ", " (:SPECREF NIL "let") ", or "
       (:MACREF NIL "do") "; that is, first evaluating all of the "
       (:TERM NIL "forms") " that produce " (:TERM NIL "values")
       ", and only then " (:TERM NIL "assigning") " or " (:TERM NIL "binding")
       " the " (:TERM NIL "variables") " (or " (:TERM NIL "places")
       "). Note that this does not imply traditional computational “parallelism” since the "
       (:TERM NIL "forms") " that produce " (:TERM NIL "values")
       " are evaluated " (:TERM NIL "sequentially") ". See "
       (:TERM NIL "sequential") ". " :PAR)
      (:ITEM NIL (:B NIL "parameter") (:IDXTERM NIL "parameter") " "
       (:I NIL "n.") " 1. (of a " (:TERM NIL "function") ") a "
       (:TERM NIL "variable") " in the definition of a " (:TERM NIL "function")
       " which takes on the " (:TERM NIL "value") " of a corresponding "
       (:TERM NIL "argument") " (or of a " (:TERM NIL "list")
       " of corresponding arguments) to that " (:TERM NIL "function")
       " when it is called, or which in some cases is given a default value because there is no corresponding "
       (:TERM NIL "argument") ". 2. (of a " (:TERM NIL "format directive") ") "
       (:COMMENT NIL
        "Moon thinks \"as data flow\" is awkward.  I don't know what to substitute. -kmp 15-Nov-91")
       "an " (:TERM NIL "object") " received as data flow by a "
       (:TERM NIL "format directive") " due to a prefix notation within the "
       (:TERM NIL "format string") " at the " (:TERM NIL "format directive")
       "'s point of use. See " (:SECREF NIL :FORMATTED-OUTPUT) ". “In "
       (:TT NIL "\" 3,'0D\"") ", the number " (:TT NIL "3")
       " and the character " (:TT NIL "#\\0") " are parameters to the "
       (:TT NIL " D") " format directive.” " :PAR)
      (:ITEM NIL (:B NIL "parameter specializer")
       (:IDXTERM NIL "parameter specializer") " " (:I NIL "n.") " 1. (of a "
       (:TERM NIL "method") ") an " (:TERM NIL "expression")
       " which constrains the " (:TERM NIL "method")
       " to be applicable only to " (:TERM NIL "argument")
       " sequences in which the corresponding " (:TERM NIL "argument")
       " matches the " (:TERM NIL "parameter specializer") ". 2. a "
       (:TERM NIL "class") ", or a " (:TERM NIL "list") " "
       (:TT NIL "(eql " (:TERM NIL "object") ")") ". " :PAR)
      (:ITEM NIL (:B NIL "parameter specializer name")
       (:IDXTERM NIL "parameter specializer name") " " (:I NIL "n.")
       " 1. (of a " (:TERM NIL "method")
       " definition) an expression used in code to name a "
       (:TERM NIL "parameter specializer") ". See "
       (:SECREF NIL :INTRO-TO-METHODS) ". 2. a " (:TERM NIL "class") ", "
       (:ISSUE NIL "CLASS-OBJECT-SPECIALIZER:AFFIRM") " a "
       (:TERM NIL "symbol") " naming a " (:TERM NIL "class") ", "
       (:ENDISSUE NIL "CLASS-OBJECT-SPECIALIZER:AFFIRM") " or a "
       (:TERM NIL "list") " " (:TT NIL "(eql " (:TERM NIL "form") ")") ". "
       :PAR)
      (:ITEM NIL (:B NIL "pathname") (:IDXTERM NIL "pathname") " "
       (:I NIL "n.") " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "pathname")
       ", which is a structured representation of the name of a "
       (:TERM NIL "file") ". A " (:TERM NIL "pathname")
       " has six components: a “host,” a “device,” a “directory,” a “name,” a “type,” and a “version.” "
       :PAR)
      (:ITEM NIL (:B NIL "pathname designator")
       (:IDXTERM NIL "pathname designator") " " (:I NIL "n.") " a "
       (:TERM NIL "designator") " for a " (:TERM NIL "pathname")
       "; that is, an " (:TERM NIL "object") " that denotes a "
       (:TERM NIL "pathname") " and that is one of: "
       (:ISSUE NIL "PATHNAME-LOGICAL:ADD") " a " (:TERM NIL "pathname") " "
       (:TERM NIL "namestring") " "
       (:ISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
       (:COMMENT NIL "          (denoting the corresponding \\term{pathname};"
        " 	  unless explicitly specified otherwise,"
        "           only a \\term{physical pathname} \\term{namestring} is required"
        "           to be recognized by an \\term{implementation} as "
        "           a \\term{pathname designator}---whether"
        "           or not a \\term{logical pathname} \\term{namestring} is"
        "           permitted as a \\term{pathname designator} is "
        "           \\term{implementation-defined}),")
       "(denoting the corresponding " (:TERM NIL "pathname") "), "
       (:ENDISSUE NIL "PATHNAME-HOST-PARSING:RECOGNIZE-LOGICAL-HOST-NAMES") " "
       (:ENDISSUE NIL "PATHNAME-LOGICAL:ADD") " a "
       (:TERM NIL "stream associated with a file") " "
       (:COMMENT NIL "% 23.1.2 32") "(denoting the " (:TERM NIL "pathname")
       " used to open the " (:TERM NIL "file")
       "; this may be, but is not required to be, the actual name of the "
       (:TERM NIL "file") "), or a " (:TERM NIL "pathname")
       " (denoting itself). See " (:SECREF NIL :OPEN-AND-CLOSED-STREAMS) ". "
       :PAR
       (:COMMENT NIL
        " \\editornote{KMP: `Pervasive' is still used, but isn't it supposed to be getting phased out?}"
        " " " \\gentry{pervasive} \\Noun\\" "   ... needs a definition...")
       :PAR)
      (:ITEM NIL (:B NIL "physical pathname")
       (:IDXTERM NIL "physical pathname") " " (:I NIL "n.") " a "
       (:TERM NIL "pathname") " that is not a " (:TERM NIL "logical pathname")
       ". " :PAR
       (:EDITORNOTE NIL
        "KMP: Still need to reconcile some confusion in the uses of “generalized reference” and “place.” I think one was supposed to refer to the abstract concept, and the other to an object (a form), but the usages have become blurred.")
       " " (:COMMENT NIL "Moon: I have no opinion.") :PAR)
      (:ITEM NIL (:B NIL "place") (:IDXTERM NIL "place") " " (:I NIL "n.")
       " 1. a " (:TERM NIL "form") " which is suitable for use as a "
       (:TERM NIL "generalized reference")
       ". 2. the conceptual location referred to by such a "
       (:TERM NIL "place") (:SUB NIL "1") ". " :PAR)
      (:ITEM NIL (:B NIL "plist") (:IDXTERM NIL "plist") " "
       (:PRONOUNCED NIL (:HI-STRESS NIL "pē") (:LO-STRESS NIL "list")) " "
       (:I NIL "n.") " a " (:TERM NIL "property list") ". " :PAR)
      (:ITEM NIL (:B NIL "portable") (:IDXTERM NIL "portable") " "
       (:I NIL "adj.") " (of " (:TERM NIL "code")
       ") required to produce equivalent results and observable side effects in all "
       (:TERM NIL "conforming implementations") ". " :PAR)
      (:ITEM NIL (:B NIL "potential copy") (:IDXTERM NIL "potential copy") " "
       (:I NIL "n.") " (of an " (:TERM NIL "object") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1")))
       " subject to constriants) an " (:TERM NIL "object") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "2")))
       " that if the specified constraints are satisfied by "
       (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1")))
       " without any modification might or might not be "
       (:TERM NIL "identical") " to "
       (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1")))
       ", or else that must be a " (:TERM NIL "fresh") " " (:TERM NIL "object")
       " that resembles a " (:TERM NIL "copy") " of "
       (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1")))
       " except that it has been modified as necessary to satisfy the constraints. "
       :PAR)
      (:ITEM NIL (:B NIL "potential number") (:IDXTERM NIL "potential number")
       " " (:I NIL "n.") " A textual notation that might be parsed by the "
       (:TERM NIL "Lisp reader") " in some "
       (:TERM NIL "conforming implementation") " as a " (:TERM NIL "number")
       " but is not required to be parsed as a " (:TERM NIL "number") ". No "
       (:TERM NIL "object") " is a " (:TERM NIL "potential number")
       "—either an " (:TERM NIL "object") " is a " (:TERM NIL "number")
       " or it is not. See " (:SECREF NIL :POTENTIAL-NUMBERS-AS-TOKENS) ". "
       :PAR)
      (:ITEM NIL (:B NIL "pprint dispatch table")
       (:IDXTERM NIL "pprint dispatch table") " " (:I NIL "n.") " an "
       (:TERM NIL "object") " that can be the " (:TERM NIL "value") " of "
       (:VARREF NIL "*print-pprint-dispatch*") " and hence can control how "
       (:TERM NIL "objects") " are printed when "
       (:VARREF NIL "*print-pretty*") " is " (:TERM NIL "true") ". See "
       (:SECREF NIL :PPRINT-DISPATCH-TABLES) ". " :PAR)
      (:ITEM NIL (:B NIL "predicate") (:IDXTERM NIL "predicate") " "
       (:I NIL "n.") " a " (:TERM NIL "function") " that returns a "
       (:TERM NIL "generalized boolean") " as its first value. " :PAR)
      (:ITEM NIL (:B NIL "present") (:IDXTERM NIL "present") " " (:I NIL "n.")
       " 1. (of a " (:TERM NIL "feature") " in a " (:TERM NIL "Lisp image")
       ") a state of being that is in effect if and only if the "
       (:TERM NIL "symbol") " naming the " (:TERM NIL "feature") " is an "
       (:TERM NIL "element") " of the " (:TERM NIL "features list")
       ". 2. (of a " (:TERM NIL "symbol") " in a " (:TERM NIL "package")
       ") being accessible in that " (:TERM NIL "package")
       " directly, rather than being inherited from another "
       (:TERM NIL "package") ". " :PAR)
      (:ITEM NIL (:B NIL "pretty print") (:IDXTERM NIL "pretty print") " "
       (:I NIL "v.t.") " (an " (:TERM NIL "object") ") to invoke the "
       (:TERM NIL "pretty printer") " on the " (:TERM NIL "object") ". " :PAR
       (:COMMENT NIL " Waters observes:"
        "  In most places the text talks about the pretty printer either being used or not."
        "  However, it is not all that clear what the pretty printer per se is.  In the"
        "  description of *print-pprint-dispatch* I think that it makes it pretty clear that"
        "  what pretty printer means is that printing is controled by *print-pprint-dispatch*."
        "  And in fact I believe that this is in fact all it means.  You can put a value in"
        "  *print-pprint-dispatch* that makes pretty printing look exactly like "
        "  non-pretty-printing after all.  Therefore, I think it would be an overall"
        "  clarification to say more often that setting *print-pretty* to true means having"
        "  *print-pprint-dispatch* control printing---nothing more and nothing less."))
      (:ITEM NIL (:B NIL "pretty printer") (:IDXTERM NIL "pretty printer") " "
       (:I NIL "n.")
       " the procedure that prints the character representation of an "
       (:TERM NIL "object") " onto a " (:TERM NIL "stream") " when the "
       (:TERM NIL "value") " of " (:VARREF NIL "*print-pretty*") " is "
       (:TERM NIL "true") ", and that uses layout techniques (" (:I NIL "e.g.")
       ",  indentation) that tend to highlight the structure of the "
       (:TERM NIL "object")
       " in a way that makes it easier for human readers to parse visually. See the "
       (:TERM NIL "variable") " " (:VARREF NIL "*print-pprint-dispatch*")
       " and " (:SECREF NIL :PPRINTER) ". " :PAR)
      (:ITEM NIL (:B NIL "pretty printing stream")
       (:IDXTERM NIL "pretty printing stream") " " (:I NIL "n.") " a "
       (:TERM NIL "stream")
       " that does pretty printing. Such streams are created by the "
       (:TERM NIL "function") " " (:FUNREF NIL "pprint-logical-block")
       " as a link between the output stream and the logical block. " :PAR)
      (:ITEM NIL (:B NIL "primary method") (:IDXTERM NIL "primary method") " "
       (:I NIL "n.") " a member of one of two sets of " (:TERM NIL "methods")
       " (the set of " (:TERM NIL "auxiliary methods")
       " is the other) that form an exhaustive partition of the set of "
       (:TERM NIL "methods") " on the " (:TERM NIL "method") "'s "
       (:TERM NIL "generic function")
       ". How these sets are determined is dependent on the "
       (:TERM NIL "method combination") " type; see "
       (:SECREF NIL :INTRO-TO-METHODS) ". " :PAR)
      (:ITEM NIL (:B NIL "primary value") (:IDXTERM NIL "primary value") " "
       (:I NIL "n.") " (of " (:TERM NIL "values") " resulting from the "
       (:TERM NIL "evaluation") " of a " (:TERM NIL "form") ") the first "
       (:TERM NIL "value") ", if any, or else " (:MISC NIL "nil")
       " if there are no " (:TERM NIL "values")
       ". “The primary value returned by " (:FUNREF NIL "truncate")
       " is an integer quotient, truncated toward zero.” " :PAR)
      (:ITEM NIL (:B NIL "principal") (:IDXTERM NIL "principal") " "
       (:I NIL "adj.") " (of a value returned by a " (:RM NIL " Common Lisp")
       " " (:TERM NIL "function")
       " that implements a mathematically irrational or transcendental function defined in the complex domain) of possibly many (sometimes an infinite number of) correct values for the mathematical function, being the particular "
       (:TERM NIL "value") " which the corresponding " (:RM NIL " Common Lisp")
       " " (:TERM NIL "function") " has been defined to return. " :PAR)
      (:ITEM NIL (:B NIL "print name") (:IDXTERM NIL "print name") " "
       (:I NIL "n.") " " (:I NIL "Trad.") " (usually of a "
       (:TERM NIL "symbol") ") a " (:TERM NIL "name") (:SUB NIL "3") ". " :PAR)
      (:ITEM NIL (:B NIL "printer control variable")
       (:IDXTERM NIL "printer control variable") " " (:I NIL "n.") " a "
       (:TERM NIL "variable")
       " whose specific purpose is to control some action of the "
       (:TERM NIL "Lisp printer") "; that is, one of the "
       (:TERM NIL "variables") " in " (:FIGREF NIL :STD-PRINTER-CONTROL-VARS)
       ", or else some " (:TERM NIL "implementation-defined") " "
       (:TERM NIL "variable") " which is defined by the "
       (:TERM NIL "implementation") " to be a "
       (:TERM NIL "printer control variable") ". " :PAR
       (:ISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " ")
      (:ITEM NIL (:B NIL "printer escaping") (:IDXTERM NIL "printer escaping")
       " " (:I NIL "n.") " The combined state of the "
       (:TERM NIL "printer control variables") " "
       (:VARREF NIL "*print-escape*") " and " (:VARREF NIL "*print-readably*")
       ". If the value of either " (:VARREF NIL "*print-readably*") " or "
       (:VARREF NIL "*print-escape*") " is " (:TERM NIL "true") ", then "
       (:NEWTERM NIL "printer escaping")
       " is “enabled”; otherwise (if the values of both "
       (:VARREF NIL "*print-readably*") " and " (:VARREF NIL "*print-escape*")
       " are " (:TERM NIL "false") "), then " (:TERM NIL "printer escaping")
       " is “disabled”. " (:ENDISSUE NIL "PRINT-READABLY-BEHAVIOR:CLARIFY") " "
       :PAR)
      (:ITEM NIL (:B NIL "printing") (:IDXTERM NIL "printing") " "
       (:I NIL "adj.") " (of a " (:TERM NIL "character") ") being a "
       (:TERM NIL "graphic") " " (:TERM NIL "character") " other than "
       (:TERM NIL "space") ". " :PAR)
      (:ITEM NIL (:B NIL "process") (:IDXTERM NIL "process") " "
       (:I NIL "v.t.") " (a " (:TERM NIL "form") " by the "
       (:TERM NIL "compiler") ") to perform " (:TERM NIL "minimal compilation")
       ", determining the time of evaluation for a " (:TERM NIL "form")
       ", and possibly " (:TERM NIL "evaluating") " that " (:TERM NIL "form")
       " (if required). " :PAR)
      (:ITEM NIL (:B NIL "processor") (:IDXTERM NIL "processor") " "
       (:I NIL "n.") ", " (:I NIL "ANSI") " an " (:TERM NIL "implementation")
       ". " :PAR)
      (:ITEM NIL (:B NIL "proclaim") (:IDXTERM NIL "proclaim") " "
       (:I NIL "v.t.") " (a " (:TERM NIL "proclamation") ") to "
       (:TERM NIL "establish") " that " (:TERM NIL "proclamation") ". " :PAR)
      (:ITEM NIL (:B NIL "proclamation") (:IDXTERM NIL "proclamation") " "
       (:I NIL "n.") " a " (:TERM NIL "global declaration") ". " :PAR)
      (:ITEM NIL (:B NIL "prog tag") (:IDXTERM NIL "prog tag") " "
       (:I NIL "n.") " " (:I NIL "Trad.") " a " (:TERM NIL "go tag") ". " :PAR)
      (:ITEM NIL (:B NIL "program") (:IDXTERM NIL "program") " " (:I NIL "n.")
       " " (:I NIL "Trad.") " " (:RM NIL " Common Lisp") " " (:TERM NIL "code")
       ". " :PAR)
      (:ITEM NIL (:B NIL "programmer") (:IDXTERM NIL "programmer") " "
       (:I NIL "n.") " an active entity, typically a human, that writes a "
       (:TERM NIL "program") ", and that might or might not also be a "
       (:TERM NIL "user") " of the " (:TERM NIL "program") ". " :PAR)
      (:ITEM NIL (:B NIL "programmer code") (:IDXTERM NIL "programmer code")
       " " (:I NIL "n.") " " (:TERM NIL "code")
       " that is supplied by the programmer; that is, " (:TERM NIL "code")
       " that is not " (:TERM NIL "system code") ". " :PAR)
      (:ITEM NIL (:B NIL "proper list") (:IDXTERM NIL "proper list") " "
       (:I NIL "n.") " A " (:TERM NIL "list") " terminated by the "
       (:TERM NIL "empty list") ". (The " (:TERM NIL "empty list") " is a "
       (:TERM NIL "proper list") ".) See " (:TERM NIL "improper list") ". "
       :PAR)
      (:ITEM NIL (:B NIL "proper name") (:IDXTERM NIL "proper name") " "
       (:I NIL "n.") " (of a " (:TERM NIL "class") ") a " (:TERM NIL "symbol")
       " that " (:TERM NIL "names") " the " (:TERM NIL "class") " whose "
       (:TERM NIL "name") " is that " (:TERM NIL "symbol") ". See the "
       (:TERM NIL "functions") " " (:FUNREF NIL "class-name") " and "
       (:FUNREF NIL "find-class") ". " :PAR)
      (:ITEM NIL (:B NIL "proper sequence") (:IDXTERM NIL "proper sequence")
       " " (:I NIL "n.") " a " (:TERM NIL "sequence") " which is not an "
       (:TERM NIL "improper list") "; that is, a " (:TERM NIL "vector")
       " or a " (:TERM NIL "proper list") ". " :PAR
       (:COMMENT NIL
        " Moon: proper subtype -- I don't understand the parenthesized phrase, perhaps not"
        "  only because I believe types have members, not elements."))
      (:ITEM NIL (:B NIL "proper subtype") (:IDXTERM NIL "proper subtype") " "
       (:I NIL "n.") " (of a " (:TERM NIL "type") ") a " (:TERM NIL "subtype")
       " of the " (:TERM NIL "type") " which is not the " (:TERM NIL "same")
       " " (:TERM NIL "type") " as the " (:TERM NIL "type") " ("
       (:I NIL "i.e.") ",  its " (:TERM NIL "elements")
       " are a “proper subset” of the " (:TERM NIL "type") "). " :PAR)
      (:ITEM NIL (:B NIL "property") (:IDXTERM NIL "property") " "
       (:I NIL "n.") " (of a " (:TERM NIL "property list")
       ") 1. a conceptual pairing of a " (:TERM NIL "property indicator")
       " and its associated " (:TERM NIL "property value") " on a "
       (:TERM NIL "property list") ". 2. a " (:TERM NIL "property value") ". "
       (:COMMENT NIL
        "%Barmar says he's never heard this usage. -kmp -11-Dec-90"
        " 3. a \\term{property indicator}.")
       :PAR)
      (:ITEM NIL (:B NIL "property indicator")
       (:IDXTERM NIL "property indicator") " " (:I NIL "n.") " (of a "
       (:TERM NIL "property list") ") the " (:TERM NIL "name") " part of a "
       (:TERM NIL "property") ", used as a " (:TERM NIL "key")
       " when looking up a " (:TERM NIL "property value") " on a "
       (:TERM NIL "property list") ". " :PAR)
      (:ITEM NIL (:B NIL "property list") (:IDXTERM NIL "property list") " "
       (:I NIL "n.") " " (:ISSUE NIL "PLIST-DUPLICATES:ALLOW") " 1. a "
       (:TERM NIL "list") " containing an even number of "
       (:TERM NIL "elements") " that are alternating " (:TERM NIL "names")
       " (sometimes called " (:TERM NIL "indicators") " or " (:TERM NIL "keys")
       ") and " (:TERM NIL "values") " (sometimes called "
       (:TERM NIL "properties") "). When there is more than one "
       (:TERM NIL "name") " and " (:TERM NIL "value") " pair with the "
       (:TERM NIL "identical") " " (:TERM NIL "name") " in a "
       (:TERM NIL "property list") ", the first such pair determines the "
       (:TERM NIL "property") ". " (:ENDISSUE NIL "PLIST-DUPLICATES:ALLOW")
       " 2. (of a " (:TERM NIL "symbol") ") the component of the "
       (:TERM NIL "symbol") " containing a " (:TERM NIL "property list") ". "
       :PAR (:ISSUE NIL "PLIST-DUPLICATES:ALLOW") " "
       (:COMMENT NIL " \\gentry{property list format} \\Noun\\ "
        "   the form of a property list, having an even number of \\term{elements}"
        "   that are alternating \\term{names} and \\term{values}, but without the"
        "   implied restriction that no \\term{keys} be duplicated."
        "   \\gexample{When \\keyref{key} is used in a lambda list, the corresponding keyword"
        " 	    arguments are specified in property list format.}")
       (:ENDISSUE NIL "PLIST-DUPLICATES:ALLOW") " " :PAR)
      (:ITEM NIL (:B NIL "property value") (:IDXTERM NIL "property value") " "
       (:I NIL "n.") " (of a " (:TERM NIL "property indicator") " on a "
       (:TERM NIL "property list") ") the " (:TERM NIL "object")
       " associated with the " (:TERM NIL "property indicator") " on the "
       (:TERM NIL "property list") ". " :PAR)
      (:ITEM NIL (:B NIL "purports to conform")
       (:IDXTERM NIL "purports to conform") " " (:I NIL "v.")
       " makes a good-faith claim of conformance. This term expresses intention to conform, regardless of whether the goal of that intention is realized in practice. For example, language implementations have been known to have bugs, and while an "
       (:TERM NIL "implementation")
       " of this specification with bugs might not be a "
       (:TERM NIL "conforming implementation") ", it can still "
       (:TERM NIL "purport to conform")
       ". This is an important distinction in certain specific cases; "
       (:I NIL "e.g.") ",  see the " (:TERM NIL "variable") " "
       (:VARREF NIL "*features*") ". " :PAR)))
    (:ITEM NIL (:B NIL "Q")
     (:LIST NIL
      (:ITEM NIL (:B NIL "qualified method") (:IDXTERM NIL "qualified method")
       " " (:I NIL "n.") " a " (:TERM NIL "method") " that has one or more "
       (:TERM NIL "qualifiers") ". " :PAR
       (:COMMENT NIL "Maybe this should be called a method qualifier? -kmp"))
      (:ITEM NIL (:B NIL "qualifier") (:IDXTERM NIL "qualifier") " "
       (:I NIL "n.") " (of a " (:TERM NIL "method") " for a "
       (:TERM NIL "generic function") ") one of possibly several "
       (:TERM NIL "objects") " used to annotate the " (:TERM NIL "method")
       " in a way that identifies its role in the "
       (:TERM NIL "method combination") ". The "
       (:TERM NIL "method combination") " " (:TERM NIL "type")
       " determines how many " (:TERM NIL "qualifiers")
       " are permitted for each " (:TERM NIL "method") ", which "
       (:TERM NIL "qualifiers") " are permitted, and the semantics of those "
       (:TERM NIL "qualifiers") ". " :PAR (:COMMENT NIL "qualifier list?")
       :PAR)
      (:ITEM NIL (:B NIL "query I/O") (:IDXTERM NIL "query I/O") " "
       (:I NIL "n.") " the " (:TERM NIL "bidirectional") " "
       (:TERM NIL "stream") " that is the " (:TERM NIL "value") " of the "
       (:TERM NIL "variable") " " (:VARREF NIL "*query-io*") ". " :PAR)
      (:ITEM NIL (:B NIL "quoted object") (:IDXTERM NIL "quoted object") " "
       (:I NIL "n.") " an " (:TERM NIL "object")
       " which is the second element of a " (:SPECREF NIL "quote") " "
       (:TERM NIL "form") ". " :PAR)))
    (:ITEM NIL (:B NIL "R")
     (:LIST NIL
      (:ITEM NIL (:B NIL "radix") (:IDXTERM NIL "radix") " " (:I NIL "n.")
       " an " (:TERM NIL "integer")
       " between 2 and 36, inclusive, which can be used to designate a base with respect to which certain kinds of numeric input or output are performed. "
       (:COMMENT NIL "% 13.2.0 20") "(There are " (:MATH NIL (:MI NIL "n"))
       " valid digit characters for any given " (:TERM NIL "radix") " "
       (:MATH NIL (:MI NIL "n")) ", and those digits are the first "
       (:MATH NIL (:MI NIL "n")) " digits in the sequence " (:TT NIL "0") ", "
       (:TT NIL "1") ", " (:MATH NIL (:MO NIL "…")) ", " (:TT NIL "9") ", "
       (:TT NIL "A") ", " (:TT NIL "B") ", " (:MATH NIL (:MO NIL "…")) ", "
       (:TT NIL "Z") ", which have the weights " (:TT NIL "0") ", "
       (:TT NIL "1") ", " (:MATH NIL (:MO NIL "…")) ", " (:TT NIL "9") ", "
       (:TT NIL "10") ", " (:TT NIL "11") ", " (:MATH NIL (:MO NIL "…")) ", "
       (:TT NIL "35")
       ", respectively. Case is not significant in parsing numbers of radix greater than "
       (:TT NIL "10") ", so “9b8a” and “9B8A” denote the same "
       (:TERM NIL "radix") " " (:TT NIL "16") " number.) " :PAR)
      (:ITEM NIL (:B NIL "random state") (:IDXTERM NIL "random state") " "
       (:I NIL "n.") " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "random-state") ". " :PAR)
      (:ITEM NIL (:B NIL "rank") (:IDXTERM NIL "rank") " " (:I NIL "n.")
       " a non-negative " (:TERM NIL "integer") " indicating the number of "
       (:TERM NIL "dimensions") " of an " (:TERM NIL "array") ". " :PAR)
      (:ITEM NIL (:B NIL "ratio") (:IDXTERM NIL "ratio") " " (:I NIL "n.")
       " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "ratio") ". " :PAR)
      (:ITEM NIL (:B NIL "ratio marker") (:IDXTERM NIL "ratio marker") " "
       (:I NIL "n.")
       " a character which is used in the textual notation for a "
       (:TERM NIL "ratio")
       " to separate the numerator from the denominator, and which is "
       (:TERM NIL "slash") " in the " (:TERM NIL "standard readtable") ". See "
       (:SECREF NIL :CHARACTER-SYNTAX) ". " :PAR)
      (:ITEM NIL (:B NIL "rational") (:IDXTERM NIL "rational") " "
       (:I NIL "n.") " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "rational") ". " :PAR)
      (:ITEM NIL (:B NIL "read") (:IDXTERM NIL "read") " " (:I NIL "v.t.") " "
       (:ISSUE NIL "IGNORE-USE-TERMINOLOGY:VALUE-ONLY") " 1. (a "
       (:TERM NIL "binding") " or " (:TERM NIL "slot")
       " or component) to obtain the " (:TERM NIL "value") " of the "
       (:TERM NIL "binding") " or " (:TERM NIL "slot") ". "
       (:ENDISSUE NIL "IGNORE-USE-TERMINOLOGY:VALUE-ONLY") " 2. (an "
       (:TERM NIL "object") " from a " (:TERM NIL "stream") ") to parse an "
       (:TERM NIL "object") " from its representation on the "
       (:TERM NIL "stream") ". " :PAR
       (:COMMENT NIL "% There were no actual uses of this. -kmp 18-Jan-92"
        " \\gentry{read macro} \\Noun\\ \\Traditional\\"
        "   a \\term{reader macro}.")
       :PAR
       (:COMMENT NIL "% KMP: Maybe..."
        " \\gentry{readable} \\Adjective\\ (of the printed representation of an \\term{object})"
        "   printed \\term{readably}.")
       :PAR)
      (:ITEM NIL (:B NIL "readably") (:IDXTERM NIL "readably") " "
       (:I NIL "adv.") " (of a manner of printing an " (:TERM NIL "object") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1")))
       ") in such a way as to permit the " (:TERM NIL "Lisp Reader")
       " to later " (:TERM NIL "parse") " the printed output into an "
       (:TERM NIL "object") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "2"))) " that is "
       (:TERM NIL "similar") " to "
       (:MATH NIL (:MSUB NIL (:MI NIL "O") (:MN NIL "1"))) ". " :PAR)
      (:ITEM NIL (:B NIL "reader") (:IDXTERM NIL "reader") " " (:I NIL "n.")
       " 1. a " (:TERM NIL "function") " that " (:TERM NIL "reads")
       (:SUB NIL "1") " a " (:TERM NIL "variable") " or " (:TERM NIL "slot")
       ". 2. the " (:TERM NIL "Lisp reader") ". " :PAR)
      (:ITEM NIL (:B NIL "reader macro") (:IDXTERM NIL "reader macro") " "
       (:I NIL "n.")
       " 1. a textual notation introduced by dispatch on one or two "
       (:TERM NIL "characters")
       " that defines special-purpose syntax for use by the "
       (:TERM NIL "Lisp reader") ", and that is implemented by a "
       (:TERM NIL "reader macro function") ". See "
       (:SECREF NIL :READER-ALGORITHM) ". 2. the " (:TERM NIL "character")
       " or " (:TERM NIL "characters") " that introduce a "
       (:TERM NIL "reader macro") (:SUB NIL "1") "; that is, a "
       (:TERM NIL "macro character") " or the conceptual pairing of a "
       (:TERM NIL "dispatching macro character") " and the "
       (:TERM NIL "character") " that follows it. (A "
       (:TERM NIL "reader macro") " is not a kind of " (:TERM NIL "macro")
       ".) " :PAR)
      (:ITEM NIL (:B NIL "reader macro function")
       (:IDXTERM NIL "reader macro function") " " (:I NIL "n.") " a "
       (:TERM NIL "function") " " (:TERM NIL "designator") " that denotes a "
       (:TERM NIL "function") " that implements a " (:TERM NIL "reader macro")
       (:SUB NIL "2") ". See the " (:TERM NIL "functions") " "
       (:FUNREF NIL "set-macro-character") " and "
       (:FUNREF NIL "set-dispatch-macro-character") ". " :PAR)
      (:ITEM NIL (:B NIL "readtable") (:IDXTERM NIL "readtable") " "
       (:I NIL "n.") " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "readtable") ". " :PAR)
      (:ITEM NIL (:B NIL "readtable case") (:IDXTERM NIL "readtable case") " "
       (:I NIL "n.") " an attribute of a " (:TERM NIL "readtable")
       " whose value is a " (:TERM NIL "case sensitivity mode")
       ", and that selects the manner in which " (:TERM NIL "characters")
       " in a " (:TERM NIL "symbol") "'s " (:TERM NIL "name")
       " are to be treated by the " (:TERM NIL "Lisp reader") " and the "
       (:TERM NIL "Lisp printer") ". See "
       (:SECREF NIL :READTABLE-CASE-READ-EFFECT) " and "
       (:SECREF NIL :READTABLE-CASE-PRINT-EFFECT) ". " :PAR)
      (:ITEM NIL (:B NIL "readtable designator")
       (:IDXTERM NIL "readtable designator") " " (:I NIL "n.") " a "
       (:TERM NIL "designator") " for a " (:TERM NIL "readtable")
       "; that is, an " (:TERM NIL "object") " that denotes a "
       (:TERM NIL "readtable") " and that is one of: " (:MISC NIL "nil")
       " (denoting the " (:TERM NIL "standard readtable") "), or a "
       (:TERM NIL "readtable") " (denoting itself). " :PAR)
      (:ITEM NIL (:B NIL "recognizable subtype")
       (:IDXTERM NIL "recognizable subtype") " " (:I NIL "n.") " (of a "
       (:TERM NIL "type") ") a " (:TERM NIL "subtype") " of the "
       (:TERM NIL "type") " which can be reliably detected to be such by the "
       (:TERM NIL "implementation") ". See the " (:TERM NIL "function") " "
       (:FUNREF NIL "subtypep") ". " :PAR)
      (:ITEM NIL (:B NIL "reference") (:IDXTERM NIL "reference") " "
       (:I NIL "n.") ", " (:I NIL "v.t.") " 1. " (:I NIL "n.")
       " an act or occurrence of referring to an " (:TERM NIL "object") ", a "
       (:TERM NIL "binding") ", an " (:TERM NIL "exit point") ", a "
       (:TERM NIL "tag") ", or an " (:TERM NIL "environment") ". "
       (:COMMENT NIL "But what does \"refer\" mean?") "2. " (:I NIL "v.t.")
       " to refer to an " (:TERM NIL "object") ", a " (:TERM NIL "binding")
       ", an " (:TERM NIL "exit point") ", a " (:TERM NIL "tag") ", or an "
       (:TERM NIL "environment") ", usually by " (:TERM NIL "name") ". " :PAR)
      (:ITEM NIL (:B NIL "registered package")
       (:IDXTERM NIL "registered package") " " (:I NIL "n.") " a "
       (:TERM NIL "package") " " (:TERM NIL "object")
       " that is installed in the " (:TERM NIL "package registry") ". (Every "
       (:TERM NIL "registered package") " has a " (:TERM NIL "name")
       " that is a " (:TERM NIL "string") ", as well as zero or more "
       (:TERM NIL "string") " nicknames. All " (:TERM NIL "packages")
       " that are initially specified by " (:RM NIL " Common Lisp")
       " or created by " (:FUNREF NIL "make-package") " or "
       (:MACREF NIL "defpackage") " are " (:TERM NIL "registered packages")
       ". " (:TERM NIL "Registered packages") " can be turned into "
       (:TERM NIL "unregistered packages") " by "
       (:FUNREF NIL "delete-package") ".) " :PAR)
      (:ITEM NIL (:B NIL "relative") (:IDXTERM NIL "relative") " "
       (:I NIL "adj.") " 1. (of a " (:TERM NIL "time")
       ") representing an offset from an " (:TERM NIL "absolute") " "
       (:TERM NIL "time")
       " in the units appropriate to that time. For example, a "
       (:TERM NIL "relative") " " (:TERM NIL "internal time")
       " is the difference between two " (:TERM NIL "absolute") " "
       (:TERM NIL "internal times") ", and is measured in "
       (:TERM NIL "internal time units") ". 2. (of a " (:TERM NIL "pathname")
       ") representing a position in a directory hierarchy by motion from a position other than the root, which might therefore vary. “The notation "
       (:TT NIL "#P\"../foo.text\"")
       " denotes a relative pathname if the host file system is Unix.” See "
       (:TERM NIL "absolute") ". " :PAR)
      (:ITEM NIL (:B NIL "repertoire") (:IDXTERM NIL "repertoire") " "
       (:I NIL "n.") ", " (:I NIL "ISO") " a " (:TERM NIL "subtype") " of "
       (:TYPEREF NIL "character") ". See " (:SECREF NIL :CHAR-REPERTOIRES) ". "
       :PAR)
      (:ITEM NIL (:B NIL "report") (:IDXTERM NIL "report") " " (:I NIL "n.")
       " (of a " (:TERM NIL "condition") ") to " (:TERM NIL "call") " the "
       (:TERM NIL "function") " " (:FUNREF NIL "print-object") " on the "
       (:TERM NIL "condition") " in an " (:TERM NIL "environment")
       " where the " (:TERM NIL "value") " of " (:VARREF NIL "*print-escape*")
       " is " (:TERM NIL "false") ". " :PAR)
      (:ITEM NIL (:B NIL "report message") (:IDXTERM NIL "report message") " "
       (:I NIL "n.") " the text that is output by a "
       (:TERM NIL "condition reporter") ". " :PAR)
      (:ITEM NIL (:B NIL "required parameter")
       (:IDXTERM NIL "required parameter") " " (:I NIL "n.") " A "
       (:TERM NIL "parameter") " for which a corresponding positional "
       (:TERM NIL "argument") " must be supplied when " (:TERM NIL "calling")
       " the " (:TERM NIL "function") ". " :PAR)
      (:ITEM NIL (:B NIL "rest list") (:IDXTERM NIL "rest list") " "
       (:I NIL "n.") " (of a " (:TERM NIL "function") " having a "
       (:TERM NIL "rest parameter") ") The " (:TERM NIL "list")
       " to which the " (:TERM NIL "rest parameter") " is " (:TERM NIL "bound")
       " on some particular " (:TERM NIL "call") " to the "
       (:TERM NIL "function") ". " :PAR)
      (:ITEM NIL (:B NIL "rest parameter") (:IDXTERM NIL "rest parameter") " "
       (:I NIL "n.") " A " (:TERM NIL "parameter") " which was introduced by "
       (:KEYREF NIL "rest") ". " :PAR)
      (:ITEM NIL (:B NIL "restart") (:IDXTERM NIL "restart") " " (:I NIL "n.")
       " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "restart") ". " :PAR)
      (:ITEM NIL (:B NIL "restart designator")
       (:IDXTERM NIL "restart designator") " " (:I NIL "n.") " a "
       (:TERM NIL "designator") " for a " (:TERM NIL "restart")
       "; that is, an " (:TERM NIL "object") " that denotes a "
       (:TERM NIL "restart") " and that is one of: a " (:TERM NIL "non-nil")
       " " (:TERM NIL "symbol") " (denoting the most recently established "
       (:TERM NIL "active") " " (:TERM NIL "restart") " whose "
       (:TERM NIL "name") " is that " (:TERM NIL "symbol") "), or a "
       (:TERM NIL "restart") " (denoting itself). " :PAR)
      (:ITEM NIL (:B NIL "restart function") (:IDXTERM NIL "restart function")
       " " (:I NIL "n.") " a " (:TERM NIL "function") " that invokes a "
       (:TERM NIL "restart") ", as if by " (:FUNREF NIL "invoke-restart")
       ". The primary purpose of a " (:TERM NIL "restart function")
       " is to provide an alternate interface. By convention, a "
       (:TERM NIL "restart function") " usually has the same name as the "
       (:TERM NIL "restart") " which it invokes. " (:NEXTFIGURE (:CAPS T))
       " shows a list of the " (:TERM NIL "standardized") " "
       (:TERM NIL "restart functions") ". " :PAR
       (:TABLE (:NAME ("Standardized Restart Functions"))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " abort"))
         (:CELL NIL (:FUNREF NIL "muffle-warning"))
         (:CELL NIL (:FUNREF NIL "use-value")))
        (:ROW NIL (:CELL NIL (:FUNREF NIL " continue"))
         (:CELL NIL (:FUNREF NIL "store-value")) (:CELL NIL)))
       " " :PAR)
      (:ITEM NIL (:B NIL "return") (:IDXTERM NIL "return") " " (:I NIL "v.t.")
       " (of " (:TERM NIL "values") ") 1. (from a " (:TERM NIL "block")
       ") to transfer control and " (:TERM NIL "values") " from the "
       (:TERM NIL "block") "; that is, to cause the " (:TERM NIL "block")
       " to " (:TERM NIL "yield") " the " (:TERM NIL "values")
       " immediately without doing any further evaluation of the "
       (:TERM NIL "forms") " in its body. 2. (from a " (:TERM NIL "form")
       ") to " (:TERM NIL "yield") " the " (:TERM NIL "values") ". " :PAR)
      (:ITEM NIL (:B NIL "return value") (:IDXTERM NIL "return value") " "
       (:I NIL "n.") " " (:I NIL "Trad.") " a " (:TERM NIL "value")
       (:SUB NIL "1") " " :PAR)
      (:ITEM NIL (:B NIL "right-parenthesis")
       (:IDXTERM NIL "right-parenthesis") " " (:I NIL "n.") " the "
       (:TERM NIL "standard character") " “" (:TT NIL ")")
       "”, that is variously called “right parenthesis” or “close parenthesis” See "
       (:FIGREF NIL :STD-CHARS-THREE) ". " :PAR
       (:COMMENT NIL
        "% No longer needed as a glossary term. \\Seesection\\RuleOfCanonRepForComplexRationals."
        "%   -kmp" " %Moon says:"
        " % rule of canonical representation for complex rationals -- you forgot to say the"
        " % real part has to be rational.  Compare CLtL2 p.291."
        " \\gentry{rule of canonical representation for complex rationals} \\Noun\\ "
        "   a requirement by \\clisp\\ on \\term{conforming implementations} that all "
        "   numbers representing mathematical complex numbers with an imaginary part "
        "   of rational zero be represented by \\clisp\\ as \\term{objects} \\oftype{rational}"
        "   rather than as \\term{objects} \\oftype{complex}.")
       :PAR)
      (:ITEM NIL (:B NIL "run time") (:IDXTERM NIL "run time") " "
       (:I NIL "n.") " 1. " (:TERM NIL "load time") " 2. "
       (:TERM NIL "execution time") " " :PAR)
      (:ITEM NIL (:B NIL "run-time compiler")
       (:IDXTERM NIL "run-time compiler") " " (:I NIL "n.") " refers to the "
       (:FUNREF NIL "compile") " function or to "
       (:TERM NIL "implicit compilation")
       ", for which the compilation and run-time " (:TERM NIL "environments")
       " are maintained in the same " (:TERM NIL "Lisp image") ". " :PAR)
      (:ITEM NIL (:B NIL "run-time definition")
       (:IDXTERM NIL "run-time definition") " " (:I NIL "n.")
       " a definition in the " (:TERM NIL "run-time environment") ". " :PAR)
      (:ITEM NIL (:B NIL "run-time environment")
       (:IDXTERM NIL "run-time environment") " " (:I NIL "n.") " the "
       (:TERM NIL "environment") " in which a program is "
       (:TERM NIL "executed") ". " :PAR)))
    (:ITEM NIL (:B NIL "S")
     (:LIST NIL
      (:ITEM NIL (:B NIL "safe") (:IDXTERM NIL "safe") " " (:I NIL "adj.")
       " 1. (of " (:TERM NIL "code") ") processed in a "
       (:TERM NIL "lexical environment") " where the highest "
       (:DECLREF NIL "safety") " level (" (:TT NIL "3") ") was in effect. See "
       (:MISC NIL "optimize") ". 2. (of a " (:TERM NIL "call") ") a "
       (:TERM NIL "safe call") ". " :PAR)
      (:ITEM NIL (:B NIL "safe call") (:IDXTERM NIL "safe call") " "
       (:I NIL "n.") " a " (:TERM NIL "call") " in which the "
       (:TERM NIL "call") ", the " (:TERM NIL "function") " being "
       (:TERM NIL "called") ", and the point of "
       (:TERM NIL "functional evaluation") " are all " (:TERM NIL "safe")
       (:SUB NIL "1") " " (:TERM NIL "code")
       ". For more detailed information, see "
       (:SECREF NIL :SAFE-AND-UNSAFE-CALLS) ". " :PAR)
      (:ITEM NIL (:B NIL "same") (:IDXTERM NIL "same") " " (:I NIL "adj.")
       " 1. (of " (:TERM NIL "objects") " under a specified "
       (:TERM NIL "predicate") ") indistinguishable by that "
       (:TERM NIL "predicate") ". “The symbol " (:TT NIL "car") ", the string "
       (:TT NIL "\"car\"") ", and the string " (:TT NIL "\"CAR\"") " are the "
       (:TT NIL "same") " under " (:FUNREF NIL "string-equal") "”. 2. (of "
       (:TERM NIL "objects")
       " if no predicate is implied by context) indistinguishable by "
       (:FUNREF NIL "eql") ". Note that " (:FUNREF NIL "eq")
       " might be capable of distinguishing some " (:TERM NIL "numbers")
       " and " (:TERM NIL "characters") " which " (:FUNREF NIL "eql")
       " cannot distinguish, but the nature of such, if any, is "
       (:TERM NIL "implementation-dependent") ". Since " (:FUNREF NIL "eq")
       " is used only rarely in this specification, " (:FUNREF NIL "eql")
       " is the default predicate when none is mentioned explicitly. “The conses returned by two successive calls to "
       (:FUNREF NIL "cons") " are never the same.” 3. (of " (:TERM NIL "types")
       ") having the same set of " (:TERM NIL "elements") "; that is, each "
       (:TERM NIL "type") " is a " (:TERM NIL "subtype")
       " of the others. “The types specified by " (:TT NIL "(integer 0 1)")
       ", " (:TT NIL "(unsigned-byte 1)") ", and " (:TT NIL "bit")
       " are the same.” " :PAR)
      (:ITEM NIL (:B NIL "satisfy the test") (:IDXTERM NIL "satisfy the test")
       " " (:I NIL "v.") " (of an " (:TERM NIL "object")
       " being considered by a " (:TERM NIL "sequence function")
       ") 1. (for a one " (:TERM NIL "argument")
       " test) to be in a state such that the " (:TERM NIL "function")
       " which is the " (:PARAM NIL "predicate") " " (:TERM NIL "argument")
       " to the " (:TERM NIL "sequence function") " returns "
       (:TERM NIL "true") " when given a single " (:TERM NIL "argument")
       " that is the result of calling the " (:TERM NIL "sequence function")
       "'s " (:PARAM NIL "key") " " (:TERM NIL "argument") " on the "
       (:TERM NIL "object") " being considered. See "
       (:SECREF NIL :SATISFYING-THE-ONE-ARG-TEST) ". "
       (:COMMENT NIL
        "!!! Moon: Shouldn't the test-not predicate return false to satisfy the test?"
        "          Also, sometimes both arguments are run through the key,"
        "          e.g., search, mismatch; you're perhaps being too specific.")
       "2. (for a two " (:TERM NIL "argument")
       " test) to be in a state such that the two-place "
       (:TERM NIL "predicate") " which is the " (:TERM NIL "sequence function")
       "'s " (:PARAM NIL "test") " " (:TERM NIL "argument") " returns "
       (:TERM NIL "true") " when given a first " (:TERM NIL "argument")
       " that is "
       (:COMMENT NIL
        "     the result of calling the \\term{sequence function}'s "
        "     \\param{key} \\term{argument} on")
       "the " (:TERM NIL "object")
       " being considered, and when given a second " (:TERM NIL "argument")
       " that is the result of calling the " (:TERM NIL "sequence function")
       "'s " (:PARAM NIL "key") " " (:TERM NIL "argument") " on an "
       (:TERM NIL "element") " of the " (:TERM NIL "sequence function") "'s "
       (:PARAM NIL "sequence") " " (:TERM NIL "argument")
       " which is being tested for equality; or to be in a state such that the "
       (:PARAM NIL "test-not") " " (:TERM NIL "function") " returns "
       (:TERM NIL "false") " given the same " (:TERM NIL "arguments") ". See "
       (:SECREF NIL :SATISFYING-THE-TWO-ARG-TEST) ". " :PAR
       (:COMMENT NIL "!!! Moon: Can scope ever apply to anything but a name?"
        "    I think objects and environments have extent but not scope."))
      (:ITEM NIL (:B NIL "scope") (:IDXTERM NIL "scope") " " (:I NIL "n.")
       " the structural or textual region of code in which "
       (:TERM NIL "references") " to an " (:TERM NIL "object") ", a "
       (:TERM NIL "binding") ", an " (:TERM NIL "exit point") ", a "
       (:TERM NIL "tag") ", or an " (:TERM NIL "environment") " (usually by "
       (:TERM NIL "name") ") can occur. " :PAR)
      (:ITEM NIL (:B NIL "script") (:IDXTERM NIL "script") " " (:I NIL "n.")
       " " (:I NIL "ISO") " one of possibly several sets that form an "
       (:TERM NIL "exhaustive partition") " of the type "
       (:TYPEREF NIL "character") ". See " (:SECREF NIL :CHAR-SCRIPTS) ". "
       :PAR)
      (:ITEM NIL (:B NIL "secondary value") (:IDXTERM NIL "secondary value")
       " " (:I NIL "n.") " (of " (:TERM NIL "values") " resulting from the "
       (:TERM NIL "evaluation") " of a " (:TERM NIL "form") ") the second "
       (:TERM NIL "value") ", if any, or else " (:MISC NIL "nil")
       " if there are fewer than two " (:TERM NIL "values")
       ". “The secondary value returned by " (:FUNREF NIL "truncate")
       " is a remainder.” " :PAR)
      (:ITEM NIL (:B NIL "section") (:IDXTERM NIL "section") " " (:I NIL "n.")
       " a partitioning of output by a " (:TERM NIL "conditional newline")
       " on a " (:TERM NIL "pretty printing stream") ". See "
       (:SECREF NIL :DYNAMIC-CONTROL-OF-OUTPUT) ". " :PAR)
      (:ITEM NIL (:B NIL "self-evaluating object")
       (:IDXTERM NIL "self-evaluating object") " " (:I NIL "n.") " an "
       (:TERM NIL "object") " that is neither a " (:TERM NIL "symbol")
       " nor a "
       (:COMMENT NIL
        " \\term{compound form} => \\term{cons} because Moon pointed out that"
        " this wrongly seemed to permit things which were conses but not valid forms.")
       (:TERM NIL "cons") ". If a " (:TERM NIL "self-evaluating object") " is "
       (:TERM NIL "evaluated") ", it " (:TERM NIL "yields")
       " itself as its only " (:TERM NIL "value")
       ". “Strings are self-evaluating objects.” " :PAR)
      (:ITEM NIL (:B NIL "semi-standard") (:IDXTERM NIL "semi-standard") " "
       (:I NIL "adj.")
       " (of a language feature) not required to be implemented by any "
       (:TERM NIL "conforming implementation")
       ", but nevertheless recommended as the canonical approach in situations where an "
       (:TERM NIL "implementation")
       " does plan to support such a feature. The presence of "
       (:TERM NIL "semi-standard")
       " aspects in the language is intended to lessen portability problems and reduce the risk of gratuitous divergence among "
       (:TERM NIL "implementations")
       " that might stand in the way of future standardization. " :PAR)
      (:ITEM NIL (:B NIL "semicolon") (:IDXTERM NIL "semicolon") " "
       (:I NIL "n.") " the " (:TERM NIL "standard character")
       " that is called “semicolon” (" (:TT NIL ";") "). See "
       (:FIGREF NIL :STD-CHARS-THREE) ". " :PAR)
      (:ITEM NIL (:B NIL "sequence") (:IDXTERM NIL "sequence") " "
       (:I NIL "n.") " 1. an ordered collection of elements 2. a "
       (:TERM NIL "vector") " or a " (:TERM NIL "list") ". " :PAR)
      (:ITEM NIL (:B NIL "sequence function")
       (:IDXTERM NIL "sequence function") " " (:I NIL "n.") " one of the "
       (:TERM NIL "functions") " in " (:FIGREF NIL :SEQUENCE-FUNCTIONS)
       ", or an " (:TERM NIL "implementation-defined") " "
       (:TERM NIL "function") " that operates on one or more "
       (:TERM NIL "sequences") ". and that is defined by the "
       (:TERM NIL "implementation") " to be a " (:TERM NIL "sequence function")
       ". " :PAR
       (:COMMENT NIL
        "!!! This needs work but should be better than nothing for now. -kmp 13-Feb-92"))
      (:ITEM NIL (:B NIL "sequential") (:IDXTERM NIL "sequential") " "
       (:I NIL "adj.") " " (:I NIL "Trad.") " (of " (:TERM NIL "binding")
       " or " (:TERM NIL "assignment") ") done in the style of "
       (:SPECREF NIL "setq") ", " (:SPECREF NIL "let*") ", or "
       (:MACREF NIL "do*") "; that is, interleaving the evaluation of the "
       (:TERM NIL "forms") " that produce " (:TERM NIL "values") " with the "
       (:TERM NIL "assignments") " or " (:TERM NIL "bindings") " of the "
       (:TERM NIL "variables") " (or " (:TERM NIL "places") "). See "
       (:TERM NIL "parallel") ". " :PAR)
      (:ITEM NIL (:B NIL "sequentially") (:IDXTERM NIL "sequentially") " "
       (:I NIL "adv.") " in a " (:TERM NIL "sequential") " way. " :PAR)
      (:ITEM NIL (:B NIL "serious condition")
       (:IDXTERM NIL "serious condition") " " (:I NIL "n.") " a "
       (:TERM NIL "condition") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "serious-condition") ", which represents a "
       (:TERM NIL "situation")
       " that is generally sufficiently severe that entry into the "
       (:TERM NIL "debugger") " should be expected if the "
       (:TERM NIL "condition") " is " (:TERM NIL "signaled") " but not "
       (:TERM NIL "handled") ". " :PAR)
      (:ITEM NIL (:B NIL "session") (:IDXTERM NIL "session") " " (:I NIL "n.")
       " the conceptual aggregation of events in a " (:TERM NIL "Lisp image")
       " from the time it is started to the time it is terminated. " :PAR)
      (:ITEM NIL (:B NIL "set") (:IDXTERM NIL "set") " " (:I NIL "v.t.") " "
       (:I NIL "Trad.") " (any " (:TERM NIL "variable") " or a "
       (:TERM NIL "symbol") " that is the " (:TERM NIL "name") " of a "
       (:TERM NIL "dynamic variable") ") to " (:TERM NIL "assign") " the "
       (:TERM NIL "variable") ". " :PAR
       (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " ")
      (:ITEM NIL (:B NIL "setf expander") (:IDXTERM NIL "setf expander") " "
       (:I NIL "n.") " a function used by " (:MACREF NIL "setf")
       " to compute the " (:TERM NIL "setf expansion") " of a "
       (:TERM NIL "place") ". "
       (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " " :PAR
       (:ISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " ")
      (:ITEM NIL (:B NIL "setf expansion") (:IDXTERM NIL "setf expansion") " "
       (:I NIL "n.") " a set of five " (:TERM NIL "expressions") (:SUB NIL "1")
       " that, taken together, describe how to store into a "
       (:TERM NIL "place") " and which " (:TERM NIL "subforms")
       " of the macro call associated with the " (:TERM NIL "place")
       " are evaluated. See " (:SECREF NIL :SETF-EXPANSIONS) ". "
       (:ENDISSUE NIL "SETF-METHOD-VS-SETF-METHOD:RENAME-OLD-TERMS") " " :PAR)
      (:ITEM NIL (:B NIL "setf function") (:IDXTERM NIL "setf function") " "
       (:I NIL "n.") " a " (:TERM NIL "function") " whose " (:TERM NIL "name")
       " is " (:TT NIL "(setf " (:TERM NIL "symbol") ")") ". " :PAR
       (:ISSUE NIL "LISP-SYMBOL-REDEFINITION-AGAIN:MORE-FIXES") " ")
      (:ITEM NIL (:B NIL "setf function name")
       (:IDXTERM NIL "setf function name") " " (:I NIL "n.") " (of a "
       (:TERM NIL "symbol") " " (:PARAM NIL "S") ") the " (:TERM NIL "list")
       " " (:TT NIL "(setf " (:PARAM NIL "S") ")") ". "
       (:ENDISSUE NIL "LISP-SYMBOL-REDEFINITION-AGAIN:MORE-FIXES") " " :PAR)
      (:ITEM NIL (:B NIL "shadow") (:IDXTERM NIL "shadow") " " (:I NIL "v.t.")
       " 1. to override the meaning of. “That binding of " (:TT NIL "X")
       " shadows an outer one.” 2. to hide the presence of. “That "
       (:SPECREF NIL "macrolet") " of " (:TT NIL "F") " shadows the outer "
       (:SPECREF NIL "flet") " of " (:TT NIL "F")
       ".” 3. to replace. “That package shadows the symbol " (:TT NIL "cl:car")
       " with its own symbol " (:TT NIL "car") ".” " :PAR)
      (:ITEM NIL (:B NIL "shadowing symbol") (:IDXTERM NIL "shadowing symbol")
       " " (:I NIL "n.") " (in a " (:TERM NIL "package") ") an "
       (:TERM NIL "element") " of the " (:TERM NIL "package") "'s "
       (:TERM NIL "shadowing symbols list") ". " :PAR)
      (:ITEM NIL (:B NIL "shadowing symbols list")
       (:IDXTERM NIL "shadowing symbols list") " " (:I NIL "n.") " (of a "
       (:TERM NIL "package") ") a " (:TERM NIL "list") ", associated with the "
       (:TERM NIL "package") ", of " (:TERM NIL "symbols")
       " that are to be exempted from `symbol conflict errors' detected when packages are "
       (:TERM NIL "used") ". See the " (:TERM NIL "function") " "
       (:FUNREF NIL "package-shadowing-symbols") ". " :PAR)
      (:ITEM NIL (:B NIL "shared slot") (:IDXTERM NIL "shared slot") " "
       (:I NIL "n.") " (of a " (:TERM NIL "class") ") a " (:TERM NIL "slot")
       " " (:TERM NIL "accessible") " in more than one " (:TERM NIL "instance")
       " of a " (:TERM NIL "class") "; specifically, such a "
       (:TERM NIL "slot") " is " (:TERM NIL "accessible") " in all "
       (:TERM NIL "direct instances") " of the " (:TERM NIL "class")
       " and in those " (:TERM NIL "indirect instances") " whose "
       (:TERM NIL "class") " does not " (:TERM NIL "shadow") (:SUB NIL "1")
       " the " (:TERM NIL "slot") ". " :PAR)
      (:ITEM NIL (:B NIL "sharpsign") (:IDXTERM NIL "sharpsign") " "
       (:I NIL "n.") " the " (:TERM NIL "standard character")
       " that is variously called “number sign,” “sharp,” or “sharp sign” ("
       (:TT NIL "#") "). See " (:FIGREF NIL :STD-CHARS-THREE) ". " :PAR)
      (:ITEM NIL (:B NIL "short float") (:IDXTERM NIL "short float") " "
       (:I NIL "n.") " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "short-float") ". " :PAR)
      (:ITEM NIL (:B NIL "sign") (:IDXTERM NIL "sign") " " (:I NIL "n.")
       " one of the " (:TERM NIL "standard characters") " “" (:TT NIL "+")
       "” or “" (:TT NIL "-") "”. " :PAR)
      (:ITEM NIL (:B NIL "signal") (:IDXTERM NIL "signal") " " (:I NIL "v.")
       " to announce, using a standard protocol, that a particular situation, represented by a "
       (:TERM NIL "condition") ", has been detected. See "
       (:SECREF NIL :CONDITION-SYSTEM-CONCEPTS) ". " :PAR)
      (:ITEM NIL (:B NIL "signature") (:IDXTERM NIL "signature") " "
       (:I NIL "n.") " (of a " (:TERM NIL "method") ") a description of the "
       (:TERM NIL "parameters") " and " (:TERM NIL "parameter specializers")
       " for the " (:TERM NIL "method") " which determines the "
       (:TERM NIL "method") "'s applicability for a given set of required "
       (:TERM NIL "arguments") ", and which also describes the "
       (:TERM NIL "argument") " conventions for its other, non-required "
       (:TERM NIL "arguments") ". " :PAR)
      (:ITEM NIL (:B NIL "similar") (:IDXTERM NIL "similar") " "
       (:I NIL "adj.") " (of two " (:TERM NIL "objects")
       ") defined to be equivalent under the " (:TERM NIL "similarity")
       " relationship. " :PAR)
      (:ITEM NIL (:B NIL "similarity") (:IDXTERM NIL "similarity") " "
       (:I NIL "n.")
       " a two-place conceptual equivalence predicate, which is independent of the "
       (:TERM NIL "Lisp image") " so that two " (:TERM NIL "objects")
       " in different " (:TERM NIL "Lisp images")
       " can be understood to be equivalent under this predicate. See "
       (:SECREF NIL :LITERALS-IN-COMPILED-FILES) ". " :PAR)
      (:ITEM NIL (:B NIL "simple") (:IDXTERM NIL "simple") " " (:I NIL "adj.")
       " 1. (of an " (:TERM NIL "array") ") being of " (:TERM NIL "type") " "
       (:TYPEREF NIL "simple-array") ". 2. (of a " (:TERM NIL "character")
       ") having no " (:TERM NIL "implementation-defined") " "
       (:TERM NIL "attributes") ", or else having "
       (:TERM NIL "implementation-defined") " " (:TERM NIL "attributes")
       " each of which has the " (:TERM NIL "null") " value for that "
       (:TERM NIL "attribute") ". " :PAR)
      (:ITEM NIL (:B NIL "simple array") (:IDXTERM NIL "simple array") " "
       (:I NIL "n.") " an " (:TERM NIL "array") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "simple-array") ". " :PAR)
      (:ITEM NIL (:B NIL "simple bit array") (:IDXTERM NIL "simple bit array")
       " " (:I NIL "n.") " a " (:TERM NIL "bit array") " that is a "
       (:TERM NIL "simple array") "; that is, an " (:TERM NIL "object") " of "
       (:TERM NIL "type") " " (:TT NIL "(simple-array bit)") ". " :PAR)
      (:ITEM NIL (:B NIL "simple bit vector")
       (:IDXTERM NIL "simple bit vector") " " (:I NIL "n.") " a "
       (:TERM NIL "bit vector") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "simple-bit-vector") ". " :PAR)
      (:ITEM NIL (:B NIL "simple condition") (:IDXTERM NIL "simple condition")
       " " (:I NIL "n.") " a " (:TERM NIL "condition") " of "
       (:TERM NIL "type") " " (:TYPEREF NIL "simple-condition") ". " :PAR)
      (:ITEM NIL (:B NIL "simple general vector")
       (:IDXTERM NIL "simple general vector") " " (:I NIL "n.") " a "
       (:TERM NIL "simple vector") ". " :PAR)
      (:ITEM NIL (:B NIL "simple string") (:IDXTERM NIL "simple string") " "
       (:I NIL "n.") " a " (:TERM NIL "string") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "simple-string") ". " :PAR
       (:COMMENT NIL
        "!!! Moon: \"not the same as a one-dimensional simple array."
        " Does the addition of the \"Not all ...\" thing fix that?  (Mail sent to Moon.) -kmp 14-Jan-92"))
      (:ITEM NIL (:B NIL "simple vector") (:IDXTERM NIL "simple vector") " "
       (:I NIL "n.") " a " (:TERM NIL "vector") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "simple-vector") ", sometimes called a “"
       (:TERM NIL "simple general vector") ".” Not all " (:TERM NIL "vectors")
       " that are " (:TERM NIL "simple") " are " (:TERM NIL "simple vectors")
       "—only those that have " (:TERM NIL "element type") " "
       (:TYPEREF NIL "t") ". " :PAR)
      (:ITEM NIL (:B NIL "single escape") (:IDXTERM NIL "single escape") " "
       (:I NIL "n.") ", " (:I NIL "adj.") " 1. " (:I NIL "n.") " the "
       (:TERM NIL "syntax type") " of a " (:TERM NIL "character")
       " that indicates that the next " (:TERM NIL "character")
       " is to be treated as an " (:TERM NIL "alphabetic") (:SUB NIL "2") " "
       (:TERM NIL "character") " with its " (:TERM NIL "case")
       " preserved. For details, see " (:SECREF NIL :SINGLE-ESCAPE-CHAR)
       ". 2. " (:I NIL "adj.") " (of a " (:TERM NIL "character")
       ") having the " (:TERM NIL "single escape") " "
       (:TERM NIL "syntax type") ". 3. " (:I NIL "n.") " a "
       (:TERM NIL "single escape") (:SUB NIL "2") " " (:TERM NIL "character")
       ". (In the " (:TERM NIL "standard readtable") ", "
       (:TERM NIL "backslash") " is the only " (:TERM NIL "single escape")
       ".) " :PAR)
      (:ITEM NIL (:B NIL "single float") (:IDXTERM NIL "single float") " "
       (:I NIL "n.") " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "single-float") ". " :PAR)
      (:ITEM NIL (:B NIL "single-quote") (:IDXTERM NIL "single-quote") " "
       (:I NIL "n.") " the " (:TERM NIL "standard character")
       " that is variously called “apostrophe,” “acute accent,” “quote,” or “single quote” ("
       (:TT NIL "'") "). See " (:FIGREF NIL :STD-CHARS-THREE) ". " :PAR)
      (:ITEM NIL (:B NIL "singleton") (:IDXTERM NIL "singleton") " "
       (:I NIL "adj.") " (of a " (:TERM NIL "sequence") ") having only one "
       (:TERM NIL "element") ". “" (:TT NIL "(list 'hello)")
       " returns a singleton list.” " :PAR)
      (:ITEM NIL (:B NIL "situation") (:IDXTERM NIL "situation") " "
       (:I NIL "n.") " the " (:TERM NIL "evaluation") " of a "
       (:TERM NIL "form") " in a specific " (:TERM NIL "environment") ". "
       :PAR)
      (:ITEM NIL (:B NIL "slash") (:IDXTERM NIL "slash") " " (:I NIL "n.")
       " the " (:TERM NIL "standard character")
       " that is variously called “solidus” or “slash” (" (:TT NIL "/")
       "). See " (:FIGREF NIL :STD-CHARS-THREE) ". " :PAR
       (:COMMENT NIL
        "!!! Moon: too general--limit to CLOS slots. \"a named component\"?"))
      (:ITEM NIL (:B NIL "slot") (:IDXTERM NIL "slot") " " (:I NIL "n.")
       " a component of an " (:TERM NIL "object") " that can store a "
       (:TERM NIL "value") ". " :PAR (:COMMENT NIL " slot option?") :PAR
       (:COMMENT NIL " Per X3J13 -kmp 5-Oct-93"))
      (:ITEM NIL (:B NIL "slot specifier") (:IDXTERM NIL "slot specifier") " "
       (:I NIL "n.") " a representation of a " (:TERM NIL "slot")
       " that includes the " (:TERM NIL "name") " of the " (:TERM NIL "slot")
       " and zero or more " (:TERM NIL "slot") " options. A "
       (:TERM NIL "slot") " option pertains only to a single "
       (:TERM NIL "slot") ". " :PAR)
      (:ITEM NIL (:B NIL "source code") (:IDXTERM NIL "source code") " "
       (:I NIL "n.") " " (:TERM NIL "code") " representing "
       (:TERM NIL "objects") " suitable for " (:TERM NIL "evaluation") " ("
       (:I NIL "e.g.") ",  " (:TERM NIL "objects") " created by "
       (:FUNREF NIL "read") ", by " (:TERM NIL "macro expansion") ", "
       (:ISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89") " or by "
       (:TERM NIL "compiler macro expansion") "). "
       (:ENDISSUE NIL "DEFINE-COMPILER-MACRO:X3J13-NOV89") " " :PAR)
      (:ITEM NIL (:B NIL "source file") (:IDXTERM NIL "source file") " "
       (:I NIL "n.") " a " (:TERM NIL "file")
       " which contains a textual representation of " (:TERM NIL "source code")
       ", that can be edited, " (:TERM NIL "loaded") ", or "
       (:TERM NIL "compiled") ". " :PAR)
      (:ITEM NIL (:B NIL "space") (:IDXTERM NIL "space") " " (:I NIL "n.")
       " the " (:TERM NIL "standard character") " " (:ANG NIL "Space")
       ", notated for the " (:TERM NIL "Lisp reader") " as "
       (:TT NIL "#\\Space") ". " :PAR)
      (:ITEM NIL (:B NIL "special form") (:IDXTERM NIL "special form") " "
       (:I NIL "n.") " a " (:TERM NIL "list") ", other than a "
       (:TERM NIL "macro form") ", which is a " (:TERM NIL "form")
       " with special syntax or special " (:TERM NIL "evaluation")
       " rules or both, possibly manipulating the " (:TERM NIL "evaluation")
       " " (:TERM NIL "environment")
       " or control flow or both. The first element of a "
       (:TERM NIL "special form") " is a " (:TERM NIL "special operator") ". "
       :PAR)
      (:ITEM NIL (:B NIL "special operator") (:IDXTERM NIL "special operator")
       " " (:I NIL "n.") " one of a fixed set of " (:TERM NIL "symbols")
       ", enumerated in " (:FIGREF NIL :CL-SPECIAL-OPS)
       ", that may appear in the " (:TERM NIL "car") " of a "
       (:TERM NIL "form") " in order to identify the " (:TERM NIL "form")
       " as a " (:TERM NIL "special form") ". " :PAR)
      (:ITEM NIL (:B NIL "special variable") (:IDXTERM NIL "special variable")
       " " (:I NIL "n.") " " (:I NIL "Trad.") " a "
       (:TERM NIL "dynamic variable") ". " :PAR)
      (:ITEM NIL (:B NIL "specialize") (:IDXTERM NIL "specialize") " "
       (:I NIL "v.t.") " (a " (:TERM NIL "generic function") ") to define a "
       (:TERM NIL "method") " for the " (:TERM NIL "generic function")
       ", or in other words, to refine the behavior of the "
       (:TERM NIL "generic function")
       " by giving it a specific meaning for a particular set of "
       (:TERM NIL "classes") " or " (:TERM NIL "arguments") ". " :PAR)
      (:ITEM NIL (:B NIL "specialized") (:IDXTERM NIL "specialized") " "
       (:I NIL "adj.") " 1. (of a " (:TERM NIL "generic function") ") having "
       (:TERM NIL "methods") " which " (:TERM NIL "specialize") " the "
       (:TERM NIL "generic function") ". 2. (of an " (:TERM NIL "array")
       ") having an " (:TERM NIL "actual array element type") " that is a "
       (:TERM NIL "proper subtype") " of the " (:TERM NIL "type") " "
       (:TYPEREF NIL "t") "; see " (:SECREF NIL :ARRAY-ELEMENTS) ". “"
       (:TT NIL "(make-array 5 :element-type 'bit)")
       " makes an array of length five that is specialized for bits.” " :PAR)
      (:ITEM NIL (:B NIL "specialized lambda list")
       (:IDXTERM NIL "specialized lambda list") " " (:I NIL "n.") " an "
       (:TERM NIL "extended lambda list") " used in " (:TERM NIL "forms")
       " that " (:TERM NIL "establish") " " (:TERM NIL "method")
       " definitions, such as " (:MACREF NIL "defmethod") ". See "
       (:SECREF NIL :SPECIALIZED-LAMBDA-LISTS) ". " :PAR)
      (:ITEM NIL (:B NIL "spreadable argument list designator")
       (:IDXTERM NIL "spreadable argument list designator") " " (:I NIL "n.")
       " a " (:TERM NIL "designator") " for a " (:TERM NIL "list") " of "
       (:TERM NIL "objects") "; that is, an " (:TERM NIL "object")
       " that denotes a " (:TERM NIL "list") " and that is a "
       (:TERM NIL "non-null") " " (:TERM NIL "list") " "
       (:MATH NIL (:MI NIL "L") (:MN NIL "1")) " of length "
       (:MATH NIL (:MI NIL "n")) ", whose last element is a "
       (:TERM NIL "list") " " (:MATH NIL (:MI NIL "L") (:MN NIL "2"))
       " of length " (:MATH NIL (:MI NIL "m")) " (denoting a list "
       (:MATH NIL (:MI NIL "L") (:MN NIL "3")) " of length "
       (:MATH NIL (:MI NIL "m") (:MO NIL "+") (:MI NIL "n") (:MO NIL "-")
        (:MN NIL "1"))
       " whose " (:TERM NIL "elements") " are "
       (:MATH NIL (:MI NIL "L") (:MSUB NIL (:MN NIL "1") (:MI NIL "i")))
       " for "
       (:MATH NIL (:MI NIL "i") (:MO NIL "<") (:MI NIL "n") (:MO NIL "-")
        (:MN NIL "1"))
       " followed by "
       (:MATH NIL (:MI NIL "L") (:MSUB NIL (:MN NIL "2") (:MI NIL "j")))
       " for " (:MATH NIL (:MI NIL "j") (:MO NIL "<") (:MI NIL "m"))
       "). “The list (1 2 (3 4 5)) is a spreadable argument list designator for the list (1 2 3 4 5).” "
       :PAR)
      (:ITEM NIL (:B NIL "stack allocate") (:IDXTERM NIL "stack allocate") " "
       (:I NIL "v.t.") " " (:I NIL "Trad.")
       " to allocate in a non-permanent way, such as on a stack. Stack-allocation is an optimization technique used in some "
       (:TERM NIL "implementations") " for allocating certain kinds of "
       (:TERM NIL "objects") " that have " (:TERM NIL "dynamic extent")
       ". Such " (:TERM NIL "objects")
       " are allocated on the stack rather than in the heap so that their storage can be freed as part of unwinding the stack rather than taking up space in the heap until the next garbage collection. What "
       (:TERM NIL "types") " (if any) can have " (:TERM NIL "dynamic extent")
       " can vary from " (:TERM NIL "implementation") " to "
       (:TERM NIL "implementation") ". No " (:TERM NIL "implementation")
       " is ever required to perform stack-allocation. " :PAR
       (:COMMENT NIL "!!! Moon thinks this is too circular."))
      (:ITEM NIL (:B NIL "stack-allocated") (:IDXTERM NIL "stack-allocated")
       " " (:I NIL "adj.") " " (:I NIL "Trad.") " having been "
       (:TERM NIL "stack allocated") ". " :PAR)
      (:ITEM NIL (:B NIL "standard character")
       (:IDXTERM NIL "standard character") " " (:I NIL "n.") " a "
       (:TERM NIL "character") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "standard-char")
       ", which is one of a fixed set of 96 such " (:TERM NIL "characters")
       " required to be present in all "
       (:TERM NIL "conforming implementations") ". See "
       (:SECREF NIL :STANDARD-CHARS) ". " :PAR
       (:COMMENT NIL
        " Definitions of terms \"standard function\", \"standard macro\", and \"standard special form\""
        " removed since they were not used anywhere, and since they were yucky anyway."
        "  -kmp 15-Oct-91")
       :PAR
       (:COMMENT NIL
        "Moon: \"direct instance\" or \"generalized instance\". I think it's \"direct\" "
        "      but don't know for sure."
        "After some discussion (with subject line \"standard class, standard generic function\"),"
        "Moon and KMP think this is a technical issue which requires X3J13 vote to proceed on."
        "Leaving it unchanged for now. -kmp 15-Nov-91"
        "Changing it to \"generalized instance\" on advice from Quinquevirate. -kmp 14-Feb-92"))
      (:ITEM NIL (:B NIL "standard class") (:IDXTERM NIL "standard class") " "
       (:I NIL "n.") " a " (:TERM NIL "class") " that is a "
       (:TERM NIL "generalized instance") " of " (:TERM NIL "class") " "
       (:TYPEREF NIL "standard-class") ". " :PAR
       (:COMMENT NIL "Moon: Same comment as for \"standard class\"."))
      (:ITEM NIL (:B NIL "standard generic function")
       (:IDXTERM NIL "standard generic function") " a " (:TERM NIL "function")
       " of " (:TERM NIL "type") " " (:TYPEREF NIL "standard-generic-function")
       ". " :PAR)
      (:ITEM NIL (:B NIL "standard input") (:IDXTERM NIL "standard input") " "
       (:I NIL "n.") " the " (:TERM NIL "input") " " (:TERM NIL "stream")
       " which is the " (:TERM NIL "value") " of the "
       (:TERM NIL "dynamic variable") " " (:VARREF NIL "*standard-input*") ". "
       :PAR)
      (:ITEM NIL (:B NIL "standard method combination")
       (:IDXTERM NIL "standard method combination") " " (:I NIL "n.") " the "
       (:TERM NIL "method combination") " named " (:TYPEREF NIL "standard")
       ". " :PAR)
      (:ITEM NIL (:B NIL "standard object") (:IDXTERM NIL "standard object")
       " " (:I NIL "n.") " an " (:TERM NIL "object") " that is "
       (:COMMENT NIL "This phrase added per Moon:") "a "
       (:TERM NIL "generalized instance") " of " (:TERM NIL "class") " "
       (:TYPEREF NIL "standard-object") ". " :PAR)
      (:ITEM NIL (:B NIL "standard output") (:IDXTERM NIL "standard output")
       " " (:I NIL "n.") " the " (:TERM NIL "output") " " (:TERM NIL "stream")
       " which is the " (:TERM NIL "value") " of the "
       (:TERM NIL "dynamic variable") " " (:VARREF NIL "*standard-output*")
       ". " :PAR (:ISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92")
       " ")
      (:ITEM NIL (:B NIL "standard pprint dispatch table")
       (:IDXTERM NIL "standard pprint dispatch table") " " (:I NIL "n.") " A "
       (:TERM NIL "pprint dispatch table") " that is " (:TERM NIL "different")
       " from the " (:TERM NIL "initial pprint dispatch table")
       ", that implements " (:TERM NIL "pretty printing")
       " as described in this specification, and that, unlike other "
       (:TERM NIL "pprint dispatch tables")
       ", must never be modified by any program. (Although the definite reference “the "
       (:TERM NIL "standard pprint dispatch table")
       "” is generally used within this document, it is actually "
       (:TERM NIL "implementation-dependent") " whether a single "
       (:TERM NIL "object") " fills the role of the "
       (:TERM NIL "standard pprint dispatch table")
       ", or whether there might be multiple such objects, any one of which could be used on any given occasion where “the "
       (:TERM NIL "standard pprint dispatch table")
       "” is called for. As such, this phrase should be seen as an indefinite reference in all cases except for anaphoric references.) "
       (:ENDISSUE NIL "KMP-COMMENTS-ON-SANDRA-COMMENTS:X3J13-MAR-92") " " :PAR
       (:ISSUE NIL "WITH-STANDARD-IO-SYNTAX-READTABLE:X3J13-MAR-91") " ")
      (:ITEM NIL (:B NIL "standard readtable")
       (:IDXTERM NIL "standard readtable") " " (:I NIL "n.") " A "
       (:TERM NIL "readtable") " that is " (:TERM NIL "different") " from the "
       (:TERM NIL "initial readtable") ", that implements the "
       (:TERM NIL "expression")
       " syntax defined in this specification, and that, unlike other "
       (:TERM NIL "readtables")
       ", must never be modified by any program. (Although the definite reference “the "
       (:TERM NIL "standard readtable")
       "” is generally used within this document, it is actually "
       (:TERM NIL "implementation-dependent") " whether a single "
       (:TERM NIL "object") " fills the role of the "
       (:TERM NIL "standard readtable")
       ", or whether there might be multiple such objects, any one of which could be used on any given occasion where “the "
       (:TERM NIL "standard readtable")
       "” is called for. As such, this phrase should be seen as an indefinite reference in all cases except for anaphoric references.) "
       (:ENDISSUE NIL "WITH-STANDARD-IO-SYNTAX-READTABLE:X3J13-MAR-91") " "
       :PAR)
      (:ITEM NIL (:B NIL "standard syntax") (:IDXTERM NIL "standard syntax")
       " " (:I NIL "n.") " the syntax represented by the "
       (:TERM NIL "standard readtable")
       " and used as a reference syntax throughout this document. See "
       (:SECREF NIL :THE-STANDARD-SYNTAX) ". " :PAR)
      (:ITEM NIL (:B NIL "standardized") (:IDXTERM NIL "standardized") " "
       (:I NIL "adj.") " (of a " (:TERM NIL "name") ", " (:TERM NIL "object")
       ", or definition) having been defined by " (:RM NIL " Common Lisp")
       ". “All standardized variables that are required to hold bidirectional streams have “"
       (:TT NIL "-io*") "” in their name.” " :PAR)
      (:ITEM NIL (:B NIL "startup environment")
       (:IDXTERM NIL "startup environment") " " (:I NIL "n.") " the "
       (:TERM NIL "global environment") " of the running "
       (:TERM NIL "Lisp image") " from which the " (:TERM NIL "compiler")
       " was invoked. " :PAR)
      (:ITEM NIL (:B NIL "step") (:IDXTERM NIL "step") " " (:I NIL "v.t.") ", "
       (:I NIL "n.") " 1. " (:I NIL "v.t.") " (an iteration "
       (:TERM NIL "variable") ") to " (:TERM NIL "assign") " the "
       (:TERM NIL "variable") " a new " (:TERM NIL "value")
       " at the end of an iteration, in preparation for a new iteration. 2. "
       (:I NIL "n.") " the " (:TERM NIL "code")
       " that identifies how the next value in an iteration is to be computed. 3. "
       (:I NIL "v.t.") " (" (:TERM NIL "code") ") to specially execute the "
       (:TERM NIL "code")
       ", pausing at intervals to allow user confirmation or intervention, usually for debugging. "
       :PAR)
      (:ITEM NIL (:B NIL "stream") (:IDXTERM NIL "stream") " " (:I NIL "n.")
       " an " (:TERM NIL "object")
       " that can be used with an input or output function to identify an appropriate source or sink of "
       (:TERM NIL "characters") " or " (:TERM NIL "bytes")
       " for that operation. " :PAR
       (:ISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " "
       (:ISSUE NIL "PATHNAME-STREAM:FILES-OR-SYNONYM") " ")
      (:ITEM NIL (:B NIL "stream associated with a file")
       (:IDXTERM NIL "stream associated with a file") " " (:I NIL "n.") " a "
       (:TERM NIL "file stream") ", or a " (:TERM NIL "synonym stream") " the "
       (:TERM NIL "target") " of which is a "
       (:TERM NIL "stream associated with a file") ". "
       (:COMMENT NIL "!!! I wonder if this really needs to be said...")
       "Such a " (:TERM NIL "stream") " cannot be created with "
       (:FUNREF NIL "make-two-way-stream") ", "
       (:FUNREF NIL "make-echo-stream") ", "
       (:FUNREF NIL "make-broadcast-stream") ", "
       (:FUNREF NIL "make-concatenated-stream") ", "
       (:FUNREF NIL "make-string-input-stream") ", or "
       (:FUNREF NIL "make-string-output-stream") ". "
       (:ENDISSUE NIL "PATHNAME-STREAM:FILES-OR-SYNONYM") " "
       (:ENDISSUE NIL "CLOSED-STREAM-FUNCTIONS:ALLOW-INQUIRY") " " :PAR)
      (:ITEM NIL (:B NIL "stream designator")
       (:IDXTERM NIL "stream designator") " " (:I NIL "n.") " a "
       (:TERM NIL "designator") " for a " (:TERM NIL "stream") "; that is, an "
       (:TERM NIL "object") " that denotes a " (:TERM NIL "stream")
       " and that is one of: " (:MISC NIL "t") " (denoting the "
       (:TERM NIL "value") " of " (:VARREF NIL "*terminal-io*") "), "
       (:MISC NIL "nil") " (denoting the " (:TERM NIL "value") " of "
       (:VARREF NIL "*standard-input*") " for " (:TERM NIL "input") " "
       (:TERM NIL "stream designators") " or denoting the " (:TERM NIL "value")
       " of " (:VARREF NIL "*standard-output*") " for " (:TERM NIL "output")
       " " (:TERM NIL "stream designators") "), or a " (:TERM NIL "stream")
       " (denoting itself). " :PAR)
      (:ITEM NIL (:B NIL "stream element type")
       (:IDXTERM NIL "stream element type") " " (:I NIL "n.") " (of a "
       (:TERM NIL "stream") ") the " (:TERM NIL "type")
       " of data for which the " (:TERM NIL "stream") " is specialized. "
       (:COMMENT NIL
        "KMP: Is there a notion of upgraded element type in this situation?"
        "Moon: Surely!  But there is no way for a portable program to detect it.")
       :PAR)
      (:ITEM NIL (:B NIL "stream variable") (:IDXTERM NIL "stream variable")
       " " (:I NIL "n.") " a " (:TERM NIL "variable") " whose "
       (:TERM NIL "value") " must be a " (:TERM NIL "stream") ". " :PAR)
      (:ITEM NIL (:B NIL "stream variable designator")
       (:IDXTERM NIL "stream variable designator") " " (:I NIL "n.") " a "
       (:TERM NIL "designator") " for a " (:TERM NIL "stream variable")
       "; that is, a " (:TERM NIL "symbol") " that denotes a "
       (:TERM NIL "stream variable") " and that is one of: " (:MISC NIL "t")
       " (denoting " (:VARREF NIL "*terminal-io*") "), " (:MISC NIL "nil")
       " (denoting " (:VARREF NIL "*standard-input*") " for "
       (:TERM NIL "input") " " (:TERM NIL "stream variable designators")
       " or denoting " (:VARREF NIL "*standard-output*") " for "
       (:TERM NIL "output") " " (:TERM NIL "stream variable designators")
       "), or some other " (:TERM NIL "symbol") " (denoting itself). " :PAR)
      (:ITEM NIL (:B NIL "string") (:IDXTERM NIL "string") " " (:I NIL "n.")
       " a specialized " (:TERM NIL "vector") " that is of " (:TERM NIL "type")
       " " (:TYPEREF NIL "string") ", and whose elements are of "
       (:TERM NIL "type") " " (:TYPEREF NIL "character") " or a "
       (:TERM NIL "subtype") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "character") ". " :PAR)
      (:ITEM NIL (:B NIL "string designator")
       (:IDXTERM NIL "string designator") " " (:I NIL "n.") " a "
       (:TERM NIL "designator") " for a " (:TERM NIL "string") "; that is, an "
       (:TERM NIL "object") " that denotes a " (:TERM NIL "string")
       " and that is one of: a " (:TERM NIL "character") " (denoting a "
       (:TERM NIL "singleton") " " (:TERM NIL "string") " that has the "
       (:TERM NIL "character") " as its only " (:TERM NIL "element") "), a "
       (:TERM NIL "symbol") " (denoting the " (:TERM NIL "string")
       " that is its " (:TERM NIL "name") "), or a " (:TERM NIL "string")
       " (denoting itself). " (:ISSUE NIL "STRING-COERCION:MAKE-CONSISTENT")
       " The intent is that this term be consistent with the behavior of "
       (:FUNREF NIL "string") "; " (:TERM NIL "implementations")
       " that extend " (:FUNREF NIL "string")
       " must extend the meaning of this term in a compatible way. "
       (:ENDISSUE NIL "STRING-COERCION:MAKE-CONSISTENT") " " :PAR)
      (:ITEM NIL (:B NIL "string equal") (:IDXTERM NIL "string equal") " "
       (:I NIL "adj.") " the " (:TERM NIL "same") " under "
       (:FUNREF NIL "string-equal") ". " :PAR)
      (:ITEM NIL (:B NIL "string stream") (:IDXTERM NIL "string stream") " "
       (:I NIL "n.") " a " (:TERM NIL "stream") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "string-stream") ". " :PAR)
      (:ITEM NIL (:B NIL "structure") (:IDXTERM NIL "structure") " "
       (:I NIL "n.") " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "structure-object") ". "
       (:COMMENT NIL " It's really pathetic that the type structure-object "
        " is not just called structure. -kmp 2-Jan-91")
       :PAR)
      (:ITEM NIL (:B NIL "structure class") (:IDXTERM NIL "structure class")
       " " (:I NIL "n.") " "
       (:COMMENT NIL "Moon: See comment for standard class."
        "\"instance\" => \"generalized instance\" per Quinquevirate. -kmp 14-Feb-92")
       "a " (:TERM NIL "class") " that is a "
       (:TERM NIL "generalized instance") " of " (:TERM NIL "class") " "
       (:TYPEREF NIL "structure-class") ". " :PAR)
      (:ITEM NIL (:B NIL "structure name") (:IDXTERM NIL "structure name") " "
       (:I NIL "n.") " a " (:TERM NIL "name") " defined with "
       (:MACREF NIL "defstruct") ". Usually, such a " (:TERM NIL "type")
       " is also a " (:TERM NIL "structure class") ", "
       (:COMMENT NIL "!!! Really? Must they be implementation-dependent?")
       "but there may be " (:TERM NIL "implementation-dependent")
       " situations in which this is not so, if the " (:KWD NIL "type")
       " option to " (:MACREF NIL "defstruct") " is used. " :PAR)
      (:ITEM NIL (:B NIL "style warning") (:IDXTERM NIL "style warning") " "
       (:I NIL "n.") " a " (:TERM NIL "condition") " of " (:TERM NIL "type")
       " " (:TYPEREF NIL "style-warning") ". " :PAR)
      (:ITEM NIL (:B NIL "subclass") (:IDXTERM NIL "subclass") " "
       (:I NIL "n.") " a " (:TERM NIL "class") " that " (:TERM NIL "inherits")
       " from another " (:TERM NIL "class") ", called a "
       (:TERM NIL "superclass") ". (No " (:TERM NIL "class") " is a "
       (:TERM NIL "subclass") " of itself.) " :PAR)
      (:ITEM NIL (:B NIL "subexpression") (:IDXTERM NIL "subexpression") " "
       (:I NIL "n.") " (of an " (:TERM NIL "expression") ") an "
       (:TERM NIL "expression") " that is contained within the "
       (:TERM NIL "expression") ". (In fact, the state of being a "
       (:TERM NIL "subexpression") " is not an attribute of the "
       (:TERM NIL "subexpression")
       ", but really an attribute of the containing " (:TERM NIL "expression")
       " since the " (:TERM NIL "same") " " (:TERM NIL "object")
       " can at once be a " (:TERM NIL "subexpression")
       " in one context, and not in another.) " :PAR)
      (:ITEM NIL (:B NIL "subform") (:IDXTERM NIL "subform") " " (:I NIL "n.")
       " (of a " (:TERM NIL "form") ") an " (:TERM NIL "expression")
       " that is a " (:TERM NIL "subexpression") " of the " (:TERM NIL "form")
       ", and which by virtue of its position in that " (:TERM NIL "form")
       " is also a " (:TERM NIL "form") ". “" (:TT NIL "(f x)") " and "
       (:TT NIL "x") ", but not " (:TT NIL "exit") ", are subforms of "
       (:TT NIL "(return-from exit (f x))") ".” " :PAR)
      (:ITEM NIL (:B NIL "subrepertoire") (:IDXTERM NIL "subrepertoire") " "
       (:I NIL "n.") " a subset of a " (:TERM NIL "repertoire") ". " :PAR)
      (:ITEM NIL (:B NIL "subtype") (:IDXTERM NIL "subtype") " " (:I NIL "n.")
       " a " (:TERM NIL "type")
       " whose membership is the same as or a proper subset of the membership of another "
       (:TERM NIL "type") ", called a " (:TERM NIL "supertype") ". (Every "
       (:TERM NIL "type") " is a " (:TERM NIL "subtype") " of itself.) " :PAR)
      (:ITEM NIL (:B NIL "superclass") (:IDXTERM NIL "superclass") " "
       (:I NIL "n.") " a " (:TERM NIL "class") " from which another "
       (:TERM NIL "class") " (called a " (:TERM NIL "subclass") ") "
       (:TERM NIL "inherits") ". (No " (:TERM NIL "class") " is a "
       (:TERM NIL "superclass") " of itself.) See " (:TERM NIL "subclass") ". "
       :PAR)
      (:ITEM NIL (:B NIL "supertype") (:IDXTERM NIL "supertype") " "
       (:I NIL "n.") " a " (:TERM NIL "type")
       " whose membership is the same as or a proper superset of the membership of another "
       (:TERM NIL "type") ", called a " (:TERM NIL "subtype") ". (Every "
       (:TERM NIL "type") " is a " (:TERM NIL "supertype") " of itself.) See "
       (:TERM NIL "subtype") ". " :PAR)
      (:ITEM NIL (:B NIL "supplied-p parameter")
       (:IDXTERM NIL "supplied-p parameter") " " (:I NIL "n.") " a "
       (:TERM NIL "parameter") " which receives its "
       (:TERM NIL "generalized boolean")
       " value implicitly due to the presence or absence of an "
       (:TERM NIL "argument") " corresponding to another "
       (:TERM NIL "parameter") " (such as an " (:TERM NIL "optional parameter")
       " or a " (:TERM NIL "rest parameter") "). See "
       (:SECREF NIL :ORDINARY-LAMBDA-LISTS) ". " :PAR)
      (:ITEM NIL (:B NIL "symbol") (:IDXTERM NIL "symbol") " " (:I NIL "n.")
       " an " (:TERM NIL "object") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "symbol") ". " :PAR)
      (:ITEM NIL (:B NIL "symbol macro") (:IDXTERM NIL "symbol macro") " "
       (:I NIL "n.") " a " (:TERM NIL "symbol") " that stands for another "
       (:TERM NIL "form") ". See the " (:TERM NIL "macro") " "
       (:MACREF NIL "symbol-macrolet") ". " :PAR
       (:COMMENT NIL " \\gentry{symbol name designator} \\Noun\\"
        "   a \\term{designator} for the \\term{name} of a \\term{symbol}; that is,"
        "   an \\term{object} that denotes a \\term{symbol} "
        "   and that is one of:"
        "        a \\term{character} (denoting a \\term{singleton} \\term{string}"
        " 			   that has the \\term{character} as its only \\term{element}),"
        "        a \\term{symbol} (denoting the \\term{string} that is its \\term{name}),"
        "     or a \\term{string} (denoting itself).")
       :PAR)
      (:ITEM NIL (:B NIL "synonym stream") (:IDXTERM NIL "synonym stream") " "
       (:I NIL "n.") " 1. a " (:TERM NIL "stream") " of " (:TERM NIL "type")
       " " (:TYPEREF NIL "synonym-stream") ", which is consequently a "
       (:TERM NIL "stream") " that is an alias for another "
       (:TERM NIL "stream") ", which is the " (:TERM NIL "value") " of a "
       (:TERM NIL "dynamic variable") " whose " (:TERM NIL "name") " is the "
       (:TERM NIL "synonym stream symbol") " of the "
       (:TERM NIL "synonym stream") ". See the " (:TERM NIL "function") " "
       (:FUNREF NIL "make-synonym-stream") ". 2. (to a " (:TERM NIL "stream")
       ") a " (:TERM NIL "synonym stream") " which has the "
       (:TERM NIL "stream") " as the " (:TERM NIL "value") " of its "
       (:TERM NIL "synonym stream symbol") ". 3. (to a " (:TERM NIL "symbol")
       ") a " (:TERM NIL "synonym stream") " which has the "
       (:TERM NIL "symbol") " as its " (:TERM NIL "synonym stream symbol") ". "
       :PAR)
      (:ITEM NIL (:B NIL "synonym stream symbol")
       (:IDXTERM NIL "synonym stream symbol") " " (:I NIL "n.") " (of a "
       (:TERM NIL "synonym stream") ") the " (:TERM NIL "symbol")
       " which names the " (:TERM NIL "dynamic variable") " which has as its "
       (:TERM NIL "value") " another " (:TERM NIL "stream") " for which the "
       (:TERM NIL "synonym stream") " is an alias. " :PAR)
      (:ITEM NIL (:B NIL "syntax type") (:IDXTERM NIL "syntax type") " "
       (:I NIL "n.") " (of a " (:TERM NIL "character")
       ") one of several classifications, enumerated in "
       (:FIGREF NIL :POSSIBLE-SYNTAX-TYPES)
       ", that are used for dispatch during parsing by the "
       (:TERM NIL "Lisp reader") ". See " (:SECREF NIL :CHARACTER-SYNTAX-TYPES)
       ". " :PAR)
      (:ITEM NIL (:B NIL "system class") (:IDXTERM NIL "system class") " "
       (:I NIL "n.") " a " (:TERM NIL "class") " that may be of "
       (:TERM NIL "type") " " (:TYPEREF NIL "built-in-class") " in a "
       (:TERM NIL "conforming implementation")
       " and hence cannot be inherited by " (:TERM NIL "classes")
       " defined by " (:TERM NIL "conforming programs") ". " :PAR)
      (:ITEM NIL (:B NIL "system code") (:IDXTERM NIL "system code") " "
       (:I NIL "n.") " " (:TERM NIL "code") " supplied by the "
       (:TERM NIL "implementation") " to implement this specification ("
       (:I NIL "e.g.") ",  the definition of " (:FUNREF NIL "mapcar")
       ") or generated automatically in support of this specification ("
       (:I NIL "e.g.") ",  during method combination); that is, "
       (:TERM NIL "code") " that is not " (:TERM NIL "programmer code") ". "
       :PAR
       (:COMMENT NIL
        " %!!! Now that there's this term \"standarized\", this term could probably go away."
        " %    -kmp 24-Jan-92" " \\gentry{system stream variable} \\Noun\\"
        "   a \\term{standardized} \\term{stream variable}."
        "   \\Seesection\\StreamConcepts.")
       :PAR)))
    (:ITEM NIL (:B NIL "T")
     (:LIST NIL
      (:ITEM NIL (:B NIL "t") (:IDXTERM NIL "t") " " (:I NIL "n.")
       " 1. a. the " (:TERM NIL "boolean")
       " representing true. b. the canonical "
       (:TERM NIL "generalized boolean") " representing true. (Although any "
       (:TERM NIL "object") " other than " (:MISC NIL "nil") " is considered "
       (:TERM NIL "true") " as a " (:TERM NIL "generalized boolean") ", "
       (:TT NIL "t")
       " is generally used when there is no special reason to prefer one such "
       (:TERM NIL "object") " over another.) 2. the " (:TERM NIL "name")
       " of the " (:TERM NIL "type") " to which all " (:TERM NIL "objects")
       " belong—the " (:TERM NIL "supertype") " of all " (:TERM NIL "types")
       " (including itself). 3. the " (:TERM NIL "name") " of the "
       (:TERM NIL "superclass") " of all " (:TERM NIL "classes")
       " except itself. " :PAR)
      (:ITEM NIL (:B NIL "tag") (:IDXTERM NIL "tag") " " (:I NIL "n.") " 1. a "
       (:TERM NIL "catch tag") ". 2. a " (:TERM NIL "go tag") ". " :PAR
       (:ISSUE NIL "TAILP-NIL:T") " ")
      (:ITEM NIL (:B NIL "tail") (:IDXTERM NIL "tail") " " (:I NIL "n.")
       " (of a " (:TERM NIL "list") ") an " (:TERM NIL "object")
       " that is the " (:TERM NIL "same") " as either some " (:TERM NIL "cons")
       " which makes up that " (:TERM NIL "list") " or the " (:TERM NIL "atom")
       " (if any) which terminates the " (:TERM NIL "list")
       ". “The empty list is a tail of every proper list.” "
       (:ENDISSUE NIL "TAILP-NIL:T") " " :PAR)
      (:ITEM NIL (:B NIL "target") (:IDXTERM NIL "target") " " (:I NIL "n.")
       " 1. (of a " (:TERM NIL "constructed stream") ") a "
       (:TERM NIL "constituent") " of the " (:TERM NIL "constructed stream")
       ". “The target of a synonym stream is the value of its synonym stream symbol.” 2. (of a "
       (:TERM NIL "displaced array") ") the " (:TERM NIL "array")
       " to which the " (:TERM NIL "displaced array")
       " is displaced. (In the case of a chain of "
       (:TERM NIL "constructed streams") " or " (:TERM NIL "displaced arrays")
       ", the unqualified term “" (:TERM NIL "target")
       "” always refers to the immediate " (:TERM NIL "target")
       " of the first item in the chain, not the immediate target of the last item.) "
       (:COMMENT NIL
        "!!! Do we want a term \"eventual target\" to talk about the last item?")
       :PAR)
      (:ITEM NIL (:B NIL "terminal I/O") (:IDXTERM NIL "terminal I/O") " "
       (:I NIL "n.") " the " (:TERM NIL "bidirectional") " "
       (:TERM NIL "stream") " that is the " (:TERM NIL "value") " of the "
       (:TERM NIL "variable") " " (:VARREF NIL "*terminal-io*") ". " :PAR)
      (:ITEM NIL (:B NIL "terminating") (:IDXTERM NIL "terminating") " "
       (:I NIL "n.") " (of a " (:TERM NIL "macro character")
       ") being such that, if it appears while parsing a token, it terminates that token. See "
       (:SECREF NIL :READER-ALGORITHM) ". " :PAR)
      (:ITEM NIL (:B NIL "tertiary value") (:IDXTERM NIL "tertiary value") " "
       (:I NIL "n.") " (of " (:TERM NIL "values") " resulting from the "
       (:TERM NIL "evaluation") " of a " (:TERM NIL "form") ") the third "
       (:TERM NIL "value") ", if any, or else " (:MISC NIL "nil")
       " if there are fewer than three " (:TERM NIL "values") ". " :PAR)
      (:ITEM NIL (:B NIL "throw") (:IDXTERM NIL "throw") " " (:I NIL "v.")
       " to transfer control and " (:TERM NIL "values") " to a "
       (:TERM NIL "catch") ". See the " (:TERM NIL "special operator") " "
       (:SPECREF NIL "throw") ". " :PAR)
      (:ITEM NIL (:B NIL "tilde") (:IDXTERM NIL "tilde") " " (:I NIL "n.")
       " the " (:TERM NIL "standard character") " that is called “tilde” ("
       (:TT NIL " ") "). See " (:FIGREF NIL :STD-CHARS-THREE) ". " :PAR
       (:COMMENT NIL "!!! Moon: What's a \"time line\"?"))
      (:ITEM NIL (:B NIL "time") (:IDXTERM NIL "time")
       " a representation of a point (" (:TERM NIL "absolute") " "
       (:TERM NIL "time") ") or an interval (" (:TERM NIL "relative") " "
       (:TERM NIL "time") ") on a time line. See " (:TERM NIL "decoded time")
       ", " (:TERM NIL "internal time") ", and " (:TERM NIL "universal time")
       ". " :PAR (:ISSUE NIL "TIME-ZONE-NON-INTEGER:ALLOW") " ")
      (:ITEM NIL (:B NIL "time zone") (:IDXTERM NIL "time zone") " "
       (:I NIL "n.") " a " (:TERM NIL "rational") " multiple of "
       (:TT NIL "1/3600") " between " (:TT NIL "-24") " (inclusive) and "
       (:TT NIL "24")
       " (inclusive) that represents a time zone as a number of hours offset from Greenwich Mean Time. Time zone values increase with motion to the west, so Massachusetts, U.S.A. is in time zone "
       (:TT NIL "5") ", California, U.S.A. is time zone " (:TT NIL "8")
       ", and Moscow, Russia is time zone " (:TT NIL "-3") ". "
       (:COMMENT NIL
        "   (In regions where ``daylight savings time'' might apply,"
        "    the time zone does not depend on whether daylight savings time"
        "    is in effect---such information is represented separately.)"
        "% Moon didn't like that, and prefers the following:")
       "(When “daylight savings time” is separately represented as an "
       (:TERM NIL "argument") " or " (:TERM NIL "return value") ", the "
       (:TERM NIL "time zone")
       " that accompanies it does not depend on whether daylight savings time is in effect.) "
       (:ENDISSUE NIL "TIME-ZONE-NON-INTEGER:ALLOW") " " :PAR)
      (:ITEM NIL (:B NIL "token") (:IDXTERM NIL "token") " " (:I NIL "n.")
       " a textual representation for a " (:TERM NIL "number") " or a "
       (:TERM NIL "symbol") ". See " (:SECREF NIL :INTERP-OF-TOKENS) ". " :PAR)
      (:ITEM NIL (:B NIL "top level form") (:IDXTERM NIL "top level form") " "
       (:I NIL "n.") " "
       (:COMMENT NIL
        " The old definition is contradicted by item (4) in the description of how"
        " EVAL-WHEN works. --sjl 3 Mar 92"
        "  a \\term{form} which, because it is not a \\term{subform} of some \\term{form}"
        "  that \\term{establishes} a new \\term{lexical environment}, is to be executed"
        "  in the \\term{null lexical environment}.")
       "a " (:TERM NIL "form") " which is processed specially by "
       (:FUNREF NIL "compile-file") " for the purposes of enabling "
       (:TERM NIL "compile time") " " (:TERM NIL "evaluation") " of that "
       (:TERM NIL "form") ". " (:TERM NIL "Top level forms") " include those "
       (:TERM NIL "forms") " which are not " (:TERM NIL "subforms")
       " of any other " (:TERM NIL "form") ", and certain other cases. See "
       (:SECREF NIL :TOP-LEVEL-FORMS) ". " :PAR)
      (:ITEM NIL (:B NIL "trace output") (:IDXTERM NIL "trace output") " "
       (:I NIL "n.") " the " (:TERM NIL "output") " " (:TERM NIL "stream")
       " which is the " (:TERM NIL "value") " of the "
       (:TERM NIL "dynamic variable") " " (:VARREF NIL "*trace-output*") ". "
       :PAR)
      (:ITEM NIL (:B NIL "tree") (:IDXTERM NIL "tree") " " (:I NIL "n.")
       " 1. a binary recursive data structure made up of " (:TERM NIL "conses")
       " and " (:TERM NIL "atoms") ": the " (:TERM NIL "conses")
       " are themselves also " (:TERM NIL "trees")
       " (sometimes called “subtrees” or “branches”), and the "
       (:TERM NIL "atoms") " are terminal nodes (sometimes called "
       (:TERM NIL "leaves") "). Typically, the " (:TERM NIL "leaves")
       " represent data while the branches establish some relationship among that data. "
       (:COMMENT NIL
        " Moon wondered if \"acyclic\" should be here.  I think that's fine for math"
        " but not for computer science. so i'm leaving it out.  I think it's"
        " useful to talk about a tree that is circular, but \"circular tree\" would"
        " be an oxymoron under so rigorous a definition.  as with a list, one"
        " often doesn't descend a tree in order to prove it's well-formed before"
        " manipulating it with tree primitives, and you'd still like to be able to"
        " say it was a tree.   tree is more of a view on the process of"
        " destructuring than a kind of object.  after all, all objects are trees."
        " -kmp 15-Nov-91")
       "2. in general, any recursive data structure that has some notion of “branches” and "
       (:TERM NIL "leaves") ". " :PAR)
      (:ITEM NIL (:B NIL "tree structure") (:IDXTERM NIL "tree structure") " "
       (:I NIL "n.") " (of a " (:TERM NIL "tree") (:SUB NIL "1")
       ") the set of " (:TERM NIL "conses") " that make up the "
       (:TERM NIL "tree") ". Note that while the " (:TERM NIL "car")
       (:SUB NIL "1b") " component of each such " (:TERM NIL "cons")
       " is part of the " (:TERM NIL "tree structure") ", the "
       (:TERM NIL "objects") " that are the " (:TERM NIL "cars") (:SUB NIL "2")
       " of each " (:TERM NIL "cons") " in the " (:TERM NIL "tree")
       " are not themselves part of its " (:TERM NIL "tree structure")
       " unless they are also " (:TERM NIL "conses") ". " :PAR)
      (:ITEM NIL (:B NIL "true") (:IDXTERM NIL "true") " " (:I NIL "n.")
       " any " (:TERM NIL "object") " that is not " (:TERM NIL "false")
       " and that is used to represent the success of a "
       (:TERM NIL "predicate") " test. See " (:TERM NIL "t") (:SUB NIL "1")
       ". " :PAR)
      (:ITEM NIL (:B NIL "truename") (:IDXTERM NIL "truename") " "
       (:I NIL "n.") " 1. the canonical " (:TERM NIL "filename") " of a "
       (:TERM NIL "file") " in the " (:TERM NIL "file system") ". See "
       (:SECREF NIL :TRUENAMES) ". 2. a " (:TERM NIL "pathname")
       " representing a " (:TERM NIL "truename") (:SUB NIL "1") ". " :PAR)
      (:ITEM NIL (:B NIL "two-way stream") (:IDXTERM NIL "two-way stream") " "
       (:I NIL "n.") " a " (:TERM NIL "stream") " of " (:TERM NIL "type") " "
       (:TYPEREF NIL "two-way-stream") ", which is a "
       (:TERM NIL "bidirectional") " " (:TERM NIL "composite stream")
       " that receives its input from an associated " (:TERM NIL "input") " "
       (:TERM NIL "stream") " and sends its output to an associated "
       (:TERM NIL "output") " " (:TERM NIL "stream") ". " :PAR)
      (:ITEM NIL (:B NIL "type") (:IDXTERM NIL "type") " " (:I NIL "n.")
       " 1. a set of " (:TERM NIL "objects")
       ", usually with common structure, behavior, or purpose. (Note that the expression “"
       (:I NIL "X") " is of type "
       (:PARAM NIL "S" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "a"))))
       "” naturally implies that “" (:I NIL "X") " is of type "
       (:PARAM NIL "S" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "b"))))
       "” if "
       (:PARAM NIL "S" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "a"))))
       " is a " (:TERM NIL "subtype") " of "
       (:PARAM NIL "S" (:MATH NIL (:MSUB NIL (:MROW NIL) (:MI NIL "b"))))
       ".) 2. (immediately following the name of a " (:TERM NIL "type") ") a "
       (:TERM NIL "subtype") " of that " (:TERM NIL "type") ". “The type "
       (:TYPEREF NIL "vector") " is an array type.” " :PAR)
      (:ITEM NIL (:B NIL "type declaration") (:IDXTERM NIL "type declaration")
       " " (:I NIL "n.") " a " (:TERM NIL "declaration")
       " that asserts that every reference to a specified "
       (:TERM NIL "binding") " within the scope of the "
       (:TERM NIL "declaration") " results in some " (:TERM NIL "object")
       " of the specified " (:TERM NIL "type") ". " :PAR)
      (:ITEM NIL (:B NIL "type equivalent") (:IDXTERM NIL "type equivalent")
       " " (:I NIL "adj.") " (of two " (:TERM NIL "types") " "
       (:MATH NIL (:MI NIL "X")) " and " (:MATH NIL (:MI NIL "Y"))
       ") having the same " (:TERM NIL "elements") "; that is, "
       (:MATH NIL (:MI NIL "X")) " is a " (:TERM NIL "subtype") " of "
       (:MATH NIL (:MI NIL "Y")) " and " (:MATH NIL (:MI NIL "Y")) " is a "
       (:TERM NIL "subtype") " of " (:MATH NIL (:MI NIL "X")) ". " :PAR)
      (:ITEM NIL (:B NIL "type expand") (:IDXTERM NIL "type expand") " "
       (:I NIL "n.") " to fully expand a " (:TERM NIL "type specifier")
       ", removing any references to " (:TERM NIL "derived types") ". ("
       (:RM NIL " Common Lisp")
       " provides no program interface to cause this to occur, but the semantics of "
       (:RM NIL " Common Lisp") " are such that every "
       (:TERM NIL "implementation")
       " must be able to do this internally, and some situations involving "
       (:TERM NIL "type specifiers")
       " are most easily described in terms of a fully expanded "
       (:TERM NIL "type specifier") ".) " :PAR)
      (:ITEM NIL (:B NIL "type specifier") (:IDXTERM NIL "type specifier") " "
       (:I NIL "n.") " an " (:TERM NIL "expression") " that denotes a "
       (:TERM NIL "type") ". “The symbol " (:TT NIL "random-state")
       ", the list " (:TT NIL "(integer 3 5)") ", the list "
       (:TT NIL "(and list (not null))") ", and the class named "
       (:TT NIL "standard-class") " are type specifiers.” " :PAR)))
    (:ITEM NIL (:B NIL "U")
     (:LIST NIL
      (:ITEM NIL (:B NIL "unbound") (:IDXTERM NIL "unbound") " "
       (:I NIL "adj.") " not having an associated denotation in a "
       (:TERM NIL "binding") ". See " (:TERM NIL "bound") ". " :PAR)
      (:ITEM NIL (:B NIL "unbound variable") (:IDXTERM NIL "unbound variable")
       " " (:I NIL "n.") " a " (:TERM NIL "name")
       " that is syntactically plausible as the name of a "
       (:TERM NIL "variable") " but which is not " (:TERM NIL "bound")
       " in the " (:TERM NIL "variable") " " (:TERM NIL "namespace") ". " :PAR)
      (:ITEM NIL (:B NIL "undefined function")
       (:IDXTERM NIL "undefined function") " " (:I NIL "n.") " a "
       (:TERM NIL "name") " that is syntactically plausible as the name of a "
       (:TERM NIL "function") " but which is not " (:TERM NIL "bound")
       " in the " (:TERM NIL "function") " " (:TERM NIL "namespace") ". " :PAR)
      (:ITEM NIL (:B NIL "unintern") (:IDXTERM NIL "unintern") " "
       (:I NIL "v.t.") " (a " (:TERM NIL "symbol") " in a "
       (:TERM NIL "package") ") to make the " (:TERM NIL "symbol") " not be "
       (:TERM NIL "present") " in that " (:TERM NIL "package") ". (The "
       (:TERM NIL "symbol") " might continue to be " (:TERM NIL "accessible")
       " by inheritance.) " :PAR)
      (:ITEM NIL (:B NIL "uninterned") (:IDXTERM NIL "uninterned") " "
       (:I NIL "adj.") " (of a " (:TERM NIL "symbol") ") not "
       (:TERM NIL "accessible") " in any " (:TERM NIL "package") "; "
       (:I NIL "i.e.") ",  not " (:TERM NIL "interned") (:SUB NIL "1") ". "
       :PAR)
      (:ITEM NIL (:B NIL "universal time") (:IDXTERM NIL "universal time") " "
       (:I NIL "n.") " " (:TERM NIL "time") ", represented as a non-negative "
       (:TERM NIL "integer") " number of seconds. "
       (:COMMENT NIL "!!! Moon: Universal time is -always- absolute!")
       (:TERM NIL "Absolute") " " (:TERM NIL "universal time")
       " is measured as an offset from the beginning of the year 1900 (ignoring "
       (:TERM NIL "leap seconds") "). See " (:SECREF NIL :UNIVERSAL-TIME) ". "
       :PAR)
      (:ITEM NIL (:B NIL "unqualified method")
       (:IDXTERM NIL "unqualified method") " " (:I NIL "n.") " a "
       (:TERM NIL "method") " with no " (:TERM NIL "qualifiers") ". " :PAR)
      (:ITEM NIL (:B NIL "unregistered package")
       (:IDXTERM NIL "unregistered package") " " (:I NIL "n.") " a "
       (:TERM NIL "package") " " (:TERM NIL "object")
       " that is not present in the " (:TERM NIL "package registry") ". An "
       (:TERM NIL "unregistered package") " has no " (:TERM NIL "name") "; "
       (:I NIL "i.e.") ",  its " (:TERM NIL "name") " is " (:MISC NIL "nil")
       ". See the " (:TERM NIL "function") " " (:FUNREF NIL "delete-package")
       ". " :PAR)
      (:ITEM NIL (:B NIL "unsafe") (:IDXTERM NIL "unsafe") " " (:I NIL "adj.")
       " (of " (:TERM NIL "code") ") not " (:TERM NIL "safe")
       ". (Note that, unless explicitly specified otherwise, if a particular kind of error checking is guaranteed only in a "
       (:TERM NIL "safe")
       " context, the same checking might or might not occur in that context if it were "
       (:TERM NIL "unsafe") "; describing a context as " (:TERM NIL "unsafe")
       " means that certain kinds of error checking are not reliably enabled but does not guarantee that error checking is definitely disabled.) "
       :PAR)
      (:ITEM NIL (:B NIL "unsafe call") (:IDXTERM NIL "unsafe call") " "
       (:I NIL "n.") " a " (:TERM NIL "call") " that is not a "
       (:TERM NIL "safe call") ". For more detailed information, see "
       (:SECREF NIL :SAFE-AND-UNSAFE-CALLS) ". " :PAR)
      (:ITEM NIL (:B NIL "upgrade") (:IDXTERM NIL "upgrade") " "
       (:I NIL "v.t.") " (a declared " (:TERM NIL "type") " to an actual "
       (:TERM NIL "type") ") 1. (when creating an " (:TERM NIL "array")
       ") to substitute an " (:TERM NIL "actual array element type") " for an "
       (:TERM NIL "expressed array element type")
       " when choosing an appropriately " (:TERM NIL "specialized") " "
       (:TERM NIL "array") " representation. See the " (:TERM NIL "function")
       " " (:FUNREF NIL "upgraded-array-element-type") ". 2. (when creating a "
       (:TERM NIL "complex") ") to substitute an "
       (:TERM NIL "actual complex part type") " for an "
       (:TERM NIL "expressed complex part type")
       " when choosing an appropriately " (:TERM NIL "specialized") " "
       (:TERM NIL "complex") " representation. See the " (:TERM NIL "function")
       " " (:FUNREF NIL "upgraded-complex-part-type") ". " :PAR)
      (:ITEM NIL (:B NIL "upgraded array element type")
       (:IDXTERM NIL "upgraded array element type") " " (:I NIL "n.") " (of a "
       (:TERM NIL "type") ") a " (:TERM NIL "type") " that is a "
       (:TERM NIL "supertype") " of the " (:TERM NIL "type")
       " and that is used instead of the " (:TERM NIL "type") " whenever the "
       (:TERM NIL "type") " is used as an " (:TERM NIL "array element type")
       " for object creation or type discrimination. See "
       (:SECREF NIL :ARRAY-UPGRADING) ". " :PAR)
      (:ITEM NIL (:B NIL "upgraded complex part type")
       (:IDXTERM NIL "upgraded complex part type") " " (:I NIL "n.") " (of a "
       (:TERM NIL "type") ") a " (:TERM NIL "type") " that is a "
       (:TERM NIL "supertype") " of the " (:TERM NIL "type")
       " and that is used instead of the " (:TERM NIL "type") " whenever the "
       (:TERM NIL "type") " is used as a " (:TERM NIL "complex part type")
       " for object creation or type discrimination. See the "
       (:TERM NIL "function") " " (:FUNREF NIL "upgraded-complex-part-type")
       ". " :PAR)
      (:ITEM NIL (:B NIL "uppercase") (:IDXTERM NIL "uppercase") " "
       (:I NIL "adj.") " (of a " (:TERM NIL "character") ") being among "
       (:TERM NIL "standard characters")
       " corresponding to the capital letters " (:TT NIL "A") " through "
       (:TT NIL "Z") ", or being some other "
       (:TERM NIL "implementation-defined") " " (:TERM NIL "character")
       " that is defined by the " (:TERM NIL "implementation") " to be "
       (:TERM NIL "uppercase") ". See " (:SECREF NIL :CHARACTERS-WITH-CASE)
       ". " :PAR)
      (:ITEM NIL (:B NIL "use") (:IDXTERM NIL "use") " " (:I NIL "v.t.") " (a "
       (:TERM NIL "package") " "
       (:MATH NIL (:MSUB NIL (:MI NIL "P") (:MN NIL "1"))) ") to "
       (:TERM NIL "inherit") " the " (:TERM NIL "external symbols") " of "
       (:MATH NIL (:MSUB NIL (:MI NIL "P") (:MN NIL "1"))) ". (If a package "
       (:MATH NIL (:MSUB NIL (:MI NIL "P") (:MN NIL "2"))) " uses "
       (:MATH NIL (:MSUB NIL (:MI NIL "P") (:MN NIL "1"))) ", the "
       (:TERM NIL "external symbols") " of "
       (:MATH NIL (:MSUB NIL (:MI NIL "P") (:MN NIL "1"))) " become "
       (:TERM NIL "internal symbols") " of "
       (:MATH NIL (:MSUB NIL (:MI NIL "P") (:MN NIL "2")))
       " unless they are explicitly " (:TERM NIL "exported") ".) “The package "
       (:PACKREF NIL "cl-user") " uses the package " (:PACKREF NIL "cl") ".” "
       :PAR)
      (:ITEM NIL (:B NIL "use list") (:IDXTERM NIL "use list") " "
       (:I NIL "n.") " (of a " (:TERM NIL "package") ") a (possibly empty) "
       (:TERM NIL "list") " associated with each " (:TERM NIL "package")
       " which determines what other " (:TERM NIL "packages")
       " are currently being " (:TERM NIL "used") " by that "
       (:TERM NIL "package") ". " :PAR)
      (:ITEM NIL (:B NIL "user") (:IDXTERM NIL "user") " " (:I NIL "n.")
       " an active entity, typically a human, that invokes or interacts with a "
       (:TERM NIL "program") " at run time, but that is not necessarily a "
       (:TERM NIL "programmer") ". " :PAR)))
    (:ITEM NIL (:B NIL "V")
     (:LIST NIL
      (:ITEM NIL (:B NIL "valid array dimension")
       (:IDXTERM NIL "valid array dimension") " " (:I NIL "n.") " a "
       (:TERM NIL "fixnum") " suitable for use as an " (:TERM NIL "array") " "
       (:TERM NIL "dimension") ". Such a " (:TERM NIL "fixnum")
       " must be greater than or equal to zero, and less than the "
       (:TERM NIL "value") " of " (:CONREF NIL "array-dimension-limit")
       ". When multiple " (:TERM NIL "array") " " (:TERM NIL "dimensions")
       " are to be used together to specify a multi-dimensional "
       (:TERM NIL "array")
       ", there is also an implied constraint that the product of all of the "
       (:TERM NIL "dimensions") " be less than the " (:TERM NIL "value") " of "
       (:CONREF NIL "array-total-size-limit") ". "
       (:ENDISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " " :PAR
       (:ISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " ")
      (:ITEM NIL (:B NIL "valid array index")
       (:IDXTERM NIL "valid array index") " " (:I NIL "n.") " (of an "
       (:TERM NIL "array") ") a " (:TERM NIL "fixnum")
       " suitable for use as one of possibly several indices needed to name an "
       (:TERM NIL "element") " of the " (:TERM NIL "array")
       " according to a multi-dimensional Cartesian coordinate system. Such a "
       (:TERM NIL "fixnum")
       " must be greater than or equal to zero, and must be less than the corresponding "
       (:TERM NIL "dimension") (:SUB NIL "1") " of the " (:TERM NIL "array")
       ". (Unless otherwise explicitly specified, the phrase “a "
       (:TERM NIL "list") " of " (:TERM NIL "valid array indices")
       "” further implies that the " (:TERM NIL "length") " of the "
       (:TERM NIL "list") " must be the same as the " (:TERM NIL "rank")
       " of the " (:TERM NIL "array") ".) “For a " (:TT NIL "2") " by "
       (:TT NIL "3") " array, valid array indices for the first dimension are "
       (:TT NIL "0") " and " (:TT NIL "1")
       ", and valid array indices for the second dimension are " (:TT NIL "0")
       ", " (:TT NIL "1") " and " (:TT NIL "2") ".” "
       (:ENDISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " " :PAR
       (:ISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " ")
      (:ITEM NIL (:B NIL "valid array row-major index")
       (:IDXTERM NIL "valid array row-major index") " " (:I NIL "n.")
       " (of an " (:TERM NIL "array") ", which might have any number of "
       (:TERM NIL "dimensions") (:SUB NIL "2") ") a single "
       (:TERM NIL "fixnum") " suitable for use in naming any "
       (:TERM NIL "element") " of the " (:TERM NIL "array")
       ", by viewing the array's storage as a linear series of "
       (:TERM NIL "elements") " in row-major order. Such a "
       (:TERM NIL "fixnum")
       " must be greater than or equal to zero, and less than the "
       (:TERM NIL "array total size") " of the " (:TERM NIL "array") ". "
       (:ENDISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " " :PAR
       (:ISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " ")
      (:ITEM NIL (:B NIL "valid fill pointer")
       (:IDXTERM NIL "valid fill pointer") " " (:I NIL "n.") " (of an "
       (:TERM NIL "array") ") a " (:TERM NIL "fixnum")
       " suitable for use as a " (:TERM NIL "fill pointer") " for the "
       (:TERM NIL "array") ". Such a " (:TERM NIL "fixnum")
       " must be greater than or equal to zero, and less than or equal to the "
       (:TERM NIL "array total size") " of the " (:TERM NIL "array") ". "
       (:ENDISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " " :PAR
       (:EDITORNOTE NIL
        "KMP: The “valid pathname xxx” definitions were taken from text found in make-pathname, but look wrong to me. I'll fix them later.")
       (:COMMENT NIL "!!!") :PAR
       (:ISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN") " " :PAR)
      (:ITEM NIL (:B NIL "valid logical pathname host")
       (:IDXTERM NIL "valid logical pathname host") " " (:I NIL "n.") " a "
       (:TERM NIL "string") " that has been defined as the name of a "
       (:TERM NIL "logical host") ". See the " (:TERM NIL "function") " "
       (:FUNREF NIL "load-logical-pathname-translations") ". " :PAR)
      (:ITEM NIL (:B NIL "valid pathname device")
       (:IDXTERM NIL "valid pathname device") " " (:I NIL "n.") " a "
       (:TERM NIL "string") ", " (:MISC NIL "nil") ", " (:KWD NIL "unspecific")
       ", or some other " (:TERM NIL "object") " defined by the "
       (:TERM NIL "implementation") " to be a "
       (:TERM NIL "valid pathname device") ". " :PAR)
      (:ITEM NIL (:B NIL "valid pathname directory")
       (:IDXTERM NIL "valid pathname directory") " " (:I NIL "n.") " a "
       (:TERM NIL "string") ", a " (:TERM NIL "list") " of "
       (:TERM NIL "strings") ", " (:MISC NIL "nil") ", "
       (:ISSUE NIL "PATHNAME-SUBDIRECTORY-LIST:NEW-REPRESENTATION") " "
       (:KWD NIL "wild") ", "
       (:ENDISSUE NIL "PATHNAME-SUBDIRECTORY-LIST:NEW-REPRESENTATION") " "
       (:KWD NIL "unspecific") ", or some other " (:TERM NIL "object")
       " defined by the " (:TERM NIL "implementation") " to be a "
       (:TERM NIL "valid directory component") ". " :PAR)
      (:ITEM NIL (:B NIL "valid pathname host")
       (:IDXTERM NIL "valid pathname host") " " (:I NIL "n.") " a "
       (:TERM NIL "valid physical pathname host") " or a "
       (:TERM NIL "valid logical pathname host") ". " :PAR)
      (:ITEM NIL (:B NIL "valid pathname name")
       (:IDXTERM NIL "valid pathname name") " " (:I NIL "n.") " a "
       (:TERM NIL "string") ", " (:MISC NIL "nil") ", " (:KWD NIL "wild") ", "
       (:KWD NIL "unspecific") ", or some other " (:TERM NIL "object")
       " defined by the " (:TERM NIL "implementation") " to be a "
       (:TERM NIL "valid pathname name") ". " :PAR)
      (:ITEM NIL (:B NIL "valid pathname type")
       (:IDXTERM NIL "valid pathname type") " " (:I NIL "n.") " a "
       (:TERM NIL "string") ", " (:MISC NIL "nil") ", " (:KWD NIL "wild") ", "
       (:KWD NIL "unspecific") ". "
       (:COMMENT NIL "!!! Moon: \"... or some other ...\"") :PAR)
      (:ITEM NIL (:B NIL "valid pathname version")
       (:IDXTERM NIL "valid pathname version") " " (:I NIL "n.")
       " a non-negative " (:TERM NIL "integer") ", or one of "
       (:KWD NIL "wild") ", " (:KWD NIL "newest") ", " (:KWD NIL "unspecific")
       ", or " (:MISC NIL "nil") ". "
       (:COMMENT NIL "!!! KMP: \"... or some other ...\""
        "!!! What to do about this?")
       "The symbols " (:KWD NIL "oldest") ", " (:KWD NIL "previous") ", and "
       (:KWD NIL "installed") " are " (:TERM NIL "semi-standard")
       " special version symbols. " :PAR)
      (:ITEM NIL (:B NIL "valid physical pathname host")
       (:IDXTERM NIL "valid physical pathname host") " " (:I NIL "n.")
       " any of a " (:TERM NIL "string") ", a " (:TERM NIL "list") " of "
       (:TERM NIL "strings") ", or the symbol " (:KWD NIL "unspecific")
       ", that is recognized by the implementation as the name of a host. "
       :PAR (:ENDISSUE NIL "PATHNAME-UNSPECIFIC-COMPONENT:NEW-TOKEN") " " :PAR)
      (:ITEM NIL (:B NIL "valid sequence index")
       (:IDXTERM NIL "valid sequence index") " " (:I NIL "n.") " (of a "
       (:TERM NIL "sequence") ") an " (:TERM NIL "integer")
       " suitable for use to name an " (:TERM NIL "element") " of the "
       (:TERM NIL "sequence") ". Such an " (:TERM NIL "integer")
       " must be greater than or equal to zero, and must be less than the "
       (:TERM NIL "length") " of the " (:TERM NIL "sequence") ". "
       (:ISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " (If the "
       (:TERM NIL "sequence") " is an " (:TERM NIL "array") ", the "
       (:TERM NIL "valid sequence index") " is further constrained to be a "
       (:TERM NIL "fixnum") ".) "
       (:ENDISSUE NIL "ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM") " "
       :PAR)
      (:ITEM NIL (:B NIL "value") (:IDXTERM NIL "value") " " (:I NIL "n.")
       " 1. a. one of possibly several " (:TERM NIL "objects")
       " that are the result of an " (:TERM NIL "evaluation")
       ". b. (in a situation where exactly one value is expected from the "
       (:TERM NIL "evaluation") " of a " (:TERM NIL "form") ") the "
       (:TERM NIL "primary value") " returned by the " (:TERM NIL "form")
       ". c. (of " (:TERM NIL "forms") " in an " (:TERM NIL "implicit progn")
       ") one of possibly several " (:TERM NIL "objects")
       " that result from the " (:TERM NIL "evaluation") " of the last "
       (:TERM NIL "form") ", or " (:MISC NIL "nil") " if there are no "
       (:TERM NIL "forms") ". 2. an " (:TERM NIL "object")
       " associated with a " (:TERM NIL "name") " in a " (:TERM NIL "binding")
       ". 3. (of a " (:TERM NIL "symbol") ") the " (:TERM NIL "value")
       " of the " (:TERM NIL "dynamic variable")
       " named by that symbol. 4. an " (:TERM NIL "object")
       " associated with a " (:TERM NIL "key") " in an "
       (:TERM NIL "association list") ", a " (:TERM NIL "property list")
       ", or a " (:TERM NIL "hash table") ". " :PAR)
      (:ITEM NIL (:B NIL "value cell") (:IDXTERM NIL "value cell") " "
       (:I NIL "n.") " " (:I NIL "Trad.") " (of a " (:TERM NIL "symbol")
       ") The " (:TERM NIL "place") " which holds the " (:TERM NIL "value")
       ", if any, of the " (:TERM NIL "dynamic variable") " named by that "
       (:TERM NIL "symbol") ", and which is " (:TERM NIL "accessed") " by "
       (:FUNREF NIL "symbol-value") ". See " (:TERM NIL "cell") ". " :PAR)
      (:ITEM NIL (:B NIL "variable") (:IDXTERM NIL "variable") " "
       (:I NIL "n.") " "
       (:COMMENT NIL
        "% Rewritten per Boyer/Kaufmann/Moore #5 (by X3J13 vote at May 4-5, 1994 meeting)."
        "% -kmp 9-May-94"
        "   %!!! Moon: This is certainly no valid definition, especially when contrasting"
        "   %          the variable namespace with the function namespace."
        "   a \\term{binding} in which a \\term{symbol} is the \\term{name}"
        "   used to refer to an \\term{object}.")
       "a " (:TERM NIL "binding") " in the “variable” " (:TERM NIL "namespace")
       ". See " (:SECREF NIL :SYMBOLS-AS-FORMS) ". " :PAR)
      (:ITEM NIL (:B NIL "vector") (:IDXTERM NIL "vector") " " (:I NIL "n.")
       " a one-dimensional " (:TERM NIL "array") ". " :PAR)
      (:ITEM NIL (:B NIL "vertical-bar") (:IDXTERM NIL "vertical-bar") " "
       (:I NIL "n.") " the " (:TERM NIL "standard character")
       " that is called “vertical bar” (" (:TT NIL "|") "). See "
       (:FIGREF NIL :STD-CHARS-THREE) ". " :PAR)))
    (:ITEM NIL (:B NIL "W")
     (:LIST NIL
      (:ITEM NIL (:B NIL "whitespace") (:IDXTERM NIL "whitespace") " "
       (:I NIL "n.") " 1. one or more " (:TERM NIL "characters")
       " that are either the " (:TERM NIL "graphic") " "
       (:TERM NIL "character") " " (:TT NIL "#\\Space") " or else "
       (:TERM NIL "non-graphic") " characters such as " (:TT NIL "#\\Newline")
       " that only move the print position. 2. a. " (:I NIL "n.") " the "
       (:TERM NIL "syntax type") " of a " (:TERM NIL "character") " that is a "
       (:TERM NIL "token") " separator. For details, see "
       (:SECREF NIL :WHITESPACE-CHARS) ". b. " (:I NIL "adj.") " (of a "
       (:TERM NIL "character") ") having the " (:TERM NIL "whitespace")
       (:SUB NIL "2a") " " (:TERM NIL "syntax type") (:SUB NIL "2") ". c. "
       (:I NIL "n.") " a " (:TERM NIL "whitespace") (:SUB NIL "2b") " "
       (:TERM NIL "character") ". " :PAR)
      (:ITEM NIL (:B NIL "wild") (:IDXTERM NIL "wild") " " (:I NIL "adj.")
       " 1. (of a " (:TERM NIL "namestring") ") using an "
       (:TERM NIL "implementation-defined")
       " syntax for naming files, which might “match” any of possibly several possible "
       (:TERM NIL "filenames")
       ", and which can therefore be used to refer to the aggregate of the "
       (:TERM NIL "files") " named by those " (:TERM NIL "filenames")
       ". 2. (of a " (:TERM NIL "pathname")
       ") a structured representation of a name which might “match” any of possibly several "
       (:TERM NIL "pathnames")
       ", and which can therefore be used to refer to the aggregate of the "
       (:TERM NIL "files") " named by those " (:TERM NIL "pathnames")
       ". The set of " (:TERM NIL "wild") " " (:TERM NIL "pathnames")
       " includes, but is not restricted to, " (:TERM NIL "pathnames")
       " which have a component which is " (:KWD NIL "wild")
       ", or which have a directory component which contains "
       (:KWD NIL "wild") " or " (:KWD NIL "wild-inferors") ". See the "
       (:TERM NIL "function") " " (:FUNREF NIL "wild-pathname-p") ". "
       (:COMMENT NIL
        "!!! Need to fix this.  Some places use wild to refer to components instead of full pathnames."
        "   3. (of a \\term{pathname} component)"
        "      a component of a \\term{pathname} that might ``match'' any of possibly "
        "      several values for that component, and which can"
        "      therefore be used to refer to the aggregate of the \\term{files} named by those"
        "      \\term{pathnames}.  The set of \\term{wild} \\term{pathnames} includes, but"
        "      is not restricted to, \\term{pathnames} which have a component which is"
        "      \\kwd{wild}, or which have a directory component which contains \\kwd{wild} "
        "      or \\kwd{wild-inferors}." "      \\Seefun{wild-pathname-p}.")
       :PAR)
      (:ITEM NIL (:B NIL "write") (:IDXTERM NIL "write") " " (:I NIL "v.t.")
       " " (:ISSUE NIL "IGNORE-USE-TERMINOLOGY:VALUE-ONLY") " 1. (a "
       (:TERM NIL "binding") " or " (:TERM NIL "slot")
       " or component) to change the " (:TERM NIL "value") " of the "
       (:TERM NIL "binding") " or " (:TERM NIL "slot") ". "
       (:ENDISSUE NIL "IGNORE-USE-TERMINOLOGY:VALUE-ONLY") " 2. (an "
       (:TERM NIL "object") " to a " (:TERM NIL "stream")
       ") to output a representation of the " (:TERM NIL "object") " to the "
       (:TERM NIL "stream") ". " :PAR)
      (:ITEM NIL (:B NIL "writer") (:IDXTERM NIL "writer") " " (:I NIL "n.")
       " a " (:TERM NIL "function") " that " (:TERM NIL "writes")
       (:SUB NIL "1") " a " (:TERM NIL "variable") " or " (:TERM NIL "slot")
       ". " :PAR)))
    (:ITEM NIL (:B NIL "Y")
     (:LIST NIL
      (:ITEM NIL (:B NIL "yield") (:IDXTERM NIL "yield") " " (:I NIL "v.t.")
       " (" (:TERM NIL "values") ") to produce the " (:TERM NIL "values")
       " as the result of " (:TERM NIL "evaluation") ". “The form "
       (:TT NIL "(+ 2 3)") " yields " (:TT NIL "5") ".” " :PAR))
     " "))
   " ")
  :PAR)
 (:CHAPTER (:NUM "A" :TITLE ("Appendix") :NUMTAG :CHAP-A :NAMETAG :APPENDIX)
  (:SECTION (:TITLE ("Removed Language Features") :TAGS (:REMOVED-FEATURES))
   " " :PAR
   (:SUBSECTION (:TITLE ("Requirements for removed and deprecated features"))
    (:ISSUE NIL "DEPRECATION-POSITION:LIMITED")
    " For this standard, some features from the language described in "
    (:BIB
     (:URL "https://www.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html" :ISBN
      "1-55558-041-6")
     "Common Lisp: The Language")
    " have been removed, and others have been deprecated (and will most likely not appear in future "
    (:RM NIL " Common Lisp")
    " standards). Which features were removed and which were deprecated was decided on a case-by-case basis by the X3J13 committee. "
    :PAR (:TERM NIL "Conforming implementations")
    " that wish to retain any removed features for compatibility must assure that such compatibility does not interfere with the correct function of "
    (:TERM NIL "conforming programs")
    ". For example, symbols corresponding to the names of removed functions may not appear in the the "
    (:PACKREF NIL "common-lisp") " " (:TERM NIL "package")
    ". (Note, however, that this specification has been devised in such a way that there can be a package named "
    (:TT NIL "LISP") " which can contain such symbols.) " :PAR
    (:TERM NIL "Conforming implementations")
    " must implement all deprecated features. For a list of deprecated features, see "
    (:SECREF NIL :DEPRECATED-FEATURES) ". "
    (:ENDISSUE NIL "DEPRECATION-POSITION:LIMITED") " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Removed Types"))
    (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " The " (:TERM NIL "type") " "
    (:TT NIL "string-char") (:IDXCODE NIL "string-char") " was removed. "
    (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Removed Operators")) "The functions "
    (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " (:TT NIL "int-char")
    (:IDXCODE NIL "int-char") ", " (:TT NIL "char-bits")
    (:IDXCODE NIL "char-bits") ", " (:TT NIL "char-font")
    (:IDXCODE NIL "char-font") ", " (:TT NIL "make-char")
    (:IDXCODE NIL "make-char") ", " (:TT NIL "char-bit")
    (:IDXCODE NIL "char-bit") ", " (:TT NIL "set-char-bit")
    (:IDXCODE NIL "set-char-bit") ", " (:TT NIL "string-char-p")
    (:IDXCODE NIL "string-char-p") ", "
    (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1")
    (:ISSUE NIL "COMMON-TYPE:REMOVE") " and " (:TT NIL "commonp")
    (:IDXCODE NIL "commonp") " " (:ENDISSUE NIL "COMMON-TYPE:REMOVE")
    (:ISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-AGAIN:X3J13-DEC-91") " "
    (:ISSUE NIL "REQUIRE-PATHNAME-DEFAULTS:ELIMINATE") " "
    (:COMMENT NIL "\\f{provide}," "and \\f{require} ")
    (:ENDISSUE NIL "REQUIRE-PATHNAME-DEFAULTS:ELIMINATE")
    (:ENDISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-AGAIN:X3J13-DEC-91")
    " were removed. " :PAR (:ISSUE NIL "COMPILER-LET-CONFUSION:ELIMINATE")
    " The " (:TERM NIL "special operator") " " (:TT NIL "compiler-let")
    " was removed. " (:ENDISSUE NIL "COMPILER-LET-CONFUSION:ELIMINATE") " "
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Removed Argument Conventions"))
    (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " The " (:PARAM NIL "font")
    " argument to " (:FUNREF NIL "digit-char") (:IDXREF NIL "digit-char")
    " was removed. The " (:PARAM NIL "bits") " and " (:PARAM NIL "font")
    " arguments to " (:FUNREF NIL "code-char") (:IDXREF NIL "code-char")
    " were removed. " (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " :PAR
    (:ISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-YET-AGAIN:RESTORE-ARGUMENT") " "
    (:ISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-AGAIN:X3J13-DEC-91") " "
    (:COMMENT NIL
     "The \\param{pathname} argument to \\funref{require}\\idxref{require} was removed.")
    (:ENDISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-AGAIN:X3J13-DEC-91") " "
    (:ENDISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-YET-AGAIN:RESTORE-ARGUMENT") " "
    :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Removed Variables")) "The variables "
    (:ISSUE NIL "CHARACTER-PROPOSAL:2-1-1") " " (:TT NIL "char-font-limit")
    (:IDXCODE NIL "char-font-limit") ", " (:TT NIL "char-bits-limit")
    (:IDXCODE NIL "char-bits-limit") ", " (:TT NIL "char-control-bit")
    (:IDXCODE NIL "char-control-bit") ", " (:TT NIL "char-meta-bit")
    (:IDXCODE NIL "char-meta-bit") ", " (:TT NIL "char-super-bit")
    (:IDXCODE NIL "char-super-bit") ", " (:TT NIL "char-hyper-bit")
    (:IDXCODE NIL "char-hyper-bit") ", "
    (:ENDISSUE NIL "CHARACTER-PROPOSAL:2-1-1")
    (:ISSUE NIL "BREAK-ON-WARNINGS-OBSOLETE:REMOVE") " and "
    (:TT NIL "*break-on-warnings*") (:IDXCODE NIL "*break-on-warnings*") " "
    (:ENDISSUE NIL "BREAK-ON-WARNINGS-OBSOLETE:REMOVE") " "
    (:ISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-AGAIN:X3J13-DEC-91") " "
    (:COMMENT NIL "and") (:ISSUE NIL "REQUIRE-PATHNAME-DEFAULTS:ELIMINATE") " "
    (:COMMENT NIL "\\f{*modules*}")
    (:ENDISSUE NIL "REQUIRE-PATHNAME-DEFAULTS:ELIMINATE") " "
    (:ENDISSUE NIL "REQUIRE-PATHNAME-DEFAULTS-AGAIN:X3J13-DEC-91")
    " were removed. " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Removed Reader Syntax")) "The “" (:TT NIL "#,") "” "
    (:TERM NIL "reader macro") " in " (:TERM NIL "standard syntax")
    " was removed. " :PAR)
   :PAR
   (:SUBSECTION (:TITLE ("Packages No Longer Required")) "The "
    (:TERM NIL "packages") " " (:PACKREF NIL "lisp") (:IDXPACKREF NIL "lisp")
    ", " (:PACKREF NIL "user") (:IDXPACKREF NIL "user") ", and "
    (:PACKREF NIL "system") (:IDXPACKREF NIL "system")
    " are no longer required. It is valid for " (:TERM NIL "packages")
    " with one or more of these names to be provided by a "
    (:TERM NIL "conforming implementation") " as extensions. " :PAR))
  :PAR
  (:COMMENT NIL
   " What about deprecated features? see CHAP-A-4-DEPRECATED? -kmp 27-Sep-90")
  :PAR)
 (:ERRATA NIL
  (:ERRATUM
   (:KIND :TEXT :FROM
    "Webster's Third New International Dictionary the English Language, Unabridged"
    :TO
    "Webster's Third New International Dictionary of the English Language, Unabridged"
    :COUNT 3)
   "The \\WebstersDictionary bibliography title (setup-terms.tex) drops the 'of' of the real title.")
  (:ERRATUM
   (:KIND :TEXT :FROM "the the " :TO "the " :COUNT 2 :IN (:CHAPTER "2"))
   "Doubled words: 'a symbol in the the keyword package' in the symbol-syntax examples table, and ';;; FIB computes the the Fibonacci function' in the FIB code example's comment.")
  (:ERRATUM
   (:KIND :REF :FROM (:MACREF "destruct") :TO (:MACREF "defstruct") :IN
    (:CHAPTER "3"))
   "Spec typo: 'how destruct processes' (3.4.4) both mean defstruct; no operator destruct exists.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "x") :TO (:TT "x") :COUNT 3 :IN (:CHAPTER "3"))
   "The declaration-scope walkthrough in 3.3.4 three times marks the variable x as a glossary term; its other mentions there are \\f{x}.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "funcall") :TO (:FUNREF "funcall") :IN
    (:CHAPTER "3"))
   "3.1.2.1.2.4 (Lambda Forms) marks the function funcall as a glossary term.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "implemention-dependent") :TO
    (:TERM "implementation-dependent") :COUNT 2 :IN (:CHAPTER "3"))
   "The boa-constructor examples in 3.4.6 twice misspell the glossary term implementation-dependent (as the value of slot E in the #S(FOO ...) results).")
  (:ERRATUM
   (:KIND :REF :FROM (:MACREF "let") :TO (:SPECREF "let") :COUNT 2 :IN
    (:CHAPTER "3"))
   "let is a special operator, marked \\macref in the Declaration Scope section.")
  (:ERRATUM
   (:KIND :REF :FROM (:SPECREF "handler-case") :TO (:MACREF "handler-case") :IN
    (:CHAPTER "3"))
   "handler-case is a macro, marked \\specref in the lambda-list kinds table.")
  (:ERRATUM
   (:KIND :REF :FROM (:SPECREF "restart-case") :TO (:MACREF "restart-case") :IN
    (:CHAPTER "3"))
   "restart-case is a macro, marked \\specref in the lambda-list kinds table.")
  (:ERRATUM
   (:KIND :REF :FROM (:MACREF "macrolet") :TO (:SPECREF "macrolet") :COUNT 3
    :IN (:CHAPTER "3"))
   "macrolet is a special operator, marked \\macref in the lambda-list kinds table (and twice more in chapter 3; same defect).")
  (:ERRATUM
   (:KIND :REF :FROM (:MACREF "destruct") :TO (:MACREF "defstruct") :IN
    (:CHAPTER "4"))
   "Spec typo: 'the :include option of destruct' (4.3) both mean defstruct; no operator destruct exists.")
  (:ERRATUM
   (:KIND :PROP :FROM (:COM :FTYPE "Special Form") :TO "Special Operator" :IN
    (:CHAPTER "5"))
   "setq's header is the only one reading 'Special Form'; the spec's term (and every other entry's header) is Special Operator.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "hash-table") :TO (:TYPEREF "hash-table") :IN
    (:CHAPTER "6"))
   "6.1.2.1.4 says loop's hash-table subclause 'iterates over the ... of a hash-table'; hyphenated it names the type, so link it as one.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "signaling") :TO (:TERM "signaling") :IN
    (:CHAPTER "9"))
   "'... signaling the same condition object again' marks the glossary term signaling as a function reference.")
  (:ERRATUM
   (:KIND :TEXT :FROM ":operator '/" :TO ":operation '/" :COUNT 2 :IN
    (:CHAPTER "9"))
   "9.1.2.1's arithmetic-error examples use the nonexistent :operator initarg for :operation.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "print-unreadable-object") :TO
    (:MACREF "print-unreadable-object") :IN (:CHAPTER "9"))
   "print-unreadable-object is a macro, marked \\funref in the Printing Conditions section.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "define-setf-method") :TO
    (:MACREF "define-setf-expander") :IN (:CHAPTER "11"))
   "Stale pre-X3J13-renaming name: define-setf-method became define-setf-expander (a macro).")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "define-method-combination") :TO
    (:MACREF "define-method-combination") :IN (:CHAPTER "11"))
   "define-method-combination is a macro, marked \\funref in the COMMON-LISP package constraints list.")
  (:ERRATUM
   (:KIND :REF :FROM (:SPECREF "declaim") :TO (:MACREF "declaim") :IN
    (:CHAPTER "11"))
   "declaim is a macro, marked \\specref in the COMMON-LISP package constraints list.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "defsetf") :TO (:MACREF "defsetf") :IN
    (:CHAPTER "11"))
   "defsetf is a macro, marked \\funref in the COMMON-LISP package constraints list.")
  (:ERRATUM
   (:KIND :TEXT :FROM "whether are not they are" :TO "whether or not they are"
    :IN (:CHAPTER "13"))
   "13.1.4: 'whether are not they are' for 'whether or not they are'.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "*default-pathname-defaults*") :TO
    (:VARREF "*default-pathname-defaults*") :COUNT 2 :IN (:CHAPTER "19"))
   "*default-pathname-defaults* is a variable, marked \\funref in the Merging Pathnames section (and once more elsewhere in chapter 19; same defect).")
  (:ERRATUM
   (:KIND :REF :FROM (:MACREF "with-output-from-string") :TO
    (:MACREF "with-output-to-string") :COUNT 2 :IN (:CHAPTER "21"))
   "Spec typo: no with-output-from-string exists; both the See Also line and the Notes of read-from-string mean with-output-to-string.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "echo-stream-ouput-stream") :TO
    (:FUNREF "echo-stream-output-stream") :IN (:CHAPTER "21"))
   "Spec typo for echo-stream-output-stream in the stream-related function display table.")
  (:ERRATUM
   (:KIND :NODE :FROM
    (:ROW NIL (:CELL NIL (:FUNREF NIL " y-or-n-p"))
     (:CELL NIL (:FUNREF NIL "yes-or-no-p")) (:CELL NIL))
    :TO
    (:ROW NIL (:CELL NIL (:FUNREF NIL " y-or-n-p"))
     (:CELL NIL (:FUNREF NIL "yes-or-no-p")))
    :IN (:CHAPTER "21"))
   "Figure 21-4 uses \\displaythree for two items (y-or-n-p&yes-or-no-p&\\cr), leaving a phantom third column; drop the empty trailing cell.")
  (:ERRATUM
   (:KIND :PROP :FROM (:COM :FTYPE "macro") :TO "Macro" :IN (:CHAPTER "21"))
   "with-open-file's header has lowercase 'macro'.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "with-input-from-string") :TO
    (:MACREF "with-input-from-string") :IN (:CHAPTER "21"))
   "with-input-from-string is a macro, marked \\funref in the Other Subclasses of Stream table.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "with-output-to-string") :TO
    (:MACREF "with-output-to-string") :IN (:CHAPTER "21"))
   "with-output-to-string is a macro, marked \\funref in the Other Subclasses of Stream table.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "pprint dispatch functions") :TO
    (:MISC "pprint dispatch functions") :IN (:CHAPTER "22"))
   "Four words of prose wrapped in a function reference; :misc keeps the rendering but resolves silently.")
  (:ERRATUM
   (:KIND :TEXT :FROM "returned by the the " :TO "returned by the " :IN
    (:CHAPTER "22"))
   "Doubled word in 22.2.1.3: 'a function that was returned by the the formatter macro'. Matched with the leading words so the print-unreadable-object patch above cannot collide with it.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "pprint-logical-block") :TO
    (:MACREF "pprint-logical-block") :COUNT 4 :IN (:CHAPTER "22"))
   "pprint-logical-block is a macro, marked \\funref in the Tilde Less-Than-Sign format section (and three more times elsewhere in chapter 22; same defect).")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "lispm") :TO (:TT "lispm") :IN (:CHAPTER "24"))
   "24.1.2.1.1 marks the feature name lispm as a glossary term; its neighbors spice and perq in the same sentence are \\f{...} code.")
  (:ERRATUM
   (:KIND :PROP :FROM (:COM :FTYPE "function") :TO "Function" :IN
    (:CHAPTER "25"))
   "encode-universal-time's header has lowercase 'function'; every other function entry reads 'Function'.")
  (:ERRATUM (:KIND :TEXT :FROM "recieves" :TO "receives" :IN (:CHAPTER "26"))
   "Spelling in the glossary entry for supplied-p parameter.")
  (:ERRATUM (:KIND :TEXT :FROM "of of " :TO "of " :IN (:CHAPTER "26"))
   "Doubled word in the glossary entry for em.")
  (:ERRATUM (:KIND :TEXT :FROM "the the " :TO "the " :IN (:CHAPTER "26"))
   "Doubled word in the glossary entry for safe.")
  (:ERRATUM
   (:KIND :TEXT :FROM "the the " :TO "the " :IN (:COM "*load-pathname*"))
   "Doubled word: 'denoted by the the first argument to load'.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "readtable") :TO (:TYPEREF "readtable") :IN
    (:COM "*readtable*"))
   "readtable is a system class, marked \\funref in *readtable*'s See Also.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "fill-pointer") :TO (:TERM "fill pointer") :IN
    (:COM "adjust-array"))
   "adjust-array's Description hyphenates the glossary term fill pointer.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "array-dimension-limit") :TO
    (:CONREF "array-dimension-limit") :IN (:COM "adjust-array"))
   "array-dimension-limit is a constant variable, marked \\funref in adjust-array's See Also.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "array-total-size-limit") :TO
    (:CONREF "array-total-size-limit") :IN (:COM "adjust-array"))
   "array-total-size-limit is a constant variable, marked \\funref in adjust-array's See Also.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "check-type") :TO (:MACREF "check-type") :IN
    (:COM "assert"))
   "check-type is a macro, marked \\funref in assert's See Also.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "assert") :TO (:MACREF "assert") :COUNT 2 :IN
    (:COM "assert"))
   "assert is a macro, marked \\funref twice in its own description.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "bound") :TO (:FUNREF "boundp") :IN
    (:COM "boundp"))
   "boundp's Notes refer to 'the function bound'.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "interactive-stream-p") :TO
    (:FUNREF "interactive-stream-p") :IN (:COM "broadcast-stream"))
   "broadcast-stream's Description marks the function interactive-stream-p as a glossary term.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "make-method") :TO (:MACREF "make-method") :COUNT
    5 :IN (:COM "call-method"))
   "make-method is a local macro, marked \\funref five times in the call-method, make-method entry.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "define-method-combination") :TO
    (:MACREF "define-method-combination") :IN (:COM "call-next-method"))
   "define-method-combination is a macro, marked \\funref in call-next-method's Affected By.")
  (:ERRATUM
   (:KIND :REF :FROM (:PARAM "arg") :TO (:PARAM "args") :IN
    (:COM "call-next-method"))
   "call-next-method's Arguments and Values labels the &rest parameter arg; the Syntax declares it args.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "char-code-limit") :TO
    (:CONREF "char-code-limit") :IN (:COM "char-code"))
   "char-code-limit is a constant variable, marked \\funref in char-code's See Also.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "check-type") :TO (:MACREF "check-type") :IN
    (:COM "check-type"))
   "check-type is a macro, marked \\funref in its own description.")
  (:ERRATUM
   (:KIND :TEXT :FROM " – " :TO "—" :IN (:COM "concatenated-stream-streams"))
   "concatenated-stream-streams' parameter uses an en dash.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "with-slots") :TO (:MACREF "with-slots") :IN
    (:COM "condition"))
   "condition's Description marks the macro with-slots as a glossary term.")
  (:ERRATUM
   (:KIND :REF :FROM (:MACREF "make-condition") :TO (:FUNREF "make-condition")
    :IN (:COM "condition"))
   "make-condition is a function, marked \\macref in condition's description.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "defstruct") :TO (:MACREF "defstruct") :IN
    (:COM "copy-structure"))
   "defstruct is a macro, marked \\funref in copy-structure's See Also.")
  (:ERRATUM
   (:KIND :REF :FROM (:KWD "init-form") :TO (:KWD "initform") :IN
    (:COM "defclass"))
   "defclass's Arguments and Values hyphenates the slot option :initform as the nonexistent :init-form.")
  (:ERRATUM
   (:KIND :TEXT :FROM "unspecifed" :TO "unspecified" :IN
    (:COM "define-condition"))
   "Spelling in define-condition's report-function description.")
  (:ERRATUM
   (:KIND :TEXT :FROM " – " :TO "—" :COUNT 3 :IN (:COM "define-condition"))
   "define-condition's Slot-spec, Slot-name and Option parameters use en dashes.")
  (:ERRATUM
   (:KIND :REF :FROM (:MACREF "multiple-value-prog1") :TO
    (:SPECREF "multiple-value-prog1") :IN (:COM "define-method-combination"))
   "multiple-value-prog1 is a special operator, not a macro, in define-method-combination's description.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "call-method") :TO (:MACREF "call-method") :COUNT
    4 :IN (:COM "define-method-combination"))
   "call-method is a local macro, marked \\funref in define-method-combination (its description and See Also; the commit fixed three of the four, all the same defect).")
  (:ERRATUM
   (:KIND :REF :FROM (:DECLREF "satisfies") :TO (:TYPEREF "satisfies") :IN
    (:COM "deftype"))
   "satisfies is a type specifier, marked \\declref in deftype's description.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "deftype") :TO (:MACREF "deftype") :COUNT 2 :IN
    (:COM "deftype"))
   "deftype is a macro, marked \\funref twice in its own description.")
  (:ERRATUM
   (:KIND :REF :FROM (:TT "(setf documentation)") :TO
    (:FUNREF "(setf documentation)") :IN (:COM "documentation"))
   "documentation's description writes (setf documentation) as plain code; it names the setf accessor.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "output-stream") :TO (:PARAM "output-stream") :IN
    (:COM "echo-stream-input-stream"))
   "The echo-stream accessors mark the parameter output-stream as a function reference.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "pathspec") :TO (:PARAM "pathspec") :IN
    (:COM "ensure-directories-exist"))
   "ensure-directories-exist's Description marks the parameter pathspec as a glossary term.")
  (:ERRATUM
   (:KIND :NODE :FROM (:KEYWORD NIL " Method-combination") :TO
    (:PARAM NIL "method-combination") :IN (:COM "ensure-generic-function"))
   "ensure-generic-function marks the method-combination parameter with {\\keyword ...} (code, and miscapitalized) instead of \\param.")
  (:ERRATUM
   (:KIND :NODE :FROM (:KEYWORD NIL " Environment") :TO
    (:PARAM NIL "environment") :IN (:COM "ensure-generic-function"))
   "ensure-generic-function marks the environment parameter with {\\keyword ...} instead of \\param.")
  (:ERRATUM
   (:KIND :TEXT :FROM " – " :TO "—" :COUNT 2 :IN
    (:COM "ensure-generic-function"))
   "ensure-generic-function's method-combination and environment parameters use en dashes.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "hash-tables") :TO (:TERM "hash tables") :IN
    (:COM "equalp"))
   "equalp's Description hyphenates the glossary term hash table (plural; resolves via stemming).")
  (:ERRATUM
   (:KIND :TEXT :FROM "(if (error \"pushing the button would be stupid.\"))"
    :TO "(error \"pushing the button would be stupid.\")" :IN (:COM "error"))
   "The wargames:no-win-scenario example wraps the error call in a one-armed if with nothing in the then position; the call should stand alone.")
  (:ERRATUM
   (:KIND :TEXT :FROM "(file-author s)" :TO "(file-author stream)" :IN
    (:COM "file-author"))
   "file-author's example binds stream but calls (file-author s).")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "errorp") :TO (:PARAM "errorp") :IN
    (:COM "find-class"))
   "find-class's Description marks the parameter errorp as a glossary term.")
  (:ERRATUM (:KIND :TEXT :FROM " – " :TO "—" :IN (:COM "find-class"))
   "find-class's environment parameter uses an en dash.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "type-specifier") :TO (:TERM "type specifier") :IN
    (:COM "function"))
   "function (the type)'s Description hyphenates the glossary term type specifier.")
  (:ERRATUM
   (:KIND :REF :FROM (:DECLREF "values") :TO (:TYPEREF "values") :IN
    (:COM "function"))
   "the values type specifier, marked \\declref in the function system class description.")
  (:ERRATUM
   (:KIND :REF :FROM (:DECLREF "function") :TO (:TYPEREF "function") :IN
    (:COM "function"))
   "the function type specifier, marked \\declref in the function system class description.")
  (:ERRATUM
   (:KIND :REF :FROM (:MACREF "getf") :TO (:FUNREF "getf") :IN (:COM "getf"))
   "getf is an accessor, marked \\macref in its Notes.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "handler-function") :TO (:PARAM "handler-function")
    :IN (:COM "handler-bind"))
   "handler-bind's Description says each handler form 'should evaluate to a handler-function'; no such glossary entry or parameter exists, so render it as a metavariable like the entry's actual parameters.")
  (:ERRATUM
   (:KIND :TEXT :FROM "(setq #1# temp)" :TO "(setq #2# temp)" :IN
    (:COM "handler-case"))
   "handler-case's expansion sketch stores the condition into the block name #1# instead of the variable #2#, which the handler bodies then read.")
  (:ERRATUM (:KIND :TEXT :FROM "the the " :TO "the " :IN (:COM "in-package"))
   "Doubled word: 'Causes the the package named by name'.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "most-negative-fixnum") :TO
    (:CONREF "most-negative-fixnum") :IN (:COM "integer"))
   "most-negative-fixnum is a constant variable, marked \\funref in integer's Notes.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "most-positive-fixnum") :TO
    (:CONREF "most-positive-fixnum") :IN (:COM "integer"))
   "most-positive-fixnum is a constant variable, marked \\funref in integer's Notes.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "satifies the test") :TO
    (:TERM "satisfies the test") :IN (:COM "intersection"))
   "intersection's Description misspells satisfies; the same entry writes \\term{satisfy the test} correctly two lines later.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "invoke-restart") :TO (:FUNREF "invoke-restart")
    :IN (:COM "invoke-restart"))
   "invoke-restart's Notes wrap its own name in \\term{} instead of a function reference.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "keyword") :TO (:TYPEREF "keyword") :IN
    (:COM "keywordp"))
   "keyword is a type, marked \\funref in keywordp's See Also.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "object") :TO (:PARAM "object") :IN
    (:COM "ldiff"))
   "ldiff/tailp's Description marks the parameter object as a function reference.")
  (:ERRATUM
   (:KIND :REF :FROM (:MACREF "finally") :TO (:LOOPREF "finally") :IN
    (:COM "loop-finish"))
   "loop-finish marks the loop keyword finally as a macro reference.")
  (:ERRATUM
   (:KIND :TEXT :FROM "(gamma ,x ,y)) → EPSILON" :TO "(gamma ,x ,y)) → DELTA"
    :IN (:COM "macroexpand"))
   "Defining macro delta returns DELTA, not EPSILON, in macroexpand's examples.")
  (:ERRATUM
   (:KIND :TEXT :FROM "rehash-theshold" :TO "rehash-threshold" :IN
    (:COM "make-hash-table"))
   "Misspelled rehash-threshold.")
  (:ERRATUM
   (:KIND :NODE :FROM (:PART (:NAME "Examples") " " :PAR) :TO
    (:PART (:NAME "Examples" :NONE T) " " :PAR) :IN
    (:COM "make-instances-obsolete"))
   "make-instances-obsolete's Examples section is empty (\\label Examples:: with no body) rather than \\None.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "element-type") :TO (:PARAM "element-type") :IN
    (:COM "make-string-output-stream"))
   "make-string-output-stream's Description marks the parameter element-type as a glossary term.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "make-symbol") :TO (:FUNREF "make-symbol") :IN
    (:COM "make-symbol"))
   "make-symbol's Description wraps its own name in \\term{} instead of a function reference.")
  (:ERRATUM (:KIND :TEXT :FROM " – " :TO "—" :IN (:COM "map"))
   "map's result-type parameter uses an en dash.")
  (:ERRATUM
   (:KIND :TEXT :FROM " – " :TO "—" :COUNT 3 :IN (:COM "no-next-method"))
   "no-next-method's parameter descriptions use en dashes; the convention is em dash.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "with-open-file") :TO (:MACREF "with-open-file")
    :IN (:COM "open"))
   "with-open-file is a macro, marked \\funref in open's See Also.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "reader-error") :TO (:TYPEREF "reader-error") :IN
    (:COM "parse-error"))
   "reader-error is a condition type, marked \\funref in parse-error's See Also.")
  (:ERRATUM
   (:KIND :TEXT :FROM "possibly, but necessarily" :TO
    "possibly, but not necessarily" :IN (:COM "pop"))
   "Missing 'not' in pop's Description.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "start") :TO (:PARAM "start") :IN
    (:COM "position"))
   "position's Description marks the parameter start as a glossary term.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "end") :TO (:PARAM "end") :IN (:COM "position"))
   "position's Description marks the parameter end as a glossary term.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "from-end") :TO (:PARAM "from-end") :IN
    (:COM "position"))
   "position's Description marks the parameter from-end as a glossary term.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "pprint-dispatch-table") :TO
    (:TERM "pprint dispatch table") :IN (:COM "pprint-dispatch"))
   "pprint-dispatch's Description hyphenates the glossary term pprint dispatch table.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "pprint-if-list-exhausted") :TO
    (:MACREF "pprint-exit-if-list-exhausted") :IN
    (:COM "pprint-exit-if-list-exhausted"))
   "pprint-exit-if-list-exhausted's own entry drops the 'exit-' from its name (and it is a local macro, not a function).")
  (:ERRATUM
   (:KIND :REF :FROM (:KWD "pre-line-prefix") :TO (:KWD "per-line-prefix")
    :COUNT 2 :IN (:COM "pprint-logical-block"))
   "pprint-logical-block twice calls its :per-line-prefix argument :pre-line-prefix.")
  (:ERRATUM
   (:KIND :REF :FROM (:VARREF "*print-miser*") :TO
    (:VARREF "*print-miser-width*") :IN (:COM "pprint-newline"))
   "pprint-newline's See Also abbreviates *print-miser-width* to the nonexistent *print-miser*.")
  (:ERRATUM
   (:KIND :REF :FROM (:MACREF "pprint-fill") :TO (:FUNREF "pprint-fill") :IN
    (:COM "print-object"))
   "pprint-fill is a function, marked \\macref in print-object's description.")
  (:ERRATUM
   (:KIND :TEXT :FROM "the the " :TO "the " :IN
    (:COM "print-unreadable-object"))
   "Doubled word: 'enclosed in the the angle brackets'.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "print-unreadable-object") :TO
    (:MACREF "print-unreadable-object") :IN (:COM "print-unreadable-object"))
   "print-unreadable-object is a macro, marked \\funref in its own Exceptional Situations.")
  (:ERRATUM (:KIND :TEXT :FROM " – " :TO "—" :IN (:COM "read-char-no-hang"))
   "read-char-no-hang's input-stream parameter uses an en dash.")
  (:ERRATUM
   (:KIND :TEXT :FROM "it is used is used " :TO "it is used " :IN
    (:COM "reduce"))
   "Doubled phrase in reduce's :key description.")
  (:ERRATUM
   (:KIND :REF :FROM (:MACREF "get") :TO (:FUNREF "get") :IN (:COM "remprop"))
   "get is a function, marked \\macref in remprop's Notes.")
  (:ERRATUM
   (:KIND :REF :FROM (:MACREF "remprop") :TO (:FUNREF "remprop") :COUNT 2 :IN
    (:COM "remprop"))
   "remprop is a function, marked \\macref twice in its own description.")
  (:ERRATUM
   (:KIND :TEXT :FROM "Enter a new ice cream: " :TO "Enter a new value: " :IN
    (:COM "restart-case"))
   "The verify-or-fix-perfect-sundae transcript shows a prompt that does not match the example's read-new-value function, which prints 'Enter a new value: '.")
  (:ERRATUM
   (:KIND :REF :FROM (:PARAM "start-end") :TO (:PARAM "from-end") :IN
    (:COM "search"))
   "search's Description names the nonexistent parameter start-end; the parameter is from-end.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "type-specifier") :TO (:PARAM "type-specifier") :IN
    (:COM "set-pprint-dispatch"))
   "set-pprint-dispatch's Description marks the parameter type-specifier as a glossary term.")
  (:ERRATUM
   (:KIND :TEXT :FROM "(find-symbol 'car 'temp)" :TO
    "(find-symbol \"CAR\" 'temp)" :COUNT 2 :IN (:COM "shadow"))
   "find-symbol takes a string, not a symbol; shadow's example passes 'car twice.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "simple-condition") :TO
    (:TYPEREF "simple-condition") :IN (:COM "simple-condition-format-control"))
   "simple-condition is a condition type, marked \\funref in the simple-condition-format-* See Also.")
  (:ERRATUM (:KIND :TEXT :FROM " – " :TO "—" :IN (:COM "slot-makunbound"))
   "slot-makunbound's instance parameter uses an en dash.")
  (:ERRATUM
   (:KIND :TEXT :FROM "Slot-name" :TO "slot-name" :IN (:COM "slot-makunbound"))
   "slot-makunbound's Arguments and Values capitalizes the parameter as Slot-name; the Description uses slot-name.")
  (:ERRATUM
   (:KIND :REF :FROM (:PARAM "name") :TO (:PARAM "slot-name") :IN
    (:COM "slot-value"))
   "slot-value's Arguments and Values names the parameter name; the Syntax and Description use slot-name.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "storage-condition") :TO
    (:TYPEREF "storage-condition") :IN (:COM "storage-condition"))
   "storage-condition's own Description wraps its name in \\term{} instead of a type reference.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "start1") :TO (:PARAM "start1") :IN
    (:COM "string="))
   "string='s Description marks the parameter start1 as a glossary term.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "start2") :TO (:PARAM "start2") :IN
    (:COM "string="))
   "string='s Description marks the parameter start2 as a glossary term.")
  (:ERRATUM
   (:KIND :REF :FROM (:DECLREF "and") :TO (:TYPEREF "and") :IN
    (:COM "subtypep"))
   "and is a type specifier here, marked \\declref in subtypep's description.")
  (:ERRATUM
   (:KIND :REF :FROM (:DECLREF "eql") :TO (:TYPEREF "eql") :IN
    (:COM "subtypep"))
   "eql is a type specifier here, marked \\declref in subtypep's description.")
  (:ERRATUM
   (:KIND :REF :FROM (:DECLREF "function") :TO (:TYPEREF "function") :IN
    (:COM "subtypep"))
   "the function type specifier, marked \\declref in subtypep's description.")
  (:ERRATUM
   (:KIND :REF :FROM (:DECLREF "member") :TO (:TYPEREF "member") :IN
    (:COM "subtypep"))
   "member is a type specifier here, marked \\declref in subtypep's description.")
  (:ERRATUM
   (:KIND :REF :FROM (:DECLREF "not") :TO (:TYPEREF "not") :IN
    (:COM "subtypep"))
   "not is a type specifier here, marked \\declref in subtypep's description.")
  (:ERRATUM
   (:KIND :REF :FROM (:DECLREF "or") :TO (:TYPEREF "or") :IN (:COM "subtypep"))
   "or is a type specifier here, marked \\declref in subtypep's description.")
  (:ERRATUM
   (:KIND :REF :FROM (:DECLREF "satisfies") :TO (:TYPEREF "satisfies") :IN
    (:COM "subtypep"))
   "satisfies is a type specifier, marked \\declref in subtypep's description.")
  (:ERRATUM
   (:KIND :REF :FROM (:DECLREF "values") :TO (:TYPEREF "values") :IN
    (:COM "subtypep"))
   "the values type specifier, marked \\declref in subtypep's description.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "remf") :TO (:MACREF "remf") :IN (:COM "symbol"))
   "remf is a macro, marked \\funref in the symbol system class description.")
  (:ERRATUM (:KIND :TEXT :FROM " – " :TO "—" :IN (:COM "terpri"))
   "terpri/fresh-line's output-stream parameter uses an en dash.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "time") :TO (:MACREF "time") :COUNT 3 :IN
    (:COM "time"))
   "time is a macro, marked \\funref three times in its own description.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "function-names") :TO (:PARAM "function-names") :IN
    (:COM "trace"))
   "trace's Description marks the parameter function-names as a glossary term.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "bignum") :TO (:TYPEREF "bignum") :IN
    (:COM "type"))
   "type's Description marks the type bignum as a glossary term.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "function") :TO (:TYPEREF "function") :IN
    (:COM "type-of"))
   "the function type, marked \\funref in type-of's description.")
  (:ERRATUM
   (:KIND :REF :FROM (:FUNREF "unbound-slot-object") :TO
    (:FUNREF "unbound-slot-instance") :IN (:COM "unbound-slot"))
   "The unbound-slot condition's See Also names unbound-slot-object, but the function defined (and referenced everywhere else) is unbound-slot-instance.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "protected-form") :TO (:PARAM "protected-form") :IN
    (:COM "unwind-protect"))
   "unwind-protect's Description marks the parameter protected-form as a glossary term.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "typespec") :TO (:PARAM "typespec") :IN
    (:COM "upgraded-complex-part-type"))
   "upgraded-complex-part-type's Description marks the parameter typespec as a glossary term.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "with-compilation-unit") :TO
    (:MACREF "with-compilation-unit") :IN (:COM "with-compilation-unit"))
   "with-compilation-unit's Examples commentary wraps its own name in \\term{} instead of a macro reference.")
  (:ERRATUM
   (:KIND :TEXT :FROM " – " :TO "—" :COUNT 2 :IN (:COM "with-open-file"))
   "with-open-file's stream and options parameters use en dashes.")
  (:ERRATUM
   (:KIND :TEXT :FROM "'something big" :TO "'something-big" :IN
    (:COM "with-simple-restart"))
   "Missing hyphen in the compute-power-of-2 example's something-big symbol.")
  (:ERRATUM (:KIND :TEXT :FROM " – " :TO "—" :IN (:COM "write-char"))
   "write-char's output-stream parameter uses an en dash.")
  (:ERRATUM (:KIND :TEXT :FROM " – " :TO "—" :IN (:COM "write-string"))
   "write-string/write-line's output-stream parameter uses an en dash.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "lambda-list") :TO (:TERM "lambda list") :IN
    (:ITEM "aux variable"))
   "The glossary entry for aux variable hyphenates the glossary term lambda list.")
  (:ERRATUM
   (:KIND :REF :FROM (:MACREF "macrolet") :TO (:SPECREF "macrolet") :IN
    (:ITEM "macro lambda list"))
   "macrolet is a special operator, marked \\macref in the glossary entry macro lambda list.")
  (:ERRATUM (:KIND :REF :FROM (:TERM "9") :TO (:TT "9") :IN (:ITEM "numeric"))
   "The glossary entry for numeric writes 'characters 0 through 9' with 0 as code and 9 as a glossary term.")
  (:ERRATUM
   (:KIND :REF :FROM (:MACREF "let") :TO (:SPECREF "let") :IN
    (:ITEM "parallel"))
   "let is a special operator, marked \\macref in the glossary entry parallel.")
  (:ERRATUM
   (:KIND :REF :FROM (:MACREF "let*") :TO (:SPECREF "let*") :IN
    (:ITEM "sequential"))
   "let* is a special operator, marked \\macref in the glossary entry sequential.")
  (:ERRATUM
   (:KIND :REF :FROM (:MACREF "setq") :TO (:SPECREF "setq") :IN
    (:ITEM "sequential"))
   "setq is a special operator, marked \\macref in the glossary entry sequential.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "slash") :TO (:TERM "backslash") :IN
    (:ITEM "single escape"))
   "The glossary entry for single escape says slash is the only single escape in the standard readtable; per 2.1.4 it is backslash.")
  (:ERRATUM
   (:KIND :REF :FROM (:TERM "-3") :TO (:TT "-3") :IN (:ITEM "time zone"))
   "The glossary entry for time zone marks the number -3 ('Moscow, Russia is time zone -3') as a glossary term.")))
